[英]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
这更适合表达你的意图(在我看来),因为你想对列表的每个元素做同样的事情。 如果你想对每个元素做不同的事情,那么zip
或zipWith
可能更合适。
如果你想避免使用lambda,你可以使用Control.Arrow
&&&
将它写成pointfree:
map (const False &&& id) a
基本上说“将函数const False
和id
应用于输入,然后构造它们的两个输出的元组”。 有一个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.