Способ иметь общую функцию в объявлении экземпляра? - PullRequest
0 голосов
/ 27 ноября 2018

Я пытаюсь заставить работать следующий код:

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 голосов
/ 27 ноября 2018

Haskell не разрешает локальные определения в предложениях объявления экземпляров where.Но предположим, гипотетически, что это так.Тогда то, что вы пытаетесь сделать все же , не сработает.Компилятор не может знать, как создавать переменные типа в вызовах convert.Вы, кажется, хотите что-то вроде неявных параметров на уровне типа, и это звучит для меня как настоящий кошмар.Если передача прокси вам не по вкусу, вы можете использовать TypeApplications.

...