Haskell类型类中的乘积和和类型Parallels

Dav*_*son 7 haskell types typeclass

看起来像Applicative,MonadArrow这样的类型类在类型类中有某种类型的等价类型,例如Alternative,MonadPlusArrowPlus.例如,Applicative和Alternative可用于定义以下内容:

(<&&>) :: Applicative f => f a -> f b -> f (a, b)
a <&&> b = (,) <$> a <*> b

(<||>) :: Alternative f => f a -> f b -> f (Either a b)
a <||> b = (Left <$> a) <|> (Right <$> b)
Run Code Online (Sandbox Code Playgroud)

但是,在所有这些情况下(以及ArrowChoice),产品类型类是sum类型的先决条件.是否存在依赖于先决条件类的类型规则或常用函数?该Typeclassopedia触及了这些关系,但不幸的是我无法找到的依赖任何明确的理由.

lef*_*out 5

Arrow基本上是幺半群类别1的类- "monoid"不是指Monoid,而是Haskell类型产品幺半群.即,使用单位元素()和乘法(,).现在,和类型也构成了一个幺半群,这就是ArrowChoice使用它.这两个类在这个意义上是互补的; ArrowChoice不应该真的是一个子类Arrow.

在monoidal类别中,你可以继续使用monoidal仿函数.这些如何出来取决于你使用什么作为你的类型幺半群.因为(), (,),你得到

class ProdMonoidalFtor f where
  prodUnit :: () -> f ()
  prodZip :: (f a, f b) -> f (a,b)

type (+) = Either
class SumMonoidalFtor f where
  sumUnit :: Void -> f Void
  sumZip :: f a + f b -> f (a+b)
Run Code Online (Sandbox Code Playgroud)

原来后者基本上是无用的,因为Void最初的对象Hask,这意味着存在恰好一个Void -> a(即absurd),用于所有类型a.然而,什么是一定意义是comonoidal函子+:

class SumCoMonoidalFtor f where
  sumCounit :: f Void -> Void -- I bet you find this useless too, but it's not totally.
  sumCozip :: f (a+b) -> f a + f b
Run Code Online (Sandbox Code Playgroud)

这反过来对产品类型没有意义,因为()它是终端对象.

现在有趣的是,ProdMonoidalFtor相当于Applicative:

instance (ProdMonoidalFtor f) => Applicative f where
  pure x = fmap (const x) $ prodUnit ()
  fs <*> xs = fmap (\(f,x) -> f x) $ prodZip (fs,xs)
Run Code Online (Sandbox Code Playgroud)

有人可能怀疑这Alternative相当于SumMonoidalFtor,但事实并非如此!实际上,它相当于决定性的仿函数,它们对于comonad来说是对monad的应用.

虽然Alternative并且MonadPlus似乎并没有真正的数学支持,但它们基本上是你在"un-Kleisliing" ArrowChoice课程时所获得的,但使用的是Kleisli类别ProdMonoidalFtor.这有点可疑.


1 那只考虑first/ left,second/ right***/ +++.至于其余的&&&,|||并且arr,这些更具体,IMO属于单独的类.