リストを操作する関数(その2)

zip は2つのリストからそれぞれの要素を取り出して,タプル(組)にしたリストを返す。

Prelude> zip [1,2,3] "abc"
[(1,'a'),(2,'b'),(3,'c')]

タプルには違う型を含めることができる。
zipWith はタプルを作る代わりに関数を適用する。

Prelude> zipWith (+) [1,2,3] [10,20,30]
[11,22,33]

上の例では + を zipWith の第1引数と渡しているけど,()で囲んでやらないとエラーになる。
うまく zipWith の引数として認識できないってことかな。

Prelude> zipWith + [1,2,3] [10,20,30]

:1:10:
    Couldn't match `[a]' against `t -> t1'
      Expected type: [a]
      Inferred type: t -> t1
    Probable cause: `[1, 2, 3]' is applied to too many arguments in the call
        ([1, 2, 3] [10, 20, 30])
    In the second argument of `(+)', namely `[1, 2, 3] [10, 20, 30]'


ところでタプルって何に使うんだろ。


追記: zipWith の引数について
こうすると同じメッセージがでる。つまり二つのリストが zipWith ではなく + の引数だと解釈されてしまうってことか。

Prelude> zipWith (+ [1,2,3] [10,20,30])

:1:11:
    Couldn't match `[a]' against `t -> t1'
      Expected type: [a]
      Inferred type: t -> t1
    Probable cause: `[1, 2, 3]' is applied to too many arguments in the call
        ([1, 2, 3] [10, 20, 30])
    In the second argument of `(+)', namely `[1, 2, 3] [10, 20, 30]'