"Циркулярная" декларация функции в SML - PullRequest
2 голосов
/ 22 февраля 2011

Я хочу использовать функции круговым способом, как показано в следующем примере:

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

Запись этого приводит к ошибке в SML, что конструктор cll2 не связан. Может ли кто-нибудь помочь мне написать что-нибудь подобное? Это возможно в C; Я хотел бы написать это на SML.

Ответы [ 2 ]

7 голосов
/ 22 февраля 2011

Вам нужно ключевое слово and.

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

Очевидно, что эти определения не подойдут, поскольку это бесконечная рекурсия (обычно вы проверяете базовый случай в одной или нескольких функциях), но это общая форма.

0 голосов
/ 26 ноября 2012

в этом случае, поскольку 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оценивается по порядку, и вам нужно быть явным, если вы хотите сослаться на то, что вы еще не объявили - и and - это обычный способ сделать это, да, потому что, семантически, в любом случае, это означает, чтонабор функций предназначен для объединения, так что они могут ссылаться друг на друга.

...