関数や動詞の合成

接続詞 ボンドとアットプ

用法APL結果と例(単項) 用法結果と例(両項)
&
Bond
ボンド
(接続詞)
u&n Y
n&v Y
Compose
u&v Y
動詞と数(名詞)、又は 数と動詞を接続して新たな動詞 を作る。

さらに 2つの動詞 を連結し動詞を作る。

2つの動詞が単項ときは u@v と同じ働きをする。 \[ \begin{array}{c} u\\ \vert \\ v\\ \vert \\ y \end{array} \]

    %&2 y=.1 2 3 4      
 0.5 1 1.5 2(yを2で割る) 
  
    2&% y          
 2 1 0.6666667 0.5      
(2をyで割っている)   

  +:&>: 5 NB. 2*(1+5)         
12

  +:@>: 5 (単項の@は同じ働き)        
12
Compose
コンポーズ
X u&v Y
二項の動詞uと単項の動詞vを &連結した場合は、 その働きに注意が必要。

つまり x u&v yは (vx)u(vy)/のよう に作用する。 \[ \begin{array}{ccc} &u&\\ /&& \backslash\\ v&&v\\ \mid&&\mid\\ x&&y\\ \end{array} \]

100 -&+: 40      
120

(+:100)-(+:40)     
120
&.
Under
アンダー
(接続詞) u&.v Y
& u&.vは、 u&vの後にvの逆演算を行なった結果を返す。 \[ \begin{array}{c} v^{-1}\\ \vert\\ u\\ \vert \\ v\\ \vert \\ y \end{array} \]
    +:&.>: 5         
11
   
    <:+:&>: 5        
11
   
    (>:^:_1)&+:&>: 5     
11
   
    >:^:_1          
 <:             
「>:」の逆演算は「<:」 

 *&.>  {@> i.5
+-+-+-+-+-+
|0|1|1|1|1|
+-+-+-+-+-+

each &.> Boxを開いてuを適用して戻す
& Under
アンダー
X u&.v Y
&で結合させた演算の後で右動詞vの逆演算を行なった結果を返す。 \[ \begin{array}{ccc} &v^{-1}&\\ &\vert& \\ &u&\\ /&& \backslash\\ v&&v\\ \mid&&\mid\\ x&&y\\ \end{array} \]
 100 -&.+: 40      
60
 
 -:(+:100)-(+:40)    
60

 +:^:_1(+:100)-(+:40)  
60
\[ \dfrac{(100 \times 2 ) - (40 \times 2)}{2} \]
&:
Appose
アポーズ
u&:v Y
ランクが無限であることを除き &/と同じ働きをする。
    +:&:>: 5         
12

Appose
アポーズ
X u&:v Y
ランクが無限の場合で &/とほぼ同じ働き
100 -&:+: 40      
120

(+:100)-(+:40)     
120
用法APL結果と例(単項) 用法結果と例(両項)
@
Atop
アトップ
(接続詞)
u@v Y
2つの動詞を関数合成により連結して動詞を作る。

2つの動詞が単項ならば u&vと同じ働きをする。 \[ \begin{array}{c} u\\ \vert \\ v\\ \vert \\ y \end{array} \]

    +:&>: 5         
12

    +:@>: 5         
12

    %&2 i.5         
 0 0.5 1 1.5 2        

    %@2 i.5         
 domain error        

名詞、数値との連結の不可能な点が 
&と異なる。        
Atop
アトップ
(接続詞) X u@v Y
単項の動詞uと二項の動詞vを @で連結した場合は、 その働きに注意が必要。

つまり x(u@v)yは u(xvy)のように作用する。 \[ \begin{array}{ccc} &u&\\ &\vert &\\ &v&\\ /&& \backslash\\ \vert &&\vert\\ x&&y\\ \end{array} \]

3 |@- 7        
4

|(3-7)         
4
@:

At
アット
(接続詞)
u@:v Y
ランクが無限であることを除き 「@」と同じ働きをする。
    +:@:>: 5         
12
「@」/は接続される直前の右のランクを継承するが @:は 継承しない。

@でうまく作動しない場合は @:に変えてみ るとよい場合がある。+/ には +/@:を用いる

At
アット
(接続詞)
X u@:v Y
@とほぼ同じ働き
100 +:@:- 40      
120

3 |@:- 7        
4

3 |&:- 7        
_1            

(-3)|(-7)       
_1            

フックとフォーク

用法APL結果と例(単項) 用法結果と例(両項)
Fork
フォーク
(3連動詞)
(f g h)Y
Jの動詞(演算子)の連結では3つの動詞の結合(フォーク) が最優先される。

ただ2つだけの場合はフックになる。 \[ \begin{array}{ccc} &g&\\ /&&\backslash \\ f&&h \\ \mid&&\mid \\ y&&y\\ \end{array} \]

    (+/%#)a=.1 2 3 4 5    
3
Fork
フォーク
X(f g h)Y
\[ \begin{array}{ccccccc} &&&g&&&\\ &&/&& \backslash&&\\ &&f&&h&&\\ &/&\backslash&&/&\backslash& \\ &x&y&&x&y&\\ \end{array} \]
5 (+*-) 3       
16

(5+3)*(5-3)      
16
   3 (+,-) 5
8 _2
\[3 \pm 5\] 4つ以上の連結の場合には
k fgh        
  └─┘Fork      
└──┘Hook       
右から3個ずつの組み合わせて行ってフォークを作る。

最後が2個になればフックになる /td>

Hook
フック
(2連動詞)
(gh)Y
二項動詞gと単項動詞hでは (g h )y はy g h(y) のように演算する。 \[ \begin{array}{ccc} &g&\\ /&&\backslash \\ y&&h \\ &&\mid \\ &&y\\ \end{array} \]
    (*-)3          
 _9             
 
    3 *(-3)         
 _9             

-(+/%#) 
\[ x-\bar{x} \]
Hook
フック
X(gh)Y
単項の場合と同様で x(g h)yは x gh(y)と演算する。 \[ \begin{array}{ccc} &g&\\ /&&\backslash \\ x&&h \\ &&\mid \\ &&y\\ \end{array} \]
5(*-)3         
_15            

5 *(-3)        
_15            
 [: 

Cap
キャップ
(動詞)
<
 ([:gh)Y 
2連動詞の左端の単項動詞を フックではなく(元に戻して右から順に)働かせたいときに その左端に付けて、 「([: g h)y」又は x([: g h)y の形で演算させ g{h(y)}, g(x h y)と同じ結果を与える。
 Monad     Dyad
\[ \begin{array}{c|ccc} g&&g&\\ \vert &&\vert&\\ h &&h&\\ \vert&/&&\backslash\\ y&x&&y\\ \end{array} \]
    ([:*-)3         
 _1             
    
    *(-3)   (片側の場合) 
 _1             
    
    5([:*-)3         
 1      (両側の場合) 
    
    *(5-3)          
1
Cap
キャップ
X [: Y
単項又は二項関数の意図し ない用法を排除する。
abs=.| : [:      
 abs _4 0 5       
4 0 5           

3 | _4 0 5       
4 0 5           

3 abs _4 0 5      

valence error       

| ] _4 0 5       
4 0 5           

これで単項に限定できたか思えるが、        

3 | ] _4 0 5      
4 0 5           

のように左右に引数を入れ
てもエラーにならない。  

ジェランドとコントロール機能

用法APL結果と例(単項) 用法結果と例(両項)
\[ \sim \]
Reflexive
両側化
副詞 u~ Y
二項動詞に$\sim$を付加すると、Yを左右の引数として両 側演算を行なう。 u~ y はy u yと同じ
  /:~ 1 3 0 5 2 4
0 1 2 3 4 5 NB.upsort
  
   +~3
6  
 
Passive
交換
副詞 X u~ Y
u ~y は左右の引数を反対(交換) にして演算を行なう。

1 2 3 -~ 4 5 6     
 3 3 3           

    (4 5 6)-(1 2 3)    
3 3 3           
\[ \sim \]
~
Evoke
呼出し
(接続詞)
'm' ~ Y
ユーザー定義の動詞(代動詞)を名前で呼び出してその動詞 を実行させる。

'm'~ y は m yと同じ結果を与える。

    sum=.+/         
 
    'sum'~ i.5      
10
用法APL結果と例(単項) 用法結果と例(両項)
/
Insert
挿入
u / Y
m / Y
(副詞)
動詞(u)の場合は、アイテム 間にuを挿入した演算と同等

ジェランド( u`v/)の場合は、u,v の各要素を右引数の各アイテ ムに指定順に挿入する。

    +/ i.5          
10

(0+1+2+3+4)

    */ >:i.5
120 NB.パイ関数

(1*2*3*4*5)
\[ \sum , \Pi \]
Y;(+/ Y);+/ "1 Y=.i.2 3
+-----+-----+----+
|0 1 2|3 5 7|3 12|
|3 4 5|     |    |
+-----+-----+----+

テーブル等の一般アレイには 
ランクで作用方向を指定する 
Table
一般外積
X u/ Y
(>:i.5) */ table >:i.5
+--+-------------+
|*/|1  2  3  4  5|
+--+-------------+
|1 |1  2  3  4  5|
|2 |2  4  6  8 10|
|3 |3  6  9 12 15|
|4 |4  8 12 16 20|
|5 |5 10 15 20 25|
+--+-------------+
tableは見出しを付ける関数
用法APL結果と例(単項)
`
Tie
(接続詞)
u`v
u`v
u`m@.
n`v@.
u`v@.
複数個の動詞を連結して動名詞(ジェランド)を作る。

スラッシュ (/)やオブリーク(/.) アジェンダ(@.)と共に用いる

    +`*/ i.6         
29
 
    0+1*2+3*4+5       
29
 
    +`%/ 3 1 4        
3.25
 
    3+1%4          
3.25
 (演算子を交互に挿入する) 
 
    +:`*/. _2 3
_4
 1

演算子を交互に作用させる。/.を用いる 
   
  !`*: /. 3 4 5      
6
16
120

順に(!3),(*:4),(!5)を求めている        
`:
Evoke- Gerund
m`:0
m`:3
m`:6
次の3タイプがあり、右引数により指定する。 \[ \begin{array}{cc|c} m&`:0&Append\\ m&`:3&Insert\\ m&`:6&Train\\ \end{array} \]
(+:`-:`*:`%:)`:(0) i.5

+: 0   2       4       6  8

-: 0 0.5       1     1.5  2

*: 0   1       4       9 16

%: 0   1 1.41421 1.73205  2

Append(演算子を逐一作用させる) 

    +`* `:(3) i.5        
14

(3)はInsertで交互に演算する +`*/ i.5と同じ        

  +/`%`# `:(6) i.5
2

 (+/%#)i.5 NB. mean
2
用法APL結果と例(単項) 用法結果と例(両項)
@.
Agenda
アジェンダ
m@.v Y
関数型の条件文でジェランドmを実行させる条 件を記述するときに用いる
  a,: 2&| a

a=.  2 3 4 5 6 7 

(2&|)0 1 0 1 0 1 

 cond=.  +:`-: @. (2&|)

   cond "0 a
4 1.5 8 2.5 12 3.5

条件文は()に入れる。ランク"0も必要
Agenda
アジェ ンダ
X m@.v Y
 
片側形の場合と同様    

   2 +`^  @. <3
8

2<3は真(1)なので、~ 
の方(2^3)を実行する 

3 +`^@.< 2       
5

(3+2)の方を実行する 
^:
Power
反復
(接続詞)
u^:n Y
動詞uをn回実行する。

nは一般アレイでも構わない。

タシット型のループ

   >: ^:(3) i.6
3 4 5 6 7 8
  
   >: ^:(i.3) i.6
0|0 1 2 3 4 5
1|1 2 3 4 5 6
2|2 3 4 5 6 7

(i.n)で経過を観察できる

    %:^:_1 i.5        
 0 1 4 9 16         
  • u ^:_1はuの逆演算で *: i.5(2乗)と同じである。
  • ^: _/は収束まで反復する(無限ループに注意)
関数の主要部を明示型で作成し ^:(100)などとする事もできる。
Power
反復
X u^:n Y
片側形と同じく反復演算  

3 *^:3 i.5       
0 3 27 54 81 108     

3 *^:(i.5) 3      
3 9 27 81 243       
用法APL結果と例(単項)
Adverse
(接続詞)
u::v
u::v/の結果はエラーが 無ければuを、エラーのとき は停止せずにvを実行する。

cf. try catch

M.
Memo
記憶
反復計算で関数と結果をメモリーに 保存して効率を高める。(早くなる場合があるが効かない場合もある) (詳細は2章)
$:
Self Reference
再帰
$:を用いた再帰
   1:`(] * $:@<:)@.*5
120

   */ >:i.5
120
詳細は2章