【发布时间】:2012-11-20 14:33:29
【问题描述】:
我正在构建一个名为 Haskell 解释器的调用,并且我想实现一个函数 short :: Val -> Exp -> Error Val,它将评估应用于表达式的值。我不想评估短路布尔二元运算符的第二个参数(即((&&) False) 和((||) 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
【问题讨论】:
-
您能否提供更多代码,例如如何定义
Val和Exp。这没什么好继续的。 -
该代码让我们对您在那里尝试做的事情知之甚少。为什么在这里使用
&&作为模式?忽略((&&) False)不是语法合法模式这一事实,&&是 Haskell 的运算符,而不是您的语言。你不应该匹配你的语言的 && 运算符的任何表示吗? -
对此感到抱歉。我已经包含了
Val和Exp的定义
标签: haskell boolean interpreter short-circuiting