我有这段代码:
main = do
args <- getArgs
(var1, var2, var3, var4) <- return ("my var1", "my var2", "my var3", "my var4")
-- or
-- (var1, var2, var3, var4) <- do
-- return ("my var1", "my var2", "my var3", "my var4")
putStrLn "Var3 is: " ++ var3
return ()
但现在它没有做任何有用的事情。但它没有给我错误:
#1
Couldn't match expected type `[Char]' with actual type `IO ()'
In the return type of a call of `putStrLn'
In the first argument of `(++)', namely
`putStrLn "Var3 is: "'
In a stmt of a 'do' block: putStrLn "Var3 is: " ++ var3
#2
Couldn't match type `[]' with `IO'
Expected type: IO Char
Actual type: [Char]
有趣的是,如果我将该行putStrLn "Var3 is: " ++ var3
注释掉,那么它编译得很好。
为什么?在putStrLn“Var3 ..”之前没有额外的空间,因此不应该像对待第二个“do”块那样对待它。
我该如何解决这个问题?
答案 0 :(得分:4)
您的(主要)问题是在putStrLn
的函数应用程序之前评估函数应用程序(++)
。所以你真正得到的是
(putStrLn "Var3 is: ") ++ (var3)
这没有意义,因为(++)
需要两个字符串,而不是字符串和I / O操作。要解决此问题,您可以在字符串周围放置括号:
putStrLn ("Var3 is: " ++ var3)
或使用函数应用程序运算符($)
:
putStrLn $ "Var3 is: " ++ var3