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]を動作するように表示されます。
ここで何が起こっているのか分かりませんが、GHC 8では、元の 'Right mempty'でもあなたが探しているタイプが得られるように振る舞いが変わりました。関連するhttps://ghc.haskell.org/trac/ghc/ticket/11319を参照してください。いずれにしても、ImpredicativeTypesはサポートされていないため、実際には使用しないでください。 –
ここで起こっていることのいくつかはかなり明確です:GHCは 'mempty :: forall bを作る必要がありました。 Monoid b => b'であるが、 'mempty :: Monoid m => m'なので、' m =(forall b。Monoid b => b) 'を選び、 b => b) '、もちろんできませんでした(ポリタイプのインスタンスはありません)。 –
[GHCのドキュメント](https://downloads.haskell.org/~ghc/8.0.1/docs/html/users_guide/glasgow_exts.html#impredicative)によると、私はこのトピックをオフトピックとして閉じることにしました。 「多変量」、「非常に実験的」、「確かにサポートされていない」の4種類があります。また、この機能が "うまくいけば"何をするかを参照します。固定されていない限り、この拡張機能を使用しようとしても意味がありません。IMHO、現在提案されている修正はあまりにも侵略的です。 – dfeuer