【发布时间】:2011-03-17 14:47:27
【问题描述】:
我正在尝试学习 Scala,并尝试编写一个从序列中提取一元、二元和三元的序列理解。例如,[1,2,3,4] 应该转换为(不是 Scala 语法)
[1; _,1; _,_,1; 2; 1,2; _,1,2; 3; 2,3; 1,2,3; 4; 3,4; 2,3,4]
在 Scala 2.8 中,我尝试了以下方法:
def trigrams(tokens : Seq[T]) = {
var t1 : Option[T] = None
var t2 : Option[T] = None
for (t3 <- tokens) {
yield t3
yield (t2,t3)
yield (t1,t2,Some(t3))
t1 = t2
t2 = t3
}
}
但这不能编译为apparently,在for-comprehension 中只允许一个yield(也没有块语句)。有没有其他优雅的方式来获得相同的行为,只需要传递一次数据?
【问题讨论】:
-
不是 scala 程序员,但看起来您正在返回 1-tuple、2-tuple 和 3-tuple,它们都没有相同的数据类型。所以它可能不是类型检查。每个元素都应该具有相同的数据类型,例如本例中的 3 元组。在 F#/OCaml 中,您可以将不同的返回类型包装在一个联合中,例如
let trigram = One of 'a | Two of 'a * 'a | Three of 'a * 'a * 'a,然后您可以yield One(t3); yield Two(t2, t3); yield Three(t1, t2, t3),其中返回类型为seq<trigram<Option<'a>>>。 -
它确实会检查我是否将结果声明为 Seq[Any],或者我是否使用派生自
Ngram的类Unigram、Bigram和Trigram,而不是元组。
标签: scala yield list-comprehension