2017-04-19 66 views
1

我想在Haskell中锁定一个专用的文件,并在已锁定的情况下抛出IOError报告Haskell锁定文件的更好方法

import Data.Maybe (fromMaybe) 
import System.FileLock (FileLock, SharedExclusive (Exclusive), tryLockFile) 

-- ... 
do 
    -- ... 
    maybeFileLock <- tryLockFile path Exclusive -- returns Maybe FileLock 
    let fileLock = fromMaybe (throwIO (userError "File locked")) maybeFileLock 

有没有更好的方式来处理Maybe,只是抛出一个异常,如果它是Nothing?我可以将这两条线合并成一条线吗?

N.B.:有人可能会争辩说,这些行的任何组合都会使意图不太清晰。

+0

您的示例代码无效。它有一个类型错误。 –

回答

3
fileLock <- fromMaybe (throwIO (userError "File locked")) 
    <$> tryLockFile path Exclusive 

throwIO :: Exception e => e -> IO a,所以这和你的代码应该FileLockIO a之间的不匹配。相反:

fileLock <- maybe (throwIO (userError "File locked")) pure 
    =<< tryLockFile path Exclusive 
+0

工作。谢谢。当我尝试编译时,我意识到了不匹配的类型,但仍在通过如何修复它。 – Ralph

相关问题