Как я комбинирую монады в Haskell?

Как студент физики до меня очень доводят на самом деле , доказывают , что мой код работает, как он, как предполагается. Вы могли или доказать это логически, которое увеличивается в трудности решительно, поскольку реализация становится более сложной, или можно сделать (как близко как возможные) эмпирическое доказательство функции посредством хорошего тестирования.

, Если Вы не предоставляете логическое доказательство функции, необходимо протестировать. Единственная альтернатива должна сказать, что "Я думаю работы кода...."

18
задан Chris W. 21 July 2009 в 22:25
поделиться

3 ответа

Я предполагаю, что вы хотите использовать монаду 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.

Монадные преобразователи «добавляют функциональность» другим монады.

21
ответ дан 30 November 2019 в 07:18
поделиться

Вы точно не говорите, как вы хотите объединить 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 поставляется с пакетом , который включает преобразователи монад для общих случаев.

17
ответ дан 30 November 2019 в 07:18
поделиться

В каком смысле вы хотите объединить монады?

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
0
ответ дан 30 November 2019 в 07:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: