dfj*_*328 16 haskell tuples list
我想转换下面的元组列表
a = [(1,()),(2,())]
Run Code Online (Sandbox Code Playgroud)
通过相同的值进入嵌套的元组列表
b = [(False,(1,())),(False,(2,()))]
Run Code Online (Sandbox Code Playgroud)
使用此格式的zip功能
zip [False] a
Run Code Online (Sandbox Code Playgroud)
只给了我
[(False,(1,()))]
Run Code Online (Sandbox Code Playgroud)
任何建议或建议将不胜感激.
Mat*_*hid 33
如果您压缩两个不同长度的列表,您将获得最短列表的长度.
你可以通过压缩无限长的列表来解决这个问题:
zip (repeat False) a
Run Code Online (Sandbox Code Playgroud)
应该做的伎俩.
bhe*_*ilr 29
或者,zip您可以使用以下代码map:
map (\x -> (False, x)) a
Run Code Online (Sandbox Code Playgroud)
这更适合表达你的意图(在我看来),因为你想对列表的每个元素做同样的事情.如果你想对每个元素做不同的事情,那么zip或者zipWith可能更合适.
如果你想避免使用lambda,可以使用&&&from 来编写pointfree Control.Arrow:
map (const False &&& id) a
Run Code Online (Sandbox Code Playgroud)
它基本上是"应用函数const False和id输入,然后构造它们的两个输出的元组".有一个TupleSections扩展名,可以让你写这个
map (False,) a
Run Code Online (Sandbox Code Playgroud)
(由@thoferon提供的提示),但我个人觉得这不太清楚,因为你必须知道扩展已启用并注意,后False.你可以把它写成
map ((,) False) a
Run Code Online (Sandbox Code Playgroud)
没有扩展名,因为(,)作为类型的函数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 (,)
Run Code Online (Sandbox Code Playgroud)
然后strengthL可以应用于False和原始列表:
Prelude> strengthL False [(1,()),(2,())]
[(False,(1,())),(False,(2,()))]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
925 次 |
| 最近记录: |