SML问题与创建另一个函数的函数

时间:2014-03-07 03:17:32

标签: function constructor sml

请注意,这是家庭作业的一部分 - 所以请,没有直接回答。我只是需要一些帮助来找到答案,所以链接到一个教程,以帮助我理解材料将是伟大的。

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,我仍然试图理解它。任何指点我的人都会受到赞赏。

再次,没有直接的答案,我想学习这些材料,但我不确定我要修复的是什么。

1 个答案:

答案 0 :(得分:2)

要摆脱语法错误,您需要在fn表达式周围添加括号(因为以下| pattern被视为fn的一部分)。

然而,这不是你真正的问题。写入的函数没有一致的类型,因为第二种情况返回一个函数而其他情况不返回。