2011-10-06 7 views
7

Sto cercando di scrivere una funzioneHaskell Peano Numbers

toPeano :: Int -> Nat 
toPeano n = 

che trasforma un intero nel suo Numero Peano.

devo dati:

data Nat = 
    Zero | 
    Succ Nat 
    deriving Show 

Per esempio,

toPeano 0 = Zero 
toPeano 1 = Succ Zero 
toPeano 2 = Succ (Succ Zero) 

e così via.

Non ho idea di come ottenerlo per stampare i numeri Peano dati un numero intero. Non ho mai lavorato con i numeri di Peano, quindi qualsiasi aiuto con questo sarebbe molto apprezzato!

Grazie!

risposta

7

tua domanda non è chiaro, quindi inizierò dalla conversione:

toPeano 0 = Zero 
toPeano 1 = Succ Zero 
toPeano 2 = Succ (Succ Zero) 

Questo è piuttosto esplicito. È possibile definire i numeri Peano con un semplice ricorsione e che hanno il lavoro per tutti naturali:

toPeano 0 = Zero 
toPeano x 
    | x < 0 = error "Can not convert a negative number to Peano" 
    | otherwise = Succ (toPeano (x-1)) 

Il nucleo Ecco l'Succ (toPeano (x-1)) - questo solo un sottrae dal numero intero e aggiunge uno alla costruzione Peano.

Ora che ne dici di un'altra direzione? Bene, ogni volta che vedi "Succ" si può semplicemente aggiungere uno:

fromPeano Zero = 0 
fromPeano (Succ x) = 1 + fromPeano x -- note this is inefficent but right now we don't care 

stampa Risultati

Ora l'unica parte di quello che hai detto che sembrava una domanda era:

Non ho idea di come ottenerlo per stampare i numeri Peano dati un numero intero.

Questo non ha nulla a che fare con i numeri di Peano, ma in GHCi si può solo eseguire una di queste funzioni:

> fromPeano (toPeano 5) 
5 

o si può fare un programma e utilizzare print di stampare i risultati:

main = print (toPeano 5829) 

e utilizzare GHC per compilare il programma

$ ghc --make myProg.hs 
$ ./myProg 
Succ (Succ (Succ (... 
+0

è possibile evitare questo 'controllo per <0' utilizzando un tipo di tipo di numeri' Natural'? –

+0

Certo, ho usato GADT per codificare il binario in una domanda ([http://stackoverflow.com/questions/11910143/positive-integer-type/11912348#11912348]) e sono sicuro che ci siano altri modi per farlo. –

1

Sarebbe qualcosa di simile ciò che stai cercando?

toPeano 0 = Zero 
toPeano n = Succ $ toPeano (n-1)