7.1 ヘッダーあり定義ブロック

以下は𝕩をdeconstructするだけのヘッダー(𝕊が含まれてない)だが、これも許されるので注意。

    F ← {a1‿a2‿a3 : a1+a2+a3}

紛らわしい例

    {•Show"ok" ⋄ 1}⍟10 0

Repeat ''の左引数はヘッダーもなく特殊名も含まないので複文ブロックである。 複文ブロックは関数Repeatの適用前に評価されるので"ok"が出力され1に簡約される。 従って上記のコードは以下と等価である。

    •Show"ok" ⋄ 1⍟10 0

1はRepeatの左引数なのでfunction roleが与えられ、1を返す恒等関数とみなされる。 結局、エラーなく恒等関数を10回繰り返し実行し1が返される。 一方、画面への出力は1回のみとなる。

紛らわしい例2

ブロックは必ずしも関数名を踏まなくてもよい。ただし注意が必要になる。

   •Type¨{x‿y : 1}‿{x : 1}
⟨ 3 1 ⟩        # 両者の型は違う

このように{x‿y : 1}は関数であるが、{x : 1}は数だと言われる。何が起きているのだろうか。

まず、関数が右引数しか場合はない場合は関数名をブロックに含まなくてもよい

If a header consists of 𝕊 with one argument, like 𝕊 a‿b: or 𝕊𝕩:, the 𝕊 can be left off. See case headers below for examples.

Special names in headers

    {x‿y : 1}@          # 1引数関数。引数を分解しているが参照はしてない定数関数
1
    {𝕊 x‿y : 1}@        # 上のと同じ関数の冗長表現
1
    {𝕊 𝕩 : 1}@          # 上のと同じ関数の冗長表現
1
    {x‿y : x|y}4‿10     # 引数を参照する1引数関数。
2

この仕様には例外がある。

The exception is if the argument is a plain name, as in 𝕊 arg:, because the header arg: is a label for an immediate block as described in the next section.

関数名を書かず、引数をパターンマッチングで分解しない場合はブロックは関数ではなく複文として処理される

    {x : 1}      # このブロックは関数ではないので引数を必要とせず値が返される。
1

ここでヘッダーに現れているx引数名ではなくこのブロックを自己参照するラベルである。 といっても本体中で使うことはできない。なんというか変な所に置かれたtype annotation1程度に考えるしかなさそうである。

For immediate blocks, this is the only type of header possible, and it must use an identifier as there's no applicable special name. However, the name can't be used in code: it doesn't make sense to refer to a value while it's still being computed!

1

ラベルが小文字で始まっていることからこのブロックにsubjectとしての型が与えられている。 大文字だとどうなるだろうか。

   {F : 3}1         # 定数関数になっている
3
   {F : 3}          # 関数なので引数がなければ関数そのものが返される
(function block)
   {F : f}10        # Fはブロックそのものを自己参照しており、引数を指しているわけではない
(function block)    # なので引数を与えても関数そのものが返値になる