El tipo de los números naturales
El tipo de los números raturales se puede definir por
data Nat = Cero | Suc Nat deriving (Show, Eq)
de forma que Suc (Suc (Suc Cero))
representa el número 3.
Definir las siguientes funciones
nat2int :: Nat -> Int int2nat :: Int -> Nat suma :: Nat -> Nat -> Nat
tales que
-
nat2int n
es el número entero correspondiente al número naturaln
. Por ejemplo,
nat2int (Suc (Suc (Suc Cero))) == 3
-
int2nat n
es el número natural correspondiente al número enteron
. Por ejemplo,
int2nat 3 == Suc (Suc (Suc Cero))
-
suma m n
es la suma de los número naturalesm
yn
. Por ejemplo,
λ> suma (Suc (Suc Cero)) (Suc Cero) Suc (Suc (Suc Cero)) λ> nat2int (suma (Suc (Suc Cero)) (Suc Cero)) 3 λ> nat2int (suma (int2nat 2) (int2nat 1)) 3
Soluciones
A continuación se muestran las soluciones en Haskell y las soluciones en Python.
Soluciones en Haskell
data Nat = Cero | Suc Nat deriving (Show, Eq) nat2int :: Nat -> Int nat2int Cero = 0 nat2int (Suc n) = 1 + nat2int n int2nat :: Int -> Nat int2nat 0 = Cero int2nat n = Suc (int2nat (n-1)) suma :: Nat -> Nat -> Nat suma Cero n = n suma (Suc m) n = Suc (suma m n)
Soluciones en Python
from dataclasses import dataclass @dataclass class Nat: pass @dataclass class Cero(Nat): pass @dataclass class Suc(Nat): n: Nat def nat2int(n: Nat) -> int: match n: case Cero(): return 0 case Suc(n): return 1 + nat2int(n) assert False def int2nat(n: int) -> Nat: if n == 0: return Cero() return Suc(int2nat(n - 1)) def suma(m: Nat, n: Nat) -> Nat: match m: case Cero(): return n case Suc(m): return Suc(suma(m, n)) assert False