Haskell“什么都不做”IO,或者如果没有别的

我想在Haskell中做一些如下所示的事情:

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

显然这是不合法的,因为没有else 。 我想到的一个select:

 nop :: IO () nop = sequence_ [] main2 = do s <- getLine if s == "foo" then putStr "You entered foo" else nop 

这有点冗长,但如果有必要的话我会解决的。 但是,如果没有内置的nop版本,我会感到惊讶。

或者:

 doIf :: Bool -> IO () -> IO () doIf bm = if b then m else nop main3 = do s <- getLine doIf (s == "foo") (putStr "You entered foo") 

这更简洁,但语法不是特别好。 再次,我不会感到惊讶的发现内置的东西已经存在。

什么是这样做的首选方式?

在monad中最简单的做法是:

 return () 

然而,对于你正在做的特定的习惯,有一个已经为你做的combinator:

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

当 combinator的行为完全像你的doIf combinator 🙂

在这种情况下,您可以使用Hoogle来查找函数。

在Hoogle中,您可以inputtypes签名,并通过统一types和重新sorting参数来尝试在标准库中查找匹配的函数。

在你的情况下,你可以简单地input你的doIf函数的types: Bool – > IO() – > IO() 。 这里的第三个答案是whenunless在那里。