2013-01-12 51 views
2

如何打印两个数字之和的结果?打印两个数字的和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 
+0

不要用拥抱修改代码这种方式。 –

+2

更有建设性地使用GHC。如果您更喜欢使用解释器而不是编译器,则可以使用GHC附带的'runghc'程序。 – dave4420

+1

@CatPlusPlus拥抱很适合用于这样的代码。 runghc不是一个交互式解释器。 ghci是,也很好用。 – AndrewC

回答

4

我要以此来猜测你的错误与不使用括号。

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

print (read one + read two) 

根据优先级,变量可以被解析为属于作为参数print而不是向+。通过使用parens,我们确保变量与+相关联,并且只有print的结果。

最后,确保缩进是正确的。你在这里粘贴的方式与do-expression不正确。第一个putStrLn应该与其余的缩进级别相同 - 至少ghc会抱怨它。

+0

我把(),但它给出了一个错误。我编辑了我的帖子。 – tomss

+0

@ user1966757已更新。需要使用'read'转换为数字:) –

+0

谢谢,这也是一个身份问题。:) – tomss

10

尝试使用readLn而不是getLine

getLineIO monad中返回String,并且String不能被添加。

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

1

您可以使用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)) 
+0

你的语句必须排队,并且有不必要的括号'print(读一个+读两个)' – AndrewC

+0

像你想要的! –