在Scala中,Int是列表[Int]的超级类型吗?它是如何形成的?
看看这个例子:在Scala中,Int是列表[Int]的超级类型吗?它是如何形成的?,scala,functional-programming,fold,Scala,Functional Programming,Fold,看看这个例子: val list = List(1, 2, 3, 4, 5) val sum = list.fold(0)((x, y) => x + y) assert(sum == 15) 以及折叠的方法签名: fold[A1 >: A](z: A1)(op: (A1, A1) => A1): A1 我假设A是类型List[Int]和A1是类型Int。 根据forfold,A1是二进制运算符的类型参数,是a的超类型。如果我上面的假设是正确的,那么在上面的求和示例中,
val list = List(1, 2, 3, 4, 5)
val sum = list.fold(0)((x, y) => x + y)
assert(sum == 15)
以及折叠的方法签名
:
fold[A1 >: A](z: A1)(op: (A1, A1) => A1): A1
我假设A
是类型List[Int]
和A1
是类型Int
。
根据forfold
,A1
是二进制运算符的类型参数,是a的超类型。如果我上面的假设是正确的,那么在上面的求和示例中,Int
是List[Int]
的超级类型。像这样的一些博客文章实际上明确地说明了这一点。
显然,
List[Int]
没有扩展Int
。所以我的问题是:Int
是List[Int]
的超级类型吗?a是List[+a]
类型构造函数本身中绑定的类型变量:它位于您链接的文档页面顶部,在
sealed abstract class List[+A]
您的list
-变量的类型是list[Int]
,因此A
是Int
。fold
中的A1
必须是Int
的超类型,在这种情况下,a
和A1>:a
因此只是Int
(而不是列表[Int]
)
关于博客的链接:它确实包含了这句话 Int是List[Int]的超类型 这显然是错误的。您可以通过以下方式轻松检查:
scala> implicitly[List[Int] <:< Int]
^
error: Cannot prove that List[Int] <:< Int.
scala>隐式[List[Int]A
是List[+A]
类型构造函数本身中绑定的类型变量:它位于您链接的文档页面顶部,在
sealed abstract class List[+A]
您的list
-变量的类型是list[Int]
,因此A
是Int
。fold
中的A1
必须是Int
的超类型,在这种情况下,A
和A1>:因此A
只是Int
(不是list[Int]/code>)
关于博客的链接:它确实包含了这句话
Int是List[Int]的超类型
这显然是错误的。您可以通过以下方式轻松检查:
scala> implicitly[List[Int] <:< Int]
^
error: Cannot prove that List[Int] <:< Int.
scala>隐式[List[Int]你引用的博客是非常错误的,但是博客没有提到任何东西,甚至没有暗示像Int是一个超级类型的List[Int]这样的错误声明
@sarveshseri只有这样做了,请检查最后第三段的最后一句。它只是说,在所有三个折叠中,起始值的类型必须与返回值相同,这是一个正确的语句。这一点从签名本身就非常清楚了-对于任何列表[a]
都有三个“折叠”方法-fold[A1>:A](z:A1)(op:(A1,A1)=>A1:A1
,foldLeft[B](z:B)(op:(B,A)=>B):B
,和foldRight[B](z:B)(op:(A,B)=>B):B
。正如您所看到的,返回类型与收集器/起始值类型完全相同。我甚至没有看到任何迹象表明Int是一种超级类型的列表[Int]
。好的。现在我看到了。它确实说,Int是列表的超类型[Int]
…奇怪的是,当我上次读到它时,它逃过了我的注意。你引用的那个博客是非常错误的,但是博客没有提到任何东西,甚至没有暗示像Int是列表的超类型[Int]这样的非常错误的声明
@sarveshseri只有这样做了,请检查最后第三段的最后一句。它只是说,在所有三个折叠中,起始值的类型必须与返回值相同,这是一个正确的语句。这一点从签名本身就非常清楚了-对于任何列表[a]
都有三个“折叠”方法-fold[A1>:A](z:A1)(op:(A1,A1)=>A1:A1
,foldLeft[B](z:B)(op:(B,A)=>B):B
,和foldRight[B](z:B)(op:(A,B)=>B):B
。正如您所看到的,返回类型与收集器/起始值类型完全相同。我甚至没有看到任何迹象表明Int是一种超级类型的列表[Int]
。好的。现在我看到了。它确实说,Int是列表[Int]
的超类型……奇怪的是,当我上次读它的时候,它逃过了我的眼睛。