问题描述
我正在学习{@ {3}}这本书
我需要定义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;
}
但是执行我在执行时得到的代码:
ackermann 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
>
我不明白这是怎么回事。
解决方法
从错误输出来看,您似乎正在尝试在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,$n - 1;
}
say ackermann 3,4;
我得到了预期的结果(125
)。
在我看来,您在将代码输入REPL会话时出现了某种错误。
专业提示:如果您尝试使用多行代码的示例,通常将每个示例存储到单独的文件中会更容易。这样可以使您对代码有更多的监督,可以更轻松地进行更改和查看其结果,并且如果要重新查看过去所做的示例,还可以追溯到以后。