dfe*_*uer 12 haskell arrows typeclass bifunctor
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')
Run Code Online (Sandbox Code Playgroud)
这个Bifunctor班级的法律完全类似于Functor。
该Arrow级配备了一系列法律不同的法律和有关略带神秘的警告(***):“请注意,这一般不是一个函子。” 出乎意料的是(对我而言),只有一部法律适用于(***):
first f >>> arr (id *** g) = arr (id *** g) >>> first f
Run Code Online (Sandbox Code Playgroud)
该Arrow (->)实例和Bifunctor (,)实例完全匹配,这,这样bimap @(,) = (***) @(->)。这有什么特殊意义吗?有有意义的假设吗
class Foo (~~>) p where
biFoo :: (a ~~> a') -> (b ~~> b') -> p a b ~~> p a' b'
Run Code Online (Sandbox Code Playgroud)
如果是这样,那是否承认功能依赖性?
Arrow是笛卡尔封闭类别或最小笛卡尔单曲面类别的(有点混蛋)的先驱。特别是,张量积为(,)和单位元素的单曲面类别()。
回想一下,单调类别的特征在于张量积为bifunctor,因此Arrow和之间存在联系Bifunctor。
***实际上,法律比您列出的要多,仅是图书馆选择用这些法律来制定法律first。这是该类的等效定义:
class (Category k, Category k') => EnhancedCategory k k' where
arr :: k a b -> k' a b
-- arr id ? id
-- arr (f . g) = arr f . arr g
class (EnhancedCategory (->) a) => Arrow a where
(***) :: a b c -> a b' c' -> a (b,b') (c,c')
-- (f***id) . (g***id) ? (f.g)***id
-- (id***f) . (id***g) ? id***(f.g)
-- arr fst . (f***id) ? f . arr fst
-- arr snd . (id***g) ? g . arr snd
-- ¿ arr swap . (f***g) ? (g***f) . arr swap ?
-- ((f***g)***h) . assoc ? assoc . (f***(g***h))
diag :: a b (b,b)
first :: Arrow a => a b c -> a (b,d) (c,d)
first f = f***id
second :: Arrow a => a b c -> a (d,b) (d,c)
second g = id***g
(&&&) :: Arrow a => a b c -> a b d -> a b (c,d)
f&&&g = (f***g) . diag
Run Code Online (Sandbox Code Playgroud)
顺便说一下,也可以去除arr用于提升纯函数,而是给超类只使用专用的方法fst,snd和assoc。我叫那个班Cartesian。这允许定义不包含任意Haskell函数的“箭头”类别。线性图就是一个重要的例子。
| 归档时间: |
|
| 查看次数: |
209 次 |
| 最近记录: |