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