スタック オーバーフローの質問Compose と andThen の方法にいくらか似ていますが、私は Twitter のScala Schoolチュートリアルに取り組んでいましたが、コメント投稿者が抱えていたのと同じ問題にすぐに遭遇しました (問題が解決したと思って寝たので、これは素晴らしいことでした)。
チュートリアルでは、次の 2 つのメソッドを定義しています。
def addUmm(x: String) = x + " umm"
def addAhem(x: String) = x + " ahem"
Scala の新しいバージョンでは、 composeを次のように呼び出すことはできませんaddUmm(_).compose(addAhem(_))
。compose を呼び出します。実行に成功したので、満足して就寝しました。addUmm
addAhem
scala> ((s: String) => s + " umm").compose((s: String) => s + " ahem")
res0: String => java.lang.String = <function1>
涼しい。問題は、メソッドを構成できないことはある程度理にかなっていますが、私が知っている値で同じことを評価すると、次のようになりFunction1
ます。
val a = (s: String) => s + " umm"
val b = (s: String) => s + " ahem"
val c = a(_).compose(b(_))
さて、その最後の行は、今回はメソッドではなく関数の部分的な適用ですが、元の質問と同じエラーを吐き出します。元の質問の回答の 1 つ (上位にランク付けされていますが、受け入れられた回答ではありません) は、部分適用がどのように展開されるかに関係していることを示唆しているように見えますが、その説明は何ですか?
Scala の初心者にとって、両方の場所a(_).compose(b(_))
を明示的に指定しても推論器が間違っているという事実は、やや混乱を招きます。_: String
a.compose(b)