web-dev-qa-db-ja.com

最新のGHCで廃止されたDatatypeContexts:なぜですか?

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

The Glorious Glasgow Haskell Compilation System, version 7.2.1

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

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

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

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

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

68

誤った機能であり、実際にはhaveがなかったため、非推奨になりました。便利な機能!それがしたのは、他の場所にたくさんの追加の制約を強制することだけでした。特に、そのようなタイプでパターンマッチングを行う場合、値を作成するために利用可能である必要があるという知識に基づいて、コンテキストにアクセスするのではなく、制約を追加する必要があります。そもそも。

実際には逆の方法で機能し、既知のコンテキストを追跡する「置換」は、次のとおりです 代わりにGADTスタイルの宣言を使用してください

_data MyType a where
    ConstructorOne :: Ord a => a -> MyType a
    ConstructorTwo :: Ord a => a -> a -> MyType a
_

GADTは一般に、他の多くの点でもより柔軟性がありますが、この特定のケースでは、creating値にOrd制約が必要です。次に、値とともに運ばれ、コンストラクターでのパターンマッチングにより、値が引き出されます。したがって、それを使用する関数のコンテキストも必要ありません。_MyType a_型の何かを期待することにより、_Ord a_制約が発生することがわかっているからです。

94
C. A. McCann

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

9
ivanm