in Kapitel 6 "Programming in Haskell" von Graham Hutton gibt es einen Abschnitt "6.5 Mutual Rekursion", dass das folgende Beispiel enthält:Mutual Rekursion in ungeraden/geraden Funktionen in Haskell
even :: Int -> Bool
even 0 = True
even (n + 1) = odd n
odd :: Int -> Bool
odd 0 = False
odd (n + 1) = even n
Ich wollte es ausprobieren. Ich habe den Code in Hof.hs Datei, lief GHCI (Version 7.8.3), typisiert
:l Hof.hs
und bekam die folgende Fehlermeldung
Hof.hs:3:7: Parse error in pattern: n + 1 Failed, modules loaded: none.
Warum bin ich diese Nachricht bekommen? Ist der Code syntaktisch veraltet oder so?
Ich denke, das ist wirklich auf natürliche Zahlen und mit 'Int' für die Bequemlichkeit. Das Einbringen von "ABS" macht wahrscheinlich keinen Sinn. Besser wäre es, Peano Naturals zu verwenden: 'Daten Nat = Zero | Succ Nat', dann 'sogar Zero = True; gerade (Succ n) = ungerade n; ungerade Null = Falsch; ungerade (Succ n) = gerade n '. – dfeuer
@dfeuer Warum macht das aber keinen Sinn? Eine negative ganze Zahl ist gerade dann, wenn sie ansonsten durch 2 und ungerade teilbar ist. Obwohl die Implementierung, die Sie geben, mit ihrem Mustervergleich, passt das Original aus der Frage genauer. –
@DavidYoung, ich nehme das zurück. Wenn Sie eine Darstellung von ganzen Zahlen als natürliche Zahlen mit einem Vorzeichen verwenden, dann ist der absolute Wert eine vollkommen vernünftige Möglichkeit, dies zu tun. Aber * none * macht das für 'Int', das ist Zweierkomplement binär! – dfeuer