18

スタック オーバーフローの質問Compose と andThen の方法にいくらか似ていますが、私は Twitter のScala Schoolチュートリアルに取り組んでいましたが、コメント投稿者が抱えていたのと同じ問題にすぐに遭遇しました (問題が解決したと思って寝たので、これは素晴らしいことでした)。

チュートリアルでは、次の 2 つのメソッドを定義しています。

def addUmm(x: String) = x + " umm"
def addAhem(x: String) = x + " ahem"

Scala の新しいバージョンでは、 composeを次のように呼び出すことはできませんaddUmm(_).compose(addAhem(_))。compose を呼び出します。実行に成功したので、満足して就寝しました。addUmmaddAhem

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(_))を明示的に指定しても推論器が間違っているという事実は、やや混乱を招きます。_: Stringa.compose(b)

4

2 に答える 2

24

a(_).compose(b(_))に展開しx => { a(x).compose(y => b(y) }ます。したがって、エラー。あなたが欲しいのはです(x => a(x)).compose(y => b(y))。括弧のペアを追加すると、これが修正されます。

scala> (a(_)).compose(b(_: String))
res56: String => java.lang.String = <function1>

scala> res56("hello")
res57: java.lang.String = helloahemumm

しかし、abは関数であるため、この面倒なことをすべて回避して、単にa compose b.

于 2011-10-07T06:01:55.190 に答える
4

単純に「a compose b」を使用できます。

scala> val c = a compose b
c: String => java.lang.String = <function1>
于 2011-10-07T05:57:15.530 に答える