我正在尝试使以下代码起作用:
instance (Integral n, OffsetCalculator o, HexDirection d) => (IsoEvidence (Axial d n) (Offset d o n)) where
po :: Proxy o
po = Proxy
pd :: Proxy d
pd = Proxy
adj :: Vector2D n -> n
adj p = adjustment po $ p ^. otherAxis pd
convert :: (n -> n -> n) -> Vector2D n -> Vector2D n
convert f p = (offsetAxis pd) %~ (flip f (adj p)) $ p
convertFrom (Offset p) = Axial $ convert (P.-) p
convertTo (Axial p) = Offset $ convert (P.+) p
我正在从以前的一些编译代码中转换它,因此我相对相信代码在概念上是可以的。我的问题是convertFrom和convertTo是IsoEvidence类唯一公开的方法。因此,其余部分将无法编译。
如果我将“转换”从实例声明中移出,则它本身开始需要Proxy参数,这会使代码更难看。有没有办法使我想做的工作?
答案 0 :(得分:1)
Haskell不允许在实例声明where
子句中进行局部定义。但是,假设它做到了。然后,您尝试执行的 still 无效。编译器无法知道如何在对convert
的调用中实例化类型变量。您似乎想要类型级别的隐式参数之类的东西,这听起来像是我的噩梦。如果代理传递不符合您的口味,则可以改用TypeApplications
。