7

我正在阅读 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并且composeFunction* 的数量大于 1?

4

1 回答 1

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.

于 2013-08-04T00:58:25.787 回答