Haskellで値による呼び出しラムダ計算を実装する場合、オブジェクト言語の関数(つまり、値による呼び出しラムダ計算)の引数の評価を強制して、必要な呼び出しを回避する必要がありますメタ言語(すなわち、Haskell)の評価順序?
具体的には、高次の抽象構文を使用した次の実装の場合:
data Exp
= Abs (Exp -> Exp)
| App Exp Exp
eval :: Exp -> Exp
eval exp = case exp of
Abs _ -> exp
App opr opd -> case eval opr of
Abs fun -> eval (fun $ eval opd) -- argument evaluation
コメント付きの行で、代わりにeval opd
を使用しての評価を強制する必要がありますか?fun $! eval opd
オブジェクトとメタレベルの間の評価順序の依存性は、CPS変換によって回避できることを私は知っています。しかし、私は今のところそれを気にしたくありません。値による呼び出しがHaskellで忠実に実装されていることを確認したいだけです。私が見た多くの実装例はこれを考慮していないように思われるので、私はこの質問を提起しました。つまり、これらの実装は強制されませんeval opd
。彼らがそれを無視しているのか、それとも私が考えすぎているのかしら。ありがとう。