Відповіді:
Спочатку кодуйте натуральні числа та пари, як описано jmad.
Представіть ціле число як пару натуральних чисел таких, що . Тоді ви можете визначити звичайні операції над цілими числами (використовуючи позначення Haskell для -cculus):
neg = \k -> (snd k, fst k)
add = \k m -> (fst k + fst m, snd k + snd m)
sub = \k m -> add k (neg m)
mul = \k m -> (fst k * fst m + snd k * snd m, fst k * snd m + snd k * fst m)
Випадок складних чисел схожий у тому сенсі, що складне число кодується як пара дій. Але складнішим питанням є кодування реалів. Тут вам доведеться зробити більше роботи:
Кодування реалів - це велика робота, і ви не хочете насправді робити це у -калькуляції. Але дивіться, наприклад, підкаталог Маршалла для простої реалізації дій у чистому Haskell. Це, в принципі, можна перекласти на чистий λ -рахунок.etc/haskell
i:ℤ
, x:a
, f,u,s:a→a
, p:(a→a,a→a)
] Якщо ви закодувати ℤ , як (Sign,ℕ)
то, враховуючи пар функцій , (s,f)
як p
цей термін λi.λp.λx.(fst i) (fst p) id ((snd i) (snd p) x)
буде виробляти або f(…f(x)…)
або s(f(…f(x)…))
(якщо результат негативний). Якщо ви кодуєте ℤ як (ℕ,ℕ)
, вам потрібна функція, яка має зворотну задану пару, (f,u)
і x
функція λi.λp.λx.(snd i)(snd p)((fst i)(fst p) x)
буде виробляти, u(…u(f(…f(x)…))…)
яка залишить f
застосований i
час до x
. Обидва працюють в різних контекстах (результат можна "перевернути" || f
неперевернутий).
fold . ctor
для будь-якого конструктора і цього типу fold
( r
). (Саме тому, для рекурсивних типів, дані будуть «рекурсія на своєму» Для НЕ рекурсивних типів це більше схожі. case
/ Матч шаблону.)
Лямбда-числення може кодувати більшість структур даних та основних типів. Наприклад, ви можете кодувати пару існуючих термінів в обчисленні лямбда, використовуючи те саме кодування Церкви, яке зазвичай бачите для кодування негативних цілих чисел та булевих:
fst = λ p . p ( λ x y . x ) snd = λ p . p ( λ x y . y )
Тоді пара - p = ( пара a b ), і якщо ви хочете повернутися a і b, ви можете зробити ( fst p ) і ( snd p ) .
Це означає, що ви можете легко представити додатні та від’ємні цілі числа за допомогою пари: знак зліва та абсолютне значення праворуч. Знак - булева, яка визначає, чи є позитивним число. Право - це натуральне число з використанням кодування Церкви.
А тепер у вас відносні цілі числа. Множення легко визначити, потрібно просто застосувати функцію від знака і множення на натуральних числах по абсолютній величині:
Щоб визначити додавання, вам слід порівняти два натуральних числа та використати віднімання, коли знаки різні, тому це не λ-термін, але ви можете адаптувати його, якщо дійсно хочете:
але тоді відняття визначити дуже просто: