Bifunctor
和Arrow
方法之间有一些重叠:
class Bifunctor p where
first :: (a -> a') -> p a b -> p a' b
second :: (b -> b') -> p a b -> p a b'
bimap :: (a -> a') -> (b -> b') -> p a b -> p a' b'
class Arrow (~~>) where
...
first :: (a ~~> a') -> (a, b) ~~> (a', b)
second :: (b ~~> b') -> (a, b) ~~> (a, b')
(***) :: (a ~~> a') -> (b ~~> b') -> (a, b) ~~> (a', b')
该类Bifunctor
带有与那些完全类似的法律Functor
。
该类Arrow
带有许多不同的定律和一个有点神秘的警告(***)
:“请注意,这通常不是函子。” 令人惊讶的是(对我来说)只有一条关于 的法律(***)
:
first f >>> arr (id *** g) = arr (id *** g) >>> first f
Arrow (->)
实例和实例完全匹配,Bifunctor (,)
所以bimap @(,) = (***) @(->)
. 这有什么特别的意义吗?有没有有意义的假设
class Foo (~~>) p where
biFoo :: (a ~~> a') -> (b ~~> b') -> p a b ~~> p a' b'
如果是这样,那是否承认功能依赖?