Как Лисп связан с F#, и изучает ли Лисп полезную ногу до F#?
Это ситуация: я в основном программирую на C# и в ней написаны типы, которые я не хочу терять. В то же время я хотел бы научиться функциональному программированию. Очевидный ответ, конечно, F#.
Но для всего, кроме C#, я использую emacs в качестве редактора, и я действительно хотел бы изучить и Lisp. (Изучайте язык ваших редакторов /IDE, который вы знаете, поэтому я знаю немного VB, чтобы писать в нем свои VS-макросы) И это не просто emacs, я действительно хочу выучить Lisp.
Что касается F#, я мог бы смешать его с C# без каких-либо проблем взаимодействия, иметь отличный GUI (WPF) и множество других.NET вкусностей. Но он, конечно, не такой зрелый, как Лисп.
Если я реалист, я знаю, хочу ли я пронести функциональный язык в свою профессиональную жизнь, это должен быть F#. Поскольку изучение двух целых языков кажется немного сложным, я надеялся, что Lisp будет отличным способом для изучения функционального программирования, и если я начну F# позже, это будет очень легко...
Это правда? Или эти два языка не сопоставимы вообще?
9 ответов
Лисп - это большое семейство языков и реализаций. Схема, например, представляет собой диалект Lisp, возможно, с более чем сотней реализаций (около десяти из них слегка популярны). Common Lisp - это еще один диалект, имеющий около десяти поддерживаемых в настоящее время реализаций. Scheme и Common Lisp оба написали стандарты, которые реализации пытаются реализовать.
F# - это и язык, и реализация. От Microsoft. Он был в основном получен из OCAML и принадлежит к семейству языков ML.
Lisp был очень ранним языком, поддерживающим функциональное программирование (Lisp 1.5 в 60-х годах). Много ранних экспериментов с функциональным программированием было сделано в Лиспе. В 70-х годах в сообществе Лисп появилось движение к корням функционального программирования, и в результате появилась Схема. Затем, особенно в 80-х и 90-х годах прошлого века, появились новые функциональные языки (ML, Miranda, FP, SML, Haskell, Clean, ...), которые сильно отличались от обычных диалектов Лисп. Есть еще наследие, но в основном они развивались в разных направлениях (статическая типизация, вывод типов, модульные системы, пакетные языки, алгебраические типы данных, ленивая оценка, чистота и многое другое). Сообщество Scheme по-прежнему имеет много контактов с сообществом FP. Но это в основном все.
Есть несколько базовых идей FP, которые можно выучить независимо от конкретного языка FP, но, как правило, F# сильно отличается от большинства диалектов Lisp. Другая особенность, заключающаяся в том, что F# поддерживает экосистему.net (особенно потому, что это создание Microsoft), не очень хорошо поддерживается диалектами Лисп.
Я также не ожидал бы большой пользы от знания ограниченного диалекта Лиспа, такого как Emacs Lisp, для изучения F#.
Я думаю, что есть только небольшое "совпадение" для того, что вы бы узнали через Common Lisp против F#. Общность я думаю примерно
- Программирование с использованием "списков минусов" в качестве общего фундаментального типа данных, иногда написание рекурсивных (особенно хвостовых) функций, а не циклов
- Некоторые основные применения общих функций высшего порядка (например, "карта" - применить функцию к каждому значению в списке)
Я думаю, что помимо некоторых основных функциональных программных средств Common Lisp и F# настолько далеки друг от друга, насколько могут быть два основных "функциональных" (не Хаскельских) языка. Common Lisp динамичен; F# является статически типизированным. Синтаксические формы совершенно разные. Время выполнения совершенно другое. Библиотеки очень разные. Объектные системы совершенно разные.
Независимо от того, в каком порядке вы их изучаете, я думаю, что после изучения одного из них будет еще немало узнать в другом (по модулю небольшого совпадения, которое я описал выше).
На мой взгляд, существует два подхода к обучению функциональному программированию:
Используйте более чистый функциональный язык, такой как Lisp или Haskell, который заставит вас сразу же выйти из процедурного мышления; или же
Используйте прагматичный функциональный язык, такой как F#, который также предлагает более знакомые, но менее функциональные конструкции, которые помогут вам легче в этом разобраться.
В любом случае вы получите больше пользы от обучения, если сможете сделать что-то полезное с языком. Похоже, у вас есть мотивация для Lisp (Emacs) и F# (.NET interop), поэтому я хотел бы взглянуть на оба и посмотреть, что привлекает ваше внимание.
В конечном счете, понимание концепций функционального программирования (функций более высокого порядка, без побочных эффектов, хвостовой рекурсии и т. Д.) Имеет большую ценность, чем любой другой язык. И как только вы изучите эти концепции, вам будет намного легче выбирать новые языки и применять методы на других языках (например, все более функциональный C#). Кроме того, вас может заинтересовать функциональное программирование для реального мира.
F# наиболее сопоставим с семейством языков ML, таких как SML и CAML. Синтаксис и функции отличаются от Lisp.
Но я думаю, что изучение хотя бы одного функционального языка действительно важно с точки зрения информатики. Умение так думать - это хорошо.
И, я бы сказал, изучение более чисто функционального языка перед запуском F# было бы способом освоить хорошие привычки функционального программирования, потому что, если вы этого не сделаете, ваш код F# может в конечном итоге быть более ОО и менее функциональным, потому что именно здесь вы пришли
Две важные вещи для рассмотрения:
- LISP типизируется динамически, тогда как F# - статически.
- LISP имеет встроенный макрос. F# нет.
Хотя они оба считаются функциональными и имеют много общих черт, они также различны. Изучение LISP, безусловно, сделает вас лучшим программистом на F#, и наоборот, но вам все равно придется изучить особенности обоих, чтобы иметь возможность практиковаться в них.
Для возможности взаимодействия с.NET я бы, конечно, выбрал F#, но ради красоты программирования я бы также попробовал LISP.
Я только новичок в F#, но я изучал Lisp до F# и считаю, что это очень помогло в контекстуализации F# как в рамках.NET, так и в гамме языков программирования.
Я искренне рекомендую посмотреть хотя бы первые несколько видео здесь:
http://groups.csail.mit.edu/mac/classes/6.001/abelson-sussman-lectures/
Они научат вас основам Lisp в течение первого часа. Серия основана на этих знаниях и прививает захватывающие принципы, которые выпадают оттуда.
Они оба функциональные языки, но синтаксически они очень разные. Это означает, что многие концепции будут схожими, и вам (как процедурному разработчику) придется использовать одно и то же умопомрачительное, чтобы использовать любой из них, но это очень разные языки.
F# является производной от ML (который считается со всеми его производными нечистым функциональным языком), тогда как Lisp старше и считается "чистым" функциональным языком.
Чистота функционального языка - увлекательная тема, и я бы порекомендовал вам прочитать " Чистота языка" и "Грязные и чистые функции", чтобы лучше понять концепцию:
Многие люди говорят о "чистых" функциональных языках, где "чистый" кажется синонимом "хорошего". Есть две черты, обычно связанные с определением чисто функционального языка:
- функции не могут иметь побочных эффектов
- функция, вызываемая с любым заданным аргументом, всегда будет возвращать одно и то же значение.
Семантика F# и Scheme очень похожа, за исключением отмеченной строгой типизации.
Кроме того, Схема настолько мала, чтобы не изучать ее!
Будучи языком программирования, Лисп сам по себе особенный, однако он совсем не похож на F#, за исключением того, что оба они поддерживают функциональное программирование. Не многие языковые конструкции переносятся с Lisp на F#. Если ты хочешь научиться шутить, дерзай. Идея функционального программирования перенесет только не синтаксис. Лисп действительно старый, в конце 50-х. Это повлияло на многие языки, и существует довольно много диалектов.
Если вы просто ищете чистый функциональный язык для изучения до F#, я бы предложил Haskell. На Haskell сильно повлиял ML, и он является хорошим языком перехода к F#, поскольку F# является производной от ML. Вы можете посмотреть на код на Haskell и увидеть похожие шаблоны в коде F#.