【发布时间】:2020-09-17 06:10:41
【问题描述】:
对于一些文件操作,我需要检查文件是否存在,是否被修改,然后才对其进行一些操作。我的新手 Haskell 代码如下(简化):
someFileOp ::FileContents -> FilePath -> IO (FileOpResult)
someFileOp contents absFilePath = do
fileExists <- DIR.doesFileExist absFilePath
if fileExists
then do
isMod <- isModified contents absFilePath
if isMod
then return FileModified
else return $ doSomethingWithFile
else return FileNotFound
确实有效。但是,嵌套的 if 表达式在我看来 错误 - 不像 FP。检查 IO 中的多个布尔条件然后根据其结果采取一些行动的惯用方法是什么?
【问题讨论】:
-
并不是 Haskell 特有的东西,但是:我不会打扰
doesFileExist。而是捕获isModified在不存在时抛出的异常。否则你有一个竞争条件。 -
这是一个不错的函数式编程,当然也很容易理解,这在我看来是一种品质。如果你想“链接”它,你可以寻找一个在 LHS IO 返回 True 时评估 RHS 的中缀运算符。此外, Either 单子可能会有所帮助。
标签: haskell conditional-statements predicate io-monad