haskell - 数字类型签名

标签 haskell types type-systems type-level-computation

是否可以创建带有数字参数的类型?

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

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/

相关文章:

haskell - 如何使用 `zipTree` 实现 `foldTree` ?

c++ - 实现在模板参数中定义的类型

types - Scheme 中的斐波那契程序(使用定义数据类型)

c - %p 格式说明符需要对所有类型显式转换为 void*,但 printf 中的 char* 除外

scala - 如果 `K >: T` 是协变或逆变,那么 `K <: T` 和 `T` 的方差是多少?

haskell - 使用 State Monad 时了解符号 "<-"吗?

haskell - Haskell 和 Brick 的 RGB 终端颜色

Haskell 问题 : constraining data types to use show

Scala 语法/类型系统语法示例?

scala - 使用隐式见证组合类型级函数