【发布时间】:2016-05-01 06:12:45
【问题描述】:
说明:我接受了gzm0's 的回答,因为它很震撼!
@Eduardo 确实提出了以下建议:
(for(i <- 10..20; j=runTest(i)) yield i -> j).toMap
这也让我可以运行构建,他只是从未发布过答案,@gzm0 的答案在概念上很棒,所以我接受了。
Once I get this other issue figured out relating to "can't call constructor"我将能够通过实际运行程序来测试这些 LOL
问题:我在这个表达式中有一个错误,特别是如何修复它,但更一般地说,我错过了关于 FP 或 Scala 的哪些错误?
timingsMap = for (i <- powersList; j <- runTest(i)) yield i -> j
我正在为算法分析作业编写我的第一个 Gradle/Scala 项目。 Scala 不是作业的一部分,所以我没有使用作业标签。除了我在 Java 中使用 Spark 的工作外,我对函数式编程是全新的,我确信这就是问题所在。
这是一个 sn-p,the full .scala file is on GitHub,可以吗,否则我会在此处发布完整程序:)
val powersList = List(10 to 20)
// create a map to keep track of power of two and resulting timings
var timingsMap: Map[Integer, Double] = Map()
// call the runTest function once for each power of two we want, from powersList,
// assign timingsMap the power of 2 value and results of runTest for that tree size
timingsMap = for (i <- powersList; j <- runTest(i)) yield i -> j
错误是: /home/jim/workspace/Scala/RedBlackTree4150/src/main/scala/Main.scala:36:值映射不是 Double 的成员 TimingsMap = for (i j
我认为我在timingsMap = ... 行中所做的是将powersList 的所有元素映射到循环的每次迭代的i,以及@987654330 的返回值@ 在每次迭代中映射到 j,然后将所有这些对放入 timingsMap。是我试图在循环中使用i 到call runTest(i) 的方式导致问题吗?
runTest 看起来像这样:
def runTest(powerOfTwo: Range): Double = {
// create the tree here
var tree = new TreeMap[Int, Double]
// we only care to create a tree with integer keys, not what the value is
for (x <- powerOfTwo) {
// set next entry in map to key, random number
tree += (x -> math.random)
}
stopWatchInst.start()
// now go through and look up all the values in the tree,
for (x <- powerOfTwo) {
// get the value, don't take the time/overhead to store it in a var, as we don't need it
tree.get(x)
}
// stop watch check time report and return time
stopWatchInst.stop()
val totalTime = stopWatchInst.elapsed(TimeUnit.MILLISECONDS)
loggerInst.info("run for 2 to the power of " + powerOfTwo + " took " + totalTime + " ms")
return totalTime
}
注意:我有一个建议将 j <- 中的 j <- 更改为 = 在这一行:timingsMap = for (i j
另一个建议根本不喜欢使用 yield 并建议用 (10 to 20).map 替换...
奇怪的是现有代码在 IntelliJ 编辑器中没有显示错误,只有在我运行它时才会中断。这些建议都给出了 IDE 中的类型不匹配错误。我真的想从概念上弄清楚我做错了什么,感谢您的帮助! (当然我需要让它工作!)
在尝试 gzm0 回答后,我走上了同一条路……我的代码在我使用 gradle run 之前没有显示任何类型不匹配……而当我进行建议的更改时,它开始给我错误就在 IDE 中……但请继续!这是基于 gzm0s 答案的最新错误:
/home/jim/workspace/Scala/RedBlackTree4150/src/main/scala/Main.scala:37: type mismatch;
found : List[(scala.collection.immutable.Range.Inclusive, Double)]
required: Map[Integer,Double]
timingsMap = for (i <- powersList) yield i -> runTest(i)
【问题讨论】:
-
在课堂上去掉括号
RedBlackTree4150()没什么区别我可以看到...我可以通过 Safari 书籍访问学习 Scala 和 Wampler 的 Programming Scala 所以如果那里有很好的参考,请使用章节/章节标题不是页码谢谢:) -
贴了一个答案,但是变成了长篇讨论,他不想去聊天,但愿那个用户没有删除答案!他们建议我使用 (10 to 20).map 之类的东西,但我们遇到了很多类型不匹配的问题。我认为我对
for ... yield所做的事情与地图一样,在引擎盖下。有没有理由避免for ... yield?该用户不喜欢它。 -
将
j = runTest(i)与=一起使用,而不是<-。<-符号用于收藏时。runTest只返回一个Double值 -
非常有帮助,让我查看 Scala 规范以了解更多信息,但我仍然遇到类型不匹配
/home/jim/workspace/Scala/RedBlackTree4150/src/main/scala/Main.scala:36: type mismatch; found : List[(scala.collection.immutable.Range.Inclusive, Double)] required: Map[Integer,Double] timingsMap = for (i <- powersList; j = runTest(i)) yield i -> j -
好的。我认为,一旦达到这一点,您可以通过将整个 for/yield 表达式括在括号中并调用
.toMap来修复它
标签: scala dictionary functional-programming