Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 在元组列表上压缩相同的值Haskell_List_Haskell_Tuples - Fatal编程技术网

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.Arrow
map(constfalse&&id)
。它不需要扩展,代码非常清晰(只要您知道
&&&
的功能)。考虑到这需要一个导入和多个字符,我不介意在这个简单的例子中使用一个有意义的lambda。您最后的建议(前缀表示法)也很好。@BenjaminGruenbaum我不同意。我碰巧非常喜欢arrow语法,尤其是在处理大量元组时,它们会派上用场。在这两种情况下,您都必须键入extra,但我经常发现自己已经导入了
Control.Arrow。对于那些试图保留Haskell 98的人来说,箭头式方法更可取。我更喜欢将
(False,)
作为语法错误(就像
[False,]
一样),而不是寻求不需要更改语言的解决方案。归根结底,这实际上只是个人风格的问题。
Prelude> strengthL False [(1,()),(2,())]
[(False,(1,())),(False,(2,()))]