2017-04-19 23 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であれば例外をスローするためのより良い方法はありますか?これら2つの行を1つにまとめることはできますか?

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

関連する問題