Haskell 如何使用catch
关于渔获物的文献似乎很少,例子也很少。我正在尝试处理由于文件不存在而导致文件检查失败的情况。如果在lambda的主体中没有使用类型限定引用lambda的参数,则代码将不会编译(即删除不执行任何操作的let)。为什么不呢Haskell 如何使用catch,haskell,Haskell,关于渔获物的文献似乎很少,例子也很少。我正在尝试处理由于文件不存在而导致文件检查失败的情况。如果在lambda的主体中没有使用类型限定引用lambda的参数,则代码将不会编译(即删除不执行任何操作的let)。为什么不呢 -- checks if file is readable checkFileAccess :: FilePath -> IO Bool checkFileAccess f = do catch (fileAccess f True False False)
-- 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)
在回答我自己的问题时,我首先尝试了
(\(e :: IOException) ...
发现要做到这一点,需要打开-XScopedTypeVariables
,这有点不推荐。然后我意识到lambda表达式只是一个表达式,因此可以对其应用类型规范:
-- checks if file is readable
checkFileAccess :: FilePath -> IO Bool
checkFileAccess f = do
catch (fileAccess f True False False)
((\_ -> return False) :: IOException -> IO Bool)
这是一个解决办法。而且非常优雅。哈斯克尔总是以其深刻的连贯性令我惊讶
话虽如此,我觉得执行此检查的代码在某种程度上不是惯用的Haskell。是否有更好的方法来执行此检查并处理IO异常?与您的问题没有直接关系,但另请参见。