模式匹配体模类型

时间:2018-09-12 16:11:11

标签: haskell data-kinds phantom-types

我正在尝试实现一个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 ...有没有办法做到这一点?

1 个答案:

答案 0 :(得分:3)

您不能为此使用幻像。幻像类型会在运行时消失,method函数需要一些运行时信息。

通常的方法是使用GADT和单例类型。

-exportOptionsPlist

让我补充一下,您的代码还可以。如果Haskell具有完全依赖类型,则可以对代码进行较小的调整,并避免使用其他单例类型。但是,目前,Haskell无法避免这种情况,需要付出更多努力。

相关问题