ForkとHookのまとめ


J言語やらない人にはなんだかわからないと思うけど、まとめです。
特に記憶しないと使えないということはないのですが、毎回試行錯誤してるのでメモしておきます。

(f g) y => y f (g y)   cf.(+ tax) 50
x (f g) y => x f (g y)

(f @: g) y => f (g y)
x (f @: g) y => f (x g y)
x (f &: g) y => (g x) f (g y)
(f &: g) y => f (g y)   This is same as (f @: g)

(f g h) y => (f y) g (h y)
x (f g h) y => (x f y) g (x h y)

(f @ g) y => Similar to (f @: g) y  but f applies separately
x (f @ g)  y => Similar to x (f @: g) y but f applies separately
(f & g)  y  => Similar to   (f &: g) y or (f @: g)  y but f applies separately
x (f & g)  y  => Similar to x (f &: g) y or (g x) f (g y) but f applies separately

(f &. g) y => gi f g y (gi is inverse of g)
x (f &. g) y => gi (g x) f (g y)

J言語には掛け算が足し算より先というような暗記しなければならない優先順位がありません。
一方、今回まとめたように動詞がいくつも並んだものをひとかたまりにしたときの引数との関係が(自然に)決まっています。
これによって簡潔な表記が可能になっています。
読んでわからないという批判もありますが、J言語ユーザーに言わせれば、読むのにコツがいるだけでとても明確です。
わからない場合は途中で切ったりして試行錯誤してみるとわかる場合が多いです。