在Haskell的monad链(>>,>> =)中有条件地"return()"的更短的方法?

Dog*_*ert 8 haskell

我有这个简单的代码,它读取一个字符串并无限期地打印出来.

main :: IO ()
main = getLine >>= putStrLn >> main
Run Code Online (Sandbox Code Playgroud)

现在我想在getLine通话后退出,如果该行是"退出"或"退出".

我的尝试:

main :: IO ()
main = do
  line <- getLine
  if line == "exit" || line == "quit"
  then return ()
  else putStrLn line >> main
Run Code Online (Sandbox Code Playgroud)

对我来说看起来不是惯用语.有没有更好的办法?

小智 16

Control.Monad.unless(而且它是一个稍微受欢迎的堂兄,when)从你的代码中抽象出这个模式:

import Control.Monad (unless)

main = do
  line <- getLine
  unless (line == "exit" || line == "quit") $ do
    putStrLn line
    main
  -- or
  when (line /= "exit" && line /= "quit") $ do
    putStrLn line
    main
Run Code Online (Sandbox Code Playgroud)

条件return ()后跟无条件代码将不会return起作用,因为它只是一个函数,而不是大多数其他语言中的流控制关键字.


Gab*_*lez 9

使用pipes-4.0:

import Pipes
import qualified Pipes.Prelude as P

main = runEffect $
    P.stdinLn >-> P.takeWhile (`notElem` ["quit", "exit"]) >-> P.stdoutLn
Run Code Online (Sandbox Code Playgroud)

  • 这是一种有趣的方式来翻转函数而不使用`flip`! (2认同)