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’
如果我没有错,模块必须不返回工作。但无论有没有返回功能,它都无法正常工作。
答案 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操作而不是列表。