def ngrams(n: Int, words: Array[String]) = {
// exclude 1-grams
(1 to n).map { i => words.sliding(i).toStream }
.foldLeft(Stream[Array[String]]()) {
(a, b) => a #::: b
} }
scala> val op2 = ngrams(3, "how are you".split(" ")).foreach { x => println((x.mkString(" ")))}
Output as :
how
are
you
how are
are you
how are you
op2: Unit = ()
如何避免上述 单位 值,实际上我想将它们转换为Set,因为Unit =(),它失败了。那么请你帮忙输出 设置(你怎么样,你,你是怎么样,你是怎么样的) 感谢帖子How to generate n-grams in scala?。
答案 0 :(得分:2)
简短回答是foreach
的返回类型为Unit
。因此,当您将foreach
的输出分配到op2
时,op2
的类型为Unit
,其值为()
。
听起来你想要做的是以下几点:
ngrams
方法计算n-gram,Set
和让我们从op2
方法的类型开始:
ngrams
它返回(n: Int, words: Array[String]) => Stream[Array[String]]
,看起来很容易变成Stream
Set
:
toSet
但是,这很危险,因为在scala中,ngrams(3, "how are you".split(" ")).toSet
相等是通过引用完成的。将Array
转换为Stream[Array[String]]
以便删除任何重复内容会更加安全(假设订单在每个ngram中都很重要):
Stream[List[String]]
现在,您可以像val op2 = ngrams(3, "how are you".split(" ")).map(_.toList).toSet
一样轻松打印Set[List[String]]
:
Stream[Array[String]]
由于结果为op2.foreach { x => println((x.mkString(" ")))}
()
类型,因此没有理由将其分配给变量。
答案 1 :(得分:0)
它是op2
的类型签名。你可以做到
ngrams(3, "how are you".split(" ")).foreach { x => println((x.mkString(" ")))}
.foreach
更改为.map
,并将结果调用op2
。 scala> val op2 = ngrams(3, "how are you".split(" ")).map { x => x.mkString(" ")}.toList
scala> op2