对于那些scala专家,我正在为我的大学课程编写代码,编译器抛出错误,我不知道如何解决。
以下代码应该只调用一个菜单选项:
def menu(option: Int): Boolean = {
actionMap.get(option) match {
case Some(f) => f()
case None =>
println("ERROR: Please enter an option between 1-8")
true
}
}
编译器不喜欢这一行:
case Some(f) => f()
更具体地说它不喜欢
=> f()
我对函数式编程和scala完全陌生,因此,任何提示或线索都会很棒。
由于
答案 0 :(得分:2)
actionMap
的类型为Map[Int, Boolean]
。以下代码有效。
def menu(option: Int): Boolean = {
actionMap.get(option) match {
case Some(value) => value
case None =>
println("ERROR: Please enter an option between 1-8")
true
}
}
括号用于功能应用。因此,只有f()
是函数时才应使用f
。
actionMap.get(someIntValue)
将返回Boolean选项,您可以在选项上进行模式匹配以提取布尔值。在您的代码片段中,您尝试应用不允许的布尔值,因为它不是函数而是值。
例如,如果你的actionMap类似于下面那么你早期的代码是有效的
val actionMap = Map(1 -> { () -> true}, 2 -> { () -> false})
def menu(option: Int): Boolean = {
actionMap.get(option) match {
case Some(f) => f() //now f() is valid.
case None =>
println("ERROR: Please enter an option between 1-8")
true
}
}