我在Scala中发现的一种常见趋势是:
def someFunction(a: SomeClass) = a match { ... }
从a
那里再也没有使用过。这种模式在FP中很常见,OCaml和F#有一个内置的构造,可以让你完全抛弃这个参数。
而不是写这个:
let someFunction a =
match a with
| 0 -> true
| _ -> false
你可以写下这个:
let someFunction =
function
| 0 -> true
| _ -> false
所以我的问题是,是否可以在Scala中编写类似的内容?
def someFunction = function {
case 0 => true
case _ => false
}
保存其他不必要的参数。
我试图将其编写为一个采用call-by-name参数的函数,但Scala不会让我创建一个空的match
块。
有可能吗?或者scala可能已经内置了这样的东西?
答案 0 :(得分:8)
使用函数而不是方法:
val someFunction: Int => Boolean = {
case 0 => true
case _ => false
}
您必须明确地编写类型注释,但这不能是一个缺点 - 对于API使用它是有用的文档。
答案 1 :(得分:3)
您可以使用部分功能:
def function[A, B](mf: PartialFunction[A, B]): A => B = x => mf(x)
虽然这要求您在左侧指定功能的类型,例如
def someFunction: Int => Boolean = function {
case 0 => true
case _ => false
}
答案 2 :(得分:0)
我发现了一种(非常难看)的方式
它更像是一个黑客/解决方案,而不是一个真正的解决方案,但我想我还是会在这里发布
你可以这样做:
def something = (_: Int) match {
case 0 => true
case _ => false
}
这可以解决这个问题,但是它的写作比起我试图摆脱的问题更难看和笨拙。
我很想知道你们能想出什么。