El tipo de los números raturales se puede definir por
data Nat = Cero | Suc Nat
deriving (Show, Eq) |
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 |
nat2int :: Nat -> Int
int2nat :: Int -> Nat
suma :: Nat -> Nat -> Nat
tales que
nat2int n
es el número entero correspondiente al número natural n
. Por ejemplo,
nat2int (Suc (Suc (Suc Cero))) == 3 |
nat2int (Suc (Suc (Suc Cero))) == 3
int2nat n
es el número natural correspondiente al número entero n
. Por ejemplo,
int2nat 3 == Suc (Suc (Suc Cero)) |
int2nat 3 == Suc (Suc (Suc Cero))
suma m n
es la suma de los número naturales m
y n
. 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 |
λ> 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) |
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 |
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
Se puede imprimir o compartir con