2011-10-06 9 views
7

estoy tratando de escribir una funciónNúmeros Haskell Peano

toPeano :: Int -> Nat 
toPeano n = 

que convierte un entero en su número de Peano.

que tienen los datos:

data Nat = 
    Zero | 
    Succ Nat 
    deriving Show 

Por ejemplo,

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

y así sucesivamente.

No tengo idea de cómo imprimir los números de Peano dado un número entero. ¡Nunca he trabajado con números de Peano, así que cualquier ayuda con esto sería muy apreciada!

¡Gracias!

Respuesta

7

Su pregunta no es clara, por lo que va a empezar a partir de la conversión:

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

Esto es bastante explícita. Se pueden definir los números de Peano con un simple recursividad y tienen que trabajar para todos los productos naturales:

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

El núcleo aquí es el Succ (toPeano (x-1)) - esto sólo resta uno del número entero y se suma a la construcción de Peano.

Ahora, ¿qué tal la otra dirección? Así, cada vez que vea "Suc" Usted puede añadir uno:

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

Imprimir resultados de

Ahora la única parte de lo que ha dicho que se parecía a una pregunta era:

No tengo idea de cómo imprimir los Peano Numbers dado un número entero.

Esto no tiene nada que ver con los números de Peano, pero en GHCi que sólo se puede ejecutar cualquiera de estas funciones:

> fromPeano (toPeano 5) 
5 

o se puede hacer un programa y utilizar print a imprimir los resultados:

main = print (toPeano 5829) 

y utilizar GHC para compilar el programa

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

¿es posible evitar esta 'verificación de <0 'utilizando algún tipo de números' naturales'? –

+0

Claro, usé GADT para codificar binarios en una pregunta ([http://stackoverflow.com/questions/11910143/positive-integer-type/11912348#11912348]) y estoy seguro de que hay otras formas de hacerlo. –

1

¿Sería algo como esto lo que estás buscando?

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