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