यह बहुत ज्यादा किसी भी प्रकार यदि आप चाहते हैं प्रतिनिधित्व करने के लिए संभव है। लेकिन चूंकि monadic संचालन हर प्रकार के लिए अलग तरह से लागू किया जाता है, यह >>=
एक बार लिख सकते हैं और यह हर उदाहरण के लिए काम करने के लिए संभव नहीं है।
हालांकि, अगर आप सामान्य कार्यों कि सबूत typeclass के कहने के पर निर्भर लिख सकते हैं। e
यहाँ पर विचार करें एक टपल, जहां fst e
एक "बाँध" परिभाषा शामिल है, और snd e
एक "वापसी" परिभाषा में शामिल किया जाना है।
bind = λe. fst e -- after applying evidence, bind looks like λmf. ___
return = λe. snd e -- after applying evidence, return looks like λx. ___
fst = λt. t true
snd = λt. t false
-- join x = x >>= id
join = λex. bind e x (λz. z)
-- liftM f m1 = do { x1 <- m1; return (f x1) }
-- m1 >>= \x1 -> return (f x1)
liftM = λefm. bind e m (λx. return e (f x))
आपको फिर मोनाड के प्रत्येक उदाहरण के लिए "सबूत ट्यूपल" परिभाषित करना होगा। ध्यान दें कि जिस तरह से हम bind
और return
परिभाषित: वे सिर्फ अन्य "सामान्य" इकाई तरीकों हमारे द्वारा निर्धारित किया की तरह काम करते हैं: वे पहली इकाई सत्ता के सबूत दिया जाना चाहिए, और फिर वे आशा के अनुरूप कार्य।
हम Maybe
का प्रतिनिधित्व ऐसे फ़ंक्शन के रूप में कर सकते हैं जो 2 इनपुट लेता है, पहला यह है कि यह Just x
है, और दूसरा इसे बदलने के लिए एक मूल्य है यदि यह कुछ भी नहीं है।
just = λxfz. f x
nothing = λfz. z
-- bind and return for maybes
bindMaybe = λmf. m f nothing
returnMaybe = just
maybeMonadEvidence = tuple bindMaybe returnMaybe
सूचियां समान हैं, इसकी सूची को फोल्डिंग फ़ंक्शन के रूप में दर्शाती हैं। इसलिए, एक सूची एक ऐसा कार्य है जो 2 इनपुट, एक "विपक्ष" और "खाली" लेता है। यह सूची में foldr myCons myEmpty
निष्पादित करता है।
nil = λcz. z
cons = λhtcz. c h (t c z)
bindList = λmf. concat (map f m)
returnList = λx. cons x nil
listMonadEvidence = tuple bindList returnList
-- concat = foldr (++) []
concat = λl. l append nil
-- append xs ys = foldr (:) ys xs
append = λxy. x cons y
-- map f = foldr ((:) . f) []
map = λfl. l (λx. cons (f x)) nil
Either
भी सीधा है। एक फ़ंक्शन के रूप में किसी भी प्रकार का प्रतिनिधित्व करें जो दो फ़ंक्शंस लेता है: यदि यह Left
है, तो लागू करने के लिए एक और दूसरा यह लागू करने के लिए Right
है।
left = λlfg. f l
right = λrfg. g r
-- Left l >>= f = Left l
-- Right r >>= f = f r
bindEither = λmf. m left f
returnEither = right
eitherMonadEvidence = tuple bindEither returnEither
मत भूलना, कार्य करता खुद को(a ->)
प्रपत्र एक इकाई। और लैम्ब्डा कैलकुस में सब कुछ एक समारोह है ... तो ... इसके बारे में बहुत मुश्किल मत सोचो। ;) Control.Monad.Instances
-- f >>= k = \ r -> k (f r) r
bindFunc = λfkr. k (f r) r
-- return = const
returnFunc = λxy. x
funcMonadEvidence = tuple bindFunc returnFunc
के स्रोत लैम्ब्डा पथरी के बाद से सीधे प्रेरित होकर ट्यूरिंग पूरा उसमें किसी भी कम्प्यूटेशनल प्रक्रिया एन्कोड करने के लिए संभव है। मुझे लगता है कि सवाल एन्कोडिंग के बारे में बिल्कुल है। बेशक, अनियमित कैलकुस में इसमें प्रकार नहीं हैं लेकिन कुछ ऑब्जेक्ट्स को एन्कोड करना संभव है जो प्रकार और टाइपिंग तंत्र के रूप में व्यवहार करते हैं। वैसे ही जैसे इसमें बूल और संख्याएं नहीं हैं लेकिन प्रश्न में उल्लिखित संबंधित एन्कोडिंग हैं। [दान द्वारा उत्तर] (https://stackoverflow.com/a/8936209/707926) इस समझ के अनुरूप है। –