我是新来的Haskell,我试图编写一个简单的函数,接受一个整数列表并返回一个列表,使第一个元素添加到列表中的所有元素。哈斯克尔与列表麻烦
这是我到目前为止。
addFirstEl [] = []
addFirstEl (x:xs) = [x + x | x <- xs]
不幸的是所有this
已经成功地做到了没有第一个元素返回一个列表,并加倍其他元素。
我是新来的Haskell,我试图编写一个简单的函数,接受一个整数列表并返回一个列表,使第一个元素添加到列表中的所有元素。哈斯克尔与列表麻烦
这是我到目前为止。
addFirstEl [] = []
addFirstEl (x:xs) = [x + x | x <- xs]
不幸的是所有this
已经成功地做到了没有第一个元素返回一个列表,并加倍其他元素。
x
在列表理解中的绑定隐藏了模式中的变量x
。试试这个:
addFirstEl [] = []
addFirstEl (x1:xs) = [x1 + x2 | x2 <- xs]
编辑
在回答你对此有何评论
的第一要素还是会从返回的列表中删除
在(x1:xs)
,xs
是列表的其余部分或tail
。它是x1
之后的所有元素,即head
。如果你想添加x1
的所有元素,包括本身,你可以写
addFirstEl [] = []
addFirstEl (x1:xs) = [x1 + x2 | x2 <- (x1:xs)]
或在head
addFirstEl [] = []
addFirstEl xs = [head xs + x | x <- xs]
非常感谢! – user3476396
我真的很喜欢'head xs'版本,因为它清楚地表达了意图。 –
@AlainO'Dea另一方面,'head'是一个部分操作,因此每个'head'的使用都给程序员增加了一个负担 - 即证明它的参数不为null。相比之下,第一个解决方案不需要任何证据,因此可以更简单地以安全的方式使用。 – chi
条款试试这个:
addFirstEl [] = []
addFirstEl [email protected](x:_) = [x + x1 | x1 <- l ]
或
addFirstEl [] = []
addFirstEl [email protected](x:_) = map (+ x) l
只是使用diffe在'xs'中租用元素的名称 – Broseph
谢谢!但是,第一个元素仍然从返回的列表中删除。 – user3476396