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関数 1 でのみサポートされており、関数 2 から関数 22 に消えたと思われることがわかりました。質問は次のとおりです。

Function* のアリティが 1 より大きい現在サポートandThenされているイディオムは何ですか?compose

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 に答える