【发布时间】:2011-03-17 19:49:17
【问题描述】:
我正在尝试使用各种 Scala 实现的类似 C# 的 yield return(即this one)和“for”构造,例如:
private def permutations[T](s: Vector[T]) = {
def swap(i: Int, j: Int) {
val tmp = s(i)
s.set(i, s.get(j))
s.set(j, tmp)
}
iterator[Vector[T]] {
def generate(left: Int, right: Int): Unit @cps[Iteration[Vector[T]]] = {
if (left >= right)
yieldValue(s)
else {
generate(left, right)
for (i <- left to right) {
swap(left, i)
generate(left+1, right)
swap(left, i)
}
}
}
generate(0, s.size-1)
}
}
但是这段代码编译错误:
error: no type parameters for method foreach: (f: (Int) => U)Unit exist so that it can be applied to arguments ((Int) => Unit @util.continuations.package.cps[ru.ispras.texterra.nlp.GHMMDisambiguator.Iteration[Vector[T]]])
--- because ---
argument expression's type is not compatible with formal parameter type;
found : (Int) => Unit @util.continuations.package.cps[ru.ispras.texterra.nlp.GHMMDisambiguator.Iteration[Vector[T]]]
required: (Int) => ?U
for (i <- left to right) {
据我了解,我必须将所有代码都设置为 () => Unit,而不是 () => Unit @with-annotations。我该怎么做?
这个问题好像很常见,但是我在网上没有找到任何提及。
【问题讨论】:
-
也许我遗漏了一些东西,但该示例中的大括号似乎不匹配。你怎么能在那里调用生成?它在嵌套范围内。
-
我通过移除一个额外的大括号解决了这两个问题。
-
此问题与以下问题重复,提供了答案:stackoverflow.com/questions/8934226/…
标签: scala scala-2.8 yield continuations yield-return