12

BifunctorArrowメソッドの間には少し重複があります。

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'

もしそうなら、それは機能的な依存関係を認めますか?

4

2 に答える 2