0 compiler-construction syntax haskell
我正在为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)
Run Code Online (Sandbox Code Playgroud)
所以,前两个版本工作正常,问题出现在第三个evalE上,编译器一直在解释(evalE e1 s) 'o' (evalE e2 s)
,好像是o
和(evalE e2 s)
作为参数给出了(evalE e1 s)
我无法弄清楚为什么它忽略了第一个右括号的存在,而且我是haskell的新手,所以我无法看到该行中的语法错误.但无论如何,编译器都不会编译,并且说evalE有太多的参数,而且我很快就会失去耐心,因为它看起来似乎不应该是错的.我在这里完全遗漏了什么?
在进一步测试时,同样的问题出现在evalE代码中调用函数的任何地方(即使是非递归的函数似乎忽略了')')
我假设这o
是一个双参数函数,你想用它作为中缀运算符.然后你必须使用反引号而不是单引号(用于字符文字).
尝试更改您的最后一句如下:
evalE (Op o e1 e2) s = (evalE e1 s) `o` (evalE e2 s)
Run Code Online (Sandbox Code Playgroud)
包装:foo 'f' bar
表示" foo
用字符'f'
和bar
作为参数调用",foo `f` bar
意思是"适用f
于foo
和bar
".
所以编译器的行为是完全正确的.