Haskell 有没有理由将向量函数限制为一个实例?

Haskell 有没有理由将向量函数限制为一个实例?,haskell,typeclass,Haskell,Typeclass,在我讲述了aboutData.Vector.Generic.Vector实例之后,我开始纳闷,为什么 zipWith :: (Vector v a, Vector v b, Vector v c) => (a -> b -> c) -> v a -> v b -> v c zipWith f xs ys = unstream (Stream.zipWith f (stream xs) (stream ys)) 而不是 zipWith :: (

在我讲述了about
Data.Vector.Generic.Vector
实例之后,我开始纳闷,为什么

zipWith :: (Vector v a, Vector v b, Vector v c)
        => (a -> b -> c) -> v a -> v b -> v c
zipWith f xs ys = unstream (Stream.zipWith f (stream xs) (stream ys))
而不是

zipWith :: (GV.Vector v1 a, GV.Vector v2 b, GV.Vector v3 c) 
        => (a -> b -> c) -> v1 a -> v2 b -> v3 c
zipWith f xs ys = unstream (Stream.zipWith f (stream xs) (stream ys))
?

第二个编译得很好。是否有任何特殊原因将所有此类功能限制为一个实例?因为对我来说

v1 = Data.Vector.fromList [1,2,3,4,5]
v2 = Data.Vector.Unboxed.fromList [6,7,8,9] :: Data.Vector.Unboxed.Vector Int
v3 = foo (*) v1 v2 :: Data.Vector.Unboxed.Vector Int
v4 = foo (*) v1 v2 :: Data.Vector.Vector Int 

看起来更“通用”。

IMO,签名中单个
v
的主要优点是,这总是可以从任何一个参数推断出来。使用更多态的方法,您将不得不为中间表达式编写笨拙的显式类型签名(可能需要
-XScopedTypeVariables
,而通常的选择是“使用与另一个参数相同的
向量
风格”(就性能而言,这可能是最好的选择,也是最明显的选择)通常情况下,这并不重要,因此完全不必担心类型签名也很好。OTOH,如果您需要组合不同的
向量
实例,精确的类型在其他地方是固定的,那么只需在其中一个参数之前加入
GV.convert
,就可以获得更多态的版本sier说,让它不那么多态,有点令人惊讶。

是的,我同意,当使用通用接口进行构造时,会出现歧义。