如何在Haxe中编写相互递归的函数

时间:2014-06-21 21:50:23

标签: recursion haxe mutual-recursion

我试图在Haxe 3中编写一个简单的相互递归函数,但无法获得编译代码,因为首先出现的相互函数中的任何一个都会报告该组中的其他函数未定义。下面是一个最小的例子,其中使用相互定义的函数oddeven来确定奇偶校验。

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中似乎是非法的。如何定义上面的相互递归函数?它有可能吗?

注意:我希望oddeven都包含在全局可见函数test中的本地函数。

谢谢,

1 个答案:

答案 0 :(得分:3)

您可以使用function myFn() {}语法,而不是将myFn = function() {}语法用于局部变量。然后,您可以在使用之前声明函数类型signiatures。

您的代码现在应该如下所示:

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只需要知道evenodd存在,并且在使用之前设置为某种东西(即使它为空)。我们知道在实际调用它们之前,我们将它们都设置为可调用函数。

请参阅haxe:http://try.haxe.org/#E79D4