打印两个数字的总和Haskell

时间:2013-01-12 09:48:26

标签: haskell

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

 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

3 个答案:

答案 0 :(得分:10)

尝试使用readLn代替getLine

getLineString 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))