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

par*_*tic 6 scala type-level-computation peano-numbers

这是我差不多两年前提出一个问题的后续问题.我还在尝试使用类型系统来编写一个小的线性代数库,其中矢量/矩阵/张量的维度使用类型系统进行编码(使用Peano编号).这允许编译器将二进制操作限制为相应维度的对象.

它运行良好,但我必须手动指定每个维度类型.例如(使用无形自然数):

type _1 = Succ[Nat._0]
type _2 = Succ[_1]
type _3 = Succ[_2]
Run Code Online (Sandbox Code Playgroud)

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

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

Tra*_*own 8

现在可以使用2.10.0中的宏(尽管使用Paradise可以使语法更清晰).我已经发布了一个现成的,袖口完整的工作示例在这里 -我相信这很容易被更简洁,您可以使用像这样做:

val holder = NatExample.toNat(13)
Run Code Online (Sandbox Code Playgroud)

然后:

scala> implicitly[holder.N =:= shapeless.Nat._13]
res0: =:=[holder.N,shapeless.Nat._13] = <function1>
Run Code Online (Sandbox Code Playgroud)

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

  • 它是[标准库类型类](http://www.scala-lang.org/api/current/index.html#scala.Predef$),它提供了编译器知道两种类型相同的证据.它在2.10之前 - 见例如[这个答案](http://stackoverflow.com/a/3427759/334519),讨论它是如何使用的. (2认同)