У меня есть тип 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
, но они ограничены.
Я посмотрел на различные пакеты стилей ограниченных функторов, но все они, похоже, также ограничивают (<*>)
, но в моем случае (<*>)
не ограничен.
Существует ли существующий класс типов, в который я мог бы втиснуть этот тип?
Если кому-то интересно, я имею в виду тип Closure
тип