2012-07-03 13 views
6

this ट्यूटोरियल में मैं निम्नलिखित स्निपेट मिल गया है:शायद इकाई बाँध समारोह पूर्वता

deposit :: (Num a) => a -> a -> Maybe a 
deposit value account = Just (account + value) 

withdraw :: (Num a,Ord a) => a -> a -> Maybe a 
withdraw value account = if (account < value) 
         then Nothing 
         else Just (account - value) 

eligible :: (Num a, Ord a) => a -> Maybe Bool 
eligible account = 
    deposit 100 account >>= 
    withdraw 200 >>= 
    deposit 100 >>= 
    withdraw 300 >>= 
    deposit 1000 >> 
    return True 

main = do 
    print $ eligible 300 -- Just True 
    print $ eligible 299 -- Nothing 

मैं समझ नहीं कैसे >>= समारोह काम करने के लिए माना जाता है। पहले तो वह अपने पहले पैरामीटर के रूप में एक Maybe a मूल्य लेता है: deposit 100 account >>=

बाद में, लेकिन यह अपनी पहली पैरामीटर के रूप में a -> Maybe a लेने के लिए लगता है: withdraw 200 >>= यह कैसे संकलक द्वारा अनुमोदित किया जा सकता है? >>= को अपने पहले पैरामीटर के रूप में Maybe a नहीं लेना चाहिए? ((a >>= b) >>= c) >>= d

लेकिन जहाँ तक मुझे पता है, यह विपरीत है:: a >>= (b >>= (c >>= d))

+2

आपने इसे 'डू' नोटेशन के साथ भ्रमित कर दिया होगा: 'एक <- b; सी <- डी; ई' है 'बी >> = (\ ए -> डी >> = (\ सी -> ई))'। – sdcvvc

+0

@ एसडीसीवीवीसी: धन्यवाद, यह वास्तव में मेरे भ्रम का स्रोत था। – kahoon

+0

ध्यान दें कि यह "शायद मोनैड बाइंड फ़ंक्शन प्राथमिकता" नहीं है; अलग-अलग टाइपक्लास उदाहरणों के लिए आपके पास अलग-अलग प्राथमिकताएं नहीं हो सकती हैं, इसलिए * सभी * मोनैड्स बाइंडों के लिए यह प्राथमिकता होनी चाहिए। – Ashe

उत्तर

14

के रूप में तक मुझे पता है

सम्भावित समाधान अगर >>= समारोह के पूर्वता निम्नलिखित तरीके से काम करेगा होगा , यह विपरीत है: a >>= (b >>= (c >>= d))

नहीं।

GHCi> :i >>= 
class Monad m where 
    (>>=) :: m a -> (a -> m b) -> m b 
    ... 
    -- Defined in `GHC.Base' 
infixl 1 >>= 

infixl मतलब है कि यह बाएं साहचर्य है, इसलिए a >>= b >>= c >>= d ≡ ((a >>= b) >>= c) >>= d

यदि infixr थे तो यह वास्तव में अधिक समझ में नहीं आता है, है ना? >>= हमेशा एक मोनड देता है, और इसके आरएचएस एक समारोह लेता है। तो में>>= से जुड़े monadic अभिव्यक्तियों की श्रृंखला (->) r मोनैड में होगी, जो शायद ही सबसे उपयोगी है।