Haskell“无所事事”IO,或者如果没有别的话

时间:2009-05-07 03:51:49

标签: haskell syntax io

我想在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")

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

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

2 个答案:

答案 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也是。