当说scala通过对象语法提供一流的模块支持时,这是什么意思?词汇表中没有任何内容甚至提到这句话,但我现在已经遇到过两次并且无法破译它.在这篇关于适配器的博客文章中有人说过.
Quasiquotes的Scala文档在解释提升时提到了这一点:
也可以结合提升和非提示拼接:
scala> val ints = List(1, 2, 3)
scala> val f123 = q"f(..$ints)"
f123: universe.Tree = f(1, 2, 3)
scala> val intss = List(List(1, 2, 3), List(4, 5), List(6))
scala> val f123456 = q"f(...$intss)"
f123456: universe.Tree = f(1, 2, 3)(4, 5)(6)
Run Code Online (Sandbox Code Playgroud)
具体是代码示例中的提升与非引用拼接的实现?
这是本教程的一些代码:
case class ListNode[+T](h: T, t: ListNode[T]) {
def head: T = h
def tail: ListNode[T] = t
def prepend(elem: T): ListNode[T] =
ListNode(elem, this)
}
Run Code Online (Sandbox Code Playgroud)
教程说:
不幸的是,这个程序不能编译,因为只有在变量位置使用类型变量时才能进行协方差注释.由于类型变量T作为方法前置的参数类型出现,因此该规则被破坏.
如何T处于协变位置predend,其他T参考(def head: T = h和def tail: ListNode[T] = t)显然是协变的?
什么我问的是,为什么T在prepend不协变.这当然不包括在为什么函数[-A1,...,+ B]没有关于允许任何超类型作为参数?,这似乎是其他人指导我阅读的内容.
这些显然是在scala中为构造函数中的任何参数自动生成的(我想这也暗示它们可以在其他地方手动添加)但这些东西是什么?
例如:
abstract type
ClassSymbol >: Null <: Universe.TypeSymbol with Universe.ClassSymbolApi
Run Code Online (Sandbox Code Playgroud)
这是在这里找到的.我意识到这有什么描述,但从语法的角度来看,我无法理解它.
Null的目的是什么?看起来它可能是某种默认值,但我只是猜测,因为我只看到这种类型的语法,并且我认为null可以是类型的返回,而不会破坏程序.这是一个抽象类型,但它没有您稍后可以指定的参数,那么它如何作为抽象类型工作?
例如: implicit val IntOrd = new Ord [Int ] {...}
如果Ord是特质,此代码是否合法?我在有关OO类和类型类之间差异的文档中看到了这一点。