Multi sous-programme récursif dans Raku
J'apprends le raku en suivant le livre Thinking in Raku
Il y a un exercice dont j'ai besoin pour définir la fonction ackermann.
J'ai défini un sous-ensemble entier positif:
subset Positive-Integer of Int where { $_ > 0}
Ensuite, je passe par la version récursive en utilisant:
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;
}
mais en exécutant le code que j'obtiens lors de l'exécution:
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
>
Je ne comprends pas ce qui se passe ici.
Réponses
À en juger par votre sortie d'erreur, vous semblez essayer d'exécuter ces exemples dans le REPL. En regardant l'erreur réelle dans la sortie d'erreur, il semble qu'il manque ce candidat:
multi ackermann(Positive-Integer $m, Positive-Integer $n) {
ackermann $m - 1, ackermann $m, $n - 1;
}
Si je prends tout le code de votre exemple et le mets dans un fichier:
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;
J'obtiens le résultat attendu ( 125).
Il me semble donc que vous avez fait une sorte d'erreur lors de la saisie du code dans une session REPL.
Astuce de pro: si vous essayez des exemples avec plusieurs lignes de code, il est généralement plus facile de stocker chaque exemple dans un fichier séparé. Cela vous donne une meilleure surveillance du code, facilite les modifications et les résultats, et vous avez quelque chose sur quoi revenir plus tard si vous souhaitez revoir des exemples que vous avez réalisés dans le passé.