我经常发现自己编写的代码看起来像这样:

import System.Directory (doesFileExist)
import Control.Monad (unless)

example = do
  fileExists <- doesFileExist "wombat.txt"
  unless fileExists $ putStrLn "Guess I should create the file, huh?"

也许更好的方法是:
example2 =
  doesFileExist "wombat.txt" >>=
    (\b -> unless b $ putStrLn "Guess I should create the file, huh?")

最好的方法是什么?

最佳答案

我可以定义一个辅助函数:

unlessM :: Monad m => m Bool -> m () -> m ()
unlessM b s = b >>= (\t -> unless t s)

example3 = unlessM (doesFileExist "wombat.txt") $
  putStrLn "Guess I should create the file, huh?"

似乎unlessM将非常有用。但是事实是,我在Hackage上看不到unlessM(或带有该类型签名)之类的东西,这使我认为有一种更好的方法来处理这种情况,这是我尚未发现的。酷 child 做什么?

关于haskell - 除非或何时将单子(monad)表达式输入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15878121/

10-12 14:01