Scala中函数组合的简明语法?

pio*_*rek 7 scala function-composition higher-order-functions

我正在学习Scala并遇到以下任务 - 如果string为空,则返回null,否则返回大写.

Apache Commons中有两个功能组合在一起解决了这个问题.在Haskell中,我只想写:

upperCaseOrNull = StringUtils.stripToNull . StringUtils.upperCase
Run Code Online (Sandbox Code Playgroud)

但是我找不到在Scala中做一个简单而干净的函数组合的方法.我发现的最短路径如下:

def upperCaseOrNull (string:String) = StringUtils.stripToNull (StringUtils.upperCase(string))
def upperCaseOrNull = StringUtils.stripToNull _ compose StringUtils.upperCase _
Run Code Online (Sandbox Code Playgroud)

Scala是否提供更简洁的语法,可能没有所有这些下划线?

Rex*_*err 2

Haskell 在一些它真正关心的事情上是极端紧凑的大师。所以它几乎是不可能被击败的。如果你做了太多的函数组合,以至于开销确实妨碍了你(就我个人而言,重复会更麻烦StringUtils.!),你可以做类似的事情

implicit class JoinFunctionsCompactly[B,C](g: B => C) {
  def o[A](f: A => B) = g compose f
}
Run Code Online (Sandbox Code Playgroud)

所以现在你只比 Haskell 多了四个字符(_两倍)。

  • @piotrek - 如果您将函数定义为函数(即“val upperCase = (s: String) => ...”),则不需要“_”。另外,如果总体上它大约是紧凑的,谁会在乎几个下划线呢?Racket 并不比 Scala 更紧凑。Racket 的开销是 `(define (compose ))`,而 Scala 的开销是 `def = _ compose _`。如果您的意思只是“我不喜欢下划线的外观”,请定义一个 compose 方法和 `compose(g,f)`。 (2认同)