Мне нравится ответ Криса Конвея, в котором указаны некоторые важные оси, которые помогают классифицировать различные функциональные языки.
Что касается возможностей определенных языков, я выберу F # , чтобы вызвать некоторые функции, которых нет во многих других FPL:
- Активные шаблоны : ряд FPL имеют алгебраические типы данных и сопоставление с образцом, но функция F #, называемая «активными образцами», позволяет определять новые шаблоны, которые позволяют использовать синтаксис сопоставления с образцом в произвольных данные.
- Вычислительные выражения : F # имеет красивый синтаксический сахар для создания монадического кода; хотя система типов не может выражать полиморфизм высшего рода (не абстрагируясь над конструкторами типов), поэтому вы не можете написать код для произвольной монады M, код, который вы можете написать для фиксированной монады, очень крутой, и люди пишут некоторые большие понимания в seq {} или асинхронные {} монады.
- Цитаты : обычный бит "код в качестве данных для метапрограммирования", хотя F # имеет выразительную систему статических типов и богатый синтаксис, и я не уверен, сколько неисписков может это сделать.
С точки зрения общей классификации, F # равно
- eager (строгий, вызов по значению; но 'lazy' - это ключевое слово и библиотека, а использование seq / IEnumerable для некоторой лени - обычная стратегия)
- нечистый (хотя синтаксис смещает вас к стилю по умолчанию)
- статический (с выводом типа, поэтому F # часто «похож на скриптинг», только с безопасностью типов)
Ваш вопрос сформулирован таким образом, с явным уклоном против некоторой прагматики, не связанной с языком (например, с какой средой исполнения он интегрируется), но вы также спрашиваете, что «влияет на то, как вы развиваетесь», и эти вещи влияют на это:
- Интеграция с Visual Studio означает отличный опыт редактирования (например, Intellisense)
- Интеграция с Visual Studio означает отличный опыт отладки (например, точки останова / точки трассировки, локальные объекты, непосредственное окно, ...)
- REPL для сценариев или пользовательского интерфейса на лету (командная строка fsi.exe или "F # Interactive", интегрированная в VS)
- .NET интеграция означает, что для большинства 'X' уже есть библиотека для этого
- сторонних инструментов, таких как FsLex / FsYacc и интеграция с MSBuild, что упрощает «сборку системы»
(Я думаю, что попытка отделить язык от времени выполнения и инструментов - это в основном академическое упражнение.)
Итак, есть описание множества отличительных черт одного конкретного языка, фанатом которого я являюсь. Я надеюсь, что другие могут опубликовать аналогичные ответы, которые выявляют отличительные черты других языков.