我是一名Haskell新手。我知道从类型类中,=>
表示“在...的情况下”。然而,我无法读取在Statistics.Sample模块中找到的以下类型。
(Vector v (Double, Double), Vector v Double) => v (Double, Double) -> Double
“=>”左边的“v”受到了什么限制?
我是一名Haskell新手。我知道从类型类中,=>
表示“在...的情况下”。然而,我无法读取在Statistics.Sample模块中找到的以下类型。
(Vector v (Double, Double), Vector v Double) => v (Double, Double) -> Double
Data.Vector.Generic.Vector
类型类接受两个类型参数,v
和 a
,其中 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
函数的第一个参数中指定。
a
必须同时实现 Foo
和 Bar
,而不是其中的任意一个。使用 "tuple syntax" 给出约束条件,因为这是多个约束条件的语法。你实际上需要执行 (Foo a, Bar a) => a -> Int
,如果没有括号它将无法编译。我上面所说的是,v
被限制为一种通用的 Vector
,它能够容纳 (Double, Double)
或 Double
。这并不意味着存在一个向量,其元素同时为 (Double, Double)
和 Double
(我在想 Python 能够执行 [(1.0, 2.0), 3.0]
)。 - bheklilr