यह हास्केल पुस्तकालयों के लिए अपने स्वयं के मोनाड उदाहरणों को परिभाषित करने के लिए एपीआई डिज़ाइन प्रथाओं से संबंधित एक प्रश्न है। डीएसएल के उदाहरण को अलग करने के लिए मोनाड उदाहरणों को परिभाषित करना एक अच्छा तरीका प्रतीत होता है। Par
monad-par, hdph में monad; वितरित प्रक्रिया में Process
; Eval
समांतर आदि में ...जब (और जब नहीं) एक मोनाड को परिभाषित करने के लिए
मैं हैकेल पुस्तकालयों के दो उदाहरण लेता हूं, जिसका उद्देश्य डेटाबेस बैकएंड के साथ आईओओ है। मेरे द्वारा किए गए उदाहरण रीड आईओ के लिए riak और रेडिस आईओ के लिए hedis हैं।
हेडिस में, Redis
मोनड is defined। वहाँ से, आप के रूप में redis साथ आईओ चलाएँ:
data Redis a -- instance Monad Redis
runRedis :: Connection -> Redis a -> IO a
class Monad m => MonadRedis m
class MonadRedis m => RedisCtx m f | m -> f
set :: RedisCtx m f => ByteString -> ByteString -> m (f Status)
example = do
conn <- connect defaultConnectInfo
runRedis conn $ do
set "hello" "world"
world <- get "hello"
liftIO $ print world
riak में, बातें अलग हैं:
create :: Client -> Int -> NominalDiffTime -> Int -> IO Pool
ping :: Connection -> IO()
withConnection :: Pool -> (Connection -> IO a) -> IO a
example = do
conn <- connect defaultClient
ping conn
runRedis
के लिए दस्तावेज़ का कहना है: "runRedis से प्रत्येक कॉल कनेक्शन से एक नेटवर्क कनेक्शन लेता है पूल और दिया गया रेडिस एक्शन चलाता है। रन करने के लिए कॉल करें इस प्रकार ब्लॉक हो सकता है जबकि पूल से सभी कनेक्शन उपयोग में हैं। "। हालांकि, दंगा पैकेज भी कनेक्शन पूल लागू करता है। यह आईओ इकाई के शीर्ष पर अतिरिक्त इकाई उदाहरणों बिना किया जाता है:
create :: Client-> Int -> NominalDiffTime -> Int -> IO Pool
withConnection :: Pool -> (Connection -> IO a) -> IO a
exampleWithPool = do
pool <- create defaultClient 1 0.5 1
withConnection pool $ \conn -> ping conn
तो, दो संकुल के बीच सादृश्य इन दोनों कार्यों के लिए नीचे फोड़े:
runRedis :: Connection -> Redis a -> IO a
withConnection :: Pool -> (Connection -> IO a) -> IO a
जहां तक मेरा बता सकते हैं, हेडीस पैकेज runRedis
का उपयोग करके रेडिस के साथ आईओ क्रियाओं को समाहित करने के लिए एक मोनड Redis
प्रस्तुत करता है। इसके विपरीत withConnection
में दंगा पैकेज बस एक फ़ंक्शन लेता है जो Connection
लेता है, और इसे आईओ मोनैड में निष्पादित करता है।
तो, अपने स्वयं के मोनाड उदाहरणों और मोनाड स्टैक को परिभाषित करने के लिए क्या प्रेरणाएं हैं? इस के दृष्टिकोण में दंगा और रेडिस पैकेज क्यों भिन्न हैं?
उत्तर के संदर्भ के रूप में - यदि यह स्पष्ट नहीं है, तो 'रेडिस ए' और' कनेक्शन -> आईओ ए 'प्रकार लगभग बराबर हैं। तो यह अनिवार्य रूप से एक कॉस्मेटिक अंतर है, जो 'एनवी -> आईओ ए' बनाम 'रीडर टीएनवी आईओ ए' के बराबर है। –
तब इसका मतलब है कि शायद न तो सही है और 'कोडोडिटी आईओ कनेक्शन' वह मोनैड था जो वह सभी के साथ चाहता था। –