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
関数 1 でのみサポートされており、関数 2 から関数 22 に消えたと思われることがわかりました。質問は次のとおりです。
Function* のアリティが 1 より大きい現在サポートandThen
されているイディオムは何ですか?compose