匹配类型和单子。错误

时间:2016-10-29 23:13:44

标签: haskell

type C = StateT Int (ErrorT String IO)


main :: C ()
main = do
  args <- liftIO $ getArgs
  case args of
    [] -> liftIO $ putStrLn "E"
    (p:ps) -> s "d"

s :: String -> C ()

我收到了错误:

     Couldn't match type ‘Control.Monad.Trans.State.Lazy.StateT
                           Int
                           (Control.Monad.Trans.Error.ErrorT String IO)
                           ()’
                   with ‘IO t0’
    Expected type: IO t0
      Actual type: C ()
    In the expression: main
    When checking the type of the IO action ‘main’

我无法理解为什么会出现错误以及如何修复它。请帮忙。

1 个答案:

答案 0 :(得分:5)

对于某些main

IO a必须属于a类型(通常,但不一定是())。它不能是StateT Int (ErrorT String IO)类型。您可以使用StateTErrorT提供的函数将其转换为基础monad的操作来解决此问题。