如何使用catch

时间:2015-09-05 12:40:41

标签: haskell

有关捕获的文档似乎很少,而且示例很少。我试图处理由于文件不存在而导致文件检查失败的情况。如果你没有使用类型限定引用lambda体中lambda的参数,那么代码将无法编译(即删除let什么都不做)。为什么不呢?

-- checks if file is readable
checkFileAccess :: FilePath -> IO Bool
checkFileAccess f = do
  catch (fileAccess f True False False)
            (\e -> do
               let _ = e :: IOException
               return False)

1 个答案:

答案 0 :(得分:2)

回答我自己的问题,我首先尝试了

.msg_div { padding:5px; cursor: pointer; }
.msg_div:hover { background-color: #eee; }

并发现要做到这一点你需要打开(\(e :: IOException) ... ,这有点不赞成。然后我意识到lambda表达式只是一个表达式,因此你可以对它应用一个类型规范:

-XScopedTypeVariables

这是一个解决方案。而且非常优雅。哈斯克尔总是以其深刻的连贯性使我感到惊讶。

话虽如此,我觉得执行此检查的代码在某种程度上不是惯用的Haskell。有没有更好的方法来检查和处理IO异常?