我有这个简单的代码,它读取一个字符串并无限期地打印出来.
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起作用,因为它只是一个函数,而不是大多数其他语言中的流控制关键字.
使用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)
| 归档时间: |
|
| 查看次数: |
1093 次 |
| 最近记录: |