我希望得到一个像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的声明吗?
对于函数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)
你自己的隐式类也可以工作(虽然我没有看过你想要的确切语义),使用像f和g我这样定义的函数.它甚至可以用于函数和方法(按此顺序).
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.