Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala匿名函数的遗传变异问题_Scala_Generics_Contravariance_Invariants_Covariant - Fatal编程技术网

Scala匿名函数的遗传变异问题

Scala匿名函数的遗传变异问题,scala,generics,contravariance,invariants,covariant,Scala,Generics,Contravariance,Invariants,Covariant,我正在学习Scala,我很难理解逆变、协变、不变性等。从中我学会了如何将函数视为另一个函数的子类型。(知道真的很有用!) 我相信下面的代码是解决我的难题的重要部分。我提取了一些我认为会增加问题不必要复杂性的部分。根据这个例子,我有一个Student对象,它将作为工厂来生成函数 函数将采用AnyVal的类型或子类型(Int、Double、Long等),返回输出将采用相同的输入类型。为了实现这一点,student类接受一个泛型(a),它是AnyVal的子类型。抽象类就在那里,因此我可以通过执行类似l

我正在学习Scala,我很难理解逆变、协变、不变性等。从中我学会了如何将函数视为另一个函数的子类型。(知道真的很有用!)

我相信下面的代码是解决我的难题的重要部分。我提取了一些我认为会增加问题不必要复杂性的部分。根据这个例子,我有一个Student对象,它将作为工厂来生成函数

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

问题是,当我得到错误“协变类型A出现在值函数的类型=>List[A]=>A的逆变位置”时,我不能有行“val function:List[A]=>A”。我不知道为什么返回类型必须是A的反变量。基于Function1特性,我可以接受这个事实

那么,我应该如何在抽象主类中定义我的函数,从而使返回类型是类型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)
抽象类主控[+A]{
val函数:列表[A]=>A
}
班级学生[A]扩展硕士[A]
对象学生{
def func1=
新学生((参数:列表[Int])=>params(0)+params(1))
}
val myFunc=Student.func1
val someList=List[Master[AnyVal]](myFunc)

很难创建使用协变类型参数化的泛型类或特征。一旦添加了方差注释,就不能将该类型用作任何类方法的参数。这是因为函数的参数是逆变的,返回类型是协变的。这是一个很好的解释以公认的回答


如果确实希望类型是协变的,则必须编写所有方法以获取类型[B>:A]的参数-也就是说,将A的超类型作为其参数类型。这可能是相当具有挑战性的;在线Scala文档中包含了可能需要的技巧。

我不知道如何编译。
函数是一个对象。您是否将Scala与JS混合使用?:)很抱歉,这应该是“新学生”((params:List[Int])=>params(0)+params(1))“感谢您指出这一点。