GHC 抱怨重叠的实例,而实际上它们不是
GHC complains about overlapping instances when in fact they are not
我的函数 toAVector
定义如下:
class Elt a => ToAVector v a where
toAVector :: v a -> A.Array DIM1 a
instance Elt a => ToAVector [] a where
toAVector l =
A.fromList (Z :. P.length l) l
instance (Elt a, G.Vector v a) => ToAVector v a where
toAVector v =
A.fromFunction (Z :. G.length v) (\(Z :. i) -> v G.! i)
{-# INLINE toAVector #-}
当尝试在另一个库中使用 toAVector
时,出现错误:
Overlapping instances for ToAVector [] Double
arising from a use of ‘toAVector’
Matching instances:
instance (A.Elt a, G.Vector v a) => ToAVector v a
-- Defined in ‘Data.Array.Accelerate.Utils’
instance A.Elt a => ToAVector [] a
-- Defined in ‘Data.Array.Accelerate.Utils’
这对我来说没有意义,因为 []
与 G.Vector [] a
不匹配,所以实例怎么可能重叠?
实例仅与实例头匹配。所以,为了重叠与否,你写的不比
instance ToAVector [] a
instance ToAVector v a
这显然是重叠的。
换个说法:
... as []
does not match G.Vector [] a
...
这在 Haskell 中永远不是有效的推理,因为 class 类型是 open。您永远无法知道某物不是特定 class 的实例,因为任何人稍后都可以将其设为实例。
我的函数 toAVector
定义如下:
class Elt a => ToAVector v a where
toAVector :: v a -> A.Array DIM1 a
instance Elt a => ToAVector [] a where
toAVector l =
A.fromList (Z :. P.length l) l
instance (Elt a, G.Vector v a) => ToAVector v a where
toAVector v =
A.fromFunction (Z :. G.length v) (\(Z :. i) -> v G.! i)
{-# INLINE toAVector #-}
当尝试在另一个库中使用 toAVector
时,出现错误:
Overlapping instances for ToAVector [] Double
arising from a use of ‘toAVector’
Matching instances:
instance (A.Elt a, G.Vector v a) => ToAVector v a
-- Defined in ‘Data.Array.Accelerate.Utils’
instance A.Elt a => ToAVector [] a
-- Defined in ‘Data.Array.Accelerate.Utils’
这对我来说没有意义,因为 []
与 G.Vector [] a
不匹配,所以实例怎么可能重叠?
实例仅与实例头匹配。所以,为了重叠与否,你写的不比
instance ToAVector [] a
instance ToAVector v a
这显然是重叠的。
换个说法:
... as
[]
does not matchG.Vector [] a
...
这在 Haskell 中永远不是有效的推理,因为 class 类型是 open。您永远无法知道某物不是特定 class 的实例,因为任何人稍后都可以将其设为实例。