在haskell中用户输入和输出有些麻烦

时间:2015-01-09 18:25:35

标签: haskell io

您好我刚开始使用haskell而且我遇到了涉及输入和输出的简单问题。 我试图向用户询问数学问题,在这种情况下:询问用户将数字37和53加在一起的结果。 如果他们输入正确的答案(90),程序将打印“优秀”,如果他们回答错误,将打印“抱歉” 我成功完成了这一部分。 我不明白该怎么做的是然后显示输出实际答案是什么,用户回答,最后是实际答案和用户答案之间的差异

//the GHCI shell
it should show: 
*Main mathSkill
what is 37 + 53?
55
Sorry  
'' here is where i want it to show the rest of the info"

非常感谢任何帮助

--the haskell code
mathSkill = do
let answer = 90         
putStrLn "What is 37 + 53?"
result <- getLine
if (read result) /= answer
then putStrLn "Sorry"
else putStrLn "excellent"

1 个答案:

答案 0 :(得分:1)

@bheklilr在这里敲响了一句:你的代码除了它的压力之外没有任何问题。如果你只想要一个单行,那么函数(>>)(>>=)与do-notation的作用相同:

Prelude> putStrLn "What is 37 + 53?" >> getLine >>= \r -> if read r /= 90 then putStrLn "Sorry" else putStrLn "Excellent"
What is 37 + 53?
30
Sorry

这相当于:

do { putStrLn "What is 37 + 53?"; r <- getLine; if read r /= 90 then putStrLn "Sorry" else putStrLn "Excellent" }

如果你省略那些花括号和分号,Haskell允许你做一些类似Python但空白的东西。要在GHCi中进行多行输入,您需要从:{开始,以:}特殊行结束:

Prelude> :{
Prelude| do
Prelude|     putStrLn "What is 37 + 53?"
Prelude|     r <- getLine
Prelude|     if read r /= 90
Prelude|     then putStrLn "Sorry"
Prelude|     else putStrLn "Excellent"
Prelude| :}
What is 37 + 53?
50
Sorry

Haskell将自动理解前两行应该独立,而if / then / else都是一个连贯的构造。