我正在构建一个名为 Haskell 解释器的调用,并且我想实现一个函数short :: Val -> Exp -> Error Val
来评估应用于表达式的值。我不想评估短路布尔二元运算符的第二个参数(即((&&) False)
and ((||) True))
,也不想评估传递给单元 lambda ( \() -> ...
) 抽象的参数。
在像 Haskell 这样的惰性语言中,我知道您会在 Prelude 中内置短路布尔二元运算符。我在想它可以做这样的事情:
short :: Val -> Exp -> Error Val
short (Partial (&&) False) = False
-- Making use of Partial Oper Val that is defined in Val
但我已经知道会出现类型错误。我不确定该怎么做。有什么建议么?
一些额外的定义:
data Val = VUnit | VNil
| VN Int | VB Bool | VOp Oper
| Partial Oper Val
| VLamUnit Exp (Env Val)
| VLam String Exp (Env Val)
| VListBool [Bool]
| VListInt [Int]
data Exp = Unit | Nil
| N Int | B Bool | Var String | Op Oper
| App Exp Exp
| LamUnit Exp
| Lam String Exp
| If Exp Exp Exp
| Let [(String, Exp)] Exp
data Error a = S a
| Error String