Понимание '_' в Scala как заполнителя или расширения eta
Подчеркивание _ может быть очень большим.
Это не тот же вопрос, что и для чего в Scala используются символы подчеркивания? который показывает несколько ситуаций, в которых используется подчеркивание, но это больше о том, почему существует подчеркивание и что, если его не существует.
Подтвердите или исправьте ниже, чтобы я мог понять, что такое заполнитель и расширение eta.
Кейс 01
Полагаю, законный? (без упрощения и удобства) способ определения объекта функции - это такой способ. Компилятор Scala находит основу и мощность в качестве заполнителей, где фактические значения заменят их при оценке.
scala> val f = (base:Double, power:Double) => Math.pow(base, power)
f: (Int, Int) => Double = <function2>
Дело 02
Я считаю, что Scala предоставляет короткий путь или удобство для сокращения усилий при вводе текста в случае 01? Вместо того, чтобы явно указывать базу или мощность имен, Scala позволяет нам просто набирать '_' соответственно.
Я считаю, что это называется заполнителем, как в спецификации Scala, и объясняется в разделе "Подчеркивание в Scala: основы".
Они оба имеют одинаковый символ "_", но на самом деле они разные.
scala> val __f = Math.pow(_, _) # 1st '_' is **base**, 2nd is **power** actually although both '_'
__f: (Double, Double) => Double = <function2>
Поскольку каждый "_" отличается, я верю этому:
scala> val _f = (_:Double, _:Double) => Math.pow(_, _)
_f: (Double, Double) => (Double, Double) => Double = <function2>
на самом деле то же самое, что и ниже, где b, p просто не используются, поэтому '_' слева вверху, я считаю, на самом деле способ сообщить компилятору Scala, что они не будут использоваться. Это правильно?
scala> val _f = (b:Double, p:Double) => Math.pow(_, _)
_f: (Double, Double) => (Double, Double) => Double = <function2>
Дело 03
Попытки понять - это расширение эта. Предоставляет ли Scala это еще одно сокращение, даже если нет необходимости вводить "_" несколько раз для каждого аргумента?
Я полагаю, что настоящая причина расширения eta состоит в том, чтобы позволить нам передавать методы, как если бы они были функциями, например (1::2::3::Nil).reduce((current, next) => Math.max(current, next)), таким образом, помогая нам, устраняя необходимость определения функций для методов.
Тем не менее, я полагаю, может быть не так много ситуаций, когда нам нужно выполнять преобразование метода в функцию самостоятельно, и мы все еще можем явно определить объект функции, как в случае 01? Или есть другие причины, по которым мы будем бороться без этой нотации расширения "_", которая кажется кратчайшим путем для экономии затрат на набор текста?
scala> val ___f = Math.pow _
___f: (Double, Double) => Double = <function2>
Стандарты кодирования
Интересно, какие стандарты кодирования Scala в реальном бизнесе могут сбивать с толку, по крайней мере, для меня. Следует ли препятствовать тому, чтобы код четко указывал, что он должен делать, хотя это увеличит усилия по вводу текста?