29

Haskell ライブラリの設計者がUndecidableInstances何らかの理由で使用することにしたとします。ライブラリは正常にコンパイルされます。ここで、一部のプログラムがライブラリを使用する (型クラスのいくつかのインスタンスを定義するなど) が、拡張機能を使用しないとします。コンパイルが失敗する (終了しない) 可能性はありますか?

そのようなシナリオが発生する可能性がある場合は、例を見ていただければ幸いです。たとえば、mtlは多くのことを使用するため、 mtl (または拡張機能を使用する他の標準ライブラリ) にUndecidableInstances依存し、それ自体を使用せず、決定不能のためにコンパイルに失敗するプログラムを作成することは可能ですか?UndecidableInstances

4

1 に答える 1

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]

あなたが得るでしょう

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]

mtlインスタンスに関しては、このようなことがどのように可能かはわかりませんが、そうでないという証拠もありません。

于 2013-01-23T10:17:19.703 に答える