5

このコードでは:

import System.Posix.Files
import Control.Exception

safeStat :: FilePath -> IO (Maybe FileStatus)
safeStat path =
  handle (\_ -> return Nothing) (getFileStatus path >>= (return . Just))

このエラーが発生します(ghciで):

Ambiguous type variable `e0' in the constraint:
  (Exception e0) arising from a use of `handle'
...

次のようなことを行うことで、エラーを取り除くことができます。

nothing :: IOException -> Maybe a
nothing _ = Nothing

safeStat :: FilePath -> IO (Maybe FileStatus)
safeStat path =
  handle (return . nothing) (getFileStatus path >>= (return . Just))

どうしたの???ハンドラーが例外を処理することを望みます。

4

2 に答える 2

4

SomeExceptionラムダ関数のパターン マッチングで値を使用できます。

import System.Posix.Files
import Control.Exception

safeStat :: FilePath -> IO (Maybe FileStatus)
safeStat path =
  handle (\(SomeException _) -> return Nothing) (getFileStatus path >>= (return . Just))
于 2012-08-20T09:54:24.430 に答える
4

Ambiguous type variableコンパイラが型を推論できないことを意味します。例外型クラスのインスタンスを持つ多くのデータ型になる可能性があるためです。SomeExceptionを使用して、例外を処理できます。例えば:

safeStat :: FilePath -> IO (Maybe FileStatus)
safeStat path = handle errorHandler $ fmap Just $ getFileStatus path
  where
    errorHandler :: SomeException -> IO (Maybe FileStatus)
    errorHandler _ = return Nothing
于 2012-08-20T02:23:23.347 に答える