Haskell似乎忽略了结束(';)';在函数内部的函数调用中
我正在为haskell的课程做作业,我们正在制作一个口译员。第一组函数是评估变量Haskell似乎忽略了结束(';)';在函数内部的函数调用中,haskell,syntax,compiler-construction,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 (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 e1s)'o'(evalE e2s)
,就好像o
和(evalE e2s)
是作为(evalE e1s)
的参数给出的
我不明白为什么它忽略了第一个右括号的存在,而且我是haskell的新手,所以我看不出这行中有什么语法错误。但不管怎样,编译器不会编译,并且说有太多的参数需要求值,我很快就失去了耐心,因为看起来似乎没有任何错误。我是不是完全错过了什么
在进一步测试中,evalE代码中调用函数的任何地方都会出现相同的问题(即使不是递归的函数似乎也会忽略“'))我假设
o
是一个双参数函数,您希望将其用作中缀运算符。然后必须使用反勾号而不是单引号(用于字符文字)
尝试按如下方式更改最后一个子句:
evalE (Op o e1 e2) s = (evalE e1 s) `o` (evalE e2 s)
总而言之:foo'f'bar
表示“调用foo
,以字符'f'
和bar
作为参数”,而foo`f`bar
表示“将f
应用于foo
和bar
”
因此,编译器的行为是完全正确的。我假设
o
是一个双参数函数,您希望将其用作中缀运算符。然后必须使用反勾号而不是单引号(用于字符文字)
尝试按如下方式更改最后一个子句:
evalE (Op o e1 e2) s = (evalE e1 s) `o` (evalE e2 s)
总而言之:foo'f'bar
表示“调用foo
,以字符'f'
和bar
作为参数”,而foo`f`bar
表示“将f
应用于foo
和bar
”
因此编译器的行为是完全正确的。请注意,不是“haskell”忽略语法,而是您的编译器,它是。。。ghc?拥抱?nhc?yhc?-无论如何,“abc”的意思是“函数a对参数b和c的应用”(在你的例子中,“a”是表达式的结果),这是正确的。请注意,不是“haskell”忽略语法,而是你的编译器,它是。。。ghc?拥抱?nhc?yhc?-无论如何,“abc”的意思是“将函数a应用于参数b和c”(在你的例子中,“a”是一个表达式的结果)是正确的。谢谢你,这很有效,我没有意识到他们需要反勾号,我的坏哈哈。谢谢你,这很有效,我没有意识到他们需要反勾号,我的坏哈哈。