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

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

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的实验分支中。我认为它很可能会合并到GHC 7.4。

一些进一步的阅读:

  • TypeNats,GHC Wiki页面。
  • Type-Level Naturals Basics
  • Ticket #4385
  • The TypeNats branch of GHC
  • 10-04 17:41
    查看更多