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 ]