【问题标题】:Multi subroutine recursive in RakuRaku中的多子程序递归
【发布时间】:2020-09-14 10:24:00
【问题描述】:

我在学乐,跟着书Thinking in Raku

我需要定义一个 ackermann 函数的练习。

我定义了一个正整数子集:

subset Positive-Integer of Int where { $_ > 0}

然后我通过递归版本使用:

multi ackermann(0, Positive-Integer $n) {
    $n + 1;
}

multi ackermann(Positive-Integer $m, 0) {
    ackermann $m - 1, 1;
}

multi ackermann(Positive-Integer $m, Positive-Integer $n) {
    ackermann $m - 1, ackermann $m, $n - 1;
}

但是执行我执行时得到的代码:

阿克曼 3, 4;

> * * &ackermann
> > * * &ackermann
> > * * &ackermann
> > ackermann 3, 4
Cannot resolve caller ackermann(Int:D, Int:D); none of these signatures match:
    (0, Int $n)
    (Int $m, 0)
  in sub ackermann at <unknown file> line 3
  in sub ackermann at <unknown file> line 3
  in sub ackermann at <unknown file> line 3
  in sub ackermann at <unknown file> line 3
  in sub ackermann at <unknown file> line 3
  in sub ackermann at <unknown file> line 3
  in sub ackermann at <unknown file> line 3
  in block <unit> at <unknown file> line 2

> 

我不明白这里发生了什么。

【问题讨论】:

    标签: raku


    【解决方案1】:

    从您的错误输出来看,您似乎试图在 REPL 中运行这些示例。查看错误输出中的实际错误,它似乎缺少这个候选:

    multi ackermann(Positive-Integer $m, Positive-Integer $n) {
        ackermann $m - 1, ackermann $m, $n - 1;
    }
    

    如果我将您示例的整个代码放入一个文件中:

    subset Positive-Integer of Int where { $_ > 0}
    
    multi ackermann(0, Positive-Integer $n) {
        $n + 1;
    }
    
    multi ackermann(Positive-Integer $m, 0) {
        ackermann $m - 1, 1;
    }
    
    multi ackermann(Positive-Integer $m, Positive-Integer $n) {
        ackermann $m - 1, ackermann $m, $n - 1;
    }
    
    say ackermann 3, 4;
    

    我得到了预期的结果 (125)。

    所以在我看来,您在将代码输入到 REPL 会话时出现了某种错误。

    专业提示:如果您尝试使用多行代码的示例,通常将每个示例存储到单独的文件中会更容易。这使您可以更好地监督代码,更容易进行更改并查看其结果,并且如果您想重新查看过去做过的示例,您可以稍后再返回。

    【讨论】:

    • 感谢您的建议,我在 emacs 中使用 raku-mode 并将其发送到 raku-repl,❯ raku ackermann.raku 125 所以我终于在发送此信息的过程中发现了错误到 emacs 中的 raku-repl。
    猜你喜欢
    • 2015-12-12
    • 1970-01-01
    • 2021-04-10
    • 2019-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    • 1970-01-01
    相关资源
    最近更新 更多