サーチ…


ファントムタイプのユースケース:通貨

ファントム型は、同じ表現を持ちますが、論理的に同じ型ではないデータを扱う場合に便利です。

良い例は、通貨を扱うことです。通貨で作業する場合は絶対に絶対に決して2つの金額の異なる通貨を追加することは望ましくありません。 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の記事で見つけることができます



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow