SML: объявить, но не определить функцию

Это всего лишь пример. Эти две функции связаны. Вы действительно хотите позвонить тому, кого назвали самым низким. Затем он должен вернуть наименьшее число из двух. Это, конечно, не сработает, потому что во время компиляции функции reducemax вы делаете вызов неопределенной в то время функции, называемой наименьшей.

fun reducemax (i:int * int):int =
    if (#1 i) > (#2 i)
    then lowest(((#1 i)-1), (#2 i))
    else lowest((#1 i), ((#2 i)-1));

fun lowest (i:int * int):int =
    if (#1 i) = (#2 i)
    then (#1 i)
    else reducemax((#1 i), (#2 i));

Я знаю, что могу использовать let, чтобы объявить функцию reducemax внутри самого низкого уровня, но есть ли способ обойти это? Например, как и в C, объявите функцию, не определяя ее. Я понимаю, что функция reducemax должна знать, что самый низкий вернет int и примет аргумент int * int.


person Horse SMith    schedule 07.11.2013    source источник


Ответы (1)


Просто замените второй fun на and и удалите точки с запятой. Это определяет взаимно рекурсивные функции.

person seanmcl    schedule 07.11.2013
comment
Ах, я смутно припоминаю, что узнал об этом сейчас!! Спасибо. Есть ли другой способ сделать это, я имею в виду, как в C? - person Horse SMith; 07.11.2013
comment
Не совсем. То есть вы не можете объявлять функции до их использования. Вы можете реализовать взаимно рекурсивные функции без and (или даже fun), используя ссылки на функции, с помощью метода, называемого обратным патчем, который чем-то похож на то, что происходит в C. Однако вам следует избегать этого, пока вы действительно не знаете, что делаете. в СМЛ. - person seanmcl; 07.11.2013