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

时间:2015-05-26 12:34:11

标签: list haskell tuples

我想转换以下元组列表

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

以相同的值

进入嵌套的元组列表
b = [(False,(1,())),(False,(2,()))]

使用此格式的zip功能

zip [False] a

只给我

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

非常感谢任何建议或意见。

3 个答案:

答案 0 :(得分:33)

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

您可以通过压缩无限长的列表来解决此问题:

zip (repeat False) a

应该这样做。

答案 1 :(得分:29)

或者,您可以使用zip

,而不是使用map
map (\x -> (False, x)) a

这会更恰当地表达你的意图(在我看来),因为你想对列表的每个元素做同样的事情。如果您想对每个元素执行不同的操作,则zipzipWith可能更合适。

如果您想避免使用lambda,可以使用&&&中的Control.Arrow来免费编写它:

map (const False &&& id) a

基本上说“将函数const Falseid应用于输入,然后构造其两个输出的元组”。有TupleSections扩展名允许您将其写为

map (False,) a

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

map ((,) False) a

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

答案 2 :(得分:6)

除了其他答案之外,还可以为任何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,()))]