Получение с помощью автономного получения - PullRequest
0 голосов
/ 21 ноября 2018

Я не совсем уверен, что я делаю не так:

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)

Пока все нормально (Аддитив определен в пакете алгебры, но довольно понятен).

Однако, теперь я хочу быть умным, используя DerivingVia и StandaloneDeriving, и я даже не могу получить следующую строку для компиляции

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

Но это заставляет меня

    * Expected kind `k0 -> * -> Constraint',
        but `Additive (Square a)' has kind `Constraint'
    * In the stand-alone deriving instance for
        `(Additive a) => Additive (Square a) via (Vector2D a)'

Можеткто нибудь подскажет что я делаю не так?Я использую GHC 8.6.2

1 Ответ

0 голосов
/ 21 ноября 2018

Это

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 
...