SML中的“循环”功能声明

时间:2011-02-22 19:17:36

标签: function sml function-declaration

我想以“循环”方式使用函数,如以下示例所示:

fun cll1 (s)= cll2(s);
fun cll2 (s)= cll3(s);
fun cll3 (s)= cll(s);

写入此操作会在SML中产生错误,构造函数cll2未绑定。有人可以帮我写这些内容吗?它可能在C;我想用SML编写它。

2 个答案:

答案 0 :(得分:7)

您需要and关键字。

fun cll1 s = cll2 s
and cll2 s = cll3 s
and cll3 s = cll s

显然这些定义不会发生,因为它是一个无限递归(通常你会测试一个或多个函数中的基本情况),但这是一般形式。

答案 1 :(得分:0)

在这种情况下,由于cll1取决于cll2cll2 cll3cll3取决于某些无关的内容(即函数实际上不是如你所想的那样循环,你也可以写

fun cll3 (s)= cll(s);
fun cll2 (s)= cll3(s);
fun cll1 (s)= cll2(s);

(当然,在这种情况下,因为它完全相同,所以也可以写val (cll1,cll2,cll3) = (cll,cll,cll)。但这可能不是很有意义。)

也就是说,这与循环定义无关,而不是你已经说明了你的问题;

也是如此
val a = b
val b = 0

(如果意图是a = b = 0)。

这里要说的是,与c中的函数不同,sml中的声明按顺序进行计算,如果要引用尚未声明的内容,则必须明确 - {{1}这是通常的做法,是的,因为从语义上讲,无论如何,它表明这些函数集合在一起,因此它们可以相互引用。 / p>