いくつかのデフォルト メソッドを実装したいのですが、定義内でType Class
使用できないというエラーが発生します。record selectors
type classes
次のコードは基本的に、 some のレコードに要素を追加する関数type class
を定義するものを作成します。コードは次のとおりです。add
repr
data type
import qualified Data.Graph.Inductive as DG
class Graph gr a b where
empty :: DG.Gr a b
empty = DG.empty
repr :: gr -> DG.Gr a b
-- following function declaration does NOT work:
add :: a -> gr -> gr
add el g = g{repr = DG.insNode el $ repr g}
コンパイラはエラーをスローします:
repr is not a record selector
In the expression: g {repr = DG.insNode el $ repr g}
In an equation for add:
add el g = g {repr = DG.insNode el $ repr g}
Haskell でそのようなメソッドを宣言することは可能ですか?
明確化
data types
同様の方法で動作する をいくつか持っているため、そのような設計が必要です。A
とB
しましょうC
data types
。それぞれにレコードが必要です。repr :: DG.Gr a b
ここで、a
とは、とb
のそれぞれに対して異なります。A
B
C
A
、orのような同じ関数B
を共有します(基本的に record に要素を追加または削除します)。これらのデータ型が多くの関数を共有する場合、関数を実装してthis のインスタンスを作成することは理にかなっています。これらの関数は、それぞれに対して自動的に実装されます。C
add
delete
repr
type class
type class
data type
さらに、関数を呼び出すときにこれらのいくつかdata types
(私が欲しいとしましょうB
)がわずかに異なる動作をすることを望んでいます。for を作成するときに、add
この動作を実装するのは簡単です。instance
type class
B