9

是否可以使用数字参数创建类型?

即,如果我想创建一种具有固定位宽的整数:

newtype FixedWidth w = FixedWidth Integer

addFixedWidth :: FixedWidth w -> FixedWidth w -> FixedWidth (w+1)
mulFixedWidth :: FixedWidth w -> FixedWidth w -> FixedWidth (2*w)

这样类型检查器只允许FixedWidth相同类型的 s 相加或相乘,而且还要确定结果的正确精度。

我知道你可以这样做:

data Nil = Nil
data Succ x = Succ

addFixedWidth :: FixedWidth w -> FixedWidth w -> FixedWidth (Succ w)

并将数字 4 表示为Succ (Succ (Succ (Succ Nil)))),但这非常难看。我还需要弄清楚如何Succ为乘法结果类型附加两个 s。

4

1 回答 1

10

您正在寻找的功能是type-level naturals,称为-XTypeNatsHaskell 的扩展。

目前这可能只在GHC的一个实验分支中。我认为它可能会在 7.4 之前合并到 GHC 中。

一些进一步的阅读:

于 2011-06-04T19:55:32.270 回答