3

如何打印两个数字之和的结果?

 main:: IO()
 main = do putStrLn "Insert the first value: "  
        one <- getLine  
        putStrLn "Insert the second value: "  
        two <- getLine    
        putStrLn "The result is:"
    print (one+two)

这给了我一个错误:

  ERROR file:.\IO.hs:3 - Type error in application
  *** Expression     : putStrLn "The result is:" print (one + two)
  *** Term           : putStrLn
  *** Type           : String -> IO ()
  *** Does not match : a -> b -> c -> d
4

3 回答 3

10

尝试使用readLn而不是getLine.

getLineStringIOmonad中返回 a并且String不能添加 s。

readLn具有多态返回类型,编译器推断返回类型是Integer(在IOmonad 中),因此您可以添加它们。

于 2013-01-12T10:41:00.523 回答
4

我猜测您的错误与不使用括号有关。

此外,由于getLine会生成一个字符串,因此您需要将其转换为正确的类型。我们可以使用read它从中获取一个数字,尽管如果无法解析字符串可能会导致错误,因此您可能希望在读取之前检查它是否仅包含数字。

print (read one + read two)

根据优先级,变量可能会被解析为作为参数print而不是 to +。通过使用括号,我们确保变量与 相关联,+并且只有结果是 for print

最后,确保缩进是正确的。您在此处粘贴的方式与 do 表达式不正确。第一个 putStrLn 应该与其余的缩进级别相同 - 至少 ghc 抱怨它。

于 2013-01-12T10:02:51.170 回答
2

您可以使用以下方式修改代码read :: Read a => String -> a

 main:: IO()
 main = do putStrLn "Insert the first value: "  
        one <- getLine  
        putStrLn "Insert the second value: "  
        two <- getLine    
        putStrLn "The result is:"
    print ((read one) + (read two))
于 2013-01-12T12:14:51.750 回答