次のように、代数型クラスの「階層」を作成しようとしています。
class Semigroup a where
(.*) :: a -> a -> a
foldr1 (.*) = foldl1 (.*) -- GHCi error: "`foldr1' is not a (visible) method of class `Semigroup'"
class (Semigroup a) => Monoid a where
identity :: a
(.*) identity = id :: a -> a -- GHCi error: "`.*' is not a (visible) method of class `Monoid'"
class (Monoid a) => Group a where
inverse :: a -> a
したがって、グループはモノイドであり、モノイドは半群です。ただし、クラスが親クラスの関数を認識できないというエラーが発生します。
これらのエラーは私を悩ませます。なぜなら、(たとえば)書くことによってclass (Semigroup a) => Monoid a
、クラスMonoid a
は関数を見ることができると思ったから(.*)
です。さらに、プレリュードのタイプにはfoldr1
制約がないのでfoldr1
、このコンテキストで機能すると思いました。