2015-02-10 6 views
10

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?

Antwort

17

n + k patterns have been removed von Haskell und sind nicht mehr verfügbar. Schreiben Sie es wie folgt statt:

even :: Int -> Bool 
even 0 = True 
even n = odd (n - 1) 

odd :: Int -> Bool 
odd 0 = False 
odd n = even (n - 1) 

Beachten Sie, dass diese Funktion schrecklich für negative Eingänge ausfällt, so dass Sie wahrscheinlich es mit abs erweitern möchten.

+2

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

+0

@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. –

+0

@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