2019年4月25日木曜日

haskellの例外処理

多分よく分かってない

今日は割り込みによって例外が発生し、ビールを買ってしまいました、みたいな帰宅モナドのなかの話。



bracket :: IO a -> (a -> IO b) -> (a -> IO c) -> IO c
bracket :: (とりあえずやってみろ) -> (ダメだイケてなかったから何とかしろ) -> (とりあえずがイケてるならやれ) -> IO (うまくいった結果よこせ)

try..cache..finally みたいなやつです

getFileMimeType :: String -> IO (Maybe ImageContents)
getFileMimeType file = do
    magic <- magicOpen [MagicMimeType]
    magicLoadDefault magic
    mt <- try $ magicFile magic file
    case mt of
        Left (err::IOException) -> return Nothing
        Right mimeType -> do
            contents <- bracket (openFile file ReadMode) hClose hGetContents
            return $ return $ ImageContents { unMimeType = packChars mimeType, unImageBuff = contents }

ちなみにLeft (err::IOException)がScopedTypeVariables拡張が必要らしいです。

0 件のコメント:

コメントを投稿