最新の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
という制約がつきます。
関連
-
[解決済み] 一般的に `{- |` で始まるHaskellのコメントは何を意味するのですか?
-
[解決済み] 解釈の仕方 (Eq a)
-
[解決済み] Haskellバイナリツリー
-
[解決済み] メソッドを廃止または非推奨としてマークする方法は?
-
[解決済み] なぜJavaのVector(およびStack)クラスは時代遅れ、または非推奨とされているのですか?
-
[解決済み] HaskellとF#の主な違いは何ですか?[クローズド]
-
[解決済み] Haskellはガベージコレクタを必要としますか?
-
[解決済み] Emacs Interactive-Haskell repl は、cabal と working directory のいずれかが project directory に設定されると無応答になる。
-
[解決済み] Haskellプログラムのパフォーマンス解析ツール
-
[解決済み] Lazy I/Oの何がそんなに悪いのか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Hindley-Milnerのどの部分が理解できないのでしょうか?
-
[解決済み] Haskellは実世界で何に使われているのか?[クローズド]
-
[解決済み] Haskellでメモ化?
-
[解決済み] リーダーモナドの目的は何ですか?
-
[解決済み] Haskellデータ型のメモリフットプリント
-
[解決済み] Haskellはガベージコレクタを必要としますか?
-
[解決済み] GHCiから言語拡張を有効にするには?
-
[解決済み] <*>は何と呼ばれ、何をするのですか?[クローズド]
-
[解決済み] Haskellのmapにはfmapがあるのに、何の意味があるのだろう?
-
[解決済み] Lazy I/Oの何がそんなに悪いのか?