Есть ли способ выразить в Haskell, что тип должен быть экземпляром класса типов более чем одним способом?

(Заранее извините, если вопрос глупый или очевидный - у меня нет большого опыта работы с 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 для Полукольца r ).

Итак, в общих условиях я спрашиваю: с учетом класса типов A , есть ли способ параметризовать класс типов B a с требованием, чтобы a быть экземпляром A двумя способами (это означает, что a должен реализовывать функции, указанные в A двумя способами)?

8
задан gspr 22 October 2010 в 17:05
поделиться