【发布时间】:2017-05-03 08:40:09
【问题描述】:
我发现在进行类型模式匹配时阅读了 scala 支持绑定类型变量的规范:
Map(1 -> "one", 2 -> "two") match {
case l: Map[k, v] =>
// binds k to Int and v to String
// k and v are types as shown here:
val i: Iterator[Tuple2[k, v]] = l.iterator
println(i.mkString(", "))
}
我可以用它做一些花哨或实用的事情吗?或者绑定类型变量只对类型文档有用?
突然想到Scala有时需要类型注解,比如定义函数,所以我尝试了:
def prepender(obj: Any) = obj match {
case xs: List[a] => (x: a) => x :: xs
case opt: Some[a] => (x: a) => x :: Nil
}
但是返回函数的类型很奇怪:
prepender: (obj: Any)a with a => List[Any] forSome { type a; type a }
scala> val p = prepender(List(1,2))
p: a with a => List[Any] forSome { type a; type a } = <function1>
scala> p(1)
<console>:10: error: type mismatch;
found : Int(1)
required: a(in value res7) with (some other)a(in value res7) where
type (some other)a(in value res7), type a(in value res7)
【问题讨论】:
-
起初我认为这只是为了方便语法,因为类型在编译时总是已知的。但现在我想知道这是否可以用于实例化存在类型?
标签: scala types pattern-matching