LINUX.ORG.RU

Функциональная парадигма

 , ,


2

7

Что-то в последнее время начали хайпить функциональное программирование. Мол, стиль со взглядом в будущее, распараллеливание, оптимизация, замена устаревшему ООП, который не способен идти в ногу с современными процессорами. Есть ли здесь люди, которые пишут на Haskell или тому подобных языках? Есть ли профит переходить на ФП? Или мультипарадигмость С++ и Java исправят ситуацию?


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

Это лишь попытки его изобразить, этим никто пользоваться в здравом уме не будет. Хотя возможно тот же mach даст наработки для внедрения нормального паттерн-матчинга в C++2x, но не больше.

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

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

Могут быть, могут не быть. Я тебе больше скажу, если джаву специально не оптимизировать, она может быть в 5 раз медленней C. Что теперь делать. Будет у тебя цикл не 2 микросекунды работать, а 10 микросекунд. Если будут реальные проблемы с производительностью — вернёшься и перепишешь. Но скорее всего проблемы будут не из-за этого.

Legioner ★★★★★
()

Или мультипарадигмость С++ и Java исправят ситуацию?

Мультипарадигменность неполноценна.

Например, в ФП большую роль играет ленивость. В основе лежат thunks. В хаскеле они оптимизированы, а в языках типа Scala и F# приходится прибегать к костылям типа Lazy<T>, которые в этих «мультипарадгименных» языках реализуются через использование блокировок, что совсем нехорошо для этих языков.

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

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

Про то что Haskel меняет мир — это всё сказки для детишек, реально речь идёт о том, что вводится некоторый объект (с реальным миром он никак не связан и даже называться может не «мир», а как-нибудь ещё) c единственным предназначением — ввести искусственную зависимость по данным для цепочки функций (которые собственно производят IO), чтобы эти функции вызвались в правильном порядке (и вообще вызвались — у Haskell как раз с этим проблема в силу его ленивости, а вовсе не чистоты).

Реальная проблема с IO в Haskell это не чистота, а ленивость. В любом языке IO является внешней сущностью по отношению к абстрактной машине этого языка. При его реализации обычно поступают так: вешают на некоторые сущности («функции») из абстрактного языка IO-действия, но при этом эти функции должны обрабатываться абстрактной машиной языка как обычные до тех пор пока не произойдёт их реальный вызов. Когда говорят, что в Haskell чистый IO — это всего лишь означает, что его удалось добавить туда без изменения чистой и ленивой абстрактной машины (но сами примитивы, который собственно и делают IO никуда не делись, просто удалось сделать так, чтобы абстрактная машина Haskell работала с ними так, как если бы это были обычные функции, но при этом получался ожидаемый эффект от IO).

А модель «Haskell меняет мир» — идиотская. Если две Haskell программы одновременно работают с одним и тем же диском то какая из них меняет мир?

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

это всего лишь означает, что его удалось добавить туда без изменения чистой и ленивой абстрактной машины (но сами примитивы, который собственно и делают IO никуда не делись

Спасибо, Кэп! Как же вы не написали еще, что хаскель-кот компилируется в строгие императивные ассемблерные инструкции и поэтому все это сказки для детишек? На этом форуме каждый первый мнит себя знатоком а остальных идиотами, но это особенности национального (Лоровского) менталитета. Мне семантики чистой ленивой абстрактной машины вполне достаточно для понимания концепций языка. А как там реализовано ИО под ее капотом - пофигу.

А модель «Haskell меняет мир» — идиотская. Если две Haskell программы одновременно работают с одним и тем же диском то какая из них меняет мир?

А модель - хаскель меняет список - идиотская. Если одна функция консит в голову 1 а другая 2 - какая из них меняет список?

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

лямбда исчисление тьюринг-полно

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

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

В рамках этих моделей честный рандом конечно не выразить. Модель замкнута в себе и не имеет внешний мир в своем составе.

Машина Тьюринга имеет ленту, начальное состояние ячеек которой задаётся извне.

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

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

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

Если Вы хотите сказать, что рандом — это не часть языка, а часть API, которое запрашивается языком извне, по-ходу выполнения, то это ничего не меняет. МТ и LC не умеют в интерактивность

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

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

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

Может хватит уже?

Да, я тоже думаю, что мне пора прекращать спорить с неадекватами, верующими в то, что монады делают Haskell не чистым.

И вообще я не тебе писал, лол.

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

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

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

ГПСПЧ это в контексте данного обсуждения не труЪ, остается чтение из внешнего источника. Для включения интерактивности на МТ можно расширить модель как последовательность программ и соответственно лент, в ЛС то же самое - представлять программу как лямбда абстракцию, выполнение которой состоит в редукции ее аппликации к входным данным (пресловутый «внешний мир» - аналог ленты) и построить такую же интерактивную цепочку - хоть через монаду, хоть через другие абстракции. Тут важно не что такое «внешний мир», а что такое программа - атомарный блок вычислений или последовательность таких блоков, запрашивающая результат вычисления предыдущего и внешний мир.

Ivana
()

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

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

А модель - хаскель меняет список - идиотская. Если одна функция консит в голову 1 а другая 2 - какая из них меняет список?

Ещё раз. У меня есть реальное устройство. Там одновременно работают 2 программы на Haskell и читают/пишут в один и тот же файл. Я хочу иметь матмодель для этого. Пока программа одна я могу считать, что пока я не сделал write файл не меняется, поэтому я могу ввести понятие внешнего мира, в данном случае это файл, в результате write получается новый файл (новый мир), программа на Haskell трансформирует мир. Теперь программы две. Поэтому мир может трансформироваться независимо от первой программы (и её абстрактной машины). Так что нет никакого смысла называть то спецзначение, которое протаскивается через read/write миром. Единственное его назначение — упорядочение и реальное выполнение IO-операций.

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

Для включения интерактивности на МТ можно расширить модель как последовательность программ и соответственно лент,

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

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

Есть - A Тут - B TS: A^B == True? hateyoufeel: A^B == False, т.к. B == False anon: A^B == False, т.к. A == False и B == False

anonymous
()

Когда срутся про чистоту ввода-вывода в haskell, мне всегда вспоминается http://esolangs.org/wiki/QFL — забавный чисто функциональный эзоланг с IO. Несмотря на то, что модель IO там совсем другая (и скорее всего шуточная), она, мне кажется, помогает прочувствовать семантику IO монады в том числе.

TL;DR: в QFL монад как таковых нет, и RealWorld никак прячется от программиста — вместо этого он прячется от наблюдателя, запускающего программу. В итоге программа может оказаться в «квантовой суперпозиции» с несколькими RealWorld, при этом любая попытка посмотреть на вывод программы эту суперпозицию разрушает.

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

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

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

Они были довольно кривы. Mercury был более продвинут, но семантически Uniqueness types — это необоснованный костыль. ST монада, имхо, вариация на эту тему, но куда изящнее.

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

В итоге программа может оказаться в «квантовой суперпозиции» с несколькими RealWorld

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

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

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

Да, и еще. Закатайте губы, уважаемые фапэ-дрочеры, модель лямбда калькулюс полностью, на все 100% детерминированная модель, относящаяся к наиболее распространенному классу вычислителей «global state machine». Любые попытки притянуть сюда за уши квантовую механику выхлядяд смешно и нелепо

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

Закатайте губы, уважаемые фапэ-дрочеры, модель лямбда калькулюс полностью, на все 100% детерминированная модель

До чего у тебя деревянная башка.

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

слушай, если ты хочешь пообщаться — нафига огораживать вот этот тред от анонимусов?

так что скажу сюда.

Наш интерпретатор исходит из контекста.

да, контекст так или иначе присутствует — явно или неявно. читай «let over lambda», например.

Думал, как можно было бы в теории решить эту проблему.

не понял, в чём проблема. вообще, если бы ТС в этом топике чётко, тезисно сформулировал сам вопрос, было бы легче общаться.

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

вот в Interactive Fiction платформах, например Inform 7 (тоже хабр)на «почти» естественном языке есть следующая структура:

* парсер, который разбирает от «командной строки» игры ввод пользователя в виде членов предложения (подлежащее, сказуемое, предлоги/связки)

* модель мира для символических вычислений.

* rule book, то есть: аналог стандартной библиотеки в обычных, более мейнстримных ЯП.

* правила из rule book + расширяемые программистом. более похожи на комбинаторы методов из метаобъектного протокола лиспа.

пример игры: каноничный Zork — пощёлкай по разделам, главам.

это — программирование на ЕЯ (естественном языке). ну, почти естественном (типа simple english, gellish english, controlled natural language).

см. также сам Inform 7: wikibooks 2 onlamp

сайт Inform 7 обучающие видео

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

be NPC

стать NPC

также: пролог-подобный язык планирования; запуск внешних программ через пайпы (например, движок к GNU chess); и т.п.

см. также ifarchive/games/source/inform или вообще весь ifarchive.org

в общем, сформулируй свой вопрос.

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

модель лямбда калькулюс полностью, на все 100% детерминированная модель

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

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

а про твои контексты из того потика так скажу: прочитай уже наконец «let over lambda» про выстраивание таких контекстов; про пространства имён (CL: 2-lisp, Scheme: 1-lisp, и т.п. прочие, например, ISO ISLISP: n-lisp); про фекспры — например макросы в newlisp или целиком kernel/vau expressions; про комбинаторы в typed lambda expresions, грани лямбда куба, вот это вот всё.

что сказать-то хотел тем топиком? в чём основная мысль: кратко, ёмко, тезисно?

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

Объясняю аналогию для людей с проблемами восприятия текста и анонiмусам:

Допустим для простоты, что количество символов, которое может вывести прогамма, ограничено сверху n. Тогда есть базис из \sum_{i=0}^n{m^i} возможных значений RealWorld. По ходу выполнения программы вероятность обнаружить тот или иной вывод программы меняется, и распределение в общем случае не вырожденное, отсюда суперпозиция.

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

это уже какая-то техномагия. про управление вероятностями в суперпозиции.

Константин Муравьёв, «Неучтённый» (ЕВА такая ева):

= Модели готовы. Разработано всего три варианта. На текущем этапе развития способностей и возможностей пользователя невозможно добиться выполнения этой задачи в области низкоприоритетной зоны.

= Первая модель (желтая зона). Вероятность успешного выполнения 24,7 %.Вероятность потери базы 75,3 %. Длительной процедуры — два часа.

= Вторая модель (оранжевая зона). Вероятность успешного выполнения 37 %. Вероятность потери базы 63 %. Длительной процедуры — сорок минут.

= Первая модель (красная зона). Вероятность успешного выполнения 74 %.Вероятность потери базы 26 %. Длительной процедуры — девять минут.

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

теория магии

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

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

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

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

среди них есть инварианты, но есть и элементы произвола.

и там-то вся магия и происходит, вот оно как.

anonymous
()
Ответ на: теория магии от anonymous

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

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

Пример покажешь, как ты на жаве hot reload сделаешь?

Это делают Eclipse, Idea, NetBeans на живом коде, который ты пишешь в редакторе, чтобы обеспечить автодополнение кода и отладочный режим с оперативной заменой значений полей и результата возвращаемого методами.

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