相关疑难解决方法(0)

+ - 在Scala中签署通用声明

我在这个链接中查看了PartialFunction的文档:

trait PartialFunction[-A, +B] extends (A) ? B
Run Code Online (Sandbox Code Playgroud)

也许有人可以帮助澄清通用声明中加号和减号的重要性?

generics scala

44
推荐指数
3
解决办法
7842
查看次数

Scala逆变 - 现实生活中的例子

我理解scala中的协方差和逆变.协方差在现实世界中有很多应用,但除了相同的函数旧例子之外,我无法想到任何逆变量应用.

有人可以了解现实世界contravariance使用范例吗?

computer-science scala

30
推荐指数
3
解决办法
3992
查看次数

为什么函数[-A1,...,+ B]不允许任何超类型作为参数?

我相信人们可以将协方差(至少对象来说)定义为"使用较窄(子)类型的值代替某种较宽(超级)类型的值的能力",并且这种相反性恰好相反.这个.

显然,Scala函数是函数[-A1,...,+ B]的实例,用于逆变参数类型A1等,以及协变返回类型B.虽然这对于函数的子类型很方便,但上述定义不应该意味着我可以传递任何超类型作为参数?

请告诉我哪里弄错了.

scala function covariance contravariance

30
推荐指数
3
解决办法
4834
查看次数

Scala中变量声明中的通用通配符

在Java中我可能会这样做:

class MyClass {
    private List<? extends MyInterface> list;

    public void setList(List<MyImpl> l) { list = l; }
}
Run Code Online (Sandbox Code Playgroud)

......假设(MyImpl implements MyInterface当然).

使用?时,Scala中的模拟是Buffer什么?

import java.lang.reflect._
import scala.collection.mutable._

class ScalaClass {
   val list:Buffer[MyInterface]  = null

   def setList(l: Buffer[MyImpl]) = {
     list = l
   }
}
Run Code Online (Sandbox Code Playgroud)

这(当然)不编译 - 但是如何list以这样的方式声明变量呢?

编辑 ; 我要补充一点.显然,这与Java中的泛型在T从不协变这一事实有关,而在Scala中,它们可以是协变的,也可以不是协变的.例如,Scala类List在T中是协变的(并且必然是不可变的).因此以下将编译:

class ScalaClass {
   val list:List[MyInterface]  = null

   def setList(l: List[MyImpl]) = {
     list = …
Run Code Online (Sandbox Code Playgroud)

java generics scala covariance contravariance

16
推荐指数
1
解决办法
1万
查看次数

为什么在Function1 [-A,+ B]中将第一个类型参数定义为逆变?

所有读完Scala协方差/逆变问题及其答案由Daniel Spiewak提供,以及"Scala编程"一书的第19.3-19.7节,我对Function1 [-A,+ B]的定义有另一种疑惑:为什么它的第一种类型参数是逆变的吗?我有一个原因,就是这种类型参数保证了当有多种情况时,子类型总是比超类型更早出现,同时,子类型"是一种"超类型.例如:

 class A
 class B extends A
 class C extends B
 scala> val withDefault: A => B = {
 | case x:B => new B
 | case x:A => new B }
 withDefault: A => B = <function1>
Run Code Online (Sandbox Code Playgroud)

这里,(1)case x:B早于case x:A,(2)功能1 [A,B] <:功能1 [B,B]并且必须有其他原因?任何消息将不胜感激!

scala

8
推荐指数
1
解决办法
345
查看次数

错误:协变类型A出现在逆变位置

我试图写一个不可变的Matrix[A]类.我希望类被协变的A,但是当我把+前面A的编译器开始抱怨在类中的一些操作.

以下是我的Matrix类的相关子集(实际类比以下子集大5倍):

class Matrix[+A] private(val contents: Vector[Vector[A]])(implicit numericEv: Numeric[A])
    extends ((Int, Int) => A) with Proxy {

  import numericEv._
  import Prelude._

  // delegate `equals` and `hashCode` implementations to `contents`
  override def self = contents

  val nRows: Int = contents.length

  val nColumns: Int = contents(0).length.ensuring { len =>
    contents.forall(_.length == len)        
  }

  def dimensions = (nRows, nColumns)

  def isSquare = nRows == nColumns

  def hasSameOrderAs[B : Numeric](that: Matrix[B]) = this.dimensions == …
Run Code Online (Sandbox Code Playgroud)

scala covariance contravariance

7
推荐指数
1
解决办法
3141
查看次数

关于Scala中协方差的一些问题

我正在尝试理解Scala中的协方差,但我找不到任何帮助我解决这个问题的例子.我有这个代码:

    class GenericCellImm[+T] (val x: T) {}
Run Code Online (Sandbox Code Playgroud)

它编译得很好,但是当我使用它时

    class GenericCellMut[+T] (var x: T) { }
Run Code Online (Sandbox Code Playgroud)

它没有编译.为什么我在写这段代码时不能使用var(但我可以使用val)?我该如何解决?这里也是类似的情况

    abstract class Sequence[+A] {
    def append(x: Sequence[A]): Sequence[A]} 
Run Code Online (Sandbox Code Playgroud)

问题是什么?

scala covariance

7
推荐指数
2
解决办法
81
查看次数

X类采用类型参数

通过这篇关于Parser Combinators的信息性很好的文章阅读,我看到了这段代码:

class DisParser[+A](left: Parser[A], right: Parser[A]) extends Parser[A] {
  def apply(s: Stream[Character]) = left(s) match {
    case res: Success => res
    case _: Failure => right(s)
  }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试编译此代码时,我得到:

Parser.scala:19: error: class Success takes type parameters
    case res: Success => res
              ^
one error found
Run Code Online (Sandbox Code Playgroud)

鉴于签名Parser:

case class Success[+A](value: A, rem: Stream[Character]) extends Result[A]
Run Code Online (Sandbox Code Playgroud)

如何更改case res: Success => res线条以提供Success正确的类型参数?

scala parser-generator

6
推荐指数
1
解决办法
8366
查看次数

Scala类声明中[+ A]的含义是什么?

在scala中,Option类被声明为

  sealed abstract class _Option[+A]

  case object _None extends _Option[Nothing] {}

  final case class _Some[+A](x: A) extends _Option[A] {}
Run Code Online (Sandbox Code Playgroud)

什么是[+A]?为什么不[A]呢?可能[-A]是它意味着什么?

对不起,如果它是重复但我找不到答案的SO.

types scala

6
推荐指数
1
解决办法
1316
查看次数

scala.collection.mutable 中的 HashMap 是不变的,但 immutable.HashMap 是协变的,为什么?

我想用 mutable.HashMap[] 的 val 扩展一个类,如下所示:

class Father
class Son extends Father    

class C1{
  val m = new mutable.HashMap[Int, Father]() 
}

class C2 extends C1{
  override val m = new mutable.HashMap[Int, Son]()
}
Run Code Online (Sandbox Code Playgroud)

并得到一个错误:

错误:(19, 16) 覆盖类型为 scala.collection.mutable.HashMap[Int,ScalaByExample.Father] 的类 C1 中的值 m;值 m 具有不兼容的类型覆盖 val m = new mutable.HashMapInt, Son

我发现它immutable.HashMap是协变的,但它mutable.HashMap是不变的。如果替换mutable.HashMapimmutable.HashMap.

所以我的两个问题是:

  1. 如何使用 mutable.HashMap 使其工作?

  2. 为什么scala的作者要这样设计HashMap?

scala

5
推荐指数
1
解决办法
316
查看次数