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

  • Проверка диапазона во время компиляции

    В Scala 3, с одной стороны, можно завести тип, имя которого — просто некоторое число, с другой стороны, можно делать вычисления с типами, а с третьей…

  • (no subject)

    Помните, когда вам говорят про Финляндию, в ответ следует: «ну так там маленькое население и территория — им проще»? Так вот, те же люди «там…

  • (no subject)

    Как я понял из обсуждения текущих событий на Кубе так называемыми коммунистами: интернет это не главное, мобильники это не главное, компьютеры это не…

  • 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