Этот вопрос касается того, как Scala выполняет сопоставление и рекурсию шаблонов со списками и их производительность.
Если у меня есть функция, которая рекурсивно перечитывает список, и я делаю это с совпадением на минусах, например, что-то вроде:
def myFunction(xs) = xs match {
case Nil => Nil
case x :: xs => «something» myFunction(xs)
}
В Haskell:
myFunction [] = []
myFunction (x:xs) = «something» : myFunction xs
Я использую ту же семантику, что и я, например, Haskell. Я не думаю, что возникнет вопрос о реализации Haskell, как о том, как вы относитесь к спискам. Для длинного списка (я бы работал в списке с несколькими тысячами узлов), Haskell не мигнул бы (я думаю, хотя, я никогда не пробовал).
Но из того, что я понимаю с помощью Scala, оператор соответствия вызовет метод unapply extractor для разделения списка вокруг минусов и, чтобы расширить пример до функции, которая ничего не делает для списка:
def myFunction(xs) = xs match {
case Nil => Nil
case x :: xs => x :: myFunction(xs)
}
В Haskell:
myFunction [] = []
myFunction (x:xs) = x : myFunction xs
он назовет применить метод экстрактора, чтобы скрыть его вместе. Для длинного списка я предполагаю, что это будет очень дорого.
Чтобы проиллюстрировать, в моем конкретном случае я хочу переписывать список символов и накапливать различные вещи, где входная строка составляет всего несколько десятков килобайт.
Я действительно буду называть конструкторы и экстракторы для каждого шага рекурсии, если я хочу переписать длинный список? Или есть оптимизация? Или лучшие способы сделать это? В этом случае мне понадобится несколько переменных аккумулятора, и, очевидно, я бы просто не перечислил список, ничего не делая...
(Прошу извинить моего Haskell, я не писал строки в течение двух лет.)
(И да, я собираюсь для рекурсии хвоста.)