我想在Scala中找到与Haskell desort = (reverse . sort)
一样富有成效的语法......这是我的尝试:
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
我们有什么方法可以摆脱gf声明中的_
答案 0 :(得分: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
我自己的隐式类也会起作用(虽然我没有看过你想要的确切语义),使用像f
和g
这样的函数,因为我已经定义了他们。它甚至可以用于函数和方法(按此顺序)。
def a(i: Int): Int = i + 1
def b(i: Int): String = i.toString
scala> f andThen a
res4: Int => Int = <function1>
但是,a andThen b
不能按原样运作,因为a
是一种方法,您无法调用andThen
。为了使用andThen
,需要将a
转换为一个不会自动发生的函数,因为函数不一定是预期的。 a _ andThen b
eta-将a
扩展为一个函数,其中有一个名为andThen
的方法,并且可以提供b
(方法)的参数,因为编译器将隐式地将b
转换为函数,因为函数是唯一期望作为andThen
的参数的东西。 Function
并不是唯一一种名为andThen
的方法,因此编译器无法在100%的时间内完成{{1 }}