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

时间:2015-04-29 05:57:49

标签: haskell types typeclass

ApplicativeMonadArrow等类型类似乎在类型类中具有某种等价类型,例如AlternativeMonadPlusArrowPlus分别。例如,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)

但是,在所有这些情况下(以及ArrowChoice),产品类型类是sum类型的先决条件。是否存在依赖于先决条件类的类型规则或常用函数? Typeclassopedia涉及这些关系,但不幸的是我找不到任何明确的依赖性原因。

1 个答案:

答案 0 :(得分:5)

Arrow基本上是monoidal categories 1 的类 - “monoid”不是指Monoid,而是产品 - Haskell的monoid类型。即,单位元素()和乘法(,)。现在,sum类型也构成了一个monoid,这就是ArrowChoice使用的。这两个类在这个意义上是互补的; ArrowChoice不应该是Arrow的子类。

在幺半群类别中,您可以继续monoidal functors。这些如何出来取决于你使用什么作为你的类型幺半群。对于(), (,),您可以获得

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)

原来后者基本没用,因为Void Hask initial object,意味着只存在一个Void -> a(即{{3} })所有类型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

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

现在有趣的是ProdMonoidalFtor相当于Applicative

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

有人可能会怀疑Alternative等同于SumMonoidalFtor,但事实并非如此!实际上,它相当于absurd,而decisive functors则适用于monad。

虽然AlternativeMonadPlus似乎没有太多的数学支持,但它们基本上是你在“取消使用”ArrowChoice类时得到的,但使用的是Kleisli类别来自ProdMonoidalFtor。这有点可疑。

1 仅考虑first / leftsecond / right*** / {{ 1}}。至于剩余的+++&&&|||,这些更具体,IMO属于comonads