我想以“循环”方式使用函数,如下例所示:
fun cll1 (s)= cll2(s);
fun cll2 (s)= cll3(s);
fun cll3 (s)= cll(s);
写这个会在 SML 中产生一个错误,即构造函数cll2
未绑定。有人可以帮我写一些类似的东西吗?在 C 中是可能的;我想用 SML 写它。
我想以“循环”方式使用函数,如下例所示:
fun cll1 (s)= cll2(s);
fun cll2 (s)= cll3(s);
fun cll3 (s)= cll(s);
写这个会在 SML 中产生一个错误,即构造函数cll2
未绑定。有人可以帮我写一些类似的东西吗?在 C 中是可能的;我想用 SML 写它。
你想要and
关键字。
fun cll1 s = cll2 s
and cll2 s = cll3 s
and cll3 s = cll s
显然这些定义是行不通的,因为它是一个无限递归(通常你会在一个或多个函数中测试基本情况),但这是一般形式。
在这种情况下,由于cll1
取决于cll2
、cll2
oncll3
和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 中的声明是按顺序计算的,如果要引用尚未声明的内容,则必须明确说明——and
这是通常的做法,是的,因为从语义上讲,无论如何,它表明这组函数旨在被放在一起,以便它们可以相互引用。