这是什么类型?

6

我是一名Haskell新手。我知道从类型类中,=>表示“在...的情况下”。然而,我无法读取在Statistics.Sample模块中找到的以下类型。

(Vector v (Double, Double), Vector v Double) => v (Double, Double) -> Double

“=>”左边的“v”受到了什么限制?

我不确定你从哪里得到了“在...的背景下”的翻译。它更接近于“如果左侧的约束条件被满足,则存在一个具有右侧给定类型的函数”。 - Cubic
1个回答

10
Data.Vector.Generic.Vector类型类接受两个类型参数,va,其中 v :: * -> * 是容器的类型,a :: * 是容器中元素的类型。这只是用于向量类型在vector包中定义的通用接口,特别是Data.Vector.Unboxed.Vector
实质上,这意味着类型v必须能够容纳 (Double, Double)Double,虽然不能同时容纳。如果你使用 v ~ Data.Vector.Unboxed.Vector,那么这将完全正常工作。原因是由于correlation的实现,它使用了unzip函数。此函数将 v (a, b)分成(v a, v b)。因为correlation正在处理v (Double, Double),所以需要额外的约束条件使得v可以容纳Double
这种通用类型旨在使correlation函数与比Data.Vector.Vector更多类型的向量一起工作,包括其他库中可能实现的任何向量类型。
我要强调这些约束条件。
Data.Vector.Generic.Vector v (Double, Double)
Data.Vector.Generic.Vector v Double

声明无论您选择什么类型的v,它都能够容纳(Double, Double)并且也能够容纳Double。这是为您的向量类型指定某些先决条件,并非向量的实际内容。 向量的实际内容在correlation函数的第一个参数中指定。


“Foo a, Bar a => a -> Int” 这个函数期望 a 的类型为 Foo 或者 Bar 中的一种?那么对于签名中的下一部分,“v”为什么被指明为一个元组,而不是仅仅是“v”,因为我们已经约束了它呢? - Vorac
这意味着 a 必须同时实现 FooBar,而不是其中的任意一个。使用 "tuple syntax" 给出约束条件,因为这是多个约束条件的语法。你实际上需要执行 (Foo a, Bar a) => a -> Int,如果没有括号它将无法编译。我上面所说的是,v 被限制为一种通用的 Vector,它能够容纳 (Double, Double)Double。这并不意味着存在一个向量,其元素同时为 (Double, Double)Double(我在想 Python 能够执行 [(1.0, 2.0), 3.0])。 - bheklilr
Python - 函数式编程的 C 语言。 - Vorac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接