ハスケルに2つのリストを追加したいとします。これを行う最も一般的な方法は何ですか?ハスケルにリストを追加するための慣習的な方法は何ですか?
は、ここに私がやったことだ:
addLists :: (Integral a) => [a] -> [a] -> [a]
addLists xs ys = map add $ zip xs ys
where add (x, y) = x+y
ハスケルに2つのリストを追加したいとします。これを行う最も一般的な方法は何ですか?ハスケルにリストを追加するための慣習的な方法は何ですか?
は、ここに私がやったことだ:
addLists :: (Integral a) => [a] -> [a] -> [a]
addLists xs ys = map add $ zip xs ys
where add (x, y) = x+y
が供給関数を使用して2つのリストを組み合わせたzipWith
ライブラリ関数があります。それはあなたがここに欲しいものを正確に行い、あなたが得る:
addLists = zipWith (+)
これはさらに、引数として与えられたリストの要素を組み合わせること(+)
を使用しています。
ああ私にそれを打つ。 –
addLists xs ys = zipWith (+) xs ys
の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を使用して結果をアンラップする必要があります。
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
ありがとうございました。私は次回にHoogleを試してみます。 –
@TomMD、私はあなたのコメントの最初の部分を理解していません。 –