Полугруппа / Моноид / Иерархия классов типов групп в ошибках Haskell

Я пытаюсь создать «иерархию» классов алгебраического типа следующим образом:

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 будет работать в этом контексте.

5
задан Chris Martin 8 March 2016 в 09:47
поделиться