FWIW: В Felix, который является целым программным анализатором, в значительной степени зависящим от повышения производительности, аргументы функций бывают трех видов: нетерпеливые, ленивые или «пусть компилятор решит».
Стремительные аргументы оцениваются и присваиваются переменной до того, как будет вычислено тело функции.
Ленивые аргументы оцениваются путем замены параметра на выражение аргумента, где бы оно ни происходило.
По умолчанию «пусть решает компилятор». Для большого количества «обычного» кода (что бы это ни значило) не имеет значения, используете ли вы нетерпеливую или ленивую оценку.
Обычно в Феликсе ленивая оценка выполняется быстрее: обратите внимание, это НЕ означает закрытие. Это означает встраивание. Однако иногда компилятор выбирает стремительную оценку, это уменьшает раздувание кода, и слишком много встраивания приводит к обратным результатам. Я не утверждаю, что алгоритм хорош, но Феликс иногда может опередить С и Окамла (GHC не попал в финал).
В качестве простого примера. Типы классов. У Феликса есть классы типов, вроде Haskell. Нет или очень мало производительности ... конечно, нет словарей!
На мой взгляд, Haskell был бы намного лучше, если бы вы просто отказались от архаичной концепции раздельной компиляции: анализаторы целых программ могут сделать намного больше, а текст работает гораздо быстрее, чем объектный код (при полной свободе) кешировать результаты компиляции). Это безумие, когда ленивый язык использует модель компиляции, предназначенную для энергичной оценки!
Другая вещь, которую может попробовать вариант на Haskell, - отбросить идею, что все функции ленивы, и вместо этого принять идею, что стратегия оценки не имеет значения, если не указано иное. Это может позволить намного больше возможностей для оптимизации.