(Заранее извините, если вопрос глупый или очевидный - у меня нет большого опыта работы с Haskell).
Есть ли способ выразить, что тип должен быть экземпляром класса типов более чем одним способом? Лучше всего это проиллюстрировано на примере (который, вероятно, несколько глуп): в математике мы можем сказать, что полукольцо - это набор, который является коммутативным моноидом при выполнении одной операции (которую мы назовем сложением, тождество 0), и моноидом при выполнении одной операции. другой (который мы назовем умножением) наряду с требованиями, которые умножение распределяет по сложению и что 0 аннигилирует все элементы при умножении. Последние части здесь не важны.
Предположим теперь, что у меня есть класс типов Monoid
(не путать с Data.Monoid
),
class Monoid m where
unit :: m
operation :: m -> m -> m
и хотел бы создать класс типов Semiring
. Из определения, данного выше, я хотел бы сказать, что «если тип r является моноидом двумя (различными) способами, мы назовем его полукольцом». Так что я бы хотел что-то вроде
class (Monoid r, Monoid r) => Semiring r where ...
что, конечно, не работает. По общему признанию, пример становится немного странным, поскольку больше нет функций, которые мы хотели бы требовать для полуколец, поэтому класс типов будет пуст, но я надеюсь, что он иллюстрирует то, о чем я спрашиваю (или просто притворимся, что нам нужна какая-то функция f:r->r
для Semiring r
).
Итак, в общих настройках я спрашиваю: с учетом класса типов A
, есть ли способ параметризовать класс типов B a
с требованием, чтобы a
был экземпляром A
двумя способами (это означает, что a
должен реализовывать функции, указанные в A
двумя способами)?