LoginSignup
2
0

More than 1 year has passed since last update.

高階関数 ― J 言語入門

Last updated at Posted at 2021-06-24

J は、verb に対する操作、つまり高階関数の機能も幅広く備えています。高階関数にあたるものには、adverbconjunction の 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~ yy 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 yu (x v y) を意味します 3

   NB. - (3 % 2)
   3 -@% 2
_1.5

また、u@v yu (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 は、xy それぞれについて monad として実行されます。

  u
 / \
v   v
|   |
x   y

引数の束縛 (部分適用)

& は、m&vu&n の形で使うと、引数 (m / n) を verb (v / u) に束縛する働きをします。

   3&- 5
_2
   -&3 (5)
2

[ 前 : verb と引数 ] [ 目次 ] [ 次 : adverb と conjunction ]


  1. adverb と conjunction の詳細は、次の記事で説明しようと思います。 

  2. 計算途中の値を一時変数に入れる必要性も無くなります。 

  3. 実は厳密には違いがあるのですが、説明の都合上割愛します。 

  4. 執筆時点 (J9.02) では非推奨ですが、将来的には削除されると思われます。 

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0