Я прошу прощения за то, что не использовал Scala, но основная идея должна быть переведена, поэтому вот как я написал бы основную логику в Haskell:
capitalize :: Char -> String -> String
capitalize '_' (x:xs) = toUpper x:xs
capitalize x xs = x:xs
convertName :: String -> String
convertName = foldr capitalize ""
У нас есть две части: функция, которая в верхнем регистре первойсимвол строки, если ему дано подчеркивание или что-то еще, добавляет его к строке.Затем мы просто используем это в правой части последовательности входных символов с пустой строкой в качестве базового регистра.
Обратите внимание, что строки по умолчанию в Haskell - это ленивые последовательности символов, что может быть не так вScala, но я ожидаю, что подобное будет возможно, поскольку функциональная сторона Scala основана на той же общей традиции, вдохновленной ML, что и Haskell.
EDIT : Кстати,Заметьте, что вопреки ожиданиям многих функциональных программистов, моя реализация является , а не хвостовой рекурсией, и это и намеренно, и правильно.Вместо этого он выполняет рекурсивный вызов в конце списка, и поскольку конструкторы данных в Haskell позволяют ленивым вещам, каждый выходной символ генерируется по требованию, а остальная часть сгиба лениво откладывается, и все это выполняется в пространстве постоянного стека.Конечный результат - это, по сути, итеративный цикл, потребляющий элементы из входного потока , но написанный так, чтобы он выглядел как простая рекурсивная функция.
Даже если в общем случае вы бы так не поступилислучай кроме как в Haskell, ленивые списки / генераторы / и т.д.в наши дни распространены во многих языках, и выражение «потреблять конечное количество, обрабатывать его, производить вывод» для преобразования таких потоков не зависит от языка.
Кроме того, я благодарен Анторасу и Луиджи Плинге за написание.Реализации Scala с похожими алгоритмами - помогают мне лучше понять Scala, с которой я в настоящее время знаком лишь немного.