Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.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 - Fatal编程技术网

Haskell分析错误

Haskell分析错误,haskell,Haskell,我不太确定我做错了什么。我被困住了,不能再进步了 我将收到的错误消息放在注释中的代码中。 如果时间允许,有人能检查一下我的评估功能吗?我想我做错了什么 谢谢。你想要像这样的东西吗 let e' = {- extend env with x -} in eval e' y 正如Thomas M.DuBuisson所说,let表达式的语法无效。其次,您必须知道函数采用什么类型的参数以及返回什么类型的参数。例如,您不能将Exp与Value混用,在需要Exp类型的地方,您总是传递Exp类型的值,等等

我不太确定我做错了什么。我被困住了,不能再进步了

我将收到的错误消息放在注释中的代码中。 如果时间允许,有人能检查一下我的评估功能吗?我想我做错了什么


谢谢。

你想要像这样的东西吗

let e' = {- extend env with x -} in eval e' y 

正如Thomas M.DuBuisson所说,let表达式的语法无效。其次,您必须知道函数采用什么类型的参数以及返回什么类型的参数。例如,您不能将Exp与Value混用,在需要Exp类型的地方,您总是传递Exp类型的值,等等

eval :: Env -> Exp -> Value
-- the return type is Value
-- what are you trying to do here ? extract Value from x ...
eval e (Let [x] y) = eval e $ snd x
-- ... or from y ? Both x & y are of Exp type.
eval e (Let [x] y) = eval e y
代码中还有更多类型错误:

eval e (Primitive x [y]) = prim x [y]
-- prim expects 2nd argument of [Value] type so it can be written as
eval e (Primitive x [y]) = prim x [eval e y]
-- dtto, mixing different types is wrong
eval e (If x y z) = if x then y else z
eval e (If x y z) = let Bool x' = eval e x in
                        if x' then (eval e y) else (eval e z)
最后,main期望
IO()
作为返回类型,因此您必须以某种方式反映这一点,比如打印eval结果:

print $ eval [("y", (Number 40))] (Let [("x", (Literal (Number 2)))] (Primitive Add [(Variable "x"), (Variable "y")]))

您的
Let
处理程序需要使用新绑定扩展环境,然后使用新环境计算表达式

您的环境是一个名称、值和对的列表,但是
Let
包含一个名称、值和对的列表,因此您需要将
Exp
s转换为
Value
s以扩展环境。请注意,
eval
Exp
转换为

但是,由于
Let
可以保存多个绑定,因此需要决定是并行计算
Exp
还是顺序计算
Let
Let*
在lisp中的差异。绑定会影响以下绑定的值吗?根据该问题的答案,您将发现自己使用
map
foldl
转换列表

您对
原语
s求值的问题是双重的。首先,您使用的模式将只匹配一个元素列表,但是您的原语显然使用不同数量的参数。模式不应该使用列表语法,因为
原语
构造函数保证在该位置将有一个列表。相反,您应该使用与任何内容匹配的模式(如纯
y
)。其次,
prim
函数需要一个
值的列表,但是
Primitive
构造函数包含一个
Exp
的列表,因此您需要转换它们(但是,由于参数的计算不会影响环境,因此您将使用
map

为了让您朝着正确的方向前进,请:

eval e (Primitive x [y]) = prim x [eval e y]
[y]
模式将只匹配单个元素列表,该元素绑定到
y
,而
[eval e y]
将生成单个元素列表。您需要的是一个匹配整个列表的模式,然后您需要通过对列表的每个元素应用
eval e
来转换该列表

If
eval
也有问题。条件、then和else都是
Exp
类型,但是eval应该返回
值,因此您必须转换某些内容。最后,haskell
if
希望条件是haskell
Bool
,但您的条件是Exp
。您需要将
Exp
计算为
,然后以某种方式从
中提取haskell
Bool
。您希望
Number
String
Value
s在您的语言中表现得像
Bool
s(像python),还是应该只
Bool
Value
s表现得像
Bool
s


最后,最后,如果您有任何类型错误(例如尝试将
字符串添加到
数字中),或者您向原语提供了错误数量的参数,那么
prim
函数将导致模式匹配失败(可能在代码中,您必须编写从
If
条件中提取
Bool
)。这可能是您想要的,也可能不是您想要的…

eval e(Let[x]y)=Let(Let fst x=snd x)=y
这一行的意思是什么?这在语法上甚至都不正确。EXPR
中使用
let
无效(除了do表示法,但这只是sugar)。没有in时,元素let无效。好的。如果你主要看一下测试用例,eval取env,exp.env的形式为[(字符串,值)].String成为一个值为value的变量,该变量进入env…这就是我的意思。但我想这不是我的代码的意思。可能的重复我一定误解了Let的确切作用。我还想警告一下表达式
[x]
在等式的左侧,即列表类型上的模式匹配,只匹配一个元素的列表。非常感谢,我已经为此作业苦恼了5个多小时。但当我运行它时,我收到这样一条消息:“函数eval中的非穷举模式。”我该如何处理这个错误?这个错误意味着什么?非常感谢。我知道问题是什么了。当我运行那个测试用例时,当它点击“eval e(Variable x)=fromJust(lookup x e)”,它会崩溃,因为它什么也不返回。“e”这意味着环境应该包含多个元组,但我不知道如何向其中添加元组,而且我担心这会违反Env条件,即“type Env=[(String,Value)]。”我想这意味着它在列表中只能包含一个元组,对吗?“eval e(Primitive x[y])=prim x[eval e y]”我认为这段代码会引起很多问题,因为[y]是一个表达式列表,代码会将其转换为一个表达式。感谢您的详细解释,但我仍然不了解primitive的一些内容。也就是说,如果我有“primitive Add[(Literal(Number 13)),(Literal(Number 12))”),这将导致