Function 函数创建另一个函数时出现SML问题

Function 函数创建另一个函数时出现SML问题,function,constructor,sml,Function,Constructor,Sml,请记住,这是作业的一部分,所以请不要直接回答。我只是需要一些帮助来找出答案,所以一个链接到一个教程来帮助我理解材料将是伟大的 SML代码: datatype 'ingredient pizza = Bottom | Topping of ('ingredient * ('ingredient pizza)); datatype fish = Anchovy | Shark | Tuna; (* Testing Pizza Objects *) val

请记住,这是作业的一部分,所以请不要直接回答。我只是需要一些帮助来找出答案,所以一个链接到一个教程来帮助我理解材料将是伟大的

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_component

val rem_tuna = rem_ingredient Tuna;" 
我应该得到一个可以调用

rem_tuna my_pizza3;
从比萨饼中取出金枪鱼

如果我用两个参数调用同一个函数

rem_ingredient Tuna my_pizza2; 
我应该使用2个参数直接从pizza2对象中删除Tunar

问题是:

我不断得到错误:语法错误:在rem_成分的第三个构造函数上用DARROW替换EQUALOP,我知道我遗漏了一些可能很明显的东西。我们上周才开始学习编程语言中的SML,我还在努力理解它。任何为我指点方向的人都将不胜感激


同样,请不要直接回答,,我想学习材料,但我不确定我要修复什么。

为了消除语法错误,需要在
fn
表达式周围加括号(因为以下
模式
被视为
fn
的一部分)


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

Ah,好的。我们在课堂上还没讲到这一点。我认为构造函数可以不同,基本上类似于if-then语句,用于处理函数中的参数。是的,构造函数可以不同,但所有右侧都必须有一个公共类型。否则,您会如何为整个函数指定一个类型?对,非常有意义,感谢您为我指明了正确的方向。