【问题标题】:SML: declear but not define functionSML:清除但未定义功能
【发布时间】:2013-11-19 05:17:18
【问题描述】:

这只是一个例子。这两个功能是相连的。你真的想调用最低的那个。然后它应该返回两者中最小的数字。这当然行不通,因为您在编译 reducemax 函数时调用了一个未定义的函数,当时称为最低。

fun reducemax (i:int * int):int =
    if (#1 i) > (#2 i)
    then lowest(((#1 i)-1), (#2 i))
    else lowest((#1 i), ((#2 i)-1));

fun lowest (i:int * int):int =
    if (#1 i) = (#2 i)
    then (#1 i)
    else reducemax((#1 i), (#2 i));

我知道我可以使用 let 来在最低的内部声明 reducemax 函数,但是有什么办法可以解决这个问题吗?例如在 C 中,声明函数而不定义它。我确实理解 reducemax 函数需要知道最低将返回一个 int 并采用一个 int * int 参数。

【问题讨论】:

    标签: function sml smlnj


    【解决方案1】:

    只需将第二个fun 替换为and 并删除分号。这定义了相互递归的函数。

    【讨论】:

    • 啊,我依稀记得现在学这个!!谢谢你。有没有其他方法可以做到这一点,我的意思是像在 C 中一样?
    • 并非如此。也就是说,您不能在使用函数之前声明它们。你可以在没有and(甚至fun)的情况下使用函数引用来实现相互递归的函数,使用一种称为backpatching的技术,这就像在C中发生的那样。但是,在你真正知道什么之前,你会想要避免这种情况您正在使用 SML。
    猜你喜欢
    • 1970-01-01
    • 2014-10-14
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    • 2018-10-19
    • 2023-03-23
    • 2013-12-31
    • 2013-09-18
    相关资源
    最近更新 更多