2016-07-21 8 views
2

ImpredicativeTypesで何ができるかを見ていて、正確に何ができるのか見たいと思っていました。 TypeClassesとのやりとりに関しては、私が気がついたことに遭遇したときには奇妙な振る舞いがあります。impredicative型を作成する方法クラス型で動作する

:t mempty 
mempty :: forall a. Monoid a => a 

:t Right 
Right :: forall a b. b -> Either a b 

は、だから、私はimpredicatively入力された表現を作るためにそれらを組み合わせることができ考え出し:拡張子がすべてのことは不合理でいないようですimpredicativeタイプを推測しないように私が知っているように

:t Right mempty 
Right mempty :: forall a b. Monoid b => Either a b 

は、ルックスこのような機能の追加を開始したときの一般的なケースでは、その型推論は必ずしも可能ではありません。私は文字通りRight型シグネチャにbの上に貼り付けていますよう

:t Right mempty :: forall a. Either a (forall b. Monoid b => b) 

、非常に合理的なように見えた私には:

は、だから、私はちょうど私が明示的にimpredicativeタイプを望んでいた事実を作ることを決定しましたタイプがmemptyの場合は、forallを持ち上げないでください。

しかし、それは私に次のエラー与える:むしろ不条理なようだ

No instance for (Monoid (forall b. Monoid b => b)) 

を。 Monoidはすべて定義の意味でMonoidです。

誰かが私にここで何が起こっているのか正確に説明できますか?実際にタイプを使用しているときに実際に1つのインスタンスを決定することは難しく、不可能であるという問題であり、GHCは実際には「No instance ...」ではなく「No explicit/decidable instance for ...」を意味しますか?

:t Right undefined :: forall a. Either a (forall b. b) 

タイプのチェックをして、私は指定されたimpredicativeタイプを私に戻っています:あなたは、状況のすべてのもののうち、型クラスを取る側の注意点としては

は、[OK]を動作するように表示されます。

+0

ここで何が起こっているのか分かりませんが、GHC 8では、元の 'Right mempty'でもあなたが探しているタイプが得られるように振る舞いが変わりました。関連するhttps://ghc.haskell.org/trac/ghc/ticket/11319を参照してください。いずれにしても、ImpredicativeTypesはサポートされていないため、実際には使用しないでください。 –

+2

ここで起こっていることのいくつかはかなり明確です:GHCは 'mempty :: forall bを作る必要がありました。 Monoid b => b'であるが、 'mempty :: Monoid m => m'なので、' m =(forall b。Monoid b => b) 'を選び、 b => b) '、もちろんできませんでした(ポリタイプのインスタンスはありません)。 –

+4

[GHCのドキュメント](https://downloads.haskell.org/~ghc/8.0.1/docs/html/users_guide/glasgow_exts.html#impredicative)によると、私はこのトピックをオフトピックとして閉じることにしました。 「多変量」、「非常に実験的」、「確かにサポートされていない」の4種類があります。また、この機能が "うまくいけば"何をするかを参照します。固定されていない限り、この拡張機能を使用しようとしても意味がありません。IMHO、現在提案されている修正はあまりにも侵略的です。 – dfeuer

答えて

0

この質問には返信がないとマークされていないので、私はコメントの中で述べられたことを繰り返し述べます。

基本的にはImpredicativeTypesは完全にサポートされておらず、誰も実際にどのように動作すべきか分かりません。だから、現在の状態で意味のある何かをしようとするのは悪い考えです。答えはちょうど「それをやろうとしないでください」です。

関連する問題