这是什么类型的?

时间:2017-07-20 16:31:04

标签: haskell types constraints

Haskell新手在这里。我从type classes知道=>表示"在"的上下文中。但是,我无法阅读模块Statistics.Sample

中的以下类型
(Vector v (Double, Double), Vector v Double) => v (Double, Double) -> Double

v左侧的=>会有哪些约束?

1 个答案:

答案 0 :(得分:10)

Data.Vector.Generic.Vector类型类有两个类型参数va,其中v :: * -> *是容器的类型,a :: *是元素的类型在容器中。这只是vector包中定义的矢量类型的通用接口,特别是Data.Vector.Unboxed.Vector

这实际上是说类型v必须能够容纳(Double, Double)Double,但不能同时执行。如果您使用v ~ Data.Vector.Unboxed.Vector,那么这很好用。原因是correlation的实施,使用enter image description here。此功能会将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函数的第一个参数中指定。