2011-10-06 7 views
7

Próbuję napisać funkcjęHaskell Peano Liczby

toPeano :: Int -> Nat 
toPeano n = 

że okazuje się całkowitą na odpowiadający jej numer Peano.

Mam dane:

data Nat = 
    Zero | 
    Succ Nat 
    deriving Show 

na przykład

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

i tak dalej.

Nie mam pojęcia, jak go pobrać, aby wydrukować liczby Peano z liczbą całkowitą. Nigdy nie pracowałem z numerami Peano, więc jakakolwiek pomoc z tego będzie bardzo ceniona!

Dziękujemy!

Odpowiedz

7

Twoje pytanie nie jest jasne, więc zacznę od nawrócenia:

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

To jest raczej jednoznaczna. Można zdefiniować numery Peano o rekursji prostej i mają tę pracę dla wszystkich Naturals:

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

Rdzeń jest tu Succ (toPeano (x-1)) - to tylko odejmuje jeden od liczby całkowitej i dodaje jedną z budową Peano.

A teraz o innym kierunku? Cóż, za każdym razem można zobaczyć „Succ” można po prostu dodać jeden:

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

drukowania wyników

Teraz tylko część tego, co pan powiedział, że wyglądało to pytanie było:

Nie mam pojęcia, jak to zrobić, aby wydrukować Numery Peano z liczbą całkowitą.

To nie ma nic wspólnego z liczbami Peano, ale w GHCi można po prostu uruchomić jedną z tych funkcji:

> fromPeano (toPeano 5) 
5 

lub możesz zrobić program i używać print wydrukować wyniki:

main = print (toPeano 5829) 

i używać gHC skompilować program

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

czy można tego uniknąć 'check for <0' używając jakiegoś typu' Natural' numbers? –

+0

Oczywiście, użyłem GADTs do kodowania binarnego w jednym pytaniu ([http://stackoverflow.com/questions/11910143/positive-integer-type/11912348#11912348]) i jestem pewien, że są inne sposoby, aby to zrobić. –

1

Czy coś takiego jest tym, czego szukasz?

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