请注意,这是家庭作业的一部分 - 所以请,没有直接回答。我只是需要一些帮助来找到答案,所以链接到一个教程,以帮助我理解材料将是伟大的。
SML代码:
datatype 'ingredient pizza =
Bottom
| Topping of ('ingredient * ('ingredient pizza));
datatype fish =
Anchovy
| Shark
| Tuna;
(* Testing Pizza Objects *)
val my_pizza1 = Topping(Tuna, Topping(Shark, Topping(Anchovy, Bottom)));
val my_pizza2 = Topping(Shark, Topping(Tuna, Topping(Anchovy, Bottom)));
val my_pizza3 = Topping(Anchovy, Topping(Shark, Topping(Tuna, Bottom)));
(* My Function Start *)
fun rem_ingredient Bottom = Bottom
| rem_ingredient(t) = fn(Topping(p)) => Topping(t, rem_ingredient(p))
| rem_ingredient(Topping(t,p)) = Topping(t, rem_ingredient(p));
(* My Function End *)
如果我用1参数调用函数rem_ingredient
val rem_tuna = rem_ingredient Tuna;"
我应该得到一个可以调用
的函数rem_tuna my_pizza3;
从pizza3中删除金枪鱼
如果我使用2个参数调用相同的函数
rem_ingredient Tuna my_pizza2;
我应该使用2个参数直接从pizza2对象中删除Tuna。
问题:
我一直收到错误:语法错误:在rem_ingredient的第3个构造函数上用DARROW替换EQUALOP,我知道我错过了一些可能很明显的东西。我们上周刚开始在编程语言中学习SML,我仍然试图理解它。任何指点我的人都会受到赞赏。
再次,没有直接的答案,我想学习这些材料,但我不确定我要修复的是什么。
答案 0 :(得分:2)
要摆脱语法错误,您需要在fn
表达式周围添加括号(因为以下| pattern
被视为fn
的一部分)。
然而,这不是你真正的问题。写入的函数没有一致的类型,因为第二种情况返回一个函数而其他情况不返回。