2014-03-29 80 views
1

我是新来的Haskell,我试图编写一个简单的函数,接受一个整数列表并返回一个列表,使第一个元素添加到列表中的所有元素。哈斯克尔与列表麻烦

这是我到目前为止。

addFirstEl [] = [] 
addFirstEl (x:xs) = [x + x | x <- xs] 

不幸的是所有this已经成功地做到了没有第一个元素返回一个列表,并加倍其他元素。

+1

只是使用diffe在'xs'中租用元素的名称 – Broseph

+1

谢谢!但是,第一个元素仍然从返回的列表中删除。 – user3476396

回答

6

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] 
+0

非常感谢! – user3476396

+0

我真的很喜欢'head xs'版本,因为它清楚地表达了意图。 –

+0

@AlainO'Dea另一方面,'head'是一个部分操作,因此每个'head'的使用都给程序员增加了一个负担 - 即证明它的参数不为null。相比之下,第一个解决方案不需要任何证据,因此可以更简单地以安全的方式使用。 – chi