是否可以使用数字参数创建类型?
即,如果我想创建一种具有固定位宽的整数:
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。