我正在阅读 Joshua Suereth 的《Scala in Depth》,这本书是我为明确确立作者的能力而购买的。我在第 3 页,经过一堆拼写错误和不连贯的格式(好吧,我已经容忍了这些错误),我偶然发现了以下关于解决一个非常简单场景的功能性方法的示例。
trait Cat
trait Bird
trait Catch
trait FullTummy
def catch(hunter: Cat, prey: Bird): Cat with Catch
def eat(consumer: Cat with Catch): Cat with FullTummy
val story = (catch _) andThen (eat _)
story(new Cat, new Bird)
我谨慎地举了这个例子,前提是它显然是一个蓝图(没有定义具体的方法......)......«catch»显然是另一个错字,只要它是一个保留字......Cat
并且Bird
不可实例化......</p>
…但是,尽管示例质量很差,但我不能认为根据函数组合定义的«story» val(andThen
是 的«reverse-associative» compose
)是另一个意外错误,前提是它是示例的核心。
实际上,该示例无法在我的本地版本的 Scala (2.10.1) 上编译,并且在可用的最新版本 (2.10.2) 上也没有记录。
毫无疑问它的用处和它的实现很容易完成(跟随):
trait Function2ex[-T1, -T2, +R] extends Function2[T1, T2, R] {
def andThen[A](g: R => A): (T1, T2) => A = { (x, y) => g(apply(x, y)) }
}
在对 API 进行了简短的审查后,我发现它andThen
仅受 Function1 支持,并且据说从 Function2 消失到 Function22 所以,问题是:
当前要支持的习语是什么,andThen
并且compose
Function* 的数量大于 1?