Scala中函数组合的语法很好

时间:2016-12-29 01:37:00

标签: scala

我想在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声明中的_

1 个答案:

答案 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

我自己的隐式类也会起作用(虽然我没有看过你想要的确切语义),使用像fg这样的函数,因为我已经定义了他们。它甚至可以用于函数和方法(按此顺序)。

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