【问题标题】:How would one implement OCaml / F#'s "function" construct in Scala?如何在 Scala 中实现 OCaml / F# 的“函数”构造?
【发布时间】:2014-07-18 11:58:19
【问题描述】:

我在 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
}

保存一个不必要的参数。

我尝试将其编写为一个接受名称调用参数的函数,但 Scala 不允许我创建一个空的 match 块。

有可能吗?还是 scala 可能已经内置了类似的东西?

【问题讨论】:

    标签: scala f# pattern-matching ocaml


    【解决方案1】:

    使用函数而不是方法:

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

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

    【讨论】:

      【解决方案2】:

      你可以使用偏函数:

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

      虽然这需要您指定左侧函数的类型,例如

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

      【讨论】:

      • 我喜欢!它干净且相当简洁,可以用作function[Int, Boolean] 以及您的建议。我想知道还有什么其他方法可以解决这个问题
      • 在这种情况下创建PartialFunction 没有任何意义。
      • @sschaef 我猜李只是试图尽可能接近地匹配 F# 代码
      • @ElectricCoffee - 实际上我认为您不能将此语法与非部分函数一起使用。正如 sschaef 的回答所示,既然你可以这样做没有任何好处。
      【解决方案3】:

      我找到了一种(非常丑陋的)方法

      与其说它是一个实际的解决方案,不如说它更像是一种 hack/workaround,但我想我还是会在这里发布它

      你可以这样做:

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

      这行得通,解决了问题,但写起来比我一开始试图摆脱的难看和笨拙。

      我很想看看你们能想出什么。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-09-20
        • 2013-02-23
        • 1970-01-01
        • 1970-01-01
        • 2018-01-04
        • 2018-09-03
        相关资源
        最近更新 更多