用於幻影型別貨幣的用例
幻像型別對於處理資料非常有用,它們具有相同的表示形式,但在邏輯上並不是同一型別。
一個很好的例子是處理貨幣。如果你使用貨幣,你絕對不希望例如新增兩種不同的貨幣。5.32€ + 2.94$
的結果貨幣是什麼?它沒有定義,沒有充分的理由這樣做。
對此的解決方案可能如下所示:
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
data USD
data EUR
newtype Amount a = Amount Double
deriving (Show, Eq, Ord, Num)
GeneralisedNewtypeDeriving
擴充套件允許我們為 Amount
型別派生 Num
。GHC 重用了 Double
的 Num
例項。
現在,如果你使用例如 (5.0 :: Amount EUR)
代表歐元金額,你已經解決了在型別級別保持雙金額分開而不會引入開銷的問題。像 (1.13 :: Amount EUR) + (5.30 :: Amount USD)
這樣的東西會導致型別錯誤,並要求你適當地處理貨幣轉換。
可以在 haskell wiki 文章中找到更全面的文件