строгий контроль мутаций *и* именованные необязательные аргументы

Я люблю чисто функциональные языки, такие как haskell и erlang, из-за их сильного контроля над мутациями, но есть в них практические аспекты, которые мне действительно не нравятся. В частности, я думаю, что смешно, что ни один из них не поддерживает именованные необязательные аргументы для функций, таких как python. Именованные необязательные аргументы смехотворно смехотворно полезны. Я искренне думаю, что они являются причиной номер один, по которой людям так нравится Python. Они, очевидно, совместимы с идеей строгого контроля мутаций, так существует ли язык со строгим контролем мутаций и именованными необязательными аргументами?

В качестве упреждающего ответа педантичным сосискам, которые скажут, что haskell действительно поддерживает именованные необязательные аргументы, я видел, что представляет собой такая вещь в haskell ( https://github.com/Gabriel439/Haskell-Optional-Args-Library /blob/master/src/Data/Optional.hs , https://stackoverflow.com/questions/7781096/is-there-a-better-way-to-have-Optional-arguments-in-haskell или http:/ /neilmitchell.blogspot.ca/2008/04/Optional-parameters-in-haskell.html , например), и это сильно уродливо по сравнению с python. То же, эрланг.

Я понимаю, что строгий подход Haskell к функциям с одним входом и одним выходом, вероятно, несовместим с идеей необязательных аргументов, реализованной в python, но я думаю, что этот подход «один вход, один выход» гораздо больше похож на занудную математику, потому что -мы-можем что-то вроде вещи, чем это действительно полезная языковая функция. Идите вперед и спросите меня, почему где-то еще, но суть в том, что любая замена, которую я ищу, не должна (и, вероятно, не может) работать по тому же принципу «один вход, один выход», и я полностью согласен с этим.

Ответы (1)

Быстрый поиск в Интернете показал эту страницу в Rosetta Code с примерами кода на нескольких языках: https://rosettacode.org/wiki/Named_parameters .

Я бы предпочел оставить это как комментарий, но из-за отсутствия репутации он становится ответом. Я мог бы также уточнить:

У меня есть непосредственный опыт работы только с некоторыми из них, поэтому я не могу точно сказать, какие из них соответствуют вашим другим требованиям. Common Lisp и Racket — два из этого списка, которые я пробовал сам, и которые я считаю несколько дружественными к неизменяемому стилю программирования. Clojure тоже присутствует, но без "родной" поддержки именованных параметров (хотя на той же странице есть пример его реализации в Scheme , так что вы, вероятно, могли бы реализовать его и в Clojure, там есть замыкания и макросы ).

Существует также F# , который я не пробовал, но который согласно документации имеет как именованные, так и необязательные параметры . Насколько я понимаю, это язык, который имеет некоторые философские сходства с Haskell.


Думаю, мой ответ — F# или одна из многих разновидностей Лиспа .