クロージャ

ふつけるの4章に、関数内で関数を定義する方法があったのでクロージャを作ってみよう。

closure :: Int -> (Int -> Int)
closure x = fn
    where
        fn :: Int -> Int
        fn y = x + y

main = do
    let f = closure 95
    print $ f 5

うまく行きました。
しかしながら、これだけやるなら部分適用で・・・

add :: Int -> Int -> Int
add x y = x + y

main = do
    let f = add 5
    print $ f 5

さらに+自体も関数なので

main = do
    let f = (45 +)
    print $ f 5

とできる。
最初、
let f = 45 +
と書いたらはじかれたけど、括弧でくくってやったらうまく行った。
部分適用についてはLispに比べてHaskellが断然らむだ楽だ。