У меня есть параметризованный тип, который я хотел бы, чтобы ограничить к числовому типу, более конкретно Fractional
, например:Могу ли я ограничить параметрический полиморфный тип конструктора типов/данных в Haskell?
data Rating a = (Fractional a) => Score a | Unscored deriving (Show, Eq)
так что пользователь API может определить, какой нецелый типа они могут использовать (Float
или Double
?), Но внутренний код API, который я пишу, все равно может выполнять арифметические операции над числовым типом. Я не хочу, чтобы это целое число, потому что результаты моих «внутренних операций» могут быть не целыми числами, и я понимаю, что использование Fractional
приведет к более точным результатам.
Компиляция выше (в GHCI по крайней мере) дает мне следующую ошибку:
Data constructor `Score' has existential type variables, a context, or a specialised result type
Score :: forall a. Fractional a => a -> Rating a
(Use ExistentialQuantification or GADTs to allow this)
In the definition of data constructor `Score'
In the data declaration for `Rating'
, который подсказывает мне, что я делаю что-то, что я, вероятно, не хотят продолжать попытки; т. е. мой дизайн - мусор.
Я предполагаю, что я пытаюсь сказать следующее в этом API: «когда вы используете тип рейтинга, его параметр должен быть подклассом Fractional
, поэтому я могу выполнить точные арифметические действия». Как я могу это достичь? Или я не в курсе и/или переоснащение?
Уже обсуждался в [этом ответе] (http://stackoverflow.com/questions/12770278/typeclass-constraints-on-data-declarations). –
Да, ты прав. Благодарю. Тем не менее, мне все еще нравятся аспекты API-дизайна моего вопроса, и ответ Твина ниже удовлетворяет соглашению с моим другим решением, которое должно было наложить на него функции, которые не рассматриваются в этом другом вопросе. –