Как писать взаимно рекурсивные функции в Haxe

Я пытаюсь написать простую взаимно рекурсивную функцию в Haxe 3, но не смог заставить код скомпилироваться, потому что какая-либо из взаимных функций, которая появится первой, сообщит, что другие функции в группе не определены. Ниже приведен минимальный пример, в котором взаимно определенные функции odd а также even используются для определения паритета.

static public function test(n:Int):Bool  {
    var a:Int;
    if (n >= 0) a = n; else a = -n;

    function even(x:Int):Bool {
        if (x == 0)
            return true;
        else
            return odd(x - 1);
    }
    function odd(x:Int):Bool {
        if (x == 0)
            return false;
        else
            return even(x - 1);
    }
    return even(a);
}

Попытка скомпилировать его в neko дает:

../test.hx:715: characters 11-14 : Unknown identifier : odd
Uncaught exception - load.c(181) : Module not found : main.n

Я пытался дать предварительную декларацию odd до even как можно было бы сделать в c/ C++, но это кажется незаконным в haxe3. Как можно определить взаимно-рекурсивные функции, как указано выше? Это вообще возможно?

Примечание: я хотел иметь оба odd а также even быть локальными функциями, обернутыми в глобально видимую функцию test,

Спасибо,

1 ответ

Решение

Вместо того, чтобы использовать function myFn() {} синтаксис для локальной переменной, вы можете использовать myFn = function() {} синтаксис. Затем вы можете объявить сигнатуры типов функций перед их использованием.

Ваш код теперь должен выглядеть так:

static public function test(n:Int):Bool  {
    var a:Int;
    if (n >= 0) a = n; else a = -n;

    var even:Int->Bool = null;
    var odd = null; // Leave out the type signiature, still works.
    even = function (x:Int):Bool {
        if (x == 0)
            return true;
        else
            return odd(x - 1);
    }
    odd = function (x:Int):Bool {
        if (x == 0)
            return false;
        else
            return even(x - 1);
    }
    return even(a);
}

Это работает, потому что Haxe просто нужно знать, что even а также odd существуют, и устанавливаются на что-то (даже если это ноль), прежде чем они будут использованы. Мы знаем, что мы установим обе из них на вызываемые функции прежде, чем они будут фактически вызваны.

Смотрите на попробуйте haxe: http://try.haxe.org/

Другие вопросы по тегам