使用幻影类型派生

时间:2018-11-27 21:52:34

标签: haskell deriving coerce

道歉,但我一直无法将其缩短。以下代码可以编译到最后一行:

session()->forget('returnUrl')

此后,出现以下错误:

  • 无法匹配类型为{-# LANGUAGE RankNTypes #-} {-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, UndecidableInstances #-} {-# LANGUAGE DerivingVia, DerivingStrategies, StandaloneDeriving #-} {-# LANGUAGE ScopedTypeVariables #-} module Repro where import Prelude hiding ((+)) class (Additive a) where (+) :: a -> a -> a data Vector2D u = Vector2D { x :: u, y :: u } 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 Phantom1 d a = Phantom1 (Vector2D a) --Axial deriving via (Vector2D a) instance forall d . (Additive a) => (Additive (Phantom1 d a)) data Via a b = Via a class IsoEvidence a b where convertTo :: a -> b convertFrom :: b -> a instance forall a b . (IsoEvidence a b, Additive b) => (Additive (Via a b)) where (Via x) + (Via y) = Via $ convertFrom $ (convertTo x :: b) + (convertTo y :: b) newtype Phantom2 d a = Phantom2 (Vector2D a) --Offset instance (IsoEvidence (Phantom1 d a) (Phantom2 d a)) where convertTo (Phantom1 x) = Phantom2 x convertFrom (Phantom2 x) = Phantom1 x deriving via (Via (Phantom2 d a) (Phantom1 d a)) instance (Additive a, IsoEvidence (Phantom1 d a) (Phantom2 d a)) => (Additive (Phantom2 d a)) 的表示形式           与Vector2D a

似乎在说不能将“ Via&c”强制为“ Vector2D a”,这很奇怪,因为它实际上是一个新的两级深度的新类型,并且效果很好。

我在这里做什么错了?

1 个答案:

答案 0 :(得分:3)

DerivingVia通过新类型起作用,但是您写了

data Via a b = Via a   -- should be newtype