2013-01-23 6 views
29

何らかの理由でHaskellのライブラリ設計者がUndecidableInstancesを使用することを決めたとします。ライブラリは正常にコンパイルされます。今、いくつかのプログラムがライブラリを使用している(そのような型クラスのいくつかのインスタンスを定義しているような)が、拡張を使用していないとします。コンパイルが失敗する(終了しない)ことはありますか?UndecidableInstancesプラグマをローカルで使用すると、コンパイル終了時にグローバルな影響がありますか?

このようなシナリオが発生する可能性がある場合は、例をご覧ください。たとえば、mtlは多くの場合、UndecidableInstancesを使用しています。mtl(またはその拡張子を使用する他の標準ライブラリ)に依存するプログラムを書くことは可能ですか?UndecidableInstancesは使用しませんが、

答えて

22

大きな質問です!

これは一般に可能です。このモジュールについて考えてみましょう。

{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, UndecidableInstances #-} 

module M where 

class C a b | a -> b where 
    f :: a -> b 

instance C a b => C [a] [b] 
    where f = map f 

それだけでコンパイルされます。あなたはこのモジュールをインポートして

g x = x + f [x] 

を定義する場合は、MTLのインスタンスについて

Context reduction stack overflow; size = 201 
Use -fcontext-stack=N to increase stack size to N 
    C [b] b 
In the second argument of `(+)', namely `f [x]' 
In the expression: x + f [x] 
In an equation for `g': g x = x + f [x] 

を得ることができますしかし、私はまた、このようなものが可能である方法を見て、私はありませんそうでないという証拠はありません。

+5

私はあなたのソリューションで遊んでいましたが、私はそれを 'class C a f :: a - > a'と'インスタンスC [[a]] => C [a] f = id'これは他の拡張子を必要とせず、 'UndecidableInstances'です。 –

+4

'mtl'を調べた後、コンパイラがそれを使ってループすることはできません。拡張が必要な​​唯一の理由は、そのインスタンスの一部が[カバレッジ条件](http://www.haskell.org/ghc/docs/7.0.1/html/users_guide/type-class-extensions.html#インスタンスルール)。しかし、条件の背後にある考え方は満足しています。すべてのrhs型変数は、 'mtl'のインスタンス宣言から推論できます。 –

+0

ええと、私は 'C [[a]]'は 'FlexibleContexts'を必要としないことに驚いています。 –

関連する問題