【问题标题】:SML Issue with a function creating another function一个函数创建另一个函数的 SML 问题
【发布时间】:2014-03-07 15:05:07
【问题描述】:

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

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;

从比萨饼中取出金枪鱼3

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

rem_ingredient Tuna my_pizza2; 

我应该使用 2 个参数直接从 Pizza2 对象中删除 Tuna。

问题:

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

再次,请不要直接回答,我想学习这些材料,但我不确定我要修复什么。

【问题讨论】:

    标签: function constructor sml


    【解决方案1】:

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

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

    【讨论】:

    • 啊,好吧。我们在课堂上还没有做到这一点。我认为构造函数可能会有所不同,基本上就像 if then 语句一样,用于处理传入函数的参数。
    • 是的,构造函数可以不同,但​​所有右侧都必须有一个共同的类型。否则,您将如何为整体功能指定类型?
    • 对,很有道理,感谢您将我引向正确的方向。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    相关资源
    最近更新 更多