2015-02-10 15 views
10

nel capitolo 6 della "Programmazione in Haskell" da Graham Hutton c'è una sezione chiamata "6.5 ricorsione mutua", che contiene il seguente esempio:ricorsione giudiziaria in pari/dispari funzioni a Haskell

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

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

Volevo provarlo. Ho messo il codice nel file di Hof.hs, imbattuto ghci (versione 7.8.3), digitato

:l Hof.hs 

ed ho ottenuto il seguente messaggio di errore

 
Hof.hs:3:7: Parse error in pattern: n + 1 
Failed, modules loaded: none. 

Perché ricevo questo messaggio? Il codice è sintatticamente scaduto o qualcosa del genere?

risposta

17

n + k patterns have been removed di Haskell e non sono più disponibili. Scriverlo come questo, invece:

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

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

Nota che questa funzione non riesce terribilmente per gli ingressi negativi, quindi probabilmente si desidera aggiunto un formato di abs.

+2

Penso che questo stia davvero guardando i numeri naturali e usando 'Int' per comodità. Portare in 'abs' probabilmente non ha senso. Sarebbe meglio usare i naturali di Peano: 'dati Nat = Zero | Succ Nat', quindi 'even Zero = True; anche (Succ n) = dispari n; dispari Zero = Falso; dispari (Succ n) = pari n'. – dfeuer

+0

@dfeuer Perché non ha senso comunque? Un numero intero negativo è anche se è divisibile per 2 e dispari altrimenti. Anche se l'implementazione che date, con il suo pattern matching, adatta l'originale della domanda più da vicino. –

+0

@DavidYoung, lo riprendo. Se stai usando una rappresentazione di numeri interi come numeri naturali con un segno, allora il valore assoluto è un modo perfettamente ragionevole per farlo. Ma * nessuno * di questo ha senso per 'Int', che è il complemento binario di 2! – dfeuer

Problemi correlati