Подтвердить что ты не робот

Существует ли оператор Scala, похожий на Haskell $(знак доллара)?

Есть ли способ заставить приоритет оператора в Scala как вы делаете в Haskell с $?

Например, в Haskell у вас есть:

a b c = ((a b) c)

и

a $ b c = a (b c)

Есть ли аналогичный способ сделать это в Scala? Я знаю, что Scala не имеет операторов как таковых, но есть ли способ добиться подобного эффекта?

4b9b3361

Ответ 1

infix vs. нотация часто используется аналогично управлению приоритетом:

a b c d == a.b(c).d
a.b c d == a.b.c(d)
a b c.d == a.b(c.d)

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

(all letters)
|
^
&
< >
= !
:
+ -
* / %
(all other special characters)

Обычно имена могут выбираться явно, чтобы воспользоваться этим. Например, ~ и ^^ в стандартной библиотеке парсеров.

Ответ 2

Можно использовать implicits для достижения аналогичного эффекта. Например: (непроверено, но должно быть что-то вроде этого)

object Operator {

  class WithOperator[T](that: T) {
    def &:[U](f: T => U) = f(that)
  }
  implicit def withOperator[T](that: T) = new WithOperator(that)

}

Используя эту систему, вы не можете использовать имя $, потому что имя должно заканчиваться на: (для фиксации ассоциативности), а доллар - это обычный идентификатор (не идентификатор оператора), поэтому вы не можете он с тем же именем, что и:, если вы не разделите их символами подчеркивания.

Итак, как вы их используете? Вот так:

val plusOne = (x: Int) => {x + 1}
plusOne &: plusOne &: plusOne &: 1