如何更改此阻止原始monad代码?

时间:2017-10-25 03:08:32

标签: haskell

我有这段代码:

loop height weight=do
line<-getLine
if line=="1" then
    do
        height<-getLine
        loop height weight
else if line=="2" then
    do 
        weight<-getLine
        loop height weight
    else if line=="3" then
        do
            putStrLn (height)
        else
            do
                putStrLn "error"
有人告诉我有这么多“做”,我试着改变这段代码而不是用“做”:

loop height weight=
getLine>>=(\line->(
if line=="1" then
    getLine>>=(\height->
    loop height weight
else if line=="2" then
    getLine>>=(\weight->
    loop height weight
    else if line=="3" then
            putStrLn (height+weight)
        else
                putStrLn "error"))))

但是编译器告诉我如果行==“2”并且我无法解决它就会出现问题

你可以教我如何在没有“do”的情况下更改这段代码吗?

1 个答案:

答案 0 :(得分:5)

我认为使用构造的大小会使你的代码更加清晰,但这只是个人选择。另外putStrLn(高度+重量)是不正确的,因为高度和重量是字符串,你将它们视为整数。也许你的意思是++?

loop height weight =
  getLine >>= \line ->
  case line of
    "1" -> getLine >>= \height -> loop height weight
    "2" -> getLine >>= \weight -> loop height weight
    "3" -> putStrLn . show $ (read height :: Int) + (read weight :: Int)
    _ -> putStrLn "error"