我想转换以下元组列表
a = [(1,()),(2,())]
以相同的值
进入嵌套的元组列表b = [(False,(1,())),(False,(2,()))]
使用此格式的zip功能
zip [False] a
只给我
[(False,(1,()))]
非常感谢任何建议或意见。
答案 0 :(得分:33)
如果您压缩两个不同长度的列表,您将获得最短列表的长度。
您可以通过压缩无限长的列表来解决此问题:
zip (repeat False) a
应该这样做。
答案 1 :(得分:29)
或者,您可以使用zip
:
map
map (\x -> (False, x)) a
这会更恰当地表达你的意图(在我看来),因为你想对列表的每个元素做同样的事情。如果您想对每个元素执行不同的操作,则zip
或zipWith
可能更合适。
如果您想避免使用lambda,可以使用&&&
中的Control.Arrow
来免费编写它:
map (const False &&& id) a
基本上说“将函数const False
和id
应用于输入,然后构造其两个输出的元组”。有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,()))]