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

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 Falseid输入,然后构造它们的两个输出的元组".有一个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),虽然更冗长,但它不需要启用语言扩展.

  • 或者使用TupleSections:`map(False,)a` (4认同)

Zhe*_*lov 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 (,)
Run Code Online (Sandbox Code Playgroud)

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

Prelude> strengthL False [(1,()),(2,())]
[(False,(1,())),(False,(2,()))]
Run Code Online (Sandbox Code Playgroud)