Pull to refresh
0
0
Send message

Нет, интерпретатор калькулятора в статье только для примера алгоритма, в котором доступность взаимной множественной рекурсии произвольной вложенности существенно упрощает реализацию.

На мой взгляд, более фундаментальным применением `Eval` является пример про свертку справа: `foldRight` -- так как традиционно в функциональном программировании все непросто обработкой бесконечных последовательностей или преждевременным выходом из цикла: для чистых функций непросто определить аналоги `break/continure`, а бросаться исключениями нехорошо, да и ловить их нужно в строго определенные момент.

Haskell справляется с этим, так как ленив по своей природе, однако Scala -- строгий (strict) язык, и в нем попытка сделать свертку на бесконечной коллекции или писать рекурсию без проверки на то, хвостовая она или нет -- прямой путь к StackOverflow или OutOfMemory.

Представленные в статье `Eval & Cont`, как и другие примеры шаблона "трамплин", как раз и решают описанные выше проблемы через а) отложенные вычисление, б) возможность "пропуска" определенных ветвей вычисления, в) то, что в функциональном смысле никак не снижают "чистоту" методов, в которых используются. При этом, поскольку мы все еще пишем на Scala и (например) все еще интерпретируем в байткод, нам по-прежнему доступны и инлайнинг, и escape analysis, и другие бонусы JVM.

P.S.: Алгебра это не просто синоним dsl, это список операций над некоторым множеством элементов, результатом которых является самое это множество: https://stackoverflow.com/a/16022059/790763

Вы во втором примере просто создали генератор, не получив из него ни одного значения, и уж тем более не «сохранили квадраты всех чисел, которые нужно хранить отдельно в другом списке». Естественно, и время выполнения было меньше, и память не занята.

Information

Rating
Does not participate
Registered
Activity