2013-07-01 10 views
7

यह सिर्फ मुझे दिखाई दिया कि Data.Monoid में एक मोनॉयड में एक मूल्य को इंजेक्ट करने का कोई तरीका नहीं है। मैं इसके लिए Data.Monad.return का उपयोग करने में संकोच करता हूं लेकिन कई प्रकार के लिए singleton जैसे कुछ ढूंढने की उम्मीद कर रहा था।एक मोनॉयड में मूल्य इंजेक्ट कैसे करें?

+5

ए 'मोनोइड' एक 'मोनोइड' उदाहरण के साथ सिर्फ एक प्रकार है, यह एक कंटेनर नहीं है (सामान्य रूप से) जिसमें आप मान इंजेक्ट करते हैं। उदाहरण के लिए एक 'इंस्टेंस मोनॉयड ऑर्डरिंग' है, और इसके लिए आपके पास तीन (गैर-नीचे) मान 'एलटी',' ईक्यू ',' जीटी 'है, इंजेक्ट करने के लिए कुछ भी नहीं है, बस मान लिखें। –

+2

इसमें किस प्रकार का होगा? 'सिंगलटन :: मोनॉयड एम => ए -> ??? ' –

+0

@AlexeyRomanov' सिंगलटन एक्स = mempty' :) (बहुत उपयोगी) –

उत्तर

15

Monoid कक्षा किसी भी प्रकार के इंजेक्शन की अनुमति नहीं देती है क्योंकि मोनॉयड किसी भी प्रकार का कंटेनर नहीं है। कुछ कंटेनर मोनोइड्स होते हैं, और फिर इंजेक्शन के लिए उनका अपना साधन होगा। अपेक्षाकृत सामान्य इंजेक्शन के लिए आप Applicative से Monad (0 पूर्व सामान्य है) से return का उपयोग कर सकते हैं।

+0

हम्म ... तो ... क्या एक सैद्धांतिक ग्राउंड क्लास है जो कंटेनर को लपेटती है '? – fho

+12

@ फ्लोरियन: इस "इंजेक्ट" ऑपरेशन वाले कंस्ट्रक्टर टाइप करें, लेकिन जरूरी नहीं कि 'आवेदक', जिसे एक '[Pointed'] कहा जाता है (http://hackage.haskell.org/packages/archive/pointed/3.0.3/doc/ एचटीएमएल/डेटा-Pointed.html)। – leftaroundabout

6

दूसरों ने जो कहा है उसे जोड़ना: Int एक मोनोइड (कई अलग-अलग तरीकों से) बनाता है। आप Int में मान को "इंजेक्ट" कैसे करेंगे? अच्छा, आप नहीं करते; एक Int सिर्फ Int है। आप शायद शून्य या कुछ का उपयोग कर सकते हैं ...?

अब, अगर एक कंटेनर है, तो यह एक मोनॉयड बनाता है। लेकिन मोनोइड बिट आपको इसे कंटेनर के रूप में पेश करने में मदद नहीं करता है; इसके लिए आपको कुछ और करने की ज़रूरत है। कई चीजें जो कंटेनर नहीं हैं मोनोइड्स बनाती हैं।

संबंधित मुद्दे