Как Лисп связан с F #, и изучает ли Лисп полезную ногу до F #? - PullRequest
14 голосов
/ 23 июня 2009

Это ситуация: я в основном программирую на C # и в ней написаны типы, которые я не хочу терять. В то же время я хотел бы изучить функциональное программирование. Очевидный ответ, конечно, F #.

Но для всего, кроме C #, я использую emacs в качестве редактора, и я действительно хотел бы также изучить Lisp. (Изучайте язык ваших редакторов / IDE, который вы знаете, поэтому я знаю немного VB, чтобы написать в нем мой VS-макрос) И это не просто emacs, я действительно хочу выучить Lisp.

Что касается F #, я мог бы смешать его с C # без каких-либо проблем с взаимодействием, иметь отличный графический интерфейс (WPF) и множество других .NET вкусностей. Но он, конечно, не такой зрелый, как Лисп.

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

Это правда? Или эти два языка вообще не сопоставимы?

Ответы [ 9 ]

15 голосов
/ 23 июня 2009

Lisp - это большое семейство языков и реализаций. Схема, например, диалект 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 #.

10 голосов
/ 23 июня 2009

Я думаю, что есть только небольшое «совпадение» для того, что вы бы узнали через Common Lisp против F #. Общность это я думаю примерно

  • Программирование с использованием 'cons-lists' в качестве общего фундаментального типа данных, иногда написание рекурсивных (особенно хвостовых) функций, а не циклов
  • Некоторые основные виды использования общих функций высшего порядка (например, «map» - применить функцию к каждому значению в списке)

Помимо некоторых основных функциональных программ, я думаю, что Common Lisp и F # примерно так же далеки друг от друга, как два основных «функциональных» (не Хаскельских) языка. Common Lisp динамичен; F # является статически типизированным. Синтаксические формы совершенно разные. Время выполнения совершенно другое. Библиотеки очень разные. Системы объектов совершенно разные.

Независимо от того, в каком порядке вы их изучаете, я думаю, что после изучения одного из них будет еще немало научиться другому (по модулю небольшого совпадения, которое я описал выше).

5 голосов
/ 23 июня 2009

F # наиболее сопоставим с семейством языков ML, таких как SML и CAML. Синтаксис и функции отличаются от Lisp.

Но я думаю, что изучение хотя бы одного функционального языка действительно важно с точки зрения информатики. Умение так думать - это хорошо.

И, я бы сказал, изучение более чисто функционального языка перед запуском F # было бы способом выучить хорошие привычки функционального программирования, потому что, если вы этого не сделаете, ваш код F # может в конечном итоге стать более ОО и менее функциональным, потому что это то, откуда вы пришли.

4 голосов
/ 23 июня 2009

На мой взгляд, существует два подхода к обучению функциональному программированию:

  1. Используйте более чистый функциональный язык как Lisp или Haskell, который заставит вырваться из процедурного мышление сразу; или

  2. Используйте прагматичный функциональный язык как F #, который также предлагает больше знакомый, но менее функциональный, конструкции, которые помогут вам облегчить ваш путь в него.

В любом случае вы получите больше пользы от обучения, если сможете сделать что-то полезное с языком. Похоже, у вас есть мотивация для Lisp (Emacs) и F # (.NET interop), поэтому я хотел бы взглянуть на оба и посмотреть, что привлекает ваше внимание.

В конечном счете, понимание концепций функционального программирования (функций более высокого порядка, без побочных эффектов, хвостовой рекурсии и т. Д.) Имеет большую ценность, чем любой другой язык. И как только вы изучите эти концепции, вам будет гораздо легче выбирать новые языки и применять методы на других языках (например, все более функциональный C #). Кроме того, вас может заинтересовать Функциональное программирование для реального мира .

3 голосов
/ 23 июня 2009

Две важные вещи, которые следует учитывать:

  • LISP типизируется динамически, тогда как F # - статически.
  • В LISP встроен макрос. F # - нет.

Хотя они оба считаются функциональными и имеют много общих черт, они также различны. Изучение LISP, безусловно, сделает вас лучшим программистом на F #, и наоборот, но вам все же придется изучить особенности обоих, чтобы иметь возможность практиковаться в них.

Для возможности взаимодействия с .NET я бы, конечно, выбрал F #, но для красоты программирования я бы также попробовал LISP.

2 голосов
/ 30 июня 2009

Я только новичок в F #, но я изучал Lisp до F # и считаю, что это очень помогло в контекстуализации F # в рамках .NET Framework и гамме языков программирования.

От всей души рекомендую посмотреть хотя бы первые несколько видео здесь:

http://groups.csail.mit.edu/mac/classes/6.001/abelson-sussman-lectures/

Они научат вас основам Лиспа в течение первого часа. Серия основывается на этом знании и прививает захватывающие принципы, которые выпадают оттуда.

2 голосов
/ 23 июня 2009

Они оба функциональные языки, но синтаксически они очень разные. Это означает, что многие из концепций будут похожи, и вам (как процедурному разработчику) придется сделать то же самое, чтобы использовать их, но они очень разные языки.

F # является производной от ML (который считается со всеми его производными нечистым функциональным языком), тогда как Lisp старше и считается "чистым" «функциональный язык.

Чистота функционального языка - увлекательная тема, и я бы порекомендовал вам прочитать Языковая чистота и грязные и чистые функции , чтобы лучше понять концепцию:

Многие говорят о «чистом» функциональные языки, где "чистый" кажется синонимом слова «хорошо». Обычно есть две черты связано с определением чистый функциональный язык:

  1. функции не могут иметь побочных эффектов
  2. функция, вызываемая с любым заданным аргументом, всегда будет возвращать одно и то же значение. * * тысяча двадцать-одна
1 голос
/ 30 июня 2009

Семантика F # и Scheme очень схожа с отмеченным исключением строгой типизации.

Кроме того, Схема настолько мала, чтобы ее не изучать!

0 голосов
/ 23 июня 2009

Будучи языком программирования, Лисп сам по себе довольно особенный, однако он совсем не похож на F #, за исключением того, что оба они поддерживают функциональное программирование. Не многие языковые конструкции переносятся с Lisp на F #. Если ты хочешь научиться шутить, иди к нему. Идея функционального программирования перенесет только не синтаксис. Лисп действительно старый, в конце 50-х. Это повлияло на многие языки, и существует довольно много диалектов.

Если вы просто ищете чистый функциональный язык для изучения до F #, я бы предложил Haskell. На Haskell сильно повлиял ML, и он является хорошим языком перехода к F #, поскольку F # является производной от ML. Вы можете посмотреть на код на Haskell и увидеть похожие шаблоны в коде F #.

...