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

为什么我在这个简单的Scala代码上收到错误?

发布时间:2020-12-16 18:38:54 所属栏目:安全 来源:网络整理
导读:这是我的代码: object Triple { object Num extends Enumeration { type Num = Value val one,two,three,four,five,six,seven,eight,nine = Value } val triples = for { first - Num.values second - Num.values third - Num.values if (first != second)
这是我的代码:

object Triple {
  object Num extends Enumeration {
    type Num = Value
    val one,two,three,four,five,six,seven,eight,nine = Value
  }
  val triples = for {
    first <- Num.values
    second <- Num.values
    third <- Num.values
    if (first != second)
    if (first != third)
    if (second != third)
  } yield Set(first,second,third)
}

我在第三行得到错误.它说:

Multiple markers at this line
    - not enough arguments for method map: (implicit bf: 
         scala.collection.generic.CanBuildFrom[sudoku.Triple.Num.ValueSet,scala.collection.immutable.Se    t[sudoku.Triple.Num.Value],That])That. Unspecified 
 value parameter bf.
- diverging implicit expansion for type 
 scala.collection.generic.CanBuildFrom[sudoku.Triple.Num.ValueSet,scala.collection.immutable.Set[sudoku.Triple.Num.Value],That] starting with 
 method newCanBuildFrom in object SortedSet
- not enough arguments for method map: (implicit bf: 
 scala.collection.generic.CanBuildFrom[sudoku.Triple.Num.ValueSet,That] starting with 
 method newCanBuildFrom in object SortedSet

更新:Aleksey Izmailov给出了一个很好的答案.稍微好一点的函数实现是val triples = Num.values.subset(3).toSet

解决方法

看起来你要做的是这样的:

scala> object Num extends Enumeration {
     |     type Num = Value
     |     val one,nine = Value
     |   }
defined module Num

scala>   val triples = Num.values.toList.combinations(3)
triples: Iterator[List[Num.Value]] = non-empty iterator

scala> triples.toList
res0: List[List[Num.Value]] = List(List(one,three),List(one,four),five),six),seven),eight),nine),List(two,three...
scala>

如果你做这样的事情那么它的工作原理:

scala> object Triple {
     |   object Num extends Enumeration {
     |     type Num = Value
     |     val one,nine = Value
     |   }
     |   val triples = for {
     |     first <- Num.values
     |     second <- Num.values
     |     third <- Num.values
     |     if (first != second)
     |     if (first != third)
     |     if (second != third)
     |   } yield (first,third)
     | }
defined module Triple

scala> Triple.triples
res1: scala.collection.immutable.SortedSet[(Triple.Num.Value,Triple.Num.Value,Triple.Num.Value)] = TreeSet((one,(one,two),...
scala>

请注意,生成的集合的结果是SortedSet.该结果由Num.values定义 – 您可以将理解转换为map,flatMap和filter以检查类型的来源.

问题是你可以将可以分类的东西放到SortedSet中,例如:

scala> scala.collection.immutable.SortedSet(1,2)
res6: scala.collection.immutable.SortedSet[Int] = TreeSet(1,2)

但是,你不能把没有定义的东西放到SortedSet中,因为SortedSet保证了东西的排序,并且应该知道如何完成排序(通过隐式排序):

scala> scala.collection.immutable.SortedSet(Set(1,2),Set(3,4))
<console>:8: error: No implicit Ordering defined for scala.collection.immutable.Set[Int].
              scala.collection.immutable.SortedSet(Set(1,4))

Scala查找隐式排序在范围内定义,并且没有为您正在使用的Set或我的示例中的Set [Int]找到一个.

现在让我们“修复”它:

scala> implicit val dummyOrdering: Ordering[Set[Int]] = Ordering.by(_.size)
dummyOrdering: Ordering[Set[Int]] = scala.math.Ordering$$anon$9@6f00d9a7

scala> scala.collection.immutable.SortedSet(Set(1,4))
res8: scala.collection.immutable.SortedSet[scala.collection.immutable.Set[Int]] = TreeSet(Set(3,4))

显然,这是一个糟糕的解决方案,真正的问题是在你的情况下类型没有很好地选择.首先,您不需要为每个组合使用Set,因为您已经比较了事物以避免重复.只需使用Tuple3.其次,如果你坚持使用Set,那么在for comprehension中将Num.values转换为List:

scala> object Triple {
     |   object Num extends Enumeration {
     |     type Num = Value
     |     val one,nine = Value
     |   }
     |   val triples = for {
     |     first <- Num.values.toList
     |     second <- Num.values.toList
     |     third <- Num.values.toList
     |     if (first != second)
     |     if (first != third)
     |     if (second != third)
     |   } yield Set(first,third)
     | }
defined module Triple

希望能说清楚.基本上问题在于错误类型的选择.

(编辑:李大同)

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

    推荐文章
      热点阅读