我有一个参数化类型,我想将其限制为数字类型,更具体地说是 a Fractional
,例如:
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 中说以下内容:“当您使用 Rating 类型时,它的参数必须是的子类,Fractional
以便我可以对其执行准确的算术运算”。我怎样才能做到这一点?还是我离题和/或过度设计?