f1 f2 x
と同じ(f1 f2) x
です。関数の適用は左結合です。
ln.(f1 f2) x は ln.f1 (f2 x) と同じですか?
いいえ、まったくありません。(f1 f2) x
を引数として呼び出しf1
てf2
から、結果の関数をx
引数として呼び出します。f1 (f2 x)
引数として を呼び出しf2
、x
次にf1
の結果をf2 x
引数として呼び出します。
ln.(not eq0) x と ln.not (eq0 x)?
型指定されたラムダ計算について話しnot
、ブール値を引数として期待する場合、前者は単純に型エラーを引き起こします (eq0
は関数であり、ブール値ではないため)。型指定されていないラムダ計算について話していて、true
andfalse
が関数として表されている場合、それは がどのようnot
に定義され、どのようtrue
に andfalse
が表されているかに依存します。
true
とfalse
が教会のブール値である場合、つまりtrue
が最初の引数を返すfalse
2 引数の関数であり、2 番目の引数を返す 2 引数の関数である場合、 は関数not
と同等flip
です。つまり、2 引数の関数を取り、2 つの引数を返します。 -argument 引数が逆になっている関数。So(not eq0) x
は、他の 2 つの引数y
およびに適用されるとz
、 に評価される関数を返し((eq0 y) x) z
ます。したがって、y
が 0 の場合は を返しx
、そうでない場合は を返しますz
。