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() 。 这里的第三个答案是when
, unless
在那里。