加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 序列理解中的多重收益?

发布时间:2020-12-16 10:07:15 所属栏目:安全 来源:网络整理
导读:我正在尝试学习 Scala并尝试编写一个序列理解,从序列中提取unigrams,bigrams和trigrams.例如,[1,2,3,4]应转换为(不是Scala语法) [1; _,1; _,_,1; 2; 1,2; _,1,2; 3; 2,3; 1,3; 4; 3,4; 2,4] 在Scala 2.8中,我尝试了以下方法: def trigrams(tokens : Seq[T])
我正在尝试学习 Scala并尝试编写一个序列理解,从序列中提取unigrams,bigrams和trigrams.例如,[1,2,3,4]应转换为(不是Scala语法)

[1; _,1; _,_,1; 2; 1,2; _,1,2; 3; 2,3; 1,3; 4; 3,4; 2,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(也没有块语句).有没有其他优雅的方法来获得相同的行为,只有一次传递数据?

解决方法

for循环中不能有多个yield,因为for循环是map(或flatMap)操作的语法糖:

for (i <- collection) yield( func(i) )

翻译成

collection map {i => func(i)}

没有收益

for (i <- collection) func(i)

翻译成

collection foreach {i => func(i)}

因此,for循环的整个主体变为单个闭包,yield关键字的存在确定对集合调用的函数是map还是foreach(或flatMap).由于此翻译,禁止以下内容:

>在yield旁边使用命令式语句来确定将产生什么.
>使用多个收益率

(更不用说你提出的verison会返回一个List [Any],因为元组和1-gram都是不同的类型.你可能想要得到一个List [List [Int]])

请尝试以下方法(将n-gram按其出现的顺序排列):

val basis = List(1,4)
val slidingIterators = 1 to 4 map (basis sliding _)

for {onegram <- basis
     ngram <- slidingIterators if ngram.hasNext}
     yield (ngram.next)

要么

val basis = List(1,4)
val slidingIterators = 1 to 4 map (basis sliding _)
val first=slidingIterators head
val buf=new ListBuffer[List[Int]]

while (first.hasNext)
   for (i <- slidingIterators)
      if (i.hasNext)
         buf += i.next

如果您希望n-gram为长度顺序,请尝试:

val basis = List(1,4)
1 to 4 flatMap { basis sliding _ toList }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读