我有一个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
所以这是一种“monad”,有点像“comonad”,但没有fmap
。
从技术上讲,我有一个fmap
和pure
,但他们受到限制。
我查看了各种受约束的仿函数样式包,但它们似乎也限制了(<*>)
,但在我的情况下,(<*>)
不受约束。
是否存在可以将此类型压缩的现有类型类?
如果有人有兴趣,我正在处理的实际类型是Closure
类型