Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 如何使用catch_Haskell - Fatal编程技术网

Haskell 如何使用catch

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)

关于渔获物的文献似乎很少,例子也很少。我正在尝试处理由于文件不存在而导致文件检查失败的情况。如果在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)

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

(\(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异常?

与您的问题没有直接关系,但另请参见。