组成
功能组合允许两个功能操作并被视为单个功能。用数学术语表示,给定函数 f(x)
和函数 g(x)
,函数 h(x) = f(g(x))
。
编译函数时,会将其编译为与 Function1
相关的类型。Scala 在 Function1
实现中提供了两种与组合相关的方法:andThen
和 compose
。compose
方法符合上述数学定义,如下:
val f: B => C = ...
val g: A => B = ...
val h: A => C = f compose g
andThen
(想想 h(x) = g(f(x))
)有一种更像’DSL’的感觉:
val f: A => B = ...
val g: B => C = ...
val h: A => C = f andThen g
分配了一个新的匿名函数,该函数在 f
和 g
上关闭。在这两种情况下,此函数都绑定到新函数 h
。
def andThen(g: B => C): A => C = new (A => C){
def apply(x: A) = g(self(x))
}
如果 f
或 g
通过副作用起作用,那么调用 h
将导致 f
和 g
的所有副作用按顺序发生。任何可变状态变化都是如此。