LINUX.ORG.RU

О ФП и первопричинности

 ,


0

4

Задумался о программировании в общем. Что такое программа? Очевидно, это набор некоторых данных и команд для ЦП для выполнения неких действий. Но как пользователь понимает, что программа выполняется? Как правило, это вывод на экран некоторой информации, то есть изменение состояния монитора. Если программа «молчит», то это хотя бы изменение регистров и флагов процессора. А что же мы видим в Хаскелл? Эти теоретики считают, что программа должна быть «чистой», а раз она чистая, то она ничего не меняет. Нет движения и нет результата. Если бы они философски подошли к вопросу, поняли бы сразу, что язык мертв с рождения.

Очевидно, что надо сделать всё наоборот - главная программа грязная, а чистоту (то есть отсутствие изменений) осуществляют лишь небольшие блоки. Тогда у хаскеля был бы хоть малый шанс тягаться с JS.

Так программа для ЦП - не цель, а средство. Описать же задачу удобнее на высокоуровневом языке. На Haskell вы описали задачу, а как и кто её будет выполнять - это отдельная тема.

anonymous
()

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

Тут уже был один деятель, который утверждал, что чистых программ не существует, потому что в любом случае они меняют состояние процессора. Это не ты случаем? :)

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

А теперь ты запускаешь код в IO, пусть даже чистый, он выполняется, возвращает результат, котёнок жив!

Очевидно, что надо сделать всё наоборот - главная программа грязная, а чистоту (то есть отсутствие изменений) осуществляют лишь небольшие блоки. Тогда у хаскеля был бы хоть малый шанс тягаться с JS.

JS-то тут каким боком?

yoghurt ★★★★★
()

Очевидно, что надо сделать всё наоборот - главная программа грязная, а чистоту (то есть отсутствие изменений) осуществляют лишь небольшие блоки. Тогда у хаскеля был бы хоть малый шанс тягаться с JS.

Так и есть. Центр обычно в IO монадах, блоки вычисление по бокам - чистые.

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

JS-то тут каким боком?

Там есть map и reduce - значит это и есть функциональщина. А чистые функции - всё выдумка.

запускаешь код в IO

Монады, таким образом - лишняя сущность, правильно было бы избавится от них

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

запускаешь код в IO

Монады, таким образом - лишняя сущность, правильно было бы избавится от них

Мог бы и тоньше

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

map и reduce

мап с редьюсом и в плюсах есть, в определённом виде, прости г-ди.

yoghurt ★★★★★
()

Эти теоретики считают, что программа должна быть «чистой»

Даже SPJ так не считает. Где вы берете этих теоретиков, и зачем оспариваете выдуманные позиции?

jerk-of-all-trades
()
Ответ на: комментарий от esandmann

Какие-такие ФПшники?

Меня вот обучали программировать по образцам, написанным на Лиспе какими-то совершенно левыми докторишками. Конкретно, медики писали экспертные системы. И у них замечательно получалось. В смысле читаемости, эффективности и компактности кода - на железе времён царя Гороха.

Просто с тех пор много чего поменялось - вот тебе и приходится хлебать дерьмо полной ложкой. Можно только посочувствовать. Но вот перегибать - не надо!

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

Там есть map и reduce - значит это и есть функциональщина.

Ты не поверишь, они есть даже в пхп. Мне вот интересно, какой вывод из этого ты сделаешь?

anonymous
()

Но как пользователь понимает, что программа выполняется? Как правило, это вывод на экран некоторой информации, то есть изменение состояния монитора.

Да. Текущее состояние монитора в данный момент - это *функция* от всех произошедших до данного момента (релевантных) событий.

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

Очевидно, ты не понял, что такое монады. Посмотри на computation expressions f#, может поймешь свои ошибки.

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

Монады, таким образом - лишняя сущность, правильно было бы избавится от них

В хаскелле от них и избавляются. Реальные поцоны юзают аппликативные функторы и стрелки.

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

Он все правильно сказал, монады не нужны, есть uniqueness types.

buddhist ★★★★★
()

Эти теоретики считают, что программа должна быть «чистой»

«Эти теоретики», камрад, — арабы в 12-м веке. Стыдно не знать историю.

Очевидно, что надо сделать всё наоборот

Очевидно, все нужно сделать наоборот: главная программа — чистая, а вся грязь скрыта за декларативными/аппликативными/монадическими (на твой вкус) интерфейсами.

Т.е. программа комбинирует хаки, квирки, костыли core-библиотек, FFI-врапперов, языкового рантайма (написанного на C), оставаясь при этом верифицируемой.

Т.е., например, нам не нужно лезть внутрь байтстринга, потому что авторы библиотеки позаботились об удовлетворении самых извращенных потребностей программиста... А если нам все-таки, ВНЕЗАПНО, нужно лезть внутрь байтстринга (который, к слову, даже на хаскельной куче не размещается), мы это сделаем на своём собственном уровне, заизолировав от остальной программы.

Все вышесказанное касается FFI-биндингов к сишным библиотекам. Всё вышесказанное касается всяких уберконцепций типа STM.

Так что про «молчит», ты малость перегнул.

А вообще, меня прикалывают диванные аналитики, не написавшие ни единой строчки на хаскеле, но делающие «далеко идущие выводы». Старайся лучше.

Macil ★★★★★
()

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

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

Сам придумал что считают теоретики, сам опроверг.

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

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

А соваться куда-либо, не зная ни теории, ни практики, ни даже слова «байтстринг» - нэ нада, да!

livi
()

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

Ты не понял. «Главная программа» - грязная по определению (сигнатура IO a), но в хорошей программе занимает мало места. А большая часть - это и есть чистые небольшие блоки.

anonymous
()

Предлагаю внести в движок LOR автоматическую замену тегов «haskell», «lisp», «fp», «функциональщина» etc. на тег «срач».

Всё равно все так делают в уме, когда видят эти теги. Explicit better implicit!

Virtuos86 ★★★★★
()

Сам придумал утверждение, сам на него возразил, молодец. Зачем только на ЛОР это выносить?

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

У тебя вообще хоть один комментарий на тему хаскеля без слова байтстринг есть?

Ну, в каждой нормальной программе слово ByteString так или иначе присутствует.

Хорошо, больше не буду. Буду про array, там квирки еще круче.

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

Это жирный вброс, усиленно и нелепо маскирующийся под тонкий. Ничего особенного.

unlog1c ★★★
()

Просто «чистота» имеет в Хаскеле две очень разные, но связанные интерпретации. Поищи здесь на ЛОРе.

Давно наблюдаю у многих кашу по этому вопросу. Готов признать, что сам въехал не сразу (чертовы фанатствующие пуристы-радикалы, пишущие учебники).

Не понимаю, чего вы так прикопались к слову «чистый»? Хаскелисты его толкуют совсем в другом смысле, не в том, который вы в него обычно вкладываете ;)

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

Это удобная неформальная (!!) интерпретация для рассуждений о коде, но строго формально код с побочными эффектами может быть чистым (изучай, но если очень кратко, то выхлоп функции должен зависеть только от входных аргументов независимо ни отчего другого, ни от времени, ни от места вызова, ни от порядка вызовов, что для хаскеля означает, что все побочные эффекты должны быть явно прописаны в сигнатуре функции).

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

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

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

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

Ты чего-то сам запутался. Все гораздо проще - программы на хаскеле НЕ ВЫПОЛНЯЮТСЯ, т.к. они являются макросами. По-этому они, естественно, чистые. Что может быть грязного в генерации программного кода, когда пользователь ничего не вводит и программа ему ничего не выводит и вообще никак не использует ИО? Ничего не может.

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