Lex Kravetski (lex_kravetski) wrote,
Lex Kravetski
lex_kravetski

Category:

Как привнеси в Scala немножко Wolfram

В приложении к предыдущей статье я задумался, а сколько вообще надо дописать к Scala, чтобы разобранная в статье конструкция работала и там тоже. То есть, чтобы код вида

x \\ f \\ g


превращался в код

g(f(x))


Причём желательно без создания промежуточных объектов, то есть чтобы в плане производительности это бы ничего не стоило.

Знаете сколько для этого надо написать?



В Scala 3 — одну строку!

Причём, в отличие от Wolfram, эта одна строка расширит функциональность данной конструкции до функций с любым количеством аргументов. То есть, если

def f(x: Int, y: Int) = (x + 1, y + 1)
def g(x: Int, y: Int) = x + y


то

(2, 2) \\ f \\ g


будет эквивалентен вызову

g(f(2, 2))


Одна, сцуко, строка! Почему я раньше до неё не додумался?

extension [T, R](x: T) inline def \\(f: T => R) = f(x)


Что тут происходит? Для произвольного типа T объявляется метод–расширение, который принимает аргумент типа «функция из типа T в произвольный же тип R». Это расширение просто вызывает f(x).

В Scala 3 любой кортеж автоматически превращается в параметры функции, если та принимает ровно столько аргументов, сколько в кортеже, и они того же типа, что и аргументы, поэтому автоматически оно будет работать и с кортежами тоже. Новое же ключевое слово «inline» приводит к тому, что тело функции будет вписываться на место её вызова, то есть никаких новых объектов не создастся.

Поскольку "\\" не содержит букв, то в Scala 3 не нужно отдельно указывать, что он может быть инфиксным.

Шах и мат, аметисты!






Tags: программирование
Subscribe

  • Вегетарианский парадокс

    Мне очень нравится занимательный парадокс, связанный с вегетарианством. Дело вот в чём. Вегетарианцы говорят, что люди очень зря убивают животных…

  • Лучше гор могут быть только нетронутые горы

    Почитав увлекательные дискуссии про то, как правильно иметь право задвинуть коней в горах, хотел бы сослаться на очевидное, которое почему-то не всем…

  • Бинарный культурный детерминизм

    Один из главнейших мета-вопросов, терзающих изрядную часть русскоговорящих: «почему до сих пор всё ещё не запрещены те штуки, которые кажутся мне и…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 5 comments