В `` Kan Extensions for Program Optimization 'Ralf Hinze существует определение типа List, основанного на правильном расширении Kan забывчивый функтор из категории моноидов вдоль себя (раздел 7.4). Документ реализует реализацию Haskell следующим образом:
newtype List a = Abstr {
apply :: forall z . (Monoid z) => (a -> z) -> z
}
Я смог определить обычные конструкторы nil и cons:
nil :: List a
nil = Abstr (\f -> mempty)
cons :: a -> List a -> List a
cons x (Abstr app) = Abstr (\f -> mappend (f x) (app f))
Со следующим экземпляром класса Monoid для функции Maybe, мне удалось определить функцию head:
instance Monoid (Maybe a) where
mempty = Nothing
mappend Nothing m = m
mappend (Just a) m = Just a
head :: List a -> Maybe a
head (Abstr app) = app Just
Вопрос: как определить функцию хвоста?