如果`zip`是一个合法的类型类,它的那么的方法?

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

为什么有人可能会说,zip问题是Applicative的方法,通常的情况是ZipList。我很不高兴,因为它是不安全的。我不满意Align过,因为它是,由于是包罗万象的,过于复杂,不是通常的情况下,不够具体。

合法类Haskell中某些类型的类可能被复制合法的。这意味着,他们与等式必须持有 - 法律的一类。这是普通的,这些法律都来自编程的一个方面的范畴理论概念。例如,Monad是经由同名类别理论装置计算的概念化(无论是由意思)。

覆盖东西通常的操作要使用的东西箱子做的是奠定他们在彼此的顶部,如果他们是幺,他们会合并。

例子:

没有足够的法律这一概念的概念是通过monoidal函子,以及相应的Applicative类型的类。有,然而,在一个恼人的并发症有很多时候两种方法来定义这两个似乎是合适的Applicative。为什么这样?我建议,答案是“没有足够的法律”。

例子:

  • 对于算术: 该Sum独异的是实际的“内切半群”。是只为了亲属的东西是合法的。你不能总结的质量和力量,为实例。 所述Product幺需要尺寸ab的编号,以若干维c的。乘的质量和力量的法律,并得到我们的温暖。 因此,幺半群的正确选择可以从类型推断。
  • 对于列表: 名单通常direct sum是更安全的。它适用于任何有限数量的元素平凡,和具有共有限数量的其一个“对角线过程”的定义如LogicT。 该ZipList定义显然是不安全的。它被定义为,给定不同长度的两个列表,裁剪较长一个的较短的长度。 长度索引载体是允许zip的安全定义,通过要求证明给定的名单长度相同的设备。
  • 对于矩阵: 通常的添加矩阵的维数的均匀性,相同的与上述长度索引向量的(非常合理的)要求。由于矩阵在各种现实世界的模拟,比如3D图形喜欢使用,一旦矩阵开始得到裁剪或填充零的人会相当马上抱怨,所以沿着ZipMatrix的线ZipList定义中没有出现的吸引力。 陌生人Kronecker multiplication让人想起列表的直接产物。它承认Monad的定义了。

2案件从这些例子中,它揭示本身存在于我们称之为“幺”或“monoidal函子”的东西搞混了两种截然不同的观点,而区别对编程很重要的(不像,也许,纯理论),因为这将清理混乱,除去unsafeties和,主要是,因为有,在每种情况下,两个完全不相干的算法来运行。


我想到的是monoidal函子,也许可逆性(也称为“强度”)是最重要的。但是,总的对皮亚诺土黄结果和产品monoidal操作是无法区分的。 (我不确定他们是否可以考虑monoidal endofunctors。)所以,我转向了猜测的类型变化就是标志。物理量的乘法不类型检查的Monoid,即使!

附:这里提出了自己Monad的实例超过笛卡尔积长度索引向量和超过克罗内克矩阵乘法,带有某种fold zip作为join的。

haskell typeclass
1个回答
8
投票

精确荏苒(作为safe包调用它)可通过the Representable class表示。没有与Representable相关理论的相当数量。对于当前的目的,我们可以专注于...

一个Functor fRepresentable如果tabulateindex见证的同构到(->) x

...和:

在哈斯克尔类型类别可表示endofunctors是同构的读者单子,因此继承了非常大量的属性是免费的。

由于Representable函子是同构的,从某种类型的功能(例如均匀的一对同构于Bool -> a,和一个无限流是同构的Nat -> a),确切的压缩和解可以通过压缩和解功能逐点来实现。这就是mzipRep,为MonadZipmzip默认实现,确实:

mzipRep :: Representable f => f a -> f b -> f (a, b)
mzipRep as bs = tabulate (index as &&& index bs)

虽然MonadZip is a rather awkward class(它是MonadComprehensions扩展的实现,主要部分),它有一个相关的法律,我将重申它在非一元方面:

信息保存:如果() <$ u = () <$ v然后munzip (mzip u v) = (u, v)

换句话说,如果uv具有相同的形状,然后mzip不下降信息(以及因此它可以通过munzip撤消)。由于Representable意味着有是只有一个可能的形状,它使我们能够下降的条件,从而获得准确的荏苒。


切注意事项:

ZipList定义显然是不安全的。它被定义为,给定不同长度的两个列表,裁剪较长一个的较短的长度。

我会说这取决于你想使用荏苒什么。有时你会想要或需要准确荏苒,有时你会不会(例如,可以考虑附加指标与zip [0..]列表的普遍伎俩);有时填充而不是调整将是情理之中的事情(参见leftaroundabout's comment)。这就是为什么我更喜欢叫确切荏苒“精确”,而不是“安全”。

有,然而,在一个恼人的并发症有很多时候两种方法来定义这两个似乎是合适的Applicative。为什么这样?我建议,答案是“没有足够的法律”。

我非常不同意的观点认为,如果允许一些数据类型的多个实例一类是尚未。我宁愿说,如与笛卡尔乘积应用性和列出与压缩和解应用性列表是不同结构的,其特征在于相关的态射 - 它只是发生的是,他们可以在Haskell通过相同的数据类型来表示。

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