1. ホーム
  2. haskell

最新のGHCでDatatypeContextsが非推奨に:なぜ?

2023-09-10 23:32:35

疑問点

私はちょうどHaskellの開発をしていて、いくつかの古いコードをGHCの新しいバージョンで再コンパイルしました。

The Glorious Glasgow Haskell Compilation System, version 7.2.1

とやると、以下のようなエラーが出ました。

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

以下のような形式のコードを持っているときに表示されます。

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

私の質問は、そもそもなぜこの機能が非推奨になったのか、そして同じか似たような機能を実現するために、代わりに何をすればいいのか、ということです。

どのように解決するのですか?

非推奨なのは でした。 は誤った機能であり、実際には を持つ を持っていませんでした。それがしたことは、他の場所で余分な制約の束を強制することだけでした。特に、このような型でパターン マッチングを行う場合、最初の場所で値を構築するために利用可能でなければならないという知識に基づいてコンテキストにアクセスするのではなく、(最初に望むかもしれませんが)制約を追加することを余儀なくされるでしょう。

これは実際には別の方法で動作し、既知のコンテキストを追跡するもので、次のようになります。 の代わりに GADT スタイルの宣言を使用することです。 :

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

一般に GADT は他の多くの点でもより柔軟ですが、この特定のケースでは、何が起こるかというと 作成 を必要とすることです。 Ord 制約が必要ですが、これは値と一緒に運ばれ、コンストラクタでパターンマッチがそれを引き出します。つまり、これを使用する関数にコンテキストは必要ないのです。 MyType a という型を期待すると Ord a という制約がつきます。