Scala类型编程资源
根据,Scala的类型系统是。有哪些资源可以让新手利用类型级编程的强大功能 以下是我迄今为止找到的资源:Scala类型编程资源,scala,types,Scala,Types,根据,Scala的类型系统是。有哪些资源可以让新手利用类型级编程的强大功能 以下是我迄今为止找到的资源: 这些资源很好,但我觉得我缺少基础知识,所以没有建立坚实的基础。例如,哪里有类型定义的介绍?我可以对类型执行哪些操作 有什么好的介绍性资源吗?有源代码、wiki和示例。除了这里的其他链接,还有我关于Scala中类型级元编程的博客文章: 概述 类型级编程与传统的值级编程有许多相似之处。但是,与值级编程不同,值级编程在运行时进行计算,而类型级编程则在编译时进行计算。我将尝试在
有什么好的介绍性资源吗?有源代码、wiki和示例。除了这里的其他链接,还有我关于Scala中类型级元编程的博客文章:
- ,Scala中的类型级元编程库
- 概述
类型级编程与传统的值级编程有许多相似之处。但是,与值级编程不同,值级编程在运行时进行计算,而类型级编程则在编译时进行计算。我将尝试在值级别的编程和类型级别的编程之间进行比较
范例
类型级编程有两种主要范式:“面向对象”和“函数式”。从这里链接到的大多数示例都遵循面向对象的范例
在apocalisp中可以找到一个很好的、相当简单的面向对象范例中的类型级编程示例,如下所示:
// Abstract trait
trait Lambda {
type subst[U <: Lambda] <: Lambda
type apply[U <: Lambda] <: Lambda
type eval <: Lambda
}
// Implementations
trait App[S <: Lambda, T <: Lambda] extends Lambda {
type subst[U <: Lambda] = App[S#subst[U], T#subst[U]]
type apply[U] = Nothing
type eval = S#eval#apply[T]
}
trait Lam[T <: Lambda] extends Lambda {
type subst[U <: Lambda] = Lam[T]
type apply[U <: Lambda] = T#subst[U]#eval
type eval = Lam[T]
}
trait X extends Lambda {
type subst[U <: Lambda] = U
type apply[U] = Lambda
type eval = X
}
这里有一个自然数的peano编码。也就是说,每个非负整数都有一个类型:0的一个特殊类型,即\u0
;并且每一个大于零的整数都有一种形式为Succ[a]
,其中a
是表示较小整数的类型。例如,表示2的类型将是:such[such[\u 0]]
(后续项应用于表示零的类型两次)
我们可以将各种自然数别名,以便更方便地参考。例如:
type _3 = Succ[Succ[Succ[_0]]]
(这非常类似于将val
定义为函数的结果。)
现在,假设我们想要定义一个值级函数def-toInt[T:T2
正如推特上所建议的那样:由迈尔斯·萨宾撰写。就我个人而言,我认为想在Scala中进行类型级编程的人已经知道如何在Scala中进行编程是很合理的。即使这意味着你链接到的那些文章我一个字也不懂:-)我只是想对有趣的博客说声谢谢;我一直在思考n关注它一段时间,特别是上面提到的最后一篇文章,加深了我对面向对象语言的类型系统应该具有的重要属性的理解。所以,谢谢!
type _3 = Succ[Succ[Succ[_0]]]
class TypeToValue[T, VT](value : VT) { def getValue() = value }
implicit val _0ToInt = new TypeToValue[_0, Int](0)
implicit def succToInt[P <: Nat](implicit v : TypeToValue[P, Int]) =
new TypeToValue[Succ[P], Int](1 + v.getValue())
def toInt[T <: Nat](v : T)(implicit ttv : TypeToValue[T, Int]) : Int = ttv.getValue()
val z:_0 = null
val y:Succ[_0] = null