Понимание '_' в 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 в реальном бизнесе могут сбивать с толку, по крайней мере, для меня. Следует ли препятствовать тому, чтобы код четко указывал, что он должен делать, хотя это увеличит усилия по вводу текста?

Связанный

0 ответов

Другие вопросы по тегам