मैं इस लिखा है समाप्त इतना है कि मैं एक monadic गुना जल्दी समाप्त कर सकते हैं:एक monadic गुना जल्दी
myfoldM :: (Monad m) => (a -> b -> m (Maybe a)) -> a -> [b] -> m (Maybe a)
myfoldM _ a [] = return $ Just a
myfoldM f a (x:xs) = do ma <- f a x;
case ma of
Nothing -> return Nothing
Just a' -> myfoldM f a' xs
और अगर वहाँ एक और अधिक सुरुचिपूर्ण इस या कुछ इसी तरह से मौजूद है, तो व्यक्त करने के लिए रास्ता है मैं सोच रहा हूँ एक पुस्तकालय में हूँ। बेशक Maybe
को Either
के साथ बदलकर एक समान संस्करण है।
import Control.Monad (foldM,Monad,mzero)
import Control.Monad.Trans.Maybe (MaybeT(..))
import Control.Monad.Trans.Class (lift)
myfoldM' :: (Monad m) => (a -> b -> MaybeT m a) -> a -> [b] -> m (Maybe a)
myfoldM' f = (runMaybeT .) . foldM f
go :: Int -> Int -> MaybeT IO Int
go s i = do
lift $ putStrLn $ "i = " ++ show i
if i <= 4 then return (s+i) else mzero
test n = do
myfoldM' go 0 [1..n] >>= print
-- test 3 => Just 6
-- test 5 => Nothing
अपना खुद का गुना न लिखें, अपना फ़ंक्शन लपेटें ताकि यह मानक गुना के साथ काम करे। –
अनिवार्य रूप से यह सवाल है कि मैं पूछ रहा हूं - क्या आप मुझे ऐसा करने का उदाहरण दे सकते हैं? – ErikR