繁体   English   中英

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

[英]How would one implement OCaml / F#'s “function” construct in Scala?

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

使用函数而不是方法:

val someFunction: Int => Boolean = {
  case 0 => true
  case _ => false
}

您必须显式编写类型注释,但这不能是一个缺点 - 对于API使用它是有用的文档。

你可以使用部分功能:

def function[A, B](mf: PartialFunction[A, B]): A => B = x => mf(x)

虽然这要求你在左边指定功能的类型,例如

def someFunction: Int => Boolean = function {
    case 0 => true
    case _ => false
}

我找到了一种(非常难看)的方式

这是一个黑客/解决方案,而不是一个实际的解决方案,但我想我还是会在这里发布它

你可以这样做:

def something = (_: Int) match {
  case 0 => true
  case _ => false
}

这有效并解决了这个问题,但它写起来比我试图从一开始就摆脱的东西更丑陋和笨拙。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM