2

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

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

写这个会在 SML 中产生一个错误,即构造函数cll2未绑定。有人可以帮我写一些类似的东西吗?在 C 中是可能的;我想用 SML 写它。

4

2 回答 2

8

你想要and关键字。

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

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

于 2011-02-22T19:24:06.480 回答
0

在这种情况下,由于cll1取决于cll2cll2oncll3cll3不相关的东西(即函数实际上并不像你想象的那样循环),你也可以写

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这是通常的做法,是的,因为从语义上讲,无论如何,它表明这组函数旨在被放在一起,以便它们可以相互引用。

于 2012-11-26T01:40:54.687 回答