SchemeやPythonなどの熱心な言語では、パラメータなしのラムダ式を使用して、評価を遅延させることができます。たとえば、Scheme(チキンスキーム)の場合:
#;1> (define (make-thunk x) (lambda () (+ x 1)))
#;2> (define t (make-thunk 1))
#;3> (t)
2
2行目t
は未評価の式にバインド(lambda () (+ 1 1))
され2
、3行目で評価されます。
同様に、Pythonでは:
>>> def make_thunk(x): return lambda: x + 1
...
>>> t = make_thunk(1)
>>> t()
2
この手法を使用すると、熱心な言語で遅延評価を実装できます。
そのため、言語が既に遅延しており、遅延式を作成する必要がないため、Haskellにはパラメーターなしのラムダ式がないと予想していました。驚いたことに、Haskellではラムダ式を書くことが可能であることがわかりました
\() -> "s"
これは次の()
ような値にのみ適用できます:
(\() -> "s") ()
結果を出す
"s"
この関数を()
例外以外の引数に適用すると、(少なくともテスト中に確認できる限り)例外がスローされます。これは、SchemeやPythonでの遅延評価とは異なります。これは、式を評価するために引数が必要なためです。では、変数のないラムダ式(など\() -> "s"
)はHaskellで何を意味し、それは何のために役立つのでしょうか?
また、同様のパラメーターなしのラムダ式が(いくつかの種類の)ラムダ計算に存在するかどうかも知りたいです。
()
例外をスローする以外の引数にこの関数を適用すると...」プログラムに例外がスローされますか、それともコンパイラーがコードが型チェックしないと文句を言うのですか?