curry, uncurry

Prelude> :t curry
curry :: ((a, b) -> c) -> a -> b -> c
Prelude> :t uncurry
uncurry :: (a -> b -> c) -> (a, b) -> c
Prelude> add (a, b) = a + b
Prelude> curry add 2 3
5
Prelude> mul a b = a * b
Prelude> uncurry mul (2, 3)
6
  • curry はタプルから引数へ展開
  • uncurry は引数をタプルにまとめる

というようなイメージなのかな。

zip した各要素には uncurry が使えそう。

Prelude> xs = map (uncurry (+)) $ zip [1..] [2..]
Prelude> take 10 xs
[3,5,7,9,11,13,15,17,19,21]