Haskell似乎忽略了函数内函数调用中的结束')'

时间:2013-02-02 00:32:00

标签: haskell syntax compiler-construction

我正在为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代码中调用函数的任何地方(即使是非递归的函数似乎忽略了')')

1 个答案:

答案 0 :(得分:5)

我假设o是一个双参数函数,您希望将其用作中缀运算符。然后你必须使用反引号而不是单引号(用于字符文字)。

尝试按如下方式更改您的最后一句:

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

总结:foo 'f' bar表示“使用foo'f'作为参数调用bar,而foo `f` bar表示”申请{{1} } {} {}} {}} {/}}。{/}

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