LINUX.ORG.RU

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

 , ,


2

7

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


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

Клавиатура, сетевая карта и т.д. являются частью компьютера.

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

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

Это в языке эмуляция, а в реализации там и там вычисление заворачивается в замыкание, не?

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

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

Клавиатура, сетевая карта и так далее взаимодействуют с внешней средой. То есть компьютер взаимодействует с внешней средой. А МТ ни с какой внешней средой не заимодействует, она вещь в себе.

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

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

Он будет работать в 10-100 раз медленнее, если плохо реализованы санки на уровне рантайма. Хорошо или плохо они реализованы - это свойство рантайма, а не языка и с наличием дефолтной лени в языке не связано никак вообще.

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

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

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

Нет, начальное состояние ячеек на ленте задаётся извне.

Нет, не задается. Она просто есть и все.

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

Откуда в строгом языке возьмутся санки на уровне рантайма?

Оттуда же, откуда в ленивом. Это просто обычная оптимизация.

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

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

Как компьютер может это проверить? Опиши алгоритм, это доказывающий.

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

Как компьютер может это проверить?

Зачем компьютеру это проверять?

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

Начнём с того, что IO () не является State World ()
За пруфами в код GHC.

Вот определение ИО монады из ghc:

newtype IO a = IO (State# RealWorld -> (# State# RealWorld, a #))

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

А МТ ни с какой внешней средой не заимодействует, она вещь в себе.

об Канта или об Гегеля? :-)

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

Г. Гегель, признавая с точки зрения объективного диалектического идеализма её существование, критиковал идею о непознаваемости «вещи в себе» и непереходимой границе между нею и явлениями. Диалектический материализм признаёт существование вещей в себе, т. е. независимой от человеческого сознания реальности, но отвергает их непознаваемость (см. В. И. Ленин, Полн. собр. соч., 5 изд., т. 18, с. 102)

this.

А МТ ни с какой внешней средой не заимодействует, она вещь в себе.

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

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

и где-то унутре у неё там — неонка.

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

он не может это проверить, находясь унутре (рядом с неонкой). принципиально. алгоритма не существует для «мозгов в коробке».

метаалгоритмы для «абсолютного духа», Deus Ex Machina — то есть, той самой внешней среды --- могут существовать (но не обязаны).

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

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

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

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

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

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

структура может отражать функцию. а может и не отражать.

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

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

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

MT это модель. она «может» взаимодействовать с моделью «внешней среды»

Она может, если в ней прописано. В МТ не прописано. Для МТ вообще нет никакой внешней среды.

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

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

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

запрета взаимодействовать тоже не прописано. поэтому под потенциальной возможностью, потенциальной причинностью можно подразумевать всё что угодно.

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

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

Наконец-то обсуждение вышло на необходимый уровень абстракции...

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

Это с начала 60-х идет :) Прост раньше йезыки какбэ подбирались под задачу, потому функциональщики варились в своем манямирке «исследований искусственных интеллигентов» — и особо не выпендривались (ну да, обещали «вот-вот и A.I.», а он все никак, вплоть до 80-х. Потом в 90-е было «немного не до того». Потом в 2000-х у них снова ЧСВ опухло — раз с искусственным интеллектом вышел пшик, переобулись в прыжке и полезли в нишу «языков общего назначения» — начали гундеть про «глючную реализацию лиспмашины в любой достаточно сложной программе на любом другом языке», пофиг что смайлики опираются все одно на все ту же машину с побочными эффектами и состояниями, на основе которых «эмулируют» отсуствие побочных эффектов и прочие как бэ фишки :)

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

Никаокго внешнего мира в модели МТ нет, если его туда ввести - это будет другая модель. Не МТ.

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

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

да, это будет другая модель, другая система: старая МТ + специально подобранная внешная среда, внешний мир, моноид моноидов. в целом эта система будет работать как метафизический метациклический вычислитель.

и это разные «законы причинностей»: актуальной причинности (как сделано) и потенциальной (как могло бы быть).

то есть, позволяя вычислять всё то же самое что МТ (подсистема). но частично вычислять — за счёт среды, специально подобранной (управляющая метасистема и метасистемный переход).

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

Она может, если в ней прописано. В МТ не прописано.

прописано не в ней, а вокруг неё — в метафизике. композабельно.

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

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

И как ты до этого дошел? Самый что ни на есть функциональный. Если бы не вся эта периферия, город бы умер от голода. Причем _такая_ функциональная роль кормильца _всегда_ возлагалась на деревню, и не имеет смысла хорошо она справляется с задачей или нет. В конце концов и устройства I/O могут не выполнять своих функций.

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

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

Нет, это будет, сюрприз, одна модель,

другая система: старая МТ + специально подобранная внешная среда,

старая МТ не умеет взаимодействовать с внешней средой. Если научится - это будет не МТ.

то есть, позволяя вычислять всё то же самое что МТ (подсистема). но частично вычислять — за счёт среды, специально подобранной (управляющая метасистема и метасистемный переход).

Это называется «МТ с оракулом»

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

Да, обосрался я, извиняюсь. Что-то мне казалось, что внутренний State GHC несколько иначе называется. В любом случае, это не тот State, который Control.Monad.State, и у которого конструктор торчит наружу.

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

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

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

Заглянул давеча в RealWorldHaskell. Авторы называют IO-функции impure. Т.е. миф о нечистоте IO существует в самом коммьюнити, не то, что за его пределами.

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

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

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

Ты не представляешь, насколько.

Еще бы, «ничто» сложно представить, понимаю.

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

Оттуда же, откуда в ленивом.

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

Это просто обычная оптимизация.

Нет.

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

Он будет работать в 10-100 раз медленнее, если плохо реализованы санки на уровне рантайма.

Если есть санки на уровне рантайма это уже не строгий язык.

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

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

С чего бы ему быть нестрогим? Строгость языка - свойство семантики. Поддержка санок на уровне рантайма - свойство реализации.

Нет.

Что же в ней необычного? семантику языка она не меняет.

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

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

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

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

Ну так термы со строгими типами вычисляются энергично, а всякого рода Lazy[T] - через санки, оптимизированные на уровне языкового рантайма. В результате получаем строгий язык с быстрой опциональной ленью.

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

Для меня - если функции объекты первого класса

FORTRAN FTW!

aedeph_ ★★
()

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

06.11.2016

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

Вместо <бред>

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

Вот тебе Scala - words.map(_.ToLowerCase).filter(_.startsWith(«a»)).groupBy(_.length)

В данном случае на каждом шаге декларируется твой intent (намерение). Циклы - это подробно описаный способ получения нужного, ФП - это описание того, что хочешь получить. Если попрактиковаться ФП должное время, то даже человек привыкший к loops будет видеть этот код более читаемый, ведь намерения читаются очень просто. «Хочу все элементы списка сделать в нижнем регистре», «хочу оставить только те элементы, которые начинаются на a», «хочу сгрупировать их в Map по длине». Loop скорее всего бы смешал три действия в кучу. Если не смешал бы, то написал бы значительно более длинным способом и намерение пришлось бы писать в комментариях. Особенно интересно как легко воспринимают ФП подход начинающие программисты без сформированых привычек. Для них вполне естественно думать трансформациями одних данных в другие, вместо перекладывания одиночных кубиков.

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

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

Полностью согласен. Что не отменяет того факта, что

Хипстеры нашли очередную серебряную пулю, которая наконец-то позволит им писать правильный код не включая голову. <spoiler>не поможет.</spoiler>

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