2015-09-05 59 views
2

有關catch的文檔看起來很少,例子很少。我正在嘗試處理由於文件不存在而導致文件檢查失敗的情況。如果你沒有在類型爲限定的lambda體內引用lambda的參數,代碼將不會編譯(即刪除let不做任何事情)。爲什麼不?如何使用catch

-- 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) 
+0

與您的問題沒有直接關係,但請參閱['catchIOError'](http://hackage.haskell.org/package/base-4.8.1.0/docs/System-IO-Error.html#v:catchIOError )。 – melpomene

回答

2

回答我的問題,我第一次嘗試

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