LINUX.ORG.RU

Как начинать изучать функциональное программирование?

 


1

5

Что то захотелось поучить Haskell или чего еще в этом духе, но что взять в качестве учебного материала? в 2018 то.

haskell если возьму то станет первым моим ЯП. До этого лишь максимум калькуляторы на плюсах и шарпах и простейшие конструкции на Паскале. Стоит ли вообще или лучше к нему прийти после года на других ЯП (к примеру) Ruby, C, или Python?

Деньги нужны будут только через 2 года(мне 16) так что думаю пока могу глянуть на языки. (или стоит набивать двухлетний опыт на одном лишь питоне?)



Последнее исправление: StepanKirdin (всего исправлений: 2)

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

Для первого яп лучше SICP почитай.

P.S. не в ЯП дело

^ this

Nexmean
()

Не совершай ошибок, следуя за своей любознательностью. Твой козырь один, это время. Учи тренды, и двигайся параллельно с ними. Тренды находятся на hh.ru (если знаешь что такое впн, то забугорные аналоги), найди себе конкурентов, штук 20, и начинай подтягивать знания по любому направлению. Параллельно смотри что происходить в твоём городе, если выглядишь не по годам, то проходи по собеседованиям, поспрашивай что нужно ближайшим компаниями. И да, вместо языков программирования лучше бы ты учил английский («американский»), пока голова отлично впитывает. Погугли, это совет дают почти все + второй язык обалденно развивает мозг (мышление на втором языке, разумеется), прислушайся хотя бы к этому.

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

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

Разницы никакой. суть в том чтобы делать что нравится.

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

Не совершай ошибок, следуя за своей любознательностью.

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

anonymous
()

Деньги нужны будут только через 2 года

Что то захотелось поучить Haskell или чего еще в этом духе

я убрал всё ненужное из твоего поста.

а ведь правда, учи хацкель.

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

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

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

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

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

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

это путен всё съедает, мешает кабанеть бравым военам

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

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

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

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

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

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

Зачем? Будешь воображаемо кодить на лиспе потом всю жизнь, но конечно не на работе. Зачем на больше этих?

vertexua ★★★★★
()

Разные люди вкладывают разное в слово ФП.

Если речь идет о том чтобы предпочтать иммутабельтность ТОЛЬКО там где это адекватное решение, использовать функции высшего порядка, обрабатывать коллекции в функциональном стиле, компоновать асинхронные вычисления в функциональном стиле - то это хорошие элементы функционального програмирования. Но это теперь пристстувует везде - Java, C#, C++, Python, JavaScript. Чуть больше в других продакшн языках - Scala. В Rust/C++ например эти вещи стираются в аналогичный простейший императивный код.

Если речь о зигморфизмам со стрелками и категориями Kliesli, Scalaz, Cats - то это бессмысленное ФП ради ФП. Тебе скажут что это супер красиво и супер важно понимать. Нет. Абсолютно нафиг не нужно, никогда. Код станет быстрее? Нет. Надежнее - нет, в этой лапше можно знатно накосячить. Читаемее? Точно нет. Легче поддерживать? Ты ушел - проект накрылся. Ты станешь умнее - ммм, не очень, это такое же развитие как Gentoo компилять. Ну прочитай это все если хочешь, как я в свое время, читал SICP, TAPL, You Learn Haskell FTGG. Но лишь если у тебя просто свободное время и ты выбираешь между этим и смотреть сериал под попкорн. В принципе занимательное чтиво, даже интересное. Но не программируй пожалуйста так никогда если хочешь чтобы человечество по настоящему дожило до космической эпохи

vertexua ★★★★★
()
Последнее исправление: vertexua (всего исправлений: 6)
Ответ на: комментарий от slamd64

Без В/О ваше резюме HRюши даже читать не будут. Соответственно, все ваши попыточки сделаться крутейшим погроммистом разобьются о суровую реальность бытия.

Я сам в это не верил. Но так оно и есть, как ни парадоксально. От ВО в обычном кодоклепании нету непосредственной пользы. Не все учатся в лучших ВУЗах, а Мухосранские ВУЗы настолько же эффективны как просто дома сидеть и есть борщ. Но вот знакомые не могут начать карьеру в программировании имея знания среднего джуна (которых таки берут) без диплома IT кафедры. Цирк какой-то

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

vertexua ★★★★★
()
Последнее исправление: vertexua (всего исправлений: 1)
Ответ на: комментарий от vertexua

Если речь о зигморфизмам со стрелками и категориями Kliesli, Scalaz, Cats - то это бессмысленное ФП ради ФП.

Нет, это просто ты тупой. Blub paradox во всей красе. Но не расстраивайся, 90% гуманоидов даже тупее тебя, что не мешает им наслаждаться жывотными радостями.

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

У меня с этим по жизни проблемы. В/О нету, 20+ лет работы в IT на разных позициях вплоть до руководителя IT группы предприятий...

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

И да, в две забугорные конторы легко прошел. В одной из них и работаю теперь.

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

На Haskell можно писать один-в-один как на любом другом языке

Как насчет вызвать функцию с side-effects из чистой функции? На большинстве прочих языков проблемы нет.

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

Так, тут зависит от того, хочешь ли ты на типах программировать или всё же ФП. Если второе, то бери Clojure

Самый адекватный комментарий в треде. Функциональщина с минимумом bullshit-а — это семейство Lisp-ов. Haskell, Scala, F#, Ocaml больше о типодрочерстве.

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

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

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

В 2018ом году адекватная функциональна уже во всех мейнстримовых языках. Лет 7 назад было не так

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

Ты станешь умнее - ммм, не очень, это такое же развитие как Gentoo компилять

Вот это сомнительно. Мозги все-таки заставляет скрипеть, понятия раскладывает по полкам. STL/Boost после этого не особо страшны.

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

Как к примеру писать нормальное оконное приложение? примитивные 2д игрушки, какие то скрипты?

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

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

Я прошёл курсы Москвина. Как прошедший говорю - начинать с них не надо. Не смотря на то что курс (первый из двух) содержит введение в хаскель, на мой взгляд курс слишком быстрый (всего 4 недели, емнип). И задачи сложноваты для новичка. Курсы Москвина лучше взять после одной/двух хороших книг.

Мне кажется что начать стоит с https://www.ohaskell.guide/ . Автор ставил своей целью показать что хаскель ничуть не страшный. У него пмм вполне получилось. Единственный, на мой взгляд, недостаток О-Хаскель-гуайда это то что он «введение во введение». Но вряд ли получится сделать по-другому.

Итого я бы взял о-хаскель-гуайд, затем можно learn you a haskell for great good, благо есть на русском. Затем можно взять книжку вроде бёрда или хаттона. (лучше обе, а learn you a haskell выкинуть, но они емнип по 40 баксов за штуку и русского перевода нет). Затем брать курсы от Москвина.

Как то так.

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

Зато при минимальной предварительной подготовке (пара книжек) это просто замечательный курс.

AndreyKl ★★★★★
()
Последнее исправление: AndreyKl (всего исправлений: 1)
Ответ на: комментарий от kawaii_neko

Как насчет вызвать функцию с side-effects из чистой функции?

Хочешь сайд-эффекты в чистой функции? А ты тонкий ценитель функцианальщины (не путать с ФП).

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

Я осилил.

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

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

Ruby - специализированный язык для программирования веб-приложений.

Вообще-то руби вполне себе общего назначения.

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

Haskell, Scala, F#, Ocaml больше о типодрочерстве

Балда, кому нужно ФП без развитой системы типов? Байты перекладывать хватит и сишки.

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

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

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

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

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

Как к примеру писать нормальное оконное приложение? примитивные 2д игрушки, какие то скрипты? Что то под бэк энд? по идеи это займет в 3 раза больше времени сил в отличии от Ruby, python.

http://book.realworldhaskell.org/read/gui-programming-with-gtk-hs.html

http://hackage.haskell.org/package/sdl2

Библиотеки есть практически подо всё.

по идеи это займет в 3 раза больше времени сил в отличии от Ruby, python

Если в перфекционизм не впадать, то нет. А если впадать, то и результат будет в 3 раза лучше.

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

математика - лженаука, учи обж

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

Как насчет вызвать функцию с side-effects из чистой функции? На большинстве прочих языков проблемы нет.

Продемонстрируй side-effects из чистой функции на любом языке.

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

Балда, кому нужно ФП без развитой системы типов?

В лиспах тоже неплохое ФП получалось. Причём некоторые функции не вписываются в прокрустово ложе типизации.

Например (это Scheme),

(define (f/apply ff fn)
  (lambda args (apply ff (map (lambda (f) (apply f args)) fn))))

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

Продемонстрируй side-effects из чистой функции на любом языке.

#include <syslog.h>

static int compare(int a, int b)
{
  int result = a < b ? -1 : a > b ? 1 : 0;
  syslog(LOG_INFO, "compare (%d, %d) => %d", a, b, result);
  return result;
}

static int wrapper(const void *a, const void *b)
{
  return compare(*(int*)a, *(int*)b);
}

int main()
{
  int data[] = {3, 2, 5, 1, 9, 0};
  openlog("foo", LOG_PERROR | LOG_NODELAY);
  qsort(data, sizeof(data) / sizeof(*data), sizeof(*data), wrapper);
  return 0;
}

Problems? Монадой-то в сигнатурке отсвечивать не надо.

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

А зачем тебе тогда чистая функция?

А потому что глубоко в дерях библиотечной функции тебе внезапно понадобилось произвести сайд-эффект. И не мне тебе рассказывать, что в таком чистом и академичном хаскелле как раз для целей «отладки printf-ами» поставляется костыль.

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

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

А где тут чистая? Это пишется так:

compare a b = do
  let result = if a < b then -1 else if a > b then 1 else 0
  syslog logInfo "compare (%d, %d) => %d" a b result
  return result

main = do
  data <- newListArray (0,5) [3, 2, 5, 1, 9, 0]
  openlog "foo" [logPerror, logNodelay]
  qsort data compare

А чистая в стандартном Си не существует, а в gcc помечается __attribute__((pure)).

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

А потому что глубоко в дерях библиотечной функции тебе внезапно понадобилось произвести сайд-эффект.

Если тебе в gcc в помеченной __attribute__((pure)) захочется сделать сайд-эффект, то проблем будет не меньше.

А в Haskell для особых извратов есть unsafePerformIO.

как раз для целей «отладки printf-ами» поставляется костыль

Отладка - особый случай. К тому же пользоваться этим костылём не обязательно.

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

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

В С++ из базовых типов только число и указатель. Так из-за этого переливать между std::string, QString, CString, vtkString и char* приходится довольно часто. В Haskell в этом смысле проще.

monk ★★★★★
()
Последнее исправление: monk (всего исправлений: 1)
Ответ на: комментарий от monk

В С++ из базовых типов только число и указатель.

А я не о C++ речь веду.

Это пишется так

Было бы интересно увидеть тип compare. Это ведь будет не Int -> Int -> Int?

kawaii_neko ★★★★
()

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

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

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

Поэтому предлагаю такой вариант. Как верно заметили выше, функциональщина в том объёме, в котором она используется в индустрии вполне есть в современных языках (C#, Java/Kotlin, JS, Python (ограниченно), Rust (не индустрия, но пусть будет), Scala (тут этого много) и даже плюсы). Поэтому бери какой-нибудь такой язык, освой его хорошо, вместе со всеми этими функциональными идиомами и фишками (включая системы типов), а потом можно будет в свободное время углубляться, если будет интересно.

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

Я большой фанат хаскеля, руби (вот уж где самое приятное ооп, имхо) и всего такого, с продвинутой системой типов/семантикой, но лично у меня не хватает энергии сделать из хаскеля что-то большее, чем хобби.

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

Было бы интересно увидеть тип compare. Это ведь будет не Int -> Int -> Int?

compare :: (Monad m, Num a, Ord p) => p -> p -> m a

Можно упростить до Int -> Int -> IO Int как в Си.

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

в Haskell, есть Debug.Trace.trace, Debug.Trace.traceM и даже дамп в event-log, если очень хочется.

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

лучше все же Ordering возвращать, если не хочется совсем уж играть в си и возращать разницу между символами. (не так эффективно, но все же)

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

Да. Скажем, логгирования в syslog хочу. Проблемс?

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

Логи сохраняешь отдельно.

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