Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell似乎忽略了结束(';)';在函数内部的函数调用中_Haskell_Syntax_Compiler Construction - Fatal编程技术网

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) 因此,前两个版本工作正常,问题是在

我正在为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 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”是一个表达式的结果)是正确的。谢谢你,这很有效,我没有意识到他们需要反勾号,我的坏哈哈。谢谢你,这很有效,我没有意识到他们需要反勾号,我的坏哈哈。