为什么我在这个简单的Scala代码上收到错误?
这是我的代码:
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 希望能说清楚.基本上问题在于错误类型的选择. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 泛型 – 返回两个值中的第一个的通用方法
- 将Vim改造为强大的IDE—Vim集成Ctags/Taglist/Cscope/Winma
- bootstrap学习笔记(一)--layout
- angular – 条件模板插值是否有语法?
- Laravel源码入门-启动引导过程(八)HandleExceptions
- angular – 在子组件中具有多个formControl的ControlValueA
- AXIS发布WebService
- twitter-bootstrap – Bootstrap模态未捕获的TypeError:对
- scala – RDD到LabeledPoint的转换
- angularjs – 如何在量角器中选择单个项目