在实例声明中具有通用功能的方法?

时间:2018-11-26 22:43:59

标签: haskell typeclass

我正在尝试使以下代码起作用:

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参数,这会使代码更难看。有没有办法使我想做的工作?

1 个答案:

答案 0 :(得分:1)

Haskell不允许在实例声明where子句中进行局部定义。但是,假设它做到了。然后,您尝试执行的 still 无效。编译器无法知道如何在对convert的调用中实例化类型变量。您似乎想要类型级别的隐式参数之类的东西,这听起来像是我的噩梦。如果代理传递不符合您的口味,则可以改用TypeApplications