如何在Scala中实现OCaml / F#的“函数”构造?

时间:2014-07-18 11:58:20

标签: scala f# pattern-matching ocaml

我在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可能已经内置了这样的东西?

3 个答案:

答案 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
}

这可以解决这个问题,但是它的写作比起我试图摆脱的问题更难看和笨拙。

我很想知道你们能想出什么。