私はこのようないくつかのタイプを持っていました:
data Currency = USD | EUR
deriving (Show, Typeable)
data Money :: Currency -> * where
Money :: Int -> Money c
deriving (Show, Typeable)
typeOf
そして、私はこの関数でそれらを使用したかった:
findRate :: Money a -> Rates -> Maybe Double
findRate a = M.lookup (typeOf a)
findRateの型a
にインスタンスがなかったため、これは機能しませんでしたTypeable
。だから私はこれを行うことでそれを修正しました:
deriving instance Typeable USD
deriving instance Typeable EUR
findRate :: (Typeable a) => Money a -> Rates -> Maybe Double
ただし、通貨の数が増えると、それは多くのボイラープレートになります。すべての種類の種類がインスタンスCurrency
を派生させるように指定する方法はありますか?Typeable
編集:また、それを推論させる方法がいいので、どこにでも追加する必要はありませMoney a
ん。それはマイナーですが。a
Typeable
(Typeable a) =>