Как писать взаимно рекурсивные функции в 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/