假设:
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
本身并不“坏” 。但显然我无法让这个工作......
答案 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
类型,而不仅仅是特定类型。