Как Lisp связан с F #, и является ли изучение Lisp полезным дополнением к F #?

StackOverflow https://stackoverflow.com/questions/1033552

Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

F # - это и язык, и реализация. От Microsoft. Он был в основном получен из OCAML и принадлежит к семейству языков ML.

Lisp был очень ранним языком, поддерживающим функциональное программирование (Lisp 1.5 в 60-х годах). Много ранних экспериментов с функциональным программированием было сделано в Лиспе. В 70-х годах в сообществе Lisp было движение к корням функционального программирования, и в результате была получена схема . Затем, особенно в 80-х и 90-х годах прошлого столетия, появились новые функциональные языки (ML, Miranda, FP, SML, Haskell, Clean, ...), которые сильно отличались от обычных диалектов Лисп. Есть еще наследие, но в основном они развивались в разных направлениях (статическая типизация, вывод типов, модульные системы, языки пакетной обработки, алгебраические типы данных, ленивая оценка, чистота и многое другое). Сообщество Scheme по-прежнему имеет много контактов с сообществом FP. Но это в основном все.

Есть некоторые базовые идеи FP, которые можно выучить независимо от конкретного языка FP, но, как правило, F # сильно отличается от большинства диалектов Lisp. Другая особенность, заключающаяся в том, что F # поддерживает экосистему .net (особенно потому, что это создание Microsoft), не очень хорошо поддерживается диалектами Лисп.

Я также не ожидал бы большой пользы от знания ограниченного диалекта Лиспа, такого как Emacs Lisp, для изучения F #.

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

    Следует учитывать две важные вещи::

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

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

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

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

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

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

      

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

         <Ол>   
  • функции не могут иметь побочных эффектов
  •   
  • функция, вызываемая с любым заданным аргументом, всегда будет возвращать одно и то же   значение.
  •   

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

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

    http://groups.csail.mit. Edu / макинтош / классы / 6,001 / Абельсон-Сассмен-лекции /

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

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

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

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

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top