Как студент физики до меня очень доводят на самом деле , доказывают , что мой код работает, как он, как предполагается. Вы могли или доказать это логически, которое увеличивается в трудности решительно, поскольку реализация становится более сложной, или можно сделать (как близко как возможные) эмпирическое доказательство функции посредством хорошего тестирования.
, Если Вы не предоставляете логическое доказательство функции, необходимо протестировать. Единственная альтернатива должна сказать, что "Я думаю работы кода...."
Я предполагаю, что вы хотите использовать монаду Maybe для раннего завершения (например, break
или return
в C).
В этом случае вы следует использовать MaybeT
из пакета MaybeT ( cabal install MaybeT
).
main = do
runMaybeT . forever $ do
liftIO $ putStrLn "I won't stop until you type pretty please"
line <- liftIO getLine
when ("pretty please" == line) mzero
return ()
MaybeT является версией монадного преобразователя для монады Maybe.
Монадные преобразователи «добавляют функциональность» другим монады.
Вы точно не говорите, как вы хотите объединить IO
и Возможно
, но я предполагаю, что у вас есть много функций, которые возвращают IO (Может быть)
, которые вы хотите легко комбинировать. В основном вы хотите рассматривать IO (Возможно, a)
как отдельный тип с его собственным экземпляром Monad
:
newtype IOMaybe a = IOM (IO (Maybe a))
-- "unpack" a value of the new type
runIOMaybe :: IOMaybe a -> IO (Maybe a)
runIOMaybe (IOM a) = a
instance Monad IOMaybe where
-- bind operator
(IOM ioa) >>= f = IOM $ do
a <- ioa
case a of
Nothing -> return Nothing
Just v -> runIOMaybe (f v)
-- return
return a = IOM (return (Just a))
-- maybe also some convenience functions
returnIO :: IO a -> IOMaybe a
returnIO ioa = IOM $ do
v <- ioa
return (Just v)
returnMaybe :: Maybe a -> IOMaybe a
returnMaybe ma = IOM (return ma)
С этим вы можете использовать do
-Notation для объединения функций, которые возвращают IO (Может быть)
, IO a
или Может быть
:
f1 :: Int -> IO (Maybe Int)
f1 0 = return Nothing
f1 a = return (Just a)
main = runIOMaybe $ do
returnIO $ putStrLn "Hello"
a <- returnMaybe $ Just 2
IOM $ f1 a
return ()
Обычно то, что объединяет и изменяет такие монады, называется преобразователь монад , а GHC поставляется с пакетом , который включает преобразователи монад для общих случаев.
В каком смысле вы хотите объединить монады?
f :: Int -> IO (Maybe Int)
f x = do
putStrLn "Hello world!"
return $ if x == 0 then Nothing else Just x
Можно вычислить как:
[1 of 1] Compiling Main ( maybe-io.hs, interpreted )
Ok, modules loaded: Main.
*Main> f 0
Hello world!
Nothing
*Main> f 3
Hello world!
Just 3