3

私はこのようないくつかのタイプを持っていました:

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ん。それはマイナーですが。aTypeable(Typeable a) =>

4

2 に答える 2