我想在Haskell中做一些看起来像这样的事情:
main1 = do s <- getLine
if s == "foo" then putStr "You entered foo"
显然这不合法,因为没有else
。我想到的另一种选择:
nop :: IO ()
nop = sequence_ []
main2 = do s <- getLine
if s == "foo" then putStr "You entered foo" else nop
这有点冗长,但如果有必要我会满足。如果没有nop
的内置版本,我会感到惊讶。
可替换地:
doIf :: Bool -> IO () -> IO ()
doIf b m = if b then m else nop
main3 = do s <- getLine
doIf (s == "foo") (putStr "You entered foo")
这更简洁,但语法不是特别好。再一次,我不会惊讶地发现已经存在的内置内容。
这样做的首选方式是什么?
答案 0 :(得分:103)
在monad中执行no-op的最简单方法是:
return ()
但是,对于你正在做的特定习语,已经为你制作了一个组合器:
import Control.Monad
main = do s <- getLine
when (s == "foo") $ putStr "You entered foo"
这个when组合子的行为与你的doIf组合子完全相同:)
答案 1 :(得分:19)
您可以使用Hoogle查找功能,在这种情况下:when
。
在Hoogle中,您可以输入类型签名,它将尝试通过统一类型和重新排序参数来查找标准库中的匹配函数。
在您的情况下,您只需输入doIf
功能的类型:Bool -> IO () -> IO ()
。 when
是第三个答案,其反向unless
也是。