Scala中函数组合的语法很好

Fra*_*ank 5 scala

我希望得到一个像desort = (reverse . sort)Scala中的Haskell一样富有成效的语法......这是我的尝试:

implicit class Composition[A,B,C](val g: A => B) {
  def o(f: B => C): A => C = { a:A => f(g(a))}
}

val fg = cos _ o sin
Run Code Online (Sandbox Code Playgroud)

我们有什么方法可以摆脱_gf的声明吗?

Mic*_*jac 9

对于函数yes,但对于方法,没有.您的问题是您正在尝试使用方法g,而不是函数.对于函数,已经有一种方法用于此andThen:

val f: Int => Int = _ + 1
val g: Int => String = _.toString

scala> val fg = f andThen g
fg: Int => String = <function1>

scala> fg(2)
res3: String = 3
Run Code Online (Sandbox Code Playgroud)

你自己的隐式类也可以工作(虽然我没有看过你想要的确切语义),使用像fg我这样定义的函数.它甚至可以用于函数和方法(按此顺序).

def a(i: Int): Int = i + 1
def b(i: Int): String = i.toString

scala> f andThen a
res4: Int => Int = <function1>
Run Code Online (Sandbox Code Playgroud)

但是,a andThen b不能正常工作,因为这a是一个你无法调用的方法andThen.为了使用andThen,a需要转换为一个不会自动发生的函数,因为函数不一定是预期的.a _ andThen beta-扩展a为一个函数,其中有一个调用的方法andThen,并且可以提供b(方法)的参数,因为编译器将隐式转换b为函数,因为函数是唯一预期作为参数的函数.andThen.Function并不是唯一一个调用方法的类型andThen,因此编译器不能指望100%的时间从一个方法转换为函数a.