'Экземпляр класса типа не найден' в классе типов с несколькими параметрами

Разумно ли иметь классы многопараметрических типов в PureScript?

Компилятор выдает необоснованную ошибку «Не найден экземпляр класса типа» (см. полный вывод). приведенное ниже определение класса типа:

class Transform model turn where
  transform :: turn -> model -> model
  delay :: Maybe turn -> Int

Ошибка возникает из-за определения функции delay, которая не зависит от параметра типа model. Как видно из выходных данных компилятора, приведенных выше, он заменяет отсутствующую модель на t0.

Как правильно это исправить? В настоящее время я решил эту проблему, изменив тип turn, как показано ниже:

class Turnable model turn where
  runTurn :: turn model -> model -> model
  turnDelay :: Maybe (turn model) -> Int

person Sridhar Ratnakumar    schedule 11.12.2016    source источник


Ответы (2)


Правый фолд из канала Slack FP дал такой ответ:

добавить fundep | turn -> model

Тогда экземпляр ищется только через turn

Следовательно, я изменил определение класса типа на это:

class Turnable model turn | turn -> model where
  runTurn :: turn -> model -> model
  turnDelay :: Maybe turn -> Int

Это обрадовало компилятор. Подробнее см. Функциональные зависимости (fundep) в вики Haskell и 24 дня публикации PureScript.

person Sridhar Ratnakumar    schedule 11.12.2016

... раньше мы использовали прокси (https://github.com/purescript/purescript-proxy), чтобы помочь компилятору решить, какой экземпляр выбрать. например :

turnDelay :: Proxy model -> turn -> Int
turnDelay _ turn = .....

и вызовите его, передав прокси:

turnDelay (Proxy :: Proxy FooModel) barTurn

Я согласен, что FunDeps - это правильный путь.

person pete    schedule 13.12.2016