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
クラスには、いくつかの異なる法則と、(***)
「これは一般にファンクターではないことに注意してください」に関するやや不可解な警告が付属しています。驚いたことに (私にとって) に関する法律は 1 つだけです(***)
。
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'
もしそうなら、それは機能的な依存関係を認めますか?