当前位置: 首页 > 知识库问答 >
问题:

Scala匿名函数Genic方差问题

燕经国
2023-03-14

我正在学习Scala的路上,我很难理解逆变量、协变量、不变性等等。为什么这个例子不能编译,也就是(co-、contra-、in-)方差是如何工作的?我已经了解了函数如何可以被认为是另一个函数的子类型。(知道真有用!)

下面的代码是我认为解决我的难题的重要部分。我摘录了一些我认为会给问题增加不必要的复杂性的部分。根据这个示例,我有一个Studenthtml" target="_blank">对象,它将充当生成函数的工厂。

函数将接受AnyVal(Int、Double、Long等)的类型或子类型,并且返回的输出将是相同的输入类型。为了实现这一点,student类接受一个泛型(a)(它是anyval的子类型)。这里有抽象类,这样我就可以通过执行list[master[AnyVal]](student.func1)这样的操作来引用这些学生的列表。

问题是我不能有行“val function:list[A]=>A”,因为我得到错误“covariant type A发生在value function的type=>list[A]=>A中的逆变位置”。我不知道为什么返回类型必须是A的逆变量。对于基于Function1特性的name来说,我多少可以接受这个事实。

那么我如何在抽象主类中定义函数,使返回类型是类型a的逆变量呢?我找到了一个如何用函数定义的例子(例如def function[B>:A](v:B):list[B]),但是我如何用匿名函数来实现它呢?记住,主抽象类中的“a”必须是协变的,因为将有一个包含所有AnyVal类型(Int、Double等)的函数列表

真的很感谢你的帮助!如果我的术语出了问题,请告诉我。-Scala学习者

abstract class Master[+A] {
    val function: List[A] => A
}

class Student[A <: AnyVal](val function: List[A] => A) extends Master[A]

object Student {
def func1 =
    new Student((params: List[Int])=>params(0) + params(1))
}

val myFunc = Student.func1
val someList = List[Master[AnyVal]](myFunc)

共有1个答案

拓拔松
2023-03-14

创建带有协变类型参数化的泛型类或特征是非常困难的。添加variance注释后,就不能将该类型用作任何类方法的参数。这是因为函数的参数是反变的,返回类型是协变的。在这个公认的答案中有一个很好的解释。

如果你真的希望类型是协变的,你就得编写所有的方法来取[B>:A]类型的参数--也就是说,取A的超类型作为它们的参数类型。这可能是相当具有挑战性的;在线Scala文档中有一个可能需要的技巧示例。

 类似资料:
  • Scala 函数 Scala 中定义匿名函数的语法很简单,箭头左边是参数列表,右边是函数体。 使用匿名函数后,我们的代码变得更简洁了。 下面的表达式就定义了一个接受一个Int类型输入参数的匿名函数: var inc = (x:Int) => x+1 上述定义的匿名函数,其实是下面这种写法的简写: def add2 = new Function1[Int,Int]{     def app

  • 5.6. 匿名函数 拥有函数名的函数只能在包级语法块中被声明,通过函数字面量(function literal),我们可绕过这一限制,在任何表达式中表示一个函数值。函数字面量的语法和函数声明相似,区别在于func关键字后没有函数名。函数值字面量是一种表达式,它的值被成为匿名函数(anonymous function)。 函数字面量允许我们在使用函数时,再定义它。通过这种技巧,我们可以改写之前对st

  • 有没有想过定义一个很短的回调函数,但又不想用 def 的形式去写一个那么长的函数,那么有没有快捷方式呢? 答案是有的。 python 使用 lambda 来创建匿名函数,也就是不再使用 def 语句这样标准的形式定义一个函数。 匿名函数主要有以下特点: lambda 只是一个表达式,函数体比 def 简单很多。 lambda 的主体是一个表达式,而不是一个代码块。仅仅能在 lambda 表达式中封

  • 当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便。 在Python中,对匿名函数提供了有限支持。还是以map()函数为例,计算f(x)=x2时,除了定义一个f(x)的函数外,还可以直接传入匿名函数: >>> map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]) [1, 4, 9, 16, 25, 36, 49, 64, 81]

  • 当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便。 在Python中,对匿名函数提供了有限支持。还是以map()函数为例,计算f(x)=x2时,除了定义一个f(x)的函数外,还可以直接传入匿名函数: >>> list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9])) [1, 4, 9, 16, 25, 36, 49, 6

  • 本文向大家介绍PHP匿名函数,包括了PHP匿名函数的使用技巧和注意事项,需要的朋友参考一下 介绍 匿名函数是没有任何用户定义名称的函数。这样的函数也称为闭包或lambda函数。有时,您可能希望功能一次使用。Closure是一个匿名函数,它在定义它的环境中关闭。您需要在其中指定use关键字。匿名函数的最常见用法是创建内联回调函数。 语法 在function关键字和左括号之间没有函数名称。 函数定义后