Я пытаюсь создать «иерархию» классов алгебраических типов следующим образом:
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
в Prelude не имеет ограничений, поэтому я предположил, что foldr1
будет работать в этом контексте.