什么"太通用"类型系统的意思?

时间:2017-12-08 09:58:20

标签: scala

参考以下教程https://twitter.github.io/scala_school/type-basics.htmlfoo[A,B]将无法编译,因为它过于通用'。我不明白什么太普通'暗示。为什么foo无法编译,foo1呢?

scala> def foo[A,B](f: A=>List[A], b:B) = f(b)
<console>:11: error: type mismatch;
 found   : b.type (with underlying type B)
 required: A
       def foo[A,B](f: A=>List[A], b:B) = f(b)
                                            ^

scala> def foo1[A](f: A=>List[A], b:A) = f(b)
foo1: [A](f: A => List[A], b: A)List[A]

1 个答案:

答案 0 :(得分:2)

f的类型为A => List[A]。这意味着只能使用f类型的参数调用A。因此b A的{​​{1}}类型必须为f(b)。在b: B允许b为任何类型的意义上,A过于通用,而不仅仅是def wrapInt(i: Int): List[Int] = List(i)

例如考虑以下函数:

wrapInt(42)

现在以下呼叫是合法的:

wrapInt("hello")

但这个不是

"hello"

因为Int不是foo(wrapInt, 42) 。因此应该允许:

foo(wrapInt, "hello")

,但这不应该:

def foo[A,B](f: A=>List[A], b:B)

根据签名wrapInt("hello"),两者都将被允许,即使后者会导致rdd.unpersist() ,这是错误的类型。因此,该签名对该机构来说是非法的。