我刚刚开始学习Haskell,而且我在其他一些人中坚持这个错误
我正在尝试使用此代码
以递归方式打印字符列表中的所有字符printall :: [Char] -> [Char]
printall "" = ""
printall (i:is) = if is /= "" then print i else printall is
main = printall "hello world"
但我得到这个错误,任何人都可以帮助我吗?
intro.hs:14:36: error:
• Couldn't match expected type ‘[Char]’ with actual type
‘IO ()’
• In the expression: print i
In the expression: if is /= "" then print i else printa
ll is
In an equation for ‘printall’:
printall (i : is) = if is /= "" then print i else p
rintall is
intro.hs:16:1: error:
• Couldn't match expected type ‘IO t0’ with actual type ‘
[Char]’
答案 0 :(得分:3)
正如您在上面的评论中所说,if子句的每个分支确实应该具有相同的类型。
此外,对于某些main
,IO a
函数必须始终具有a
类型,通常为()
。这意味着printall
的类型签名应为:
printall :: [Char] -> IO ()
与:
相同printall :: String -> IO ()
答案 1 :(得分:0)
print
类型为print :: Show a => a -> IO ()
但您的printall
类型为printall :: [Char] -> [Char]
,假设它是您想要的。
表达式if x then y else z
需要y
和z
的相同类型