Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.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 - Fatal编程技术网

在这个Scala示例中,哪个是子类型函数?

在这个Scala示例中,哪个是子类型函数?,scala,Scala,我正在阅读Martin Odersky的Scala by example(2014)。 在第61页上,有一个从String类型到Int类型的函数被表示出来 作为trait函数1[String,Int]的实例。其中,函数1定义为: trait Function1[-A,+B]{def apply(x:A):B} 再往下也有人说 S=>T是S'=>T'的子类型,前提是S'是S的子类型,T是T'的子类型 他使用以下代码示例: val f:(AnyRef=>Int)=x=>x.hashCode() v

我正在阅读Martin Odersky的Scala by example(2014)。 在第61页上,有一个从String类型到Int类型的函数被表示出来 作为trait函数1[String,Int]的实例。其中,函数1定义为:

trait Function1[-A,+B]{def apply(x:A):B}

再往下也有人说

S=>T是S'=>T'的子类型,前提是S'是S的子类型,T是T'的子类型

他使用以下代码示例:

val f:(AnyRef=>Int)=x=>x.hashCode()
val g:(字符串=>Int)=f
g(“abc”)

这是我的问题。 因为String是AnyRef的子类型,所以我假设在这个例子中f代表g的子类型。对吗?
如果是,请解释该确定中的逻辑。

f和g函数,函数具有类型差异,允许类型参数的子类型和超类型:

在scala终端中运行以下代码将得到与运行示例相同的结果

g被声明为类型(AnyRef=>Int)的函数,该函数将实现如下函数:

val f = new Function[AnyRef /*or any supertype*/,Int /*or any subType type*/] {
   def apply(x: AnyRef): Int = x.hashCode()
}
它被定义为一个函数,它接受类型为
AnyRef
的参数,返回
Int

然后将g定义为一个函数,该函数接受
字符串
,并返回
Int
。它被设置为等于f,因此它变成:

val g = new Function[String /*Supertype of AnyRef*/, Int] {
    def apply(x: String): Int = x.hashCode()
}
虽然在这种情况下,g不是一个新函数。g只是f的另一个参考。从本质上讲,g是f类型转换为
函数[String,Int]

编辑:由于AnyVal是Int的子类型,因此也可以执行以下操作:

val gg: (String => AnyVal) = f

f和g函数,函数具有类型差异,允许类型参数的子类型和超类型:

在scala终端中运行以下代码将得到与运行示例相同的结果

g被声明为类型(AnyRef=>Int)的函数,该函数将实现如下函数:

val f = new Function[AnyRef /*or any supertype*/,Int /*or any subType type*/] {
   def apply(x: AnyRef): Int = x.hashCode()
}
它被定义为一个函数,它接受类型为
AnyRef
的参数,返回
Int

然后将g定义为一个函数,该函数接受
字符串
,并返回
Int
。它被设置为等于f,因此它变成:

val g = new Function[String /*Supertype of AnyRef*/, Int] {
    def apply(x: String): Int = x.hashCode()
}
虽然在这种情况下,g不是一个新函数。g只是f的另一个参考。从本质上讲,g是f类型转换为
函数[String,Int]

编辑:由于AnyVal是Int的子类型,因此也可以执行以下操作:

val gg: (String => AnyVal) = f

如果
V
U
的一个子类型,则
V
可以位于
U
可以位于的任何位置

如果你有一个
AnyRef=>Int
,你能在任何时候使用
String=>Int
吗?对
String
是一个
AnyRef
,因此您可以将其传入

因此,
AnyRef=>Int
String=>Int
的一个子类型。这种关系(有点“倒退”)是通过函数在其参数中是逆变的来描述的


也就是说,实例
f
g
不一定有任何关系。但是它们的类型确实如此。

如果
V
U
的一个子类型,那么
V
可以站在
U
可以站的任何地方

如果你有一个
AnyRef=>Int
,你能在任何时候使用
String=>Int
吗?对
String
是一个
AnyRef
,因此您可以将其传入

因此,
AnyRef=>Int
String=>Int
的一个子类型。这种关系(有点“倒退”)是通过函数在其参数中是逆变的来描述的

也就是说,实例
f
g
不一定有任何关系。但他们的类型确实如此