Haskell Language
monoid
खोज…
सूचियों के लिए मोनॉइड का एक उदाहरण
instance Monoid [a] where
mempty = []
mappend = (++)
इस उदाहरण के लिए Monoid
कानूनों की जाँच:
mempty `mappend` x = x <-> [] ++ xs = xs -- prepending an empty list is a no-op
x `mappend` mempty = x <-> xs ++ [] = xs -- appending an empty list is a no-op
x `mappend` (y `mappend` z) = (x `mappend` y) `mappend` z
<->
xs ++ (ys ++ zs) = (xs ++ ys) ++ zs -- appending lists is associative
एकल मूल्य में मोनॉयड की एक सूची को संकुचित करना
mconcat :: [a] -> a
और प्रकार की Monoid
टाइपकास्ट है :
ghci> mconcat [Sum 1, Sum 2, Sum 3]
Sum {getSum = 6}
ghci> mconcat ["concat", "enate"]
"concatenate"
इसकी डिफ़ॉल्ट परिभाषा mconcat = foldr mappend mempty
।
न्यूमेरिक मोनॉयड
नंबर दो तरह से monoidal हैं: इकाई, और 1 इकाई के रूप में साथ गुणा के रूप में 0 के साथ इसके अलावा। दोनों अलग-अलग परिस्थितियों में समान रूप से मान्य और उपयोगी हैं। इसलिए संख्याओं के लिए एक पसंदीदा उदाहरण चुनने के बजाय, विभिन्न कार्यक्षमता के लिए उन्हें टैग करने के लिए दो newtypes
, Sum
और Product
।
newtype Sum n = Sum { getSum :: n }
instance Num n => Monoid (Sum n) where
mempty = Sum 0
Sum x `mappend` Sum y = Sum (x + y)
newtype Product n = Product { getProduct :: n }
instance Num n => Monoid (Product n) where
mempty = Product 1
Product x `mappend` Product y = Product (x * y)
यह प्रभावी रूप से डेवलपर को उचित newtype
में मूल्य को लपेटकर किस कार्यक्षमता का उपयोग करने के लिए चुनने की अनुमति देता है।
Sum 3 <> Sum 5 == Sum 8
Product 3 <> Product 5 == Product 15
() के लिए मोनॉयड का एक उदाहरण
()
एक Monoid
। चूँकि केवल एक ही प्रकार का मान है ()
, केवल एक ही चीज़ mempty
और mappend
कर सकता है:
instance Monoid () where
mempty = ()
() `mappend` () = ()
Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow