主要功能是抱怨返回非IO monad

时间:2015-07-23 07:01:10

标签: haskell

import Debug.Trace

main = do
  trace "Main function parses, and returns - " "0"
  return ()

这会抛出错误,

app.hs:3:1:
    Couldn't match expected type ‘IO t0’ with actual type ‘[()]’
    In the expression: main
    When checking the type of the IO action ‘main’

如果我没有错,模块必须不返回工作。但无论有没有返回功能,它都无法正常工作。

2 个答案:

答案 0 :(得分:11)

trace不是IO动作!它的类型是:

trace :: String -> a -> a

因此编译器会推断您将main定义为 List monad !因此,它抱怨您将其定义为[()]时应该IO ()

尝试使用traceIO(或简称putStrLn)。请记住,trace是一个调试功能:它会不安全地打印内容并“突破”IO monad,这是一个真正的工作程序永远不应该做的。

(一般情况下,您可以通过自己编写类型签名来避免混淆:始终将main函数写为

main :: IO ()
main = do
  ...

然后你得到的错误将不那么混乱,因为GHC不会推断出一种奇怪的类型。)

答案 1 :(得分:8)

由于您的trace行返回一个列表(字符串“0”,类型为[Char]),您实际上是在调用列表monad,而不是IO monad。列表monad的return函数根据其参数生成单个元素列表:在本例中为[()]

trace的第二个参数更改为IO操作而不是列表。