2015-01-09 91 views
-2

嗨,我刚刚开始使用haskell,并且在涉及输入和输出的简单问题上遇到了问题。 我想问用户一个数学问题,在这种情况下:询问用户将数字37和53加在一起的结果是什么。 如果他们输入正确的答案(90)程序将打印出“优秀”,如果他们回答不正确,它会打印“对不起” 我已经设法做到这一点。 我不什么了解如何做的是那么显示为输出实际的答案是什么,回答网友终于与用户实际的答案之间的差别回答在haskell中有一些用户输入和输出的问题

//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" 
+3

这是您的实际缩进吗? Haskell知道缩进,最好使用空格来对齐。 – bheklilr 2015-01-09 18:29:05

+0

为什么你将[snippets]用作[tag:javascript]和[tag:html]作为语言指示符? – Zeta 2015-01-09 20:16:28

+0

对不起,我找不到Haskell语言指标 – DaveSwans 2015-01-10 14:17:47

回答

1

@bheklilr在这里碰到了一个问题:除了它的indendation,你的代码没有任何问题。如果你只想要一个班轮,功能(>>)(>>=)做同样的事情,做标记法:如果你离开了那些花括号和

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

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

这相当于分号,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 

哈斯克尔将自动明白,那些最初的两行应该站在自己的,而如果/那么/ else是一个连贯的构造。

+0

问题不在于我有什么,它没有什么:我需要显示一旦程序给了字符串“对不起”,然后给出实际答案90和之间的差异实际答案和用户结果。也许作为一对,回答差异(90,_) – DaveSwans 2015-01-10 14:22:29

+0

啊哈。所以你需要一个字符串连接和一系列'show'函数:'let answer = 90'然后是'guess = read r'然后是'putStrLn $'对不起,实际的答案是:“++ show answer + +“,并且你被”++ show(abs(answer - guess))++“。”' – 2015-01-15 21:47:51