我正在阅读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
是不可实例化......
...但是,尽管示例质量很差,但我不能认为根据函数组成(andThen
)定义的«故事»val是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的简短审查后,我发现只有Function1支持andThen
,并且假设从Function2消失到Function22,所以问题是:
支持andThen
和compose
的当前成语是什么?功能*的arity大于1?
答案 0 :(得分:5)
我不明白这个例子到底在哪里,但是这里有一些代码在scala 2.10.2中编译。
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` _).tupled andThen (eat _)
story(new Cat with Catch, new Bird {})
我必须引用catch
,因为它是一个保留字,并且是Function2
的元组。