2011-04-09 11 views
38

मान लीजिए कि मैं कार्यों की एक संख्या है दो:हो सकता है कि इकाई में उपयोग करते हुए "रिवर्स"

f :: a -> Maybe a 
g :: a -> Maybe a 
h :: a -> Maybe a 

और मैं उन्हें निम्नलिखित तरीके से रचना करना चाहते हैं: च रिटर्न तो कुछ भी नहीं है, गणना जी। अगर जी कुछ भी नहीं देता है, तो गणना करें। अगर उनमें से कोई सिर्फ गणना करता है, तो श्रृंखला को रोकें। और पूरी संरचना (एच। जी। एफ) निश्चित रूप से वापस आना चाहिए।

यह शायद मोनैड के सामान्य उपयोग के विपरीत है, जहां आमतौर पर कुछ भी वापस नहीं किया जाता है, तो आप कंप्यूटिंग को रोकते हैं।

इस तरह की गणना करने के लिए हास्केल मुहावरे क्या है?

उत्तर

42

mplus वास्तव में आप के लिए, MonadPlus typeclass का हिस्सा क्या देख रहे हैं। यहाँ अपनी परिभाषा है:

instance MonadPlus Maybe where 
    mzero = Nothing 

    Nothing `mplus` ys = ys 
    xs  `mplus` _ys = xs 

अपने मामले में इसका इस्तेमाल करने के लिए:

combined x = (f x) `mplus` (g x) `mplus` (h x) 
+10

वैकल्पिक (अनुप्रयोगी functors के लिए एनालॉग) ठीक होगा क्योंकि '(<|>) 'शायद' mplus' जैसा ही है। –

+1

या आप Data.Generics.Aliases.orElse का उपयोग कर सकते हैं – Landei

3

मुझे लगता है कि आप का मतलब:

f,g,h:: a -> Maybe b 

f x `mplus` g x `mplus` h x 

MonadPlus

का उपयोग करते हुए आप StateT इकाई का उपयोग करना चाहें:

एफ, जी, एच एक हो सकता है कि ReaderT हैं बी (रीडर टी तक)

या का उपयोग कर msum:

function = runReaderT $ msum $ map ReaderT [f,g,h] 
4

mplus शायद बेहतर है, लेकिन यह रूप में अच्छी तरह से काम करना चाहिए:

import Data.List 
import Data.Maybe 
import Control.Monad 

join $ find isJust [f x, g y, h z] 
संबंधित मुद्दे