型クラスを作成するとき、通常、その関数はいくつかのプロパティに従う必要があると想定します。したがって、それぞれの型クラスにモノイドとモナドの法則があります。しかし、結合法則のように、複数のクラスがその法則に従う場合と従わない場合があることを指定したい場合はどうなりますか?Haskellの型システムでそれを行う方法はありますか?型クラスのアイデアのためのこの種の型クラスは実際に実行可能でさえありますか?
これが代数からのやる気を起こさせる例です:
class Addition x where
add :: x -> x -> x
class Multiplication x where
mult :: x -> x -> x
instance Addition Int where
add = (+)
instance Multiplication Int where
add = (*)
ここで、Intに対する追加が結合法則で可換であることを指定したい場合は、クラスとインスタンスを作成できます。
class (Addition x) => AssociativeAddition x where
class (Addition x) => CommutativeAddition x where
instance AssociativeAddition Int where
instance CommutativeAddition Int where
しかし、すべてのクラスに対して可能なすべての組み合わせを作成する必要があるため、これは面倒です。加算が可換であるが、乗算は(行列のように)そうではない場合はどうなるので、結合法則と可換法則のクラスを作成することはできません。
私ができるようにしたいのは、次のようなことです。
class Associative x where
instance (Associative Addition, Commutative Addition) => Addition Int where
add = (+)
instance (Commutative Multiplication) => Multiplication Int where
mult = (*)
これはできますか?
(代数や建設代数のようなHaskellの抽象代数パッケージは、現在これを行っていないので、私は推測していません。しかし、なぜですか?)