2011-01-23 6 views
10

ハスケルに2つのリストを追加したいとします。これを行う最も一般的な方法は何ですか?ハスケルにリストを追加するための慣習的な方法は何ですか?

は、ここに私がやったことだ:

addLists :: (Integral a) => [a] -> [a] -> [a] 
addLists xs ys = map add $ zip xs ys 
    where add (x, y) = x+y 
+3

BTW: 'add = uncurry(+)'。また、クエリ ''(a - > b - > c) - > \ [a \] - に対する[zipWith]の回答は、[Hoogle](http://haskell.org/hoogle/) > \ [b \] - > \ [c \] '](http://haskell.org/hoogle/?hoogle=%28a+-%3E+b+-%3E+c%29+-%3E+%5Ba% 5D + - %3E +%5Bb%5d + - %3E +%5Bc%5D)。 – ephemient

+0

ありがとうございました。私は次回にHoogleを試してみます。 –

+0

@TomMD、私はあなたのコメントの最初の部分を理解していません。 –

答えて

28

が供給関数を使用して2つのリストを組み合わせたzipWithライブラリ関数があります。それはあなたがここに欲しいものを正確に行い、あなたが得る:

addLists = zipWith (+) 

これはさらに、引数として与えられたリストの要素を組み合わせること(+)を使用しています。

+0

ああ私にそれを打つ。 –

2
addLists xs ys = zipWith (+) xs ys 
6

のApplicativeのFunctorスタイル:

import Control.Applicative 

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

注リストのApplicativeファンクタ作るには二つの方法があるので、これはとても醜いであること。最初の(そしてIMHOの役に立たない)方法は、すべての組み合わせを取ることです。その方法は「標準」になります。したがって、(+) <$> [1,2] <*> [30,40][31,41,32,42]です。もう1つの方法は、ここで必要なリストを圧縮することですが、タイプごとに1つのタイプクラスインスタンスしか持たないので、リストをZipListsでラップし、getZipListを使用して結果をアンラップする必要があります。

関連する問題