संदर्भ में पहचान इकाई लेखन:में "डेटा प्रकार एक ला कार्टे" Swierstra लिखते हैं कि <code>Free</code> दिया (जो उन्होंने <code>Term</code> कॉल) और <code>Zero</code> आप पहचान इकाई लागू कर सकते हैं नि: शुल्क
data Term f a = Pure a
| Impure (f (Term f a))
data Zero a
Term Zero
अब है पहचान मोनड। मैं समझता हूं कि यह क्यों है। मुद्दा यह है कि मैं परेशान Functor f =>
बाधा की वजह से एक इकाई के रूप में Term Zero
का उपयोग कभी नहीं कर सकते हैं:
instance Functor f => Monad (Term f) where
return x = Pure x
(Pure x) >>= f = f x
(Impure f) >>= t = Impure (fmap (>>=f) t)
मैं Zero
एक functor कैसे करूं?
instance Functor Zero where
fmap f z = ???
लगता है कहीं कोई चाल यहाँ है की तरह: चूंकि Zero
कोई कंस्ट्रक्टर्स है, Impure
कभी नहीं इस्तेमाल किया जा सकता है, और इसलिए >>=
की Impure
मामले कभी नहीं कहा जाता है। इसका मतलब यह है fmap
कभी नहीं कहा जाता है, तो एक भावना है जिसमें यह ठीक है नहीं है:
instance Functor Zero where
fmap f z = undefined
समस्या है, इस धोखाधड़ी की तरह लगता है। मैं क्या खो रहा हूँ? Zero
वास्तव में एक फंक्टर है? या शायद Zero
एक फंक्टर नहीं है, और यह एक कमी है कि हम हास्केल में Free
कैसे व्यक्त करते हैं?
हाँ, '' 0' Zero' को 'Hask' से एक functor, खाली वर्ग (जो तब Hask में वापस एम्बेडेड है) है। –