'Converting three lists into one list in Haskell
I'm new to haskell and am working on a function called combineAll.
Its input is going to be three integer lists, and its output will be one integer list.
It's going to return a sum of the three lists in corresponding order.
For example, if the input value is :
[[1,0,0,0],[1,1,1,0],[1,1,0,0]]
Then the output value will be :
[3,2,1,0]
I defined its signature as:
combineAll :: [[Int]] -> [Int]
I tried zipWith (+) but since it takes two inputs, it seems impossible for me to build up the recursion.
Any help would be appreciated!
Solution 1:[1]
You can turn this problem on its side with transpose, and transform the resulting list with map.
The mapping function will be ..... .
To find out what it is, see what will be the type of each element, and what is the value we're interested in producing for them.
Solution 2:[2]
Check out zipWith3 if you just want to zip 3 lists together.
Alternatively, a more generalised solution would be to fold the list by zipping two int lists together at a time.
Solution 3:[3]
This seems like a homework assignment, and you haven't shown code, so I'm not going to present a full solution with code, but generally:
You can map head across your list of lists. If you do that to [[1,0,0,0],[1,1,1,0],[1,1,0,0]] you'll get [1, 1, 1]. You can sum these to get 3.
If you map tail across [[1,0,0,0],[1,1,1,0],[1,1,0,0]] you get [[0,0,0],[1,1,0],[1,0,0]]. If you apply this recursively, you can get the sums of corresponding elements of the lists in your list of lists.
Solution 4:[4]
Another option is to use the transpose function. With your input that will produce:
ghci> transpose [[1,0,0,0],[1,1,1,0],[1,1,0,0]]
[[1,1,1],[0,1,1],[0,1,0],[0,0,0]]
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Will Ness |
| Solution 2 | Will Ness |
| Solution 3 | Chris |
| Solution 4 | Noughtmare |
