Существует ли оператор Scala, похожий на Haskell $(знак доллара)?
Есть ли способ заставить приоритет оператора в Scala как вы делаете в Haskell с $?
Например, в Haskell у вас есть:
a b c = ((a b) c)
и
a $ b c = a (b c)
Есть ли аналогичный способ сделать это в Scala? Я знаю, что Scala не имеет операторов как таковых, но есть ли способ добиться подобного эффекта?
Ответы
Ответ 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
Ответ 3
Scalaz определил оператор "pipe", который работает аналогично, но с перевернутыми аргументами. См. функция и объект переключателя со значением scalaz ' >