У меня есть тип t
, который поддерживает следующие три операции:
extract :: t a -> a
duplicate :: t a -> t (t a)
(<*>) :: t (a -> b) -> t a -> t b
Естественно, я также могу написать bind:
(>>=) :: f a -> (a -> f b) -> f b
(>>=) x f = f (extract x)
И join
:
join :: t (t a) -> t a
join = extract
Но я не могу писать ни fmap
, ни pure
Так что это своего рода «монада» и своего рода «комонада», но без fmap
.
Технически у меня есть fmap
и pure
, но они ограничены.
Я просмотрел различные пакеты стилей ограниченных функторов, но все они, похоже, также ограничивают (<*>)
, но в моем случае (<*>)
не ограничен.
Есть ли существующий класс типов, в который я мог бы втиснуть этот тип?
Он очень похож на ComonadПрименить, но для этого требуется, чтобы контейнер был Functor
.
Это напоминает мне такие вещи, как DeepArrow
, который пытается получить как можно больше структуры стрелки, не требуя arr
(который является аналогом fmap
).
@Iceland_jack, к сожалению, в моем случае это, вероятно, не поможет, поскольку нет возможности вернуться от Coyoneda
к исходному типу, если только исходный тип сам по себе не является Functor
, а в данном случае это не так.
Без
fmap
я не знаю ни одного стандартного класса типов.