繁体   English   中英

在元组Haskell列表上压缩相同的值

[英]Zipping same value over a list of tuples Haskell

我想转换下面的元组列表

a = [(1,()),(2,())]

通过相同的值进入嵌套的元组列表

b = [(False,(1,())),(False,(2,()))]

使用此格式的zip功能

zip [False] a

只给了我

[(False,(1,()))]

任何建议或建议将不胜感激。

如果您压缩两个不同长度的列表,您将获得最短列表的长度。

你可以通过压缩无限长的列表来解决这个问题:

zip (repeat False) a

应该做的伎俩。

或者,您可以使用map来代替使用zip

map (\x -> (False, x)) a

这更适合表达你的意图(在我看来),因为你想对列表的每个元素做同样的事情。 如果你想对每个元素做不同的事情,那么zipzipWith可能更合适。

如果你想避免使用lambda,你可以使用Control.Arrow &&&将它写成pointfree:

map (const False &&& id) a

基本上说“将函数const Falseid应用于输入,然后构造它们的两个输出的元组”。 有一个TupleSections扩展,允许你写这个

map (False,) a

(由@thoferon提供的提示 ),但我个人认为这不太清楚,因为您必须知道扩展已启用并注意,False之后。 你可以把它写成

map ((,) False) a

没有扩展名,因为(,)作为类型a -> b -> (a, b)的函数,虽然更冗长,但它不需要启用语言扩展。

除了其他答案之外,还可以为任何Functor编写通用函数,而不仅仅是列表:

strengthL :: Functor f => a -> f b -> f (a, b)
strengthL = fmap . (,)

strengthR :: Functor f => a -> f b -> f (b, a)
strengthR = fmap . flip (,)

然后strengthL可以应用于False和原始列表:

Prelude> strengthL False [(1,()),(2,())]
[(False,(1,())),(False,(2,()))]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM