我有一個函數應用到一個文件,如果它存在的函數:應用功能到一個文件,如果它存在
import System.Directory
import Data.Maybe
applyToFile :: (FilePath -> IO a) -> FilePath -> IO (Maybe a)
applyToFile f p = doesFileExist p >>= apply
where
apply True = f p >>= (pure . Just)
apply False = pure Nothing
用例:
applyToFile readFile "/tmp/foo"
applyToFile (\p -> writeFile p "bar") "/tmp/foo"
抽象層可以添加:
import System.Directory
import Data.Maybe
applyToFileIf :: (FilePath -> IO Bool) -> (FilePath -> IO a) -> FilePath -> IO (Maybe a)
applyToFileIf f g p = f p >>= apply
where
apply True = g p >>= (pure . Just)
apply False = pure Nothing
applyToFile :: (FilePath -> IO a) -> FilePath -> IO (Maybe a)
applyToFile f p = applyToFileIf doesFileExist f p
,讓喜歡用法:
applyToFileIf (\p -> doesFileExist p >>= (pure . not)) (\p -> writeFile p "baz") "/tmp/baz"
我有這種感覺,我只是抓了表面,並有一個更通用的模式隱藏。
是否有更好的抽象或更習慣的方法來做到這一點?
片斷這個問題可能屬於上[codereview.stackexchange.com(HTTP://代碼審查。 stackexchange.com/)。 – Cirdec
更大的問題是,「如果文件存在,對文件做些什麼」是對競爭條件和安全漏洞的邀請。正確的做法幾乎總是對文件執行一些操作,並捕獲如果它尚不存在的異常。無論編程語言如何,情況都是如此。 – dfeuer