У меня есть функция, которая применить функцию в файл, если он существует: примерПрименить функцию к файлу, если он существует
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