Haskellで任意の関数を導出します
-
19-09-2019 - |
質問
Haskellでは導出インスタンスで作業する場合、それは任意の種類の関数を導出することが可能であるか、我々は特定の機能に制限されますか?
解決
あなたはHaskellの98で、次のクラスのインスタンスを導き出すことができます。式、オード、列挙型、IX、有界、読む、そしてショー
Typeable、データ、ファンクタ、折り畳み式とTraversableの:あなたは次のクラスのインスタンスをも導き出すことができGHCの拡張機能を使用します。 newtypeのは、その実装タイプからインスタンスを導出することができますGHC拡張もあります。
あなたはHaskellは問題のクラスに関する特別な知識がなくても必要な機能を生成する方法を知っているだろうという単純な理由のために、任意のクラスのインスタンスを導出することはできません。
他のヒント
あなたは、コンパイラがあなたのために導出する方法を知っているものに関して、特定のクラスに制限されています。プリプロセッサ、またはテンプレートHaskellのを使用して、あなた自身が特定のタイプの機能の実装をもたらすには、あなたが一般的なアプローチを知っていれば、新たに導出メカニズムをコーディングすることができます。
他の2つの答えが正しいです。しかし、あなたはより多くを必要とする場合は、より多くを扱うことができるhackageにいくつかのパッケージがあります。私はあなたが(互換性のために)直接ソースコードを生成することができるので、 Data.Derive に多くのことを好きかコンパイル時にそれを行うには、テンプレートHaskellのにそれをフック。クラスの広い範囲が、すでにサポートされており、あなた自身のためのサポートを追加することは非常に簡単です。概要:いまいましい罰金ライブラリの広告ピッチ: - )
ドンの答えに追加するには、次のデータ型の導出カスタム機能のジェネリックプログラミングと呼ばれています> のとこれに関する文献でのがたくさんあります。プリプロセッサとテンプレートHaskellは唯一の解決策ではありません。そのほかのオプションについては、文献のリスト概要論文のいずれかを参照してください。