Multi-Subroutine rekursiv in Raku
Ich lerne Raku nach dem Buch Thinking in Raku
Es gibt eine Übung, die ich brauche, um die Ackermann-Funktion zu definieren.
Ich habe eine positive Integer-Teilmenge definiert:
subset Positive-Integer of Int where { $_ > 0}
Dann gehe ich die rekursive Version durch mit:
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;
}
aber den Code ausführen, den ich beim Ausführen bekomme:
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
>
Ich verstehe nicht, was hier passiert.
Antworten
Nach Ihrer Fehlerausgabe zu urteilen, scheinen Sie zu versuchen, diese Beispiele in der REPL auszuführen. Betrachtet man den tatsächlichen Fehler in der Fehlerausgabe, so scheint dieser Kandidat zu fehlen:
multi ackermann(Positive-Integer $m, Positive-Integer $n) {
ackermann $m - 1, ackermann $m, $n - 1;
}
Wenn ich den gesamten Code Ihres Beispiels in eine Datei lege:
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;
Ich bekomme das erwartete Ergebnis ( 125).
Dies scheint mir also, dass Sie bei der Eingabe des Codes in eine REPL-Sitzung einen Fehler gemacht haben.
Pro-Tipp: Wenn Sie Beispiele mit mehreren Codezeilen ausprobieren, ist es im Allgemeinen einfacher, jedes Beispiel in einer separaten Datei zu speichern. Dies gibt Ihnen einen besseren Überblick über den Code, erleichtert das Vornehmen von Änderungen und das Anzeigen der Ergebnisse und Sie können später auf etwas zurückgreifen, wenn Sie Beispiele aus der Vergangenheit erneut betrachten möchten.