Схема проти Haskell для ознайомлення з функціональним програмуванням?


36

Мені подобається програмувати на C і C #, і буду вивчати C ++ у майбутньому. Мені може бути цікаво вивчити функціональне програмування як іншу парадигму програмування. Я роблю це для розваги, моя робота не пов'язана з комп'ютерним програмуванням, і я дещо натхненна використанням функціонального програмування, що викладається досить рано, на курсах інформатики в коледжі. Обчислення лямбда, безумовно, перевищує мої математичні здібності, але я думаю, що я можу впоратися з функціональним програмуванням.

Які з Haskell або Scheme послужать хорошим вступом у функціональне програмування? Я використовую emacs як свій текстовий редактор, і хотів би мати можливість його легше налаштувати в майбутньому, що спричинить за собою вивчення Emacs Lisp. Я розумію, однак, що Emacs Lisp досить відрізняється від Scheme і є також більш процедурним на відміну від функціонального.

Я, швидше за все, використовую книгу "Маленький Схемер", яку я вже придбав, якщо я переслідую "Схему" (мені здається, це трохи дивно від мого обмеженого перегляду її). Або я б застосував "Навчи тебе хаскелл для великого добра", якщо я переслідую Хаскелла. Я б також дивився відео "Intro to Haskell" доктора Еріка Мейєра на "9 каналі".

Будь-які пропозиції, відгуки чи вкладення оцінено.

Спасибі.

PS BTW У мене також є доступ до F #, оскільки я маю Visual Studio 2010, який використовую для розробки C #, але не думаю, що це має бути моїми основними критеріями для вибору мови.


3
Не забувайтеReal World Haskell
альтернатива

15
Незначний коментар: обчислення лямбда - надзвичайно проста система; класна річ у цьому не в тому, що вона складна, а навпаки; що ви можете висловити все, що завгодно, в такій простій системі. Почніть з мови програмування; тепер викиньте ВСЕ, крім змінних посилань, визначень функцій та викликів функцій. Вуаля! Обчислення лямбда.


9
Я можу навчити вас обчислюватись лямбда за п’ять хвилин. Тепер розуміння наслідків того, що ви тільки що дізналися, займає все життя. :)

5
Я вибрав Haskell за схемою головним чином тому, що в ньому не так багато затьмарених дужок!
Джої Адамс

Відповіді:


27

Я б рекомендував OCaml.

На мою особисту точку зору головною основою сучасних функціональних програмувань є функції вищого порядку, система статичного типу та алгебраїчні типи даних та узгодження шаблонів.

Між схемою, ML та Haskell я б обрав ML, тому що вважаю, що це найбільше стосується цього визначення. У схемі немає статичного набору тексту (є типізована ракетка, але це не для початківців схеми), а у Haskell є занадто багато інших матеріалів (монади, ледача оцінка ...), які, хоча і цікаво, можуть відвернути увагу від важливої ​​основи .

SML і OCaml однаково цікаві; Я більше звик до OCaml, і він має більш "практичне" почуття, яке приємно (але якщо ви дійсно хочете "практично" ризикувати втратою душі, ви можете також вибрати F #).

Схема та Haskell - теж дуже цікаві мови. Наголос схеми на макросах цікавий, але безпосередньо не пов’язаний з функціональним програмуванням (це ще одна з речей у світі, яку ви обов'язково повинні спробувати, а також логічне програмування, мови на основі стека та орієнтована на можливості E).

Haskell, безумовно, чудова мова і, я думаю, обов'язковий пункт для прагнучих гуру функціонального програмування. Але оскільки основні мови OCaml та Haskell дуже схожі (за винятком лінивої оцінки, яка відволікає початківців), Haskell вивчити Haskell легко, як тільки ви дізнаєтесь основи OCaml. А точніше, ви можете сконцентруватися на дивних речах, і вам не доведеться засвоювати основи одночасно.

Аналогічно, як тільки ви побачили OCaml, а можливо, і Haskell, і все ще хочете дізнатися більше, вам слід подивитися на Coq або Agda. Та все ж мало хто рекомендує Coq або Agda для першого ознайомлення з функціональним програмуванням ...

Щоб зрозуміти: я думаю, що вивчення OCaml (або SML), а потім Haskell, зробить вас настільки ж хорошим функціональним програмістом, як і вивчення Haskell безпосередньо, але легше (або менш болісно).
Крім того, OCaml і Haskell мають і хороші речі, що їх відрізняють, і цікаво знати про вдосконалені можливості обох . Просто навчання Haskell є біднішим у цьому аспекті (хоча, звичайно, ви могли б навчитися OCaml після Haskell; я думаю, це менш логічно і ви збіднієте).

Для вивчення OCaml я рекомендував би проект книги книги Джейсона Хікі (PDF) .

¹ це визначення суперечливе. Деякі люди із схем стверджують, що статичне введення тексту не має нічого спільного з функціональним програмуванням. Деякі люди Haskell стверджують, що їх визначення чистоти ("що робить Haskell, але не більше") є обов'язковою умовою функціонування мови. Я згоден не погоджуватися.


3
Дякую, що підштовхнули мене до OCaml, і так, я ризикую душею та вивчу F #. Я розробляю для Linux, Mac OS X і Windows (в основному колишню), але, здається, FSI доступний для всіх трьох платформ (працює на Linux і Mac OS X), які я вже роблю. Факт функціонування Майкрософт стоїть за функціональною мовою програмування (хоч і "нечистою"), слід вітати, а не зменшувати шанувальниками функціонального програмування.
haziz

SML мертвий, існує
окамл,

1
+1 для ML; це зрозуміліше, ніж Хаскелл.
m3th0dman

Я також вважаю гарною ідеєю вивчити SML або OCaml, а потім Haskell (+1). Знаючи ці мови, підібрати ще одну (наприклад, Scala) дуже легко. Додатково можна подивитися на схему, звичайний Lisp та Clojure (у цьому порядку), щоб відчути динамічні мови.
Джорджіо

@haziz: Навіть коли вони створюють гарне програмне забезпечення, Microsoft (або, з цього приводу, Oracle тощо) залишається монополістом, з усіма пов'язаними поганими методами, такими як блокування клієнтів, несумісні формати, несумісні реалізації та ін.
Giorgio

26

Якщо вас цікавлять більш вдосконалені концепції функціонального програмування, тоді перейдіть з Haskell. Існує належна система типу і сувора заборона мутації. Все-таки Хаскелл не для слабких людей.

Якщо ви просто хочете ознайомитись з функціональним дизайном, перейдіть до схеми. Синтаксис набагато простіше вивчити та читати. Це дозволяє процедурне програмування, але просто дисциплінуйте себе не використовувати жодної процедури з а !в кінці назви.

За допомогою схеми ви також можете прочитати структуру та інтерпретацію комп’ютерних програм , що є найкращим вступом до парадигм програмування, руки вниз. Про книгу читають лекції і з MIT, і з Берклі .


4
"Синтаксис набагато легше вивчити і читати" є дуже суб'єктивним.

6
@luqui: Правда. Можливо, «регулярне» - це краще слово. Жодних зворотних посилань, виправлень, пріоритету чи асоціативності - просто дужки, безліч дурних дужок.
Хоа Лонг Там

17

Правильна відповідь - це, звичайно, обидва! Тож це лише питання, з якою мовою боротися спочатку. Моя ситуація ідентична вашій. Мені дуже сподобався Маленький Схемер. Ви, безумовно, зрозумієте основні конструкції функціонального програмування після того, як пройдете це (і зможете розмістити свої плями з желе!)

Я близько чверті в Learn You a Haskell для великого добра. Я також дуже насолоджуюся цим, але дві книги не могли бути більш різними. Learn You a Haskell має дуже традиційний підхід до викладання певної мови. Малий Схемер, очевидно, характерний для Схеми, очевидно, але набагато більше стосується викладання основ функціонального програмування, а не мови схеми.

Я напевно рекомендую почати з «Маленького схемера». Це менш практично, але більш фундаментально.


17

Мої два центи щодо функціонального програмування - це не зациклюватися на певній мові, а вивчити ключові поняття функціонального програмування. Я навчився функціональному програмуванню, кидаючи головою в проект, в якому мій начальник наполягав на тому, щоб усі розробки були зроблені в APL. APL - це функціональна мова, що обробляє масив, і настільки далека від LISP, Haskell або будь-якої іншої основної мови програмування. Справжньою виграшею було те, коли я виявив, що колись я "пограбував" парадигмою функціонального програмування і подумки навчився як автоматично магічно розкласти проблему на функціональну програму, мене справді більше не залякували ідіоматичні аспекти інших функціональних мов, таких як Haskell, OCaml, Schema, Scala та Clojure. Я '

Якби я вибрав першу функціональну мову, я, мабуть, обрав би Haskell або Steel Bank Common Lisp (SBCL). Для Haskell я читав « Learn You a Haskell ...» , «Haskell Real» , «Дорога до логіки», математика та програмування «Haskell» та « Перлини функціонального алгоритму» . Для CL я прочитав « Землю Лісапа» , « Парадигми програмування штучного інтелекту» та (якщо ви справді хардкор) Пустіть над Лямбдою . Ви можете змішати і співставити всі ці книги, щоб отримати широкий огляд практичних функціональних підходів та концепцій програмування.

Я б також розглядав можливість вивчення Clojure та Scala, оскільки вони самі по собі дуже хороші та дуже виразні функціональні мови (незважаючи на те, що може сказати пурист FP).


6

Я погоджуюсь з пунктом «вивчити обидва», але є ще кілька моментів, про які досі не згадувалося. Перш за все, якщо ви новачок у функціональному програмуванні, і ви їдете з Haskell, то вам доведеться зіткнутися з кількома новими речами, крім FP: вам потрібно навчитися жити в лінивому середовищі, яке може зайняти чимало зусиль, і вам потрібно мати справу з "реальною" системою типу, яка може бути дуже далекою від тієї, яку ви використовуєте в C або C #.

Схема, OTOH, має синтаксис іноземного вигляду, але не існує системи статичного типу для вивчення, і це сувора мова, тому речі більш звичні. Крім того, реалізація схеми, як правило, дуже податлива - наприклад, Racket доводить це до крайності і надає лінивий варіант і статично набраний варіант. Це означає, що ви можете почати з «легкого» матеріалу та отримати можливість задіяти функціональну мову, а пізніше ви зможете вирости самостійно та використати введений варіант та ледачий. Зараз їм повинно бути простіше, оскільки ви одночасно маєте справу з однією особливістю. Щоб було зрозуміло, поняттябудуть досить новими, що синтаксичне питання буде незначним і здебільшого не має значення. Іншими словами, як тільки ви почнете переходити до нових понять, ви будете достатньо зайняті, що синтаксис просто зникне. (І якщо ви дійсно дбаєте про синтаксис, то синтаксис Haskell - це те, що я особисто вважаю дуже елегантним - але це тому, що він також дуже далекий від вашого середнього синтаксису C / C # / C ++.)

Але, сказавши все це, я думаю, що для F # також є хороший момент - ти кажеш, що робиш це як бічну справу, але коли ти навчишся FP, незабаром ти захочеш використати всі ці добрі речі. Використання F # означає, що ви можете робити більше «справжніх» речей, оскільки, мабуть, легко вирішувати ті самі проблеми, з якими ви маєте справу у своїй щоденній роботі. В ідеалі ви дістанетесь до точки, коли ви побачите перевагу використання цього, скажімо, C # - і використаєте його в якомусь проекті. Тож якщо ви маєте рацію не вибирати F # лише тому, що вам легше отримати доступ, вам слід подумати про це, оскільки немає нічого кращого, ніж фактично використовуватиці нові поняття. На противагу цьому, якщо ви використовуєте Scheme або Haskell і вважаєте це іграшкою мовою для своїх цілей (навіть якщо ви знаєте, що деякі люди використовують її для реальних програм), ви ніколи не будете сприймати всю річ FP надто серйозно. [Але YMMV, це здебільшого засноване на суб'єктивних спостереженнях і може сильно відрізнятися від однієї людини до іншої.]


6

Чи є причина, чому ML не є одним із ваших варіантів? Доступна кількість вступного матеріалу, включаючи книги та роздатковий матеріал. Якщо вам подобається The Little Schemer, ви також можете насолоджуватися The Little MLer. Нарешті, ви можете легко зробити перехід до F # пізніше. (Не те, що я стукаю Хаскелл або Схему - в ідеалі вивчити всі три).

Також слово попередження про Emacs Lisp. Я не думаю, що ні Haskell, ні ML не готують вас до цього. Мова Lispy, як схема, допоможе, але все ж є основні відмінності, наприклад. динамічно оцінені змінні. Розширення Emacs за своєю суттю, як правило, є більш імперативними, ніж функціональними - вони полягають у зміні стану редактора.


Дякую, що підштовхнули мене до ML / OCaml, і так, я "ризикую душею" та вивчу F #. Я розробляю для Linux, Mac OS X і Windows (в основному колишню), але, здається, FSI доступний для всіх трьох платформ (працює на Linux і Mac OS X), які я вже роблю. Факт функціонування Майкрософт стоїть за функціональною мовою програмування (хоч і "нечистою"), слід вітати, а не зменшувати шанувальниками функціонального програмування.
haziz

До речі, я замовив The Little MLer від Amazon і вже отримав його і почав свою поїздку. Я також лише додав навчання F # до своєї бібліотеки. Здається, більш загальним посібником з викладання, який я буду використовувати, щоб доповнити Маленький MLER.
haziz

6

Напишіть собі схему за 48 годин (haskell)

Я дуже рекомендую це. Ви дізнаєтесь Haskell, використовуючи реальну та цікаву проблему, і ви дізнаєтесь найкращий урок схеми з гри з побудованим перекладачем. Якщо ви підете цим маршрутом, збережіть кілька хороших вступів Haskell. Ви зрозумієте їх краще, якщо вам доведеться вирішити проблему.


Я фактично використовував цю wiki / pdf, щоб вивчити Haskell і вивчити свої вміння OCaml (переклавши ідіоматичний Haskell на OCaml). Було б досить круто, якби хтось міг взяти цей матеріал і «розщедрити» його для кількох функціональних мов. Можливо, це буде основою для досить прикольної функціональної мовної стрільби!
Marc

1
Основна проблема цього полягає в тому, що він вводить парсек без введення монад.
альтернатива

@alternative parsec має інтерфейс Monadic, але він також має додатковий інтерфейс, не кажучи вже про численні інші функції. Не так розумно вводити Парсека перед монадичним узагальненням
Філіп Дж.

4

Я б поїхав з Хаскеллом. За схемою, вас можуть підштовхнути до процедурних речей, і система його типів не є настільки корисною, що має Haskell, що чудово підходить для початківців, оскільки вона майже перевіряє правильність вашого коду під час компіляції.


3
"майже перевіряє правильність вашого коду" дуже помиляється. Жодна система типів не може цього зробити. (Якщо тільки ваша система не є справжньою доказовою теоремою.)
Елі Барзілай,

4
@Eli, ти використовував Haskell? Хоча теоретично це твердження очевидно помилкове, на практиці я вважаю його досить точним, принаймні порівняно з будь-якою іншою мовою, якою я користувався. З цього приводу я фактично не згоден, що це хороша властивість для початківця. Коли я вивчаю мотузки, я краще побачу конкретно, що мій код зробив неправильно, а не, щоб компілятор кричав на мене, що це неправильно, і з цим потрібно боротися, коли я навіть не знаю лексики, яку використовують повідомлення про помилки.

1
@Eli "досить багато" є ключовим терміном тут. У Haskell ви витрачаєте більше часу на роздуми над тим, як його реалізувати, тоді реалізація приходить досить легко. Потім ви кладете прапорець, щоб переконатися, що ваші карти, складки та ін. Є здоровими.
альтернатива

@ Елі Барзілай: Типова система Хаскелла, схоже, здається, що вона дуже близька до доказів теореми. Це, безумовно, створило середовище, коли докази теореми майже здаються більш поширеними, ніж інші інструменти. (Не те, що я маю на увазі причинний зв’язок.)
greyfade

@luqui - Так, я користувався цим; ні, це все ще помилкове твердження, як в практиці, так і в теорії. Це не те, що є унікальним для Haskell.
Елі Барзілай

1

Я думаю, що легко зациклюватися на дискусіях про мови та пропустити суть. Для того, хто просто хоче дізнатися про те, що стосується програми FP, відмінності між Ocaml / ML / Scheme / Haskell не вдвічі важливіші, ніж ваш комфорт з матеріалами (книгами, відео, інструментами), якими ви користуєтесь. І чи є у вас друг, який допоможе вам навчитися певній мові козиряти все інше.


0

Якщо це не чисто, ви також можете використовувати імперативну мову, так що Haskell.


0

В одній з відповідей, яку ви отримали на ваше запитання, я знайшов це посилання досить цікавим, оскільки воно дає вам смак Haskell та Scheme.

Окрім цього вишуканого посилання, ось моє питання щодо вашого питання.

Якщо ви приїжджаєте з необхідного програми програмування, ви можете докласти багато зусиль для вивчення функціонального програмування. Я би переконався, що досвід навчання не порожній. Це означає, що ви можете застосувати його до своєї поточної чи наступної роботи, або що це допоможе вам якимсь іншим способом.

Там багато хороших мов. Люди Скали вихваляли б свою мову, як і люди Clojure та CL. Навіть піфоністи претендують на лінь. Інші люди, які відповіли вам, запропонували ML. Аміт Ратхор, який написав Clojure в "Дії", може навіть запропонувати вам навчитися Haskell.

Ви згадали про Windows та F #. Чи допоможе це вам у вашому нинішньому становищі? Я нічого не знаю про F #. Це досить функціонально? Я це запитую, тому що IMHO Python має функціональні конструкції, але це не так, як програмування в Clojure.

Підсумовуючи підсумок, вивчіть функціональну мову, яка є "справді" функціональною і має найкращий сенс для вашої ситуації.


-2

З точки зору відносно початківця, я пропоную не починати з SICP, якщо ви вирішите схему, якщо тільки ваша математика не зріла. Книга та відео наповнені тонкощами і зовсім не інтуїтивно зрозуміли для когось, хто починає.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.