作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
"two") match { case l: Map[k, v] =>-6ren">
我发现在进行类型模式匹配时阅读了 scala 支持绑定(bind)类型变量的规范:
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(", "))
}
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 函数:
val sum = (a: Int, b: Int) => a + b
a
是
a
和
b
是
b
.它只需要知道
a
以及
b
属于
Int
类型那
a
出现在
b
之前(在这种情况下这无关紧要,因为加法是可交换的,但编译器无论如何都会关心!)。 Scala 提供了一个(别误会我也喜欢它)编译器友好的占位符语法,它可以作为这个“假设”的证明。
val sum: (Int, Int) => Int = _ + _ // where the 1st _ differs from the 2nd _
case x: SomeTypeParameterizedWith[AnotherType] // AnotherType is erased anyway
case x: SomeParameterizedType[_] // Existential type
case x: SomeParameterizedType[kind] // Existential type which you can reference
// This is a Java class with wildcards
public class Wild {
public java.util.Collection<?> contents() {
java.util.Collection<String> stuff = new Vector<String>();
stuff.add("a");
stuff.add("b");
stuff.add("see");
return stuff;
}
}
// This is the problem
import scala.collection.mutable.Set
val iter = (new Wild).contents.iterator
val set = Set.empty[???] // what type goes here?
while (iter.hasMore)
set += iter.next()
// This is the solution
def javaSet2ScalaSet[T](jset: java.util.Collection[T]): Set[T] = {
val sset = Set.empty[T] // now T can be named!
val iter = jset.iterator
while (iter.hasNext)
sset += iter.next()
sset
}
val set = new Wild().contents match {
case jset: java.util.Collection[kind] => {
val sset = Set.empty[kind]
val iter = jset.iterator
while (iter.hasNext)
sset += iter.next()
sset
}
}
kind
是必需的,因此编译器可以验证您指的是同一事物。
set
中添加字符串。由于
set
的类型是
Set[_]
.
关于scala - 具有类型变量的类型模式的用例和示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7313948/
我最近购买了《C 编程语言》并尝试了 Ex 1-8这是代码 #include #include #include /* * */ int main() { int nl,nt,nb;
早上好!我有一个变量“var”,可能为 0。我检查该变量是否为空,如果不是,我将该变量保存在 php session 中,然后调用另一个页面。在这个新页面中,我检查我创建的 session 是否为空,
我正在努力完成 Learn Python the Hard Way ex.25,但我无法理解某些事情。这是脚本: def break_words(stuff): """this functio
我是一名优秀的程序员,十分优秀!