LINUX.ORG.RU

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


2

4

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

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

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

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

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

А можно таки пример кода(на Haskell или нет, мне всёравно), для создания которого вам понадобится чёткое понимание типизированного лямбда исчисления. А то как-то тут вещают что понимание этой штуки нужно, а зачем? Я вот ни одного примера не знаю, где бы было оно нужно(каюсь, Haskell знаю на уровне сортировок, но в том же F# у меня это незнание ни разу не вызвало затруднений).

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

Заметь, я не говорю про какую-нибудь аксиоматику Цермело. Речь исключительно про школьные знания.

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

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

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

Norgat ★★★★★
()

подумать зачем, SICP, код кого-то, кто уже решил, то что вы придумали отвечая не первую часть.

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

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

Ой, да ладно... вот как раз с теорией множеств и дискреткой (надеюсь) у меня всё в порядке. %) не зря матаном полтора года голову забивали... год дискреткой, и ещё год комбинаторикой...

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

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

Я не утверждал, что я оным не владею. Я говорил лишь, что русским мой родной язык, и на нём общаться мне комфортнее.

А с тем, что на компьютерных специальностях давно пора английский язык ставить профильной дисциплиной, и подавать на должном уровне - я не спорю. За тот английский, что у нас был на первом-втором курсе мне попросту стыдно - в школе нас сильнее дрючили. Почему компьютерщикам даётся общий уровень... такой же, как во всём вузе? %) только на факультете романо-германской филологии английский более нормальный, все остальные там фигнёй страдают и самолётки пускают, зачёты сдают заочно, он там детский.

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

> Хотя это не важно, т.к. это дают на первой же лекции дискретной математики в ВУЗах.

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

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

>Нам это рассказывали и на дискретке, и на матане...

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

Если нет проблем с мат. логикой, то это задачу упрощает. Хотя, повторюсь, никакого отношения к ФП не имеет.

Раз так, то начини со Скалы. Скала вообще «ООП-ориентированный» язык (хотя я чудовищно не люблю этот термин). Но тут Одерский очень хорошо показал, что никакой пропасти между «ФП» и «ООП» нет и в помине.

У Скалы откровенно херовый синтаксис, но идиоматика намного проще. Возможен режим работы «ява на стероидах», что тоже большой плюс. Единственное, очень сильно советую приобрести e-книгу «Programming In Scala 2ed», ибо годной документации мало. Есть много интересных публикаций, но они по достаточно продвинутой тематике

Хаскель — же это по большей части интеллектуальный вызов, типа сможешь ты на ЭТОМ писать полезные программы или нет. И вообще, инструмент для мазохистов, ибо много и много раз за период обучения будешь себе казаться жалким недомерком, не способным понять элементарных вещей.

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

> Хаскель — же это по большей части интеллектуальный вызов, типа сможешь ты на ЭТОМ писать полезные программы или нет.

Вот же бред, а.

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

Когда что-то новое изучаешь, это вполне нормальное ощущение. Связано с тем, что ты входишь в новую парадигму. Это характерно не только для ФП или хацкеля, а для любой человеческой сферы деятельности.

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

Функция - это объект. С ней можно делать все то же самое, что и с любым объектом - передавать как аргумент другой функции, возвращать из другой функции. Указатели на функции с этим вполне справляются. Единственное, с чем они в Си не справляются - это замыкания. Для этого придется расширить понятие указателя на функцию, введя понятие «делегата» - структуры, содержащей указатель на функцию и произвольный набор переменных, которые могут использоваться как аргументы этой функции или замкнутые переменные. Если язык будет поддерживать работу с такими структурами через специальный синтаксис - этого будет достаточно для реализации базового ФП. Ну а лямбды это просто синтаксический сахар, в Си вот к примеру почему-то нельзя описывать функцию внутри другой функции, хотя-бы и без замыканий... хз почему так сделали... Так и лямбда тоже - безымянная функция, описанная внутри выражения, адрес (или, что лучше, объект-делегат) которой вставлен в само выражение.

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

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

>Единственное, с чем они в Си не справляются - это замыкания.

Надо отметить, что вышеперечисленные проблемы C были пофикшены в 198X-лохматом году в C++.

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

Это как? Полноценных замыканий, насколько я помню, даже в C++0x не сделали. А то что на С++ можно написать класс-функтор с переопределенным operator(), так это костыли. И на си можно сделать вручную «делегатоподобную» структуру.

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

> и таки SICP. в смысле почитать. третью главу в основном (Streams)

+1, именно после этой главы заинтересовался хаскелем.

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

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

хаскель самый крутой императивный язык в мире(с).

вот например такая императивная штука как транзакционная память - в хацкеле работает на отлично, а в императивный Си_Шарп её не смогли запилить, пичалька :)))))

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

>можно написать класс-функтор с переопределенным operator(), так это костыли

Это не костыли, это и есть замыкание: функция + вычислительный контекст. Заодно обеспечивается поддержка важного свойства «тип как вычислительный контекст». Сахару, конечно, маловато: но факт остается фактом.

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

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

Почему? Потому что нет ни лямбды (либо какой-нибудь другой возможности в рантайме создать функцию), ни замыканий. Без таких вещей называть функции первоклассными — это либо фанатизм, либо клиника.

Напомню, изначально твоя фраза была о том, что на примере С можно понять что такое первоклассные функции и лямбда. Так вот я бы скорее сказал, что на примере С скорее можно понять, чем первоклассные функции не являются и как тоскливо без лямбды.

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

>когда станут сомневаться в том, что и хаскель функциональный

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

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

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

Вообще-то это обязательный элемент любой учебы. Если такого нет, то ты и не учишься ни хера, а говно хером околачиваешь.

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

> Я говорил лишь, что русским мой родной язык, и на нём общаться мне комфортнее.

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

Почему компьютерщикам даётся общий уровень... такой же, как во всём вузе?

Да кто ж кроме филологов язык в ВУЗе учит-то? Сам учи, если не дурак, а если дурак, то опять же нечего тебе в программировании делать.

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

в реальном программинге потребности такой видимо не возникало

скорее всего возникала, просто не было необходимости задумываться над формальным определением

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

> Да кто ж кроме филологов язык в ВУЗе учит-то? Сам учи, если не дурак, а если дурак, то опять же нечего тебе в программировании делать

А нафик тогда было вообще в вуз идти, если всё самому учить?

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

>Конкретные задачи на хаскеле тоже решают, причем походу успешно

Это понятно. Я вот тоже пытаюсь решать конкретные задачи на хаскеле. С переменным успехом.

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

Macil (31.07.2011 22:41:05)

Хаскель — же это по большей части интеллектуальный вызов, типа сможешь ты на ЭТОМ писать полезные программы или нет. И вообще, инструмент для мазохистов, ибо много и много раз за период обучения будешь себе казаться жалким недомерком, не способным понять элементарных вещей.

Обучение искусству раскалывания орехов протекает долго и мучительно. В возрасте полутора лет обезьяны начинают имитировать отдельные действия, входящие в комплекс (например, стучат по ореху рукой). Примерно в 2,5 года они уже выполняют последовательности из двух действий (например, кладут орех на камень и стучат рукой). Лишь в возрасте 3,5 лет они оказываются в состоянии правильно выполнить всю цепочку операций: найти наковальню, положить орех и стукнуть камнем.

Если шимпанзе из Боссу не научился колоть орехи до 5 лет, то не научится уже никогда. Бедная обезьяна будет до конца своих дней с завистью смотреть на соплеменников, ловко колющих орехи, но так и не сообразит, в чём же тут секрет. Таких «двоечников» в популяции Боссу примерно четверть. Они иногда возобновляют попытки, но не могут понять, что нужны три предмета, и пытаются обойтись двумя. Например, одна семилетняя самка, не научившаяся колоть орехи правильно, время от времени пыталась разбить лежащий на камне орех рукой или ногой (как мы помним, так обычно поступают детеныши в возрасте 2,5 лет).

anonymous
()

Начал таки читать sicp (в переводе на русском, бросайте в меня камни). Интересно. То, что и требовалось. Снова появился интерес, желание думать, и т.п...

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

еще хорошо смотреть на английском видео лекции к нему

psv1967 ★★★★★
()

>И какую книжку почитать?

я с хаскеллом знакомелся по yet another haskell tutorial, но рекоменгдую брать http://learnyouahaskell.com/chapters

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

точно бери хаскелл.

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

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

А ты правда так хочешь?

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

>я с хаскеллом знакомелся по yet another haskell tutorial

Кстати, YAHT очень сильно не рекомендую. Хотя с тоже с него начинал.

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

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

С тобой связаться по какому-нибудь жабберу возможно? Я бы хотел обсудить пару вопросов, в том числе про аксиому и фрикас.

sanuda
()

Кстати, раз уж такое дело... читаю книжку по SICP.

Подскажите нормальный, хороший годный интерпретатор для scheme (вариант «написать свой» не принимается). Поставил guile - запускаю из консоли... ну он, конечно, работает... но ни истории команд, ни автодополнения, ни даже элементарной навигации в командной строке (направо-налево) нет... может, это как-то включается? %)

хотелось бы что-то хотя бы отдалённо смахивающее на bash по функциональности, или хотя на python ;)

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

до четвертой главы можно писать в блокноте :)))))

в четвертой не помешает интерпретатор с нормальным отладчикам(доктор ским меня в этом плане сильно расстроил :((((( )

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

в нем появилась вменяемая отладка? а то в доктор_скиме невозможно было код отладить.

из-за неудобного окна со значениями переменных.

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

обо отладке.

в четвертой главе - разработка интерпретатора.

и было очень трудно заниматься дебагом.

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

Значения переменных можно в коде посмотреть, тыкнув на переменную. Окно не нужно. Да и вообще, дебаггер в Dr.Racket не нужен, т.к. строгая типизация + стрелочки, отображающие стектрейс при ошибке.

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

да не. очень неудобно, не поймешь что во что вложено.

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