2017-04-19 49 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

相關問題