2.2 roleと型
BQNの式は以下の4つのroleのどれかを構文的に与えられる1。
- subject
- fuction
- 1-modifier
- 2-modifier
構文的というのは実際の型とは違うことがあることを意味している。 例えば、関数適用の結果は常にsubjectである。従って関数適用の結果を変数に代入するならその変数は小文字で始まらなければならない。
f ← {𝕤 ⋄ {𝕩+1}}@ # 関数を返す関数
*function*
F ← {𝕤 ⋄ {𝕩+1}}@
Error: Role of the two sides in assignment must match
f
はsubjectであるので、通常の関数に渡すことができ、その中で通常の関数として使うために関数を表すF
として参照することができる。
{𝕏 10}f # 𝕩はsubject, 𝕏は𝕩をfunctionのroleに変換したもの
11
高階関数はmodifierであると言ったが、型だけで考えるとこのように一般の関数でも関数を受け取ることができるように見えてしまう。
roleも考慮することが必要である。
関数を引数に取るprimitive関数としてreshape '⥊
'を挙げておく。
設問🧑🎓
AsFunction ← {𝕨 𝕊 𝕩 : 𝕎 𝕩}
({𝕊 x : {F y : x+y}} 1) AsFunction 2
- 上式はエラーを起こすか
AsFunction
はfunctionかmodifierか- 上式を等価変換した下式はエラーを起こすか
AsFunction ← {𝕨 𝕊 𝕩 : 𝕎𝕩}
{F y : 1+y} AsFunction 2
逆にデータがfunctionのroleを持つ例も挙げておく。
3 1
Error: Double subjects (missing ‿?)
at 3 1
^
3¨ 1
┌·
· 3
┘
modifier'¨
'の左引数の位置にあるので数値3はfunctionのroleを持ち、3を返す恒等関数となる。