Відповіді:
Спочатку кодуйте натуральні числа та пари, як описано 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 ) .
Це означає, що ви можете легко представити додатні та від’ємні цілі числа за допомогою пари: знак зліва та абсолютне значення праворуч. Знак - булева, яка визначає, чи є позитивним число. Право - це натуральне число з використанням кодування Церкви.
А тепер у вас відносні цілі числа. Множення легко визначити, потрібно просто застосувати функцію від знака і множення на натуральних числах по абсолютній величині:
Щоб визначити додавання, вам слід порівняти два натуральних числа та використати віднімання, коли знаки різні, тому це не λ-термін, але ви можете адаптувати його, якщо дійсно хочете:
але тоді відняття визначити дуже просто: