75

Haskell での開発を行っていたところ、新しいバージョンの GHC で古いコードを再コンパイルしました。

The Glorious Glasgow Haskell Compilation System, version 7.2.1

そして、私がしたとき、次のエラーを受け取りました:

警告: -XDatatypeContexts は非推奨です: これは広く誤機能と見なされており、Haskell 言語から削除されました。

これは、次の形式のコードがある場合に表示されます。

data Ord a => MyType a
    = ConstructorOne a
    | ConstructorTwo a a

私の質問は、なぜこの機能が最初に廃止されたのですか?同じまたは同様の機能を実現するために代わりに何をすべきですか?

4

2 に答える 2

106

これは間違った機能であり、実際には有用な機能を持ってなかったため、廃止されました! それがしたことは、他の場所に一連の余分な制約を強制することだけでした. 特に、そのような型でパターン マッチングを行う場合、(最初に期待したように) コンテキストへのアクセスを取得するのではなく、制約を追加することを余儀なくされます。これは、値を構築するためにコンテキストが利用可能である必要があるという知識に基づいています。そもそも。

実際には逆に機能し、既知のコンテキストを追跡する「置換」は、代わ​​りにGADT スタイルの宣言を使用することです。

data MyType a where
    ConstructorOne :: Ord a => a -> MyType a
    ConstructorTwo :: Ord a => a -> a -> MyType a

一般に、GADT は他の多くの点でもより柔軟ですが、この特定のケースでは、値の作成に制約が必要でありOrd、それが値と共に運ばれ、コンストラクターでのパターン マッチングによってそれが取り出されます。したがって、それを使用する関数のコンテキストさえ必要ありません。 type の何かを期待することで、それで制約MyType aが得られることを知っているからです。Ord a

于 2011-09-15T23:46:54.690 に答える
11

Ord a一般に、型を使用するすべての関数に制約を追加する必要があるため、MyType見かけほど有用ではありません。それらが削除された理由の詳細については、http://hackage.haskell.org/trac/haskell-prime/wiki/NoDatatypeContextsを参照してください。

于 2011-09-15T23:39:09.380 に答える