あどけない話

インターネットに関する技術的な話など

高階関数と無名関数

Ruby ではブロックが自慢らしい。制御構造を自由に作れる感じがするのだと言う。

obj.foo do |x,y|
    x を使う
    y を使う
end

これは、高階関数の最後の引数として無名関数を渡していることに他ならない。他の言語でどうなるか考えてみる。

JavaScript ではこうなる。

foo(arg,function(x,y) {
    x を使う;
    y を使う;
});

たしかに、function とか閉じ括弧が冗長な印象を受ける。

Haskell で書くとこうなる。

foo xs $ \x y -> do
    x を使う
    y を使う

end がない分、Ruby よりもすっきりした感じ。

Python でも同種のレイアウト規則を採用しているので、すっきり書けるかと期待したのだが、無名関数は一行に納めないといけないそうだ。

ここで関数の名前について考えよう。ruby では、ブロックに名前をつけられないけれど、Haskell ではできる。

bar x y = do
    x を使う
    y を使う

foo xs bar

名前が付いた関数であれば、高階関数の第一引数として渡したい気になるけど、Haskell では引数の順番はいかようにでも変更できる。

実際の例を挙げるなら、forM は mapM を flip したものだ。

mapM :: (a -> m b) -> [a] -> m [b]
forM :: [a] -> (a -> m b) -> m [b]
forM = flip mapM

という訳で、Ruby のブロックは、Haskell では当たり前の機能っぽい。

間違いや誤解があれば、指摘して下さい。