5

はい、私はそれUndecidableInstancesが悪いことを知っています。モジュールを必要としないようにモジュールを設計するのに本当に苦労しましたが、次のようなものがあります。

instance Foo x (C x y) => Bar (C x y) where

    ...

それを変更すると、API が大幅に醜くなります。私は決して派生FooBarないので、ループを作る方法はありません。

一方、有効にUndecidableInstancesすると、ばかげた間違いを見落としやすくなります。たとえば、次のように誤って書くことができます。

instance Foo x (C x z) => Bar (C x y) where

    ...

z右側には決して表示されません。

質問:モジュール内でローカルに使用することは可能UndecidableInstancesですか? つまり、通常の終了規則が解除される場所を明示的にマークしますか?

もちろん、終了には役立ちませんが、この拡張機能を使用する決定をより多くの情報に基づいて行うことができます。

質問 2:UndecidableInstances終了を保証しないが、2 番目のコード スニペットのようないくつかの境界線のケースを禁止するよりも弱いものはありますか?

4

1 に答える 1

4

これまでのところ、言語プラグマはモジュールごとであるため、最初の質問に対する答えはノーです。2 番目の質問については、よくわかりませんが、インスタンスを許可する UndecidableInstances 以外の拡張機能を知りません。

ただし、 UndecidableInstances はそれほど悪くはありません。型チェッカーが終了を証明できないインスタンスを解決しようとするだけです。ただし、コンテキストスタックにより、実際には永遠にループすることはありません。

于 2012-02-14T03:02:28.587 に答える