Haskell 类型类中的乘积和求和类型并行

问题描述 投票:0回答:1

看起来,诸如 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),产品类型类是总和类型类的先决条件。是否有依赖于先决条件类的类型类规则或通用函数? Typeclassopedia 涉及到这些关系,但不幸的是我找不到任何明确的依赖原因。

haskell typeclass applicative alternative-functor arrow-abstraction
1个回答
6
投票

Arrow
基本上是幺半群类别1的类——“幺半群”不是指
Monoid
,而是指Haskell 类型的乘积幺半群。即,具有单位元素
()
和乘法
(,)
。现在,求和类型也构成了幺半群,这就是
ArrowChoice
所使用的。从这个意义上说,这两个类别是互补的。
ArrowChoice
不应该是
Arrow
的子类。

在幺半群范畴中,你可以继续拥有幺半群函子。这些结果如何取决于你使用什么作为你的类型幺半群。对于

(), (,)
,你得到

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初始对象,这意味着
Void -> a
(即
absurd
)适用于所有类型
a
。然而,真正有意义的是 共形函子
+
:

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

这对于产品类型来说没有意义,因为

()
terminal 对象。

现在有趣的是

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
,但事实并非如此!实际上,它相当于决定性函子,它对于comonads就像应用程序对于monads一样。

虽然

Alternative
MonadPlus
似乎没有太多数学支持,但它们本质上是当“un-Kleisliing”
ArrowChoice
类时得到的,但使用源自
ProdMonoidalFtor
的 Kleisli 类别。这一切都有点可疑。


1仅考虑

first
/
left
second
/
right
***
/
+++
。至于剩下的
&&&
|||
arr
,这些更加具体,IMO 属于 不同的类别

© www.soinside.com 2019 - 2024. All rights reserved.