List 在元组列表上压缩相同的值Haskell
我想转换下面的元组列表List 在元组列表上压缩相同的值Haskell,list,haskell,tuples,List,Haskell,Tuples,我想转换下面的元组列表 a = [(1,()),(2,())] 按相同的值放入嵌套的元组列表中 b = [(False,(1,())),(False,(2,()))] 使用此格式的zip函数 zip [False] a 只给我 [(False,(1,()))] 任何建议或建议都将不胜感激。如果您压缩两个不同长度的列表,您将得到最短列表的长度 您可以通过压缩无限长的列表来解决此问题: 应该这样做。或者,您可以使用map代替zip: map (\x -> (False, x)) a
a = [(1,()),(2,())]
按相同的值放入嵌套的元组列表中
b = [(False,(1,())),(False,(2,()))]
使用此格式的zip函数
zip [False] a
只给我
[(False,(1,()))]
任何建议或建议都将不胜感激。如果您压缩两个不同长度的列表,您将得到最短列表的长度 您可以通过压缩无限长的列表来解决此问题:
应该这样做。或者,您可以使用
map
代替zip
:
map (\x -> (False, x)) a
这将更恰当地表达您的意图(在我看来),因为您希望对列表中的每个元素执行相同的操作。如果您想对每个元素执行不同的操作,那么zip
或zipWith
可能更合适
如果要避免lambda,可以使用控件中的&&&
无点编写它。箭头
:
map (const False &&& id) a
这基本上是说“将函数constfalse
和id
应用于输入,然后构造两个输出的元组”。有一个TupleSections
扩展,允许您将其编写为
map (False,) a
(提示由提供),但我个人觉得这不太清楚,因为您必须知道扩展已启用,并注意,之后的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,()))]
如果你有map
,为什么要使用zip
?或者使用元组:map(False,@thoferon)当然可以,但是在这种情况下,我诚实地说,这会让事情变得不那么清楚。map(False,
和map(False)a
之间的区别只有1个字符,这个字符非常重要。如果我想要无点,我宁愿使用Control.Arrowmap(constfalse&&id)
。它不需要扩展,代码非常清晰(只要您知道&&&
的功能)。考虑到这需要一个导入和多个字符,我不介意在这个简单的例子中使用一个有意义的lambda。您最后的建议(前缀表示法)也很好。@BenjaminGruenbaum我不同意。我碰巧非常喜欢arrow语法,尤其是在处理大量元组时,它们会派上用场。在这两种情况下,您都必须键入extra,但我经常发现自己已经导入了Control.Arrow。对于那些试图保留Haskell 98的人来说,箭头式方法更可取。我更喜欢将(False,)
作为语法错误(就像[False,]
一样),而不是寻求不需要更改语言的解决方案。归根结底,这实际上只是个人风格的问题。
Prelude> strengthL False [(1,()),(2,())]
[(False,(1,())),(False,(2,()))]