我有一個參數化的類型,我想限制爲一個數字型,更具體地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中說:「當你使用Rating類型時,它的參數必須是Fractional
的子類,所以我可以對它進行精確的算術運算」。我怎麼能做到這一點?或者我是否脫離了標記和/或過度工程?
已經在[這個答案]中討論過(http://stackoverflow.com/questions/12770278/typeclass-constraints-on-data-declarations)。 –
是的,你是對的。謝謝。儘管如此,我仍然喜歡我的問題的API設計方面,而Twan的答案下面的滿意同意我的另一個解決方案,這個解決方案是在函數上進行約束,這在其他問題中沒有涉及。 –