如何打印两个数字之和的结果?
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
答案 0 :(得分:10)
尝试使用readLn
代替getLine
。
getLine
在String
monad中返回IO
,无法添加String
。
readLn
具有多态返回类型,编译器推断返回类型为Integer
(在IO
monad中),因此您可以添加它们。
答案 1 :(得分:4)
我要猜测你的错误与不使用parens有关。
此外,由于getLine
生成一个字符串,您需要将其转换为正确的类型。我们可以使用read
从中获取一个数字,但如果无法解析字符串,它可能会导致错误,因此您可能希望在阅读之前检查它是否包含数字。
print (read one + read two)
根据优先级,可以将变量解析为属于print
的参数,而不是+
。通过使用parens,我们确保变量与+
相关联,并且只有print
的结果。
最后,确保缩进正确。你在这里粘贴它的方式与do-expression不一致。第一个putStrLn应该和其他的一样在缩进级别上 - 至少ghc抱怨它。
答案 2 :(得分: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))