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