【发布时间】:2019-07-12 17:28:41
【问题描述】:
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'
如果是,那是否承认功能依赖?
【问题讨论】:
-
了解 Profunctor
标签: haskell typeclass arrows bifunctor