【发布时间】:2013-12-18 05:01:50
【问题描述】:
我已经发现可以bind the type parameter进行模式匹配
为什么在这种情况下不起作用?
trait T
case class S[A](a: A) extends T
def pr(t1: T, t2: T) = (t1, t2) match {
case (S(a): S[ta], S(b): S[tb]) => println(a); println(b)
}
^
error: '=>' expected but ':' found.
有关信息,这是可行的:
def pr(t1: T, t2: T) = (t1, t2) match {
case (s1: S[a], s2: S[b]) => println(s1.a); println(s2.a)
}
还有这个:
def pr(t1: T, t2: T) = (t1, t2) match {
case (S(a), S(b)) => println(a); println(b)
}
我需要恢复类型以定义其他无法推断类型的函数,因为在eta-expansion的上下文中。
更新
正如 cmets 中提到的,我需要这些类型只是为了进行正确的类型检查,而不是其他任何东西。
例如:
trait T
case class S[A](a: A, w: A => Int) extends T
def makeTwo(t1: T, t2: T) = (t1, t2) match {
case (S(a1, w1), S(a2, w2)) =>
val wNew = { (a, b) => w1(a) + w2(b) }
S((a, b), wNew)
}
error: missing parameter type
val wNew = { (a, b) => w1(a) + w2(b) }
^
【问题讨论】:
-
您无法检索类型参数信息,因为它在运行时不存在 - 请参阅类型擦除
-
@LuigiPlinge,在这里键入擦除并不重要。作者不需要获取真正的类型,他需要绑定一个类型才能使代码通过类型检查。在编写通用 [反] 序列化库时,我也必须做类似的事情,但是,我不知何故避免了这个问题。
-
尝试为
makeTwo方法添加类型注释,您会发现问题所在。这个方案中的T绝对可以是任何东西 -
在这种情况下,T 不是类型变量,它实际上是一个 trait。我应该把它密封吗?
标签: scala types pattern-matching