我经常发现自己编写的代码如下:
import System.Directory (doesFileExist)
import Control.Monad (unless)
example = do
fileExists <- doesFileExist "wombat.txt"
unless fileExists $ putStrLn "Guess I should create the file, huh?"
Run Code Online (Sandbox Code Playgroud)
也许更好的方法是:
example2 =
doesFileExist "wombat.txt" >>=
(\b -> unless b $ putStrLn "Guess I should create the file, huh?")
Run Code Online (Sandbox Code Playgroud)
这里最好的方法是什么?
我可以定义一个辅助函数:
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?"
Run Code Online (Sandbox Code Playgroud)
这似乎unlessM
非常有用.但是我unlessM
在Hackage上看不到任何类似(或带有那种类型签名)的事实让我觉得有一些更好的方法来处理这种情况,我尚未发现这种情况.酷孩子们做什么?
我已经使用flip unless
了这种情况,但这些类型的组合器可能会有点吵.有了LambdaCase
扩展,你至少能避免使用名称的结果doesFileExist
,虽然这将导致不得不模式匹配的True
和False
,这看起来就有点怪(取决于如果您认为上if
是不必要的或没有).
{-# LANGUAGE LambdaCase #-}
import System.Directory (doesFileExist)
import Control.Monad (unless)
example' =
doesFileExist "wombat.txt" >>=
flip unless (putStrLn "Guess I should create the file, huh?")
example'' =
doesFileExist "wombat.txt" >>= \ case
True -> return ()
False -> putStrLn "Guess I should create the file, huh?"
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2181 次 |
最近记录: |