Haskell “哈斯克尔”;“什么也不做”;IO,或者如果没有其他

Haskell “哈斯克尔”;“什么也不做”;IO,或者如果没有其他,haskell,syntax,io,Haskell,Syntax,Io,我想在Haskell做一些类似的事情: main1 = do s <- getLine if s == "foo" then putStr "You entered foo" 这有点冗长,但如果有必要,我会接受的。不过,如果没有内置版本的nop,我会感到惊讶 或者: doIf :: Bool -> IO () -> IO () doIf b m = if b then m else nop main3 = do s <- getLine

我想在Haskell做一些类似的事情:

main1 = do s <- getLine
           if s == "foo" then putStr "You entered foo"
这有点冗长,但如果有必要,我会接受的。不过,如果没有内置版本的
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")
doIf::Bool->IO()->IO()
doIf b m=如果b那么m else nop

main3=do s在monad中执行no op的最简单方法是:

return ()
相当于:

pure ()
但是,对于您正在使用的特定成语,已经为您制作了一个组合词:

import Control.Monad
main = do s <- getLine
          when (s == "foo") $ putStr "You entered foo"
import-Control.Monad
main=do s可用于查找函数,在本例中:
when

在Hoogle中,您可以输入类型签名,它将尝试通过统一类型和重新排序参数在标准库中查找匹配函数


在您的情况下,只需输入
doIf
函数的类型:
是这里的第三个答案时,它的反面是
,除非
也在那里。

哎呀,我想到了return(),但认为它实际上会返回(即,短路do表达式中的其余内容)。我的错。谢谢你的指针指向when.return,是的:)@Dave记住Haskell中的
return
不是一个语言构造,它只是一个函数(正如bdonian所说,它的名称选择不当)。Return不会影响控制流,或者其他什么,您可以这样写:
do{s我得到的
不在范围内:`when'
for
test=do(when True(putStrLn“Hello”)
.Oops,
when
需要导入控制。Monad
位于文件顶部。
import Control.Monad
main = do s <- getLine
          when (s == "foo") $ putStr "You entered foo"