在 Haskell 中实现按值调用 lambda 演算时,我是否应该强制评估对象语言中函数的参数(即按值调用 lambda 演算)以绕过按需调用元语言(即 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
. 不知是他们忽略了还是我考虑太多了。谢谢。