我尝试手动处理文件错误,以便打印我自己的消息,目前我有以下代码:
handleFileError :: FileError -> IO a
handleFileError (FileError errorKind) = do
case errorKind of
NotFound -> undefined
NoPermission -> undefined
IsDirectory -> undefined
fileRead :: String -> IO String
fileRead file = do
pathExists <- doesPathExist file
notDirectory <- doesFileExist file
-- These two must be handled before `System.Directory.getPermissions` is called
-- or else it will error.
permissions <- getPermissions file
let hasReadPermissions = readable permissions
if hasReadPermissions then undefined -- This is the success case
else handleFileError $ FileError NoPermissions
我想检查3个布尔值(pathExists,notDirectory和hasReadPermissions)中是否有一个为false,然后相应地执行。我尝试使用False
的case来实现这一点,但是这总是运行第一个分支。
2条答案
按热度按时间o2g1uqev1#
一种方法是使用
MultiWayIf
:如果您对扩展过敏,则获得此功能的老式方法是使用guards,如下所示:
但是我不推荐这两种方法,相反,只要对文件做些什么,然后捕获异常;否则,在检查和文件使用之间,文件系统会发生变化,出现竞争情况。
i2byvkas2#
我已经解决了这个问题--我没有意识到嵌套
if
语句的方式可以像其他语言中的else-if一样: