J は、verb に対する操作、つまり高階関数の機能も幅広く備えています。高階関数にあたるものには、adverb と conjunction の 2 種類があります 1。
被演算子
adverb と conjunction を合わせて、modifier (修飾語) と呼びます。adverb は被演算子が 1 つ (左側)、conjunction は被演算子が 2 つ (両側) です。verb の場合は引数 (argument) という言葉を使いましたが、modifier の場合は被演算子 (operand) と呼び分けられています。
被演算子の名前は、被演算子が verb のときと noun のときで異なります。verb の被演算子は左側なら u、右側なら v です。一方 noun の被演算子は左側は m、右側は n です。
引数の反転
~ という adverb は、verb の左右の引数を入れ替えます。
NB. 5 , 3 と同じ
3 ,~ 5
5 3
x u~ y は y u x と同じです。
~ の被演算子 (-) が左側にあることに注意してください。これは verb (monad) と adverb の大きな違いの一つです。
~ を使うと、複雑な式の括弧を減らせることがあります。
(7 - 1) % 3
2
3 %~ 7 - 1
2
引数の複製
~ には他にも使い方があります。上の例では ~ が作った verb を dyad として使いました。これを monad として使うと、また違った働きをします。
NB. 3 , 3 と同じ
,~3
3 3
u~ y は、y u y として動作します。同じ引数を 2 回書かなくて済むので便利です 2。
verb の合成
J には関数 (verb) の合成を行う conjunction が いくつか あります。ここでは代表的な 2 つを説明します。
monad - monad / monad - dyad
@ は、u@v の形で使います。x u@v y は u (x v y) を意味します 3。
NB. - (3 % 2)
3 -@% 2
_1.5
また、u@v y は u (v y) を意味します 3。
NB. - (% 2)
-@%2
_0.5
u@v は、v を適用した後に u を適用する、という一般的な関数合成と同じ動作です。
u は必ず monad として実行されます。v は使い方に応じて monad または dyad になります。
u
|
v
[/]\
[x] y
dyad - monad
& も、u&v の形で使います。x u&v y は (v x) u (v y) を意味します 3。
NB. (% 3) - (% 2)
3 -&% 2
_0.166667
u&v は、それぞれの引数に v を適用し、その結果を u に与える、という動作をします。@ と違って monad として使うことはできません 4。
u は必ず dyad として実行されます。v は、x と y それぞれについて monad として実行されます。
u
/ \
v v
| |
x y
引数の束縛 (部分適用)
& は、m&v や u&n の形で使うと、引数 (m / n) を verb (v / u) に束縛する働きをします。
3&- 5
_2
-&3 (5)
2
[ 前 : verb と引数 ] [ 目次 ] [ 次 : adverb と conjunction ]