# 関数 関数は値を受け取り、値を返す純粋な式である。 ## 構文 ```dcdl (value: Int) => value + 1 ``` 関数呼び出しは通常の呼び出し構文で行う。 ```dcdl let increment = (value: Int) => value + 1; in increment(41) ``` 複数の parameter を指定できる。 ```dcdl (input_a: { hoge = Int & >= 0; }, input_b: { fuga = Int; }) => { hoge = input_a.hoge; fuga = input_b.fuga; } ``` parameter range は省略できる。 range がある場合、引数は参照された時点で `as` と同じ規則によって検証・絞り込みされる。 ## Scope and evaluation 関数は lexical scope を持ち、定義された場所の bindings を参照する。 引数は遅延評価され、関数本体から参照されない引数は評価されない。 再帰的な field または argument の依存は cycle diagnostic になる。 関数は中間値として参照・呼び出しできるが、data として materialize できない。 未適用の関数が materialize 対象に残っている場合は diagnostic になる。 関数値同士の等価性は定義されず、`&` で関数値同士を合成すると conflict になる。