用於幻影型別貨幣的用例

幻像型別對於處理資料非常有用,它們具有相同的表示形式,但在邏輯上並不是同一型別。

一個很好的例子是處理貨幣。如果你使用貨幣,你絕對不希望例如新增兩種不同的貨幣。5.32€ + 2.94$ 的結果貨幣是什麼?它沒有定義,沒有充分的理由這樣做。

對此的解決方案可能如下所示:

{-# LANGUAGE GeneralizedNewtypeDeriving #-}

data USD
data EUR

newtype Amount a = Amount Double
                 deriving (Show, Eq, Ord, Num)

GeneralisedNewtypeDeriving 擴充套件允許我們為 Amount 型別派生 Num。GHC 重用了 DoubleNum 例項。

現在,如果你使用例如 (5.0 :: Amount EUR) 代表歐元金額,你已經解決了在型別級別保持雙金額分開而不會引入開銷的問題。像 (1.13 :: Amount EUR) + (5.30 :: Amount USD) 這樣的東西會導致型別錯誤,並要求你適當地處理貨幣轉換。

可以在 haskell wiki 文章中找到更全面的文件