如何将(Vector v a)约束添加到实例声明中?

时间:2014-09-23 07:28:35

标签: haskell

假设:

newtype Matrix (w :: Nat) (h :: Nat) v a where
    Matrix :: v a -> Matrix w h v a

(其中v a是Data.Vector.Generic.Vector v a,你怎么说呢?)

instance Foldable (Matrix w h v) where
    foldMap = foldMapTree

foldMapTree :: (Vector v a, Monoid m) => (a -> m) -> Matrix w h v a -> m

GHC抱怨:

Matrix.hs:55:15:
    Could not deduce (Vector v a) arising from a use of ‘foldMapTree’
    from the context (Monoid m)

更改为:

instance Vector v a => Foldable (Matrix w h v) where
    foldMap = foldMapTree

给出:

Matrix.hs:54:10:
    Variable ‘a’ occurs more often than in the instance head
      in the constraint: Vector v a
      (Use UndecidableInstances to permit this)

使用UndecidableInstances并没有多大帮助,因为它几乎打破了其他一切......这个问题可能有一个简单的解决方案......其他答案表明UndecidableInstances本身并不“坏” 。但显然我无法让这个工作......

1 个答案:

答案 0 :(得分:2)

正如评论中所指出的,你想要的是不可能的。 Foldable类表达了对于给定类型构造函数{1}}的想法,您可以为任何参数类型Matrix w h v执行某些操作。

但是,您的a仅适用于受限范围的类型,即存在foldMapTree实例的类型。

即使您的Vector v a过了类型检查程序,也无济于事,因为它不会表示您需要instance Vector v a => Foldable (Matrix w h v)来支持所有可能的Vector v a类型,而不仅仅是特定类型。