Похоже, что преобразования должны образовывать моноид, а функция идентификации как пустой элемент и стандартная функция - как двоичная операция. Я не думаю, что это особенно полезно, но это должно быть возможно. Что-то вдоль линий:Набор преобразований f :: a-> форма моноида над функцией композиции - как я могу сделать это экземпляром Monoid?
instance Monoid (a -> a) where
mempty = id
mappend f g = (.)
Вышесказанное не обобщать, возможно, потому, что она маскируется ранее существовавшего определения
instance Monoid b => Monoid (a -> b) where
mempty _ = mempty
mappend f g x = f x `mappend` g x
Ошибка:
Illegal instance declaration for ‘Monoid (a -> a)’
(All instance types must be of the form (T a1 ... an)
where a1 ... an are *distinct type variables*,
and each type variable appears at most once in the instance head.
Use FlexibleInstances if you want to disable this.)
In the instance declaration for ‘Monoid (a -> a)’
Я m все еще сглаз Haskell, поэтому я не уверен, как я могу это исправить - любая помощь?
В качестве примечания к ответам в дубликате, один пример отличного использования 'Endo' находится в [получении реализации по умолчанию для' foldr' из 'foldMap'] (http://stackoverflow.com/д/23319683/2751851). – duplode