user3476396
user3476396

Reputation: 75

Haskell Trouble with Lists

I'm new to Haskell and I'm trying to write a simple function that takes a list of integers and returns a list such that the first element is added to all the elements of the list.

This is what I have so far.

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

Unfortunately all this has succeeded in doing is returning a list without the first element and the other elements being doubled.

Upvotes: 1

Views: 81

Answers (2)

Cirdec
Cirdec

Reputation: 24156

The binding of x in the list comprehension is hiding the variable x from the pattern. Try this instead:

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

Edit

In response to you comment

the first element still gets removed from the returned list

In (x1:xs),xs is the remainder or tail of the list. It is all the elements after x1, which is the head. If you want to add x1 to all the elements including itself, you could write

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

or in terms of head

addFirstEl [] = []
addFirstEl xs = [head xs + x | x <- xs]

Upvotes: 6

Lee Duhem
Lee Duhem

Reputation: 15121

Try this:

addFirstEl [] = []
addFirstEl l@(x:_) = [x + x1 | x1 <- l ]

or

addFirstEl [] = []
addFirstEl l@(x:_) = map (+ x) l

Upvotes: 3

Related Questions