是否可以创建带有数字参数的类型?
即如果我想创建一种具有固定位宽的整数类型:
newtype FixedWidth w = FixedWidth Integer
addFixedWidth :: FixedWidth w -> FixedWidth w -> FixedWidth (w+1)
mulFixedWidth :: FixedWidth w -> FixedWidth w -> FixedWidth (2*w)
这样类型检查器只允许相同类型的FixedWidth
相加或相乘,但也确定结果的正确精度。
我知道你可以做这样的事情:
data Nil = Nil
data Succ x = Succ
addFixedWidth :: FixedWidth w -> FixedWidth w -> FixedWidth (Succ w)
并将数字 4 表示为 Succ (Succ (Succ (Succ Nil))))
,但这非常难看。我还需要弄清楚如何为乘法结果类型附加两个 Succ
。
最佳答案
您正在寻找的功能是类型级自然,称为 Haskell 的 -XTypeNats
扩展。
目前这可能仅在 GHC 的一个实验分支中。我认为它很可能会在 7.4 之前合并到 GHC 中。
一些进一步阅读:
关于haskell - 数字类型签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6239022/