如何将下面的Haskell do表示法转换为bind (>>=)表示法?

rev2lines :: IO ()
rev2lines = do line1 <- getLine
               line2 <- getLine
               putStrLn (reverse line2)
               putStrLn (reverse line1)

我是一个Haskell初学者,拥有不错的知识,并且尝试过类似
getLine >>= (\line1 -> getLine >>= (\line2 -> putStrLn $ reverse(line2)))

但我无法包含另一行(即第1行)的打印声明。请帮助我正确地理解这个概念。

最佳答案

您快到了:您需要使用>>

getLine >>= (\line1 ->
getLine >>= (\line2 ->
putStrLn (reverse line2) >>
putStrLn (reverse line1)
))

请注意,>> ...>>= (\_ -> ...)等效,因此您也可以根据需要使用它。

同样,您的街区
 do line1 <- getLine
    line2 <- getLine
    putStrLn (reverse line2)
    putStrLn (reverse line1)

相当于
 do line1 <- getLine
    line2 <- getLine
    _ <- putStrLn (reverse line2)
    putStrLn (reverse line1)

本质上,块中没有显式<-的任何条目(但最后一个条目)都使用>>(或者,如果您愿意,在其前面有一个隐式_ <-)。

关于haskell - 将do表示法转换为绑定(bind)表示法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49960117/

10-13 07:08