我经常发现自己编写的代码看起来像这样:
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/