我想以“循环”方式使用函数,如以下示例所示:
fun cll1 (s)= cll2(s);
fun cll2 (s)= cll3(s);
fun cll3 (s)= cll(s);
写入此操作会在SML中产生错误,构造函数cll2
未绑定。有人可以帮我写这些内容吗?它可能在C;我想用SML编写它。
答案 0 :(得分:7)
您需要and
关键字。
fun cll1 s = cll2 s
and cll2 s = cll3 s
and cll3 s = cll s
显然这些定义不会发生,因为它是一个无限递归(通常你会测试一个或多个函数中的基本情况),但这是一般形式。
答案 1 :(得分:0)
在这种情况下,由于cll1
取决于cll2
,cll2
cll3
和cll3
取决于某些无关的内容(即函数实际上不是如你所想的那样循环,你也可以写
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>