$
Haskellの$がやっと理解できたかも、という話。
f $ xはf xと同じで、なにが嬉しいのか良くわからなかった。きっと遅延評価でなんか嬉しいことがあるんだろうかと想像して、正格なOCamlではきっとなにも嬉しいことがないんだろうと思っていた。
ところが、実は構文解析の優先順位が違う。中置演算子の方が関数適用より優先順位が低いので、例えばf (g x)をf $ g xと書けることに気付いた。これ、なにげに気持ち良いかも。
※追記
良く考えたら、Haskellの演算子の優先順位しらねーと思って、確認確認。
Prelude> (*) 2 3 + 1 7
((*) 2 3) + 1になってるな。
Prelude> (*) 2 succ 2 <interactive>:1: No instance for (Num (a -> a)) arising from use of `*' at <interactive>:1 In the definition of `it': it = (*) 2 succ 2
succはNumのインスタンスじゃないよーというエラー。ごもっとも。
Prlude> (*) 2 $ succ 3 8
ちゃんと、((*) 2) (succ 3)になってるっぽ。
うん。上のはウソじゃ無いと思う。