0

我正在为有关 haskell 的课程做作业,我们正在构建一个解释器。第一组函数是评估变量,

evalE (Var x) s        = subEv (Map.lookup x s)
where subEv (Just a)   = a
      subEv (Nothing)  = (IntVal 0)
evalE (Val v) s       = v
evalE (Op o e1 e2) s  = (evalE e1 s) 'o' (evalE e2 s)

因此,前两个版本工作正常,问题出在第三个 evalE 上,编译器(evalE e1 s) 'o' (evalE e2 s)一直o解释(evalE e2 s)(evalE e1 s)

我不知道为什么它忽略了第一个右括号的存在,而且我是haskell的新手,所以我看不到该行中有任何语法错误。但无论如何,编译器不会编译并说 evalE 的参数太多,而且我很快就会失去耐心,因为它似乎没有任何问题。我完全错过了这里的东西吗?

在进一步测试中,在调用函数的 evalE 代码中的任何地方都会出现相同的问题(即使是非递归的函数似乎也忽略了 ')' )

4

1 回答 1

5

我假设这o是一个有两个参数的函数,并且您想将其用作中缀运算符。然后你必须使用反引号而不是单引号(用于字符文字)。

尝试如下更改您的最后一个子句:

evalE (Op o e1 e2) s  = (evalE e1 s) `o` (evalE e2 s)

总结:foo 'f' bar表示“foo以字符'f'bar作为参数调用”,而foo `f` bar表示“应用于ffoobar

所以编译器的行为是完全正确的。

于 2013-02-02T00:36:48.323 回答