Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is an idiomatic way to add lists in Haskell?

Suppose I want to add two lists in Haskell. What is the most usual way to do this?

Here's what I did:

addLists :: (Integral a) => [a] -> [a] -> [a]
addLists xs ys = map add $ zip xs ys
    where add (x, y) = x+y
like image 415
Eric Wilson Avatar asked Jan 23 '11 21:01

Eric Wilson


3 Answers

There is a zipWith library function that combines two lists by using a supplied function. It does exactly what you want here and you get:

addLists = zipWith (+)

This uses (+) to combine the elements of lists given as further arguments.

like image 75
sth Avatar answered Oct 26 '22 06:10

sth


Applicative Functor style:

import Control.Applicative

addLists xs ys = getZipList $ (+) <$> ZipList xs <*> ZipList ys

Note that this is so ugly because there are two ways to make List an Applicative Functor. The first (and IMHO less useful) way is to take all combination, and that way became the "standard", so (+) <$> [1,2] <*> [30,40] is [31,41,32,42]. The other way is to zip the lists as we need here, but as you can have only one type class instance per type, we have to wrap the lists in ZipLists, and to unwrap the result using getZipList.

like image 6
Landei Avatar answered Oct 26 '22 06:10

Landei


addLists xs ys = zipWith (+) xs ys
like image 2
Alexey Romanov Avatar answered Oct 26 '22 07:10

Alexey Romanov