-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathNat.hs
36 lines (27 loc) · 1.32 KB
/
Nat.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
{-
Рассмотрим еще один пример рекурсивного типа данных:
data Nat = Zero | Suc Nat
Элементы этого типа имеют следующий вид: Zero, Suc Zero, Suc (Suc Zero), Suc (Suc (Suc Zero)), и так далее.
Таким образом мы можем считать, что элементы этого типа - это натуральные числа в унарной системе счисления.
Мы можем написать функцию, которая преобразует Nat в Integer следующим образом:
fromNat :: Nat -> Integer
fromNat Zero = 0
fromNat (Suc n) = fromNat n + 1
Реализуйте функции сложения и умножения этих чисел, а также функцию, вычисляющую факториал.
-}
data Nat = Zero | Suc Nat
fromNat :: Nat -> Integer
fromNat Zero = 0
fromNat (Suc n) = fromNat n + 1
toNat :: Integer -> Nat
toNat 0 = Zero
toNat n = (Suc (toNat (n - 1)))
add :: Nat -> Nat -> Nat
add a b = toNat (fromNat a + fromNat b)
mul :: Nat -> Nat -> Nat
mul a b = toNat (fromNat a * fromNat b)
fac :: Nat -> Nat
fac n = toNat (factorial (fromNat n))
factorial:: Integer -> Integer
factorial 0 = 1
factorial n = n * factorial(n - 1)