使用类型系统将整数转换为peano数

时间:2013-01-07 09:25:15

标签: scala type-level-computation peano-numbers

这是a question I asked almost two years ago的后续行动。我还在尝试使用类型系统来编写一个小的线性代数库,其中矢量/矩阵/张量的维度使用类型系统进行编码(使用Peano编号)。这允许编译器将二进制操作限制为相应维度的对象。

效果很好,但我必须手动指定每个维度类型。例如(使用shapeless natural numbers):

type _1 = Succ[Nat._0]
type _2 = Succ[_1]
type _3 = Succ[_2]

对于小尺寸是可以的,但如果我需要定义尺寸_1024,它会变得无聊。我正在尝试(没有成功)找到一种方法将(在编译时)整数文字转换为相应的Peano-number类型。

Daniel Sobral answer评论中,我被告知这是不可能的,因为Scala不支持依赖类型。现在,Scala 2.10具有依赖类型和宏。那么有没有办法实现它?

1 个答案:

答案 0 :(得分:8)

现在可以使用2.10.0中的宏(虽然使用Paradise可以使语法更清晰)。我已经发布了一个袖手旁观的完整工作示例here - 我确信它可以轻松地变得更简洁 - 您可以像这样使用:

val holder = NatExample.toNat(13)

然后:

scala> implicitly[holder.N =:= shapeless.Nat._13]
res0: =:=[holder.N,shapeless.Nat._13] = <function1>

如果传递非文字整数等,它将失败并出现合理的编译时错误