Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.2k views
in Technique[技术] by (71.8m points)

syntax - Haskell "do nothing" IO, or if without else

I want to do something in Haskell that looks like this:

main1 = do s <- getLine
           if s == "foo" then putStr "You entered foo"

Obviously this isn't legal since there's no else. One alternative I've thought of:

nop :: IO ()
nop = sequence_ []

main2 = do s <- getLine
           if s == "foo" then putStr "You entered foo" else nop

This is a little verbose, but I would settle for it if necessary. I would be surprised if there weren't a built-in version of nop, though.

Alternatively:

doIf :: Bool -> IO () -> IO ()
doIf b m = if b then m else nop

main3 = do s <- getLine
           doIf (s == "foo") (putStr "You entered foo")

This is more concise, but the syntax is not particularly nice. Again, I wouldn't be surprised to find something built-in that already exists.

What's the preferred way to do this?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

The easiest way to do a no-op in a monad is:

return ()

Equivalently:

pure ()

However, for the particular idiom you're doing, there's a combinator already made for you:

import Control.Monad
main = do s <- getLine
          when (s == "foo") $ putStr "You entered foo"

This when combinator behaves exactly like your doIf combinator :)


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...