Scala API 2.10。*:Function2.andThen发生了什么?

时间:2013-08-03 23:34:26

标签: api scala function-composition

我正在阅读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»显然是另一个拼写错误,只要它是一个保留字...... CatBird是不可实例化......

...但是,尽管示例质量很差,但我不能认为根据函数组成(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,所以问题是:

支持andThencompose的当前成语是什么?功能*的arity大于1?

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的元组。