Haskell无法将预期类型[char]与实际类型IO

时间:2016-12-25 08:48:59

标签: haskell functional-programming

我刚刚开始学习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]’

2 个答案:

答案 0 :(得分:3)

正如您在上面的评论中所说,if子句的每个分支确实应该具有相同的类型。

此外,对于某些mainIO 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需要yz的相同类型