1

古いコードを から に変更Prelude.catchしたControl.Exception.catchところ、あいまいな型エラーが発生しました。「大したことない」と思いました。しかし、よく調べてみると、なぜこれがそのまま機能しないのか正確にはわかりません...

handler :: Exception e => e -> IO x

with_handler :: IO x -> IO x
with_handler act = catch act handler

このコードは機能するはずですが、型システムの主格規則に明らかに違反しているように見えます。(私は何を確信していません。)

タイプチェッカーが不満に思っていることを誰かが正確に説明できますか?

4

1 に答える 1

3

コンパイラは、 に使用する型を認識していませんhandler。実行時にどの例外が発生したかを確認してから適切な型を選択することはできませんhandler。コンパイル時に型を解決する必要があります。

handler型を与えることができるかもしれません。

handler :: SomeException -> IO x

あいまいさを解決します。

于 2013-01-20T16:58:16.593 に答える