जवाबों:
पहले प्राकृतिक संख्याओं और युग्मों को सांकेतिक शब्दों में बदलना, जैसा कि जैम द्वारा वर्णित है।
एक पूर्णांक को प्राकृतिक संख्याओं जैसे कि जोड़े के रूप में प्रस्तुत करें । तब आप पूर्णांक पर सामान्य संचालन को परिभाषित कर सकते हैं ( -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)
जटिल संख्याओं का मामला इस अर्थ में समान है कि एक जटिल संख्या को वास्तविक की जोड़ी के रूप में एन्कोड किया गया है। लेकिन एक अधिक जटिल सवाल यह है कि वास्तविक को कैसे एन्कोड किया जाए। यहाँ आपको अधिक काम करना होगा:
वास्तविक एन्कोडिंग बहुत काम है और आप वास्तव में इसे -calculus में नहीं करना चाहते हैं । लेकिन उदाहरण के लिए देखें शुद्ध हास्केल में वास्तविक के सरल कार्यान्वयन के लिए मार्शल की उपनिर्देशिका । इस सिद्धांत को शुद्ध λ -culculus में अनुवादित किया जा सकता है ।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 )
फिर जोड़ी है पी = ( जोड़ी एक ख ) और तुम वापस पाने के लिए चाहते हैं, तो एक और ख आप कर सकते हैं ( FST पी ) और ( SND पी ) ।
इसका मतलब है कि आप आसानी से एक जोड़ी के साथ सकारात्मक और नकारात्मक पूर्णांक का प्रतिनिधित्व कर सकते हैं: बाईं ओर संकेत और दाईं ओर पूर्ण मान। संकेत एक बूलियन है जो निर्दिष्ट करता है कि संख्या सकारात्मक है या नहीं। चर्च एन्कोडिंग का उपयोग करके दाईं ओर एक प्राकृतिक संख्या है।
और अब जब आपके पास रिश्तेदार पूर्णांक हैं। गुणन को परिभाषित करना आसान है, आपको बस साइन पर फ़ंक्शन लागू करना होगा और निरपेक्ष मान पर प्राकृतिक संख्याओं पर गुणा करना होगा :
इसके अलावा परिभाषित करने के लिए, आपको दो प्राकृतिक संख्याओं की तुलना करनी होगी और संकेत अलग-अलग होने पर घटाव का उपयोग करना होगा, इसलिए यह एक λ-टर्म नहीं है, लेकिन यदि आप वास्तव में चाहते हैं तो आप इसे अनुकूलित कर सकते हैं:
लेकिन तब घटाव को परिभाषित करना बहुत आसान है: