数値型、より具体的には 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 で次のことを言おうとしていると思いますFractional
。どうすればこれを達成できますか? または、私は的外れであるか、および/または過剰に設計されていますか?