Câu trả lời:
Đầu tiên mã hóa các số và cặp tự nhiên, như được mô tả bởi jmad.
Biểu diễn một số nguyên là một cặp số tự nhiên ( a , b ) sao cho k = a - b . Sau đó, bạn có thể xác định hoạt động bình thường trên các số nguyên như (sử dụng ký hiệu Haskell cho λ -calculus):
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)
Trường hợp số phức tương tự theo nghĩa là số phức được mã hóa thành một cặp số thực. Nhưng một câu hỏi phức tạp hơn là làm thế nào để mã hóa thực tế. Ở đây bạn phải làm nhiều việc hơn:
Encoding số thực là rất nhiều công việc và bạn không muốn thực sự làm điều đó trong -calculus. Nhưng hãy xem ví dụ thư mục con của Marshall để thực hiện đơn giản các thực tế trong Haskell thuần túy. Điều này có thể về nguyên tắc được dịch sang tinh khiết λ -calculus.etc/haskell
i:ℤ
, x:a
, f,u,s:a→a
, p:(a→a,a→a)
] Nếu bạn mã hóa ℤ như (Sign,ℕ)
sau đó, cho một cặp của các chức năng (s,f)
như p
, thuật ngữ này λi.λp.λx.(fst i) (fst p) id ((snd i) (snd p) x)
sẽ tạo ra một trong hai f(…f(x)…)
hoặc s(f(…f(x)…))
(nếu kết quả là âm tính). Nếu bạn mã hóa ℤ như (ℕ,ℕ)
, bạn cần một hàm có nghịch đảo - được cho một cặp (f,u)
và x
, hàm λi.λp.λx.(snd i)(snd p)((fst i)(fst p) x)
sẽ tạo ra u(…u(f(…f(x)…))…)
sẽ để lại thời gian f
áp dụng . Cả hai hoạt động trong các bối cảnh khác nhau (kết quả có thể "lật" | | là không thể đảo ngược). i
x
f
fold . ctor
cho bất kỳ nhà xây dựng nào và kiểu đó fold
( r
). (Đó là lý do tại sao, đối với các loại đệ quy, dữ liệu sẽ "tự lặp lại". Đối với các loại không đệ quy, nó giống như một case
trận đấu / mẫu.)
Lambda-tính toán có thể mã hóa hầu hết các cấu trúc dữ liệu và các loại cơ bản. Ví dụ: bạn có thể mã hóa một cặp thuật ngữ hiện có trong phép tính lambda, sử dụng cùng một mã hóa Church mà bạn thường thấy để mã hóa các số nguyên không âm và boolean:
fst = λ p . p ( λ x y . x ) snd = λ p . p ( λ x y . y )
Khi đó cặp là p = ( cặp a b ) và nếu bạn muốn lấy lại a và b, bạn có thể làm ( fst p ) và ( snd p ) .
Điều đó có nghĩa là bạn có thể dễ dàng biểu diễn các số nguyên dương và âm bằng một cặp: dấu bên trái và giá trị tuyệt đối ở bên phải. Dấu hiệu là một boolean xác định xem số đó có dương không. Bên phải là một số tự nhiên sử dụng mã hóa Church.
Và bây giờ bạn có số nguyên tương đối. Phép nhân rất dễ xác định, bạn chỉ cần áp dụng hàm trên dấu và phép nhân trên số tự nhiên trên giá trị tuyệt đối:
Để xác định phép cộng, bạn phải so sánh hai số tự nhiên và sử dụng phép trừ khi các dấu hiệu khác nhau, vì vậy đây không phải là thuật ngữ but nhưng bạn có thể điều chỉnh nó nếu bạn thực sự muốn:
but then subtraction is really easy to define:
Once you have positive and negative integers you can define complex integers very easily: it is just a pair of two integers which represents . Then addition is point-wise and multiplication is as usual, but I won't write it, it should be easy: