by shigemk2

当面は技術的なことしか書かない

ラムダ

-- ラムダ式とは、1回だけ必要な関数を作るときに使う無名関数である。
-- 通常ラムダ式は高階関数に渡す関数を作るためだけに使われる。
-- ラムダ式を宣言するためには、バックスラッシュを書いて、それから関数の引数を
-- スペース区切りで書く

numLongChains' :: Int
numLongChains' = length (filter (\xs -> length xs > 15)
                        (map chain [1..100]))

-- あんまりラムダを多用しても意味ない
addThree :: Int -> Int -> Int -> Int
addThree x y z = x + y + z

addThree' :: Int -> Int -> Int -> Int
addThree' = \x -> \y -> \z -> x + y + z

-- ラムダのほうが読みやすいとき
flip' :: (a -> b -> c) -> b -> a -> c
flip' f = \x y -> f y x
Main> map (+3) [1,6,3,2]
[4,9,6,5]
Main> map (\x -> x + 3) [1,6,3,2]
[4,9,6,5]
Main> zipWith (\a b -> (a * 30 + 3) / b) [5,4,3,2,1] [1,2,3,4,5]
[153.0,61.5,31.0,15.75,6.6]
Main> map (\(a,b) -> a + b) [(1,2),(3,5),(6,3),(2,6),(2,5)]
[3,8,9,8,7]
Main> addThree' 1 2 3
6
Main> addThree 1 2 3
6
Main> zipWith (flip (++)) ["love you", "love me"] ["i ", "you "]
["i love you","you love me"]
Main> map (flip subtract 20) [1, 2, 3, 4]
[19,18,17,16]

なお、ラムダ式でパターンマッチが失敗したら、ランタイムエラーが発生する。

自分が関数を定義するときもうまくラムダ式を使えば、その部分は部分適用され
引数として別の関数に渡されるものという意図を明確にできるが、
やたらラムダを使うと可読性がおそろしく下がるので注意すること。