Podążam za samouczkami metodami Pattern matching & functional composition w Scala compose
i andThen
. Jest taki przykład:Skomponuj i zmień metody
scala> def addUmm(x: String) = x + " umm"
scala> def addAhem(x: String) = x + " ahem"
val ummThenAhem = addAhem(_).compose(addUmm(_))
Kiedy próbuję go użyć otrzymuję błąd:
<console>:7: error: missing parameter type for expanded function ((x$1) => addAhem(x$1).compose(((x$2) => addUmm(x$2))))
val ummThenAhem = addAhem(_).compose(addUmm(_))
^
<console>:7: error: missing parameter type for expanded function ((x$2) => addUmm(x$2))
val ummThenAhem = addAhem(_).compose(addUmm(_))
^
<console>:7: error: type mismatch;
found : java.lang.String
required: Int
val ummThenAhem = addAhem(_).compose(addUmm(_))
Jednak to działa:
val ummThenAhem = addAhem _ compose addUmm _
lub nawet
val ummThenAhem = addAhem _ compose addUmm
Co jest nie tak z kodem w samouczku? Czy to ostatnie wyrażenie nie jest takie samo jak pierwsze bez nawiasu?
Przez wzgląd na kompletność, tym przykładem andthen wygląda następująco:.. 'val ahemThenUmm = addAhem (_) andthen (addUmm (_))' gdy powinna wyglądać 'val ahemThenUmm1 = (addAhem _) andthen (addUmm) ' –
Nie jestem pewien co do części napisanej w nawiasach okrągłych; kompilator * nie * konwertuje metody do automatycznego działania, przynajmniej dla Scala 2.10.2. Rozwiązaniem jest zadeklarowanie funkcji 'addAhem' i' addUmm' jako funkcji, aby 'compose' lub' andThen' działały bez '_'. –