9

我不确定我在这里做错了什么:

data Vector2D u = Vector2D { 
    _x :: u, 
    _y :: u 
} deriving stock (Show, Eq, Functor, Foldable, Traversable)

{-# INLINE addVector2 #-}
addVector2 :: (Additive a) => Vector2D a -> Vector2D a -> Vector2D a 
addVector2 (Vector2D { _x = x1, _y = y1 }) (Vector2D { _x = x2, _y = y2 }) = 
    Vector2D { _x = x1 + x2, _y = y1 + y2 }

instance (Additive a) => Additive (Vector2D a) where
    (+) = addVector2

newtype Square a = Square {
    unpackSquare :: Vector2D a
} deriving stock (Show, Eq)

到目前为止,一切正常(Additive 在代数包中定义,但非常不言自明)。

但是,现在我想聪明地使用 DerivingVia 和 StandaloneDeriving,我什至无法编译下一行

deriving instance (Additive a) => Additive (Square a) via (Vector2D a)

但这让我

    * 预期种类 `k0 -> * -> Constraint',
        但是 `Additive (Square a)' 有一种 `Constraint'
    * 在独立派生实例中
        `(Additive a) => Additive (Square a) via (Vector2D a)'

谁能告诉我我做错了什么?我正在运行 GHC 8.6.2

4

1 回答 1

21

它是

deriving via (Vector2D a) instance (Additive a) => Additive (Square a)

你写的方式,via看起来像一个类型变量

deriving instance (Additive a) => Additive (Square a) via (Vector2D a)
-- <==>
deriving instance forall a via. (Additive a) => Additive (Square a) (via) (Vector2D a)

这会产生一个种类不匹配的错误,因为Additive (Square a) :: Constraint它已经饱和了,但是您已经将它应用于另外两个参数。

这是从速记形式倒过来的:

data T' = ...
  deriving Class via T 
于 2018-11-21T01:50:26.767 回答