Функциональная композиция методов, функций и частично применяемых функций в Scala

В некоторой степени похожа на вопрос о переполнении стека Методы Compose и andThen , я проработал учебник Twitter Scala School и быстро запустил в ту же проблему, что и у комментатора (что было здорово, потому что я лег спать, думая, что моя проблема решена).

В учебнике он определяет два метода как su ch:

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

и в более новых версиях Scala вы не можете вызывать compose для них как таковые: addUmm (_). compose (addAhem (_)) , принятый ответ (и некоторые из другие ответы, похоже, зависят от того факта, что addUmm и addAhem - это методы, а не функции, что создает проблему при попытке вызвать compose. Я лег спать довольный, успешно пробежав:

scala> ((s: String) => s + " umm").compose((s: String) => s + " ahem")
res0: String => java.lang.String = 

Круто.Проблема в том, что, хотя невозможность составлять методы имеет некоторый смысл, когда я то же самое со значениями, которые я знаю, оцениваю как Function1 :

val a = (s: String) => s + " umm"
val b = (s: String) => s + " ahem"
val c = a(_).compose(b(_))

Ну, эта последняя строка выдает ту же ошибку, что и исходная. вопрос сделал, хотя на этот раз они являются частичным применением функций, а не методов. Один из ответов в исходном вопросе (высоко оцененный, но не принятый ответ), кажется, намекает на то, что он имеет отношение к тому, как расширяется частичное приложение, каково объяснение?

Для новичка в Scala, тот факт, что логический вывод получает a (_). Compose (b (_)) неверно, независимо от того, явно ли вы указали _: String в обоих местах , но a.compose (b) действительно несколько сбивает с толку.

17
задан Community 23 May 2017 в 10:28
поделиться