Я пытаюсь реализовать тип CurrencyQty, который действует как число, помеченное во время компиляции:
data Currency = Usd | Eur | Gbp
data CurrencyQty (a :: Currency) = CurrencyQty Double deriving (Num)
А теперь я хочу реализовать универсальную функцию преобразования, которая динамически ищет обменные курсы.Предположим, у меня есть какая-то функция
currentExchangeRate :: Currency -> Currency -> IO Double
Я хочу написать
inUsd :: CurrencyQty a -> IO (CurrencyQty Usd)
inUsd (CurrencyQty Usd x) = return x
inUsd (CurrencyQty Eur x) = fmap (*x) $ currentExchangeRate Usd Eur
inUsd (CurrencyQty Gbp x) = fmap (*x) $ currentExchangeRate Usd Gbp
Или, может быть, как-то
inUsd :: CurrencyQty a -> IO (CurrencyQty Usd)
inUsd (CurrencyQty a x) = fmap (*x) $ currentExchangeRate Usd a
Синтаксис, который я использую, очевидно, недействителенhaskell ... есть ли способ сделать это?