LINUX.ORG.RU

Функциональное программирование - с чего начать?


2

4

Захотелось изучить эту штуку... Читал статейку на википедию, и ещё несколько статеек, но как-то не особенно понял, и не особо проникся.

С чего вообще начать, если полный 0 в этом? Какой язык выбрать? И какую книжку почитать? Желательно на русском языке.

До этого немного соображал в структурном программировании, и ООП почуть совсем.

Ответ на: комментарий от kiverattes

Фон-Нейман в конце-то начал, живее всех живых, стрелять его колотить. Проще один раз научиться кодить в рамках одной парадигмы и думать об интересных проектах. И вы, кодя на С++ сможете родить на базе его любые парадигмы, какие нужны. Есть даже книжка «мультипарадигменное проектирование на С++». Хардкорная книжка, по некоторым мнениям. Ну а чо? Если у тебя что на С++, что на хаскеле итог один - процессы, потоки, трубы, файлы, память... Блин, ничего не поменяется. Поменяется только вопрос «как». Когда есть цель что-то реализовать - торрент-клиент написать допустим новый или ещё какой-нибудь новый велосипед, то какая разница на ушах ты при этом будешь стоять или на жопе сидеть, итог важен. И даже не то, как это будет тормозить или летать и сколько жрать памяти, а какие новые возможности давать юзверю.

kiverattes ★☆
()

Haskell. Я учил по Yet Another Haskell Tutorial, но тогда не было многих других книг, вроде той же Real World Haskell. Их я не читал.

С Душкина начинать не советую, он очень сильную кашу в голове создаёт.

Miguel ★★★★★
()

SICP есть на русском.

dave ★★★★★
()
Ответ на: комментарий от no-such-file

> По поводу PCL, Мир лиспа и т.д. - это ж все про Common Lisp. Где вы в CL ФП нашли? CL это CLOS в первую очередь и макросы во вторую.

Ты всё же внимательней читай то, на что отвечаешь.

Я где-то предлагал CL? Просто сказал своё мнение про «Мир Лиспа» и про SICP.

И PCL я читать не предлагал. Чини глаза. :)

А насчёт «из Мир Лиспа всё работает» мог и попутать - достаточно давно её читал, но как-то вспоминается, что при обкатывании примеров и задач из этой книжки проблемы всё-таки были. Возможно, именно потому, что я не Common Lisp пользовался и про R5RS знал в то время только название. :)

OldFatMan
()
Ответ на: комментарий от kiverattes

Есть даже книжка «мультипарадигменное проектирование на С++». Хардкорная книжка, по некоторым мнениям

хорошая книжка, но к ФП никакого отношения не имеет. про это более другая книжка есть

jtootf ★★★★★
()
Ответ на: комментарий от no-such-file

> Где вы в CL ФП нашли?

Приверженцы этой партии еще любят утверждать, что и Scheme не является функциональным языком программирования. А как же, говорят они, если Scheme функциональный, то и C тогда тоже. В общем, театр абсурда.

dave ★★★★★
()
Ответ на: комментарий от sanuda

Я не схемер. И потом, непонятно, что понимать под «функциональной парадигмой». Даже по такому простому вопросу, многие не могут договориться. Имеем одну из вечных тем для споров: а какой язык является «функциональным»? Быть может, доживем до времен, когда станут сомневаться в том, что и хаскель функциональный :)

dave ★★★★★
()
Ответ на: комментарий от vertexua

> с вакансий

Лол, ты будто с луны свалился. К ФП приобщаются не для того, чтобы работать по вакансиям. И даже не для того, чтобы на нём потом писать. Словно первый день на ЛОРе, ей-богу.

anonymous
()

ТС, начни, как уже было сказано, с изучения английского. Потом почитай Фенимора Купера или Марка Твена в оригинале. Потом займись спортом, научись играть на музыкальном инструменте. Съезди в десяток разных стран.

А никому не нужной ерундой заниматься не надо.

anonymous
()
Ответ на: комментарий от anonymous

Впрочем, если задача состоит в моментальном повышении ЧСВ, то тут да, маргинальные направления в IT — самое оно. Надо просто чётко отдавать себе отчёт в том, что это самый простой, но и самый бестолковый метод повышения ЧСВ и самооценки. То есть вложенные в изучение ФП временнЫе инвестиции не будут потом возвращены никаким образом.

Есть и другие способы самоутверждения, они сложнее, но практичнее. Каждый выбирает себе по силам.

anonymous
()
Ответ на: комментарий от dave

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

Так вот. Определяющим фактором является то, как язык использует сообщество, а не то, как его можно использовать вообще. В функциональном стиле можно практически на любом языке писать, только не во всех языках так писать принято. ФЯП — это тот язык, на котором _принято_ писать в функциональном стиле.

То есть является ли язык функциональным по сути определяет сообщество вокруг него. Поэтому я и спросил, является ли функциональная парадигма среди схемеров доминирующей.

sanuda
()

Я бы посоветовал начать с Haskell (Душкин Р. В. Функциональное программирование на языке Haskell). Также стоит прочесть Functional Programming with Bananas, Lenses, Envelopes and Barbed Wire, как раз перед изучением Хаскеля.

Array
()
Ответ на: комментарий от sanuda

> А в сообществе схемеров функциональная парадигма является доминирующей?

маловероятно

korvin_ ★★★★★
()

установи и настрой емакс

bioreactor ★★★★★
()

Реально мне понять ФП помогли статьи на rsdn про немерле:) Начинать с математики конечно можно, если вы математик. А если программер - логично начать с простого программирования. Понять, что такое первоклассные функции и лямбды, можно без всякой математики даже на примере обычного си.

x-code
()
Ответ на: комментарий от dave

lambda-calculus...

К вопросу «зачем» - если серьёзно заниматься Информатикой, как наукой, то нужно знать и уметь. К примеру корректность программы, написанной исключительно с использованием функциональной парадигмы может быть доказана математически при помощи так называемой структйрной мат. индукции (обобщение метода мат. индукции).

anonymous
()
Ответ на: комментарий от anonymous

> К примеру корректность программы, написанной исключительно с использованием функциональной парадигмы может быть доказана математически

Вот из таких и получаются Vijay-подобные «специалисты», как в небезызвестном рассказе «The Proven Fix»:

«But I proved that it was correct!» exclaimed Vijay while stabbing his notebook with his pointer finger, «Now you see here! Page 3! There! SEE?!?!»

Для Ъ: компания взяла на работу подающего надежды молодого специалиста, «PhD in Computer Science». Первой его задачей было исправить баг в программе, работающей с аппаратными датчиками. «Специалист» моментально «исправил» баг, и долго расписывал доказательство корректности своего исправления. После того, как на практике выяснилось, что его фикс не работает, обиделся и покинул контору. С сакраментальной формулировкой «Ваше ПО дефективно, и поэтому не работает с моим исправлением, корректность которого доказана математически».

anonymous
()
Ответ на: комментарий от BattleCoder

Потому что материал низкого качества. Если разговор про хацкель, то я бы советовал http://learnyouahaskell.com/chapters и http://book.realworldhaskell.org/read/ , например. Вообще, если хочешь книжки, то смело открываешь http://haskell.org/haskellwiki/Books и читаешь то, что больше всего тебе подходит по уровню. Можно и викибуки посмотреть http://en.wikibooks.org/wiki/Haskell . Да и любые туториалы, интернет ими завален.

Хотя... все еще очень сильно зависит от того, в каком аспекте тебя хацкель интересует. Если интересует практика применения, то однозначно RWH, если интересует трансляция и анализ программ на хацкеле, то читать статьи и книжки СПЖ, Марлоу и других. Если же интересуют какие-то отдельные аспекты а-ля лямбда-счисление, типизация по ХМ и прочая муть, то гугль в помощь.

sanuda
()
Ответ на: комментарий от x-code

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

Как?

sanuda
()
Ответ на: комментарий от tn1

> ммм ... сухая книга.

Которая? «Функциональное программирование на языке Haskell»? Ну да, у нее изложение какое-то справочное. Местами вообще не ясно, при чем тут Haskell. А уж понимания того, как на нем программировать эта книга явно не дает.

sanuda
()
Ответ на: комментарий от anonymous

Там внизу хорошая цитата Д. Кнута :)

«Beware of bugs in the above code; I have only proved it correct, not tried it.» - Donald Knuth, Notes on the van Emde Boas construction of priority deques: An instructive use of recursion

anonymous
()
Ответ на: комментарий от anonymous

>После того, как на практике выяснилось, что его фикс не работает, обиделся и покинул контору. С сакраментальной формулировкой «Ваше ПО дефективно, и поэтому не работает с моим исправлением, корректность которого доказана математически»

все правильно сделал. Вполне возможно что их бажное ПО действительно работает некорректно, и не только с аппаратными датчиками, неизвестно сколько еще багов в других местах проги спрятано

Karapuz ★★★★★
()
Ответ на: комментарий от sanuda

Тогда из известных «функциональных языков» хаскель и остается почти в гордом одиночестве, хотя даже к его типам IO, ST, State и Writer можно предъявить претензии - на определенном уровне абстракции снова имеем мутабельное состояние. На второе место по функциональности поодаль можно было бы поставить clojure, но это, блин, лисп, который так не любят некоторые хаскелисты. Третье место пустует. Scala, CL, Scheme, Ocaml и F# выбывают из соревнования за использование императивного допинга.

dave ★★★★★
()
Ответ на: комментарий от dave

> хотя даже к его типам IO, ST, State и Writer можно предъявить претензии - на определенном уровне абстракции снова имеем мутабельное состояние

Ну началось нытье. Так можно и говорить, что на определенном уровне абстракции и классический инкремент «i = i + 1» не изменяет переменную, а создает новую «i2 = i1 + 1». По факту это бред.

Scala, CL, Scheme, Ocaml и F# <...> использование императивного допинга.

Поэтому и принято выделять из ФЯПов чисто функциональные. Потому что во многих из них есть примеси.

... выбывают из соревнования ...

Что за соревнование? В функциональной чистоте? Ну тогда почти верно говоришь. Только хацкель все равно не остается в гордом одиночестве, как минимум еще из чистых есть Clean и Miranda.

sanuda
()
Ответ на: комментарий от tailgunner

Читайте ВСЁ, кисоеды, всё равно у вас времени дофига.

kiverattes ★☆
()

Вообще, Haskell, как наиболее распространенный среди чистых. С чего начать? Хм. Я решил начать с Душкина (как и многие здесь), но, к счастью, перед этим уже ознакомился с основами лямбда-исчисления и ФП на базе OCaml по намного более внятной книге. Название вот прям сейчас не помню, но могу найти, если надо. Дочитав ту книгу я понял, что OCaml мне особо то и не нужен, потому что для ЯВУ уровня ФП ему явно не хватает мощной стандартной библиотеки. Поэтому выбор пал на Haskell и Душкина. Читая творчество этого «писателя», я постоянно натыкаюсь на разного рода неприятные вещи. Например, формулы, в которых не все используемые символы определены в контексте книги. Или часто используются языковые конструкции, которые еще не известны читателю и честно предупреждается, что объяснение дальше в книге, но код от этого «объяснения» понятнее не становится. Думаю вот, что Real World Haskell, судя по отзывам, будет самое оно. После хотя бы вводного курса в теорию лямбда-исчисления. Это необходимо, чтобы не недоумевать постоянно, нафига делать рекурсию там, где можно просто цикл, и не спрашивать у всех подряд, что такое карринг и вывод типов и как это работает.

delete83 ★★
()

Напиши «Hello, World!» на Unlambda и на этом успокойся. На практике все равно ФП не нужно совершенно, а чтобы мозги понапрягать Unlambda - самое то.

anonymous
()
Ответ на: комментарий от Karapuz

> все правильно сделал

Vijay, ты?

Так и знал, что кто-нибудь такое ляпнет. У вас с Vijay'ем есть ещё одна общая черта: вы плохо знаете английский. Ибо иначе ты бы прочитал ту историю целиком, и не нёс бы чепухи.

Поясняю для малограмотных. Чуваку поручили задание: обнаружить и исправить баг в программе. Он с этим заданием не справился. Всё. А мораль сей басни такова: PhD in Computer Science само по себе не делает из тебя инженера-практика. А в промышленной разработке ПО нужны именно они.

anonymous
()
Ответ на: комментарий от BattleCoder

> Простите, живу в Рашке, говорю на русском, пишу на русском, читаю на русском. Грешен.

А что, живущие в России (это слово пишется именно так, громотей херов) врачи латынь знать не должны, до тех пор, пока в древний Рим не иммигрируют? Английский - это lingua franca программирования. Кто им не владеет, того близко к программированию подпускать нельзя.

anonymous
()
Ответ на: комментарий от vertexua

> вакансий

Вакансии - для школоты.

anonymous
()
Ответ на: комментарий от sanuda

> Поэтому я и спросил, является ли функциональная парадигма среди схемеров доминирующей.

Судя по наличию set! - не является.

anonymous
()
Ответ на: комментарий от anonymous

Мораль сей басни другая: не тот человек не на той работе. PhD in Computer Science далеко не обязательно должен уметь кодить. Computer Science сама по себе очень обширна... и PhD может быть к примеру экспертом в области безопасности и шифрования, но ничего не знать о датчиках температуры и том как там этот симулятор вообще запускается. Грубо говоря его задача руководить, придумывать алгоритмы, оценивать принимаемые решения по разработке, а кодить и править баги могут индусы.

anonymous
()
Ответ на: комментарий от anonymous

> а кодить и править баги могут индусы

Судя по имени этот PhD как раз и есть индус

anonymous
()
Ответ на: комментарий от anonymous

я же Ъ и не хожу по ссылкам

обнаружить и исправить баг в программе


а вдруг для этого нужно было бы перерыть всю программу и исправить еще 50 внезапно найденных багов? он все правильно сделал, если конечно не подписался за шоколадку всю прогу исправить. это только в ссср ищут горбатых которые согласны за дневную зарплату горбатиться месяц, на западе дурных нет. поэтому его поступок воспринимается так странно, как будто он не справился со своим заданием и хлопнул дверью

Karapuz ★★★★★
()

>Захотелось изучить эту штуку...

Ну, дык, функционального программирования где угодно полным-полно. Как только ты начинаешь использовать функции высших порядков... А это делать ты начинаешь при решении любой мало-мальски сложной задачи обобщенного программирования (правда иногда ОЧЕНЬ неявно).

Какой язык выбрать?

С++? JavaScript? Java? Python?

И какую книжку почитать? Желательно на русском языке.

На русском языке ты можешь невозбранно почитать книжку «Немцов: Итоги». Для всего остального извольте учить английский.

Macil ★★★★★
()
Ответ на: комментарий от bga_

>именно курса типизированного лямбда исчисления

Начинать нужно с начала теории множеств и мат. логики, ибо не думаю что у ТС хватит теоретического аппарата. У меня вот тоже не хватило.

Macil ★★★★★
()
Ответ на: комментарий от anonymous

> Судя по наличию set! - не является.

Одного этого факта недостаточно. Говорю же, не так важно то, что в языке есть, как то, как этим языком пользуются. Насколько я вижу, set!'ом в схеме пользуются, но это строго локализовано и в небольших количествах. Так что вполне себе ФЯП, хоть и не чистый.

sanuda
()
Ответ на: комментарий от sanuda

>Для лямбда-счисления?

Для типизированного лямбда-исчисления, ибо теория типов. Кроме того там логика не свосем классическая :).

Теория множеств? Школьных знаний хватит.

Теория множеств? В ШКОЛЕ?

Macil ★★★★★
()
Ответ на: комментарий от Macil

> Для типизированного лямбда-исчисления, ибо теория типов. Кроме того там логика не свосем классическая :).

Теория типов вполне шикарно осваивается и без матлогики. Уж тем более интуиционистской.

Теория множеств? В ШКОЛЕ?

А что? Вам в школе не рассказывали ничего про множества? Неужели ты не знал после школы, что есть пересечения и объединения множеств? Не рисовал диаграммы Венна?

sanuda
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.