История изменений
Исправление Ritmik, (текущая версия) :
Т.е. все-таки пришлось писать отдельный мап для монад?
Тебе нужно заворачивать в return начальное значение, также интересен результат fold-а.А как ты хочешь?
Я хочу, чтобы работа с побочными эффектами не была реализована через жопу и чтобы у меня всегда была функции, чтобы я мог применить всю мощь фп к ним, а не городить отдельную несовместимую вселенную _M_, а после героически пытаться все это скрестить.
То есть как предлагаешь делать в чистом языке?
Ты с умным видом влез в разговор со своими фантазиями, после чего отмазываешься фразами «как предлагаешь делать в чистом языке?». Я предлагаю, тебе в теме про лисп не заикаться про хаскель, если тебе нечего сказать по конкретно обсуждаемой теме.
А если это не нравится - хаскель вместе с чистотой сразу отправляется куда подальше.
Я это сразу понимал, а тебе сделал этот вывод на 16-й странице. Поздравляю.
Кстати, я не предлагаю отправлять хаскель с чистотой куда подальше, напротив, хаскель должен развиваться и использоваться как можно больше. Я уже писал выше по этому поводу.
(reduce (fn [res x] (println x) (+ res x)) [1 2 3])
У меня будет нормальный ответ «6», никаких заворачиваний в return, да еще и побочный эффект сработает в виде вывода на stdout значений элементов коллекции. Сможешь привести аналог на хаскеле?
Это конкретно называется Debug.Trace из base.
Т.е. ты написать аналогичный код на хаскеле сам не можешь. Так?
Чем не понятно тело foreach?
Простейший foreach ещё ничего, но просто никто на этом не останавливается - начинаются разные loop с iterate.
Не уходи от темы. Что значит «еще ничего»? Или ты к телу foreach уже претензий не имеешь и отказываешься от своих слов?
Ок. Теперь ты хочешь поговорить про loop и iterate?
http://clojuredocs.org/clojure_core/clojure.core/loop http://clojuredocs.org/clojure_core/clojure.core/iterate
Что в их телах непонятного? Или ты про коммно лисповые? А там что непонятно?
Повторю, раз не въезжаешь. ФП не обязано быть чистым, как в хаскеле, ФП не обязано быть типизированным как в хаскеле. Есть масса нечистых фп языков, в их числе и clojure, которые не используют так понятийный аппарат теории категорий. Теперь понятно, про что был мой ответ?
Так я не отрицаю, что это очень узкий взгляд на ФП, фактически, это ФП + чистота = плюшки + логические ограничения = плюшки + «матан» = плюшки.
Что за плюшки? Ты написал фигню а не равенство. Опиши словами.
persistent data structures
TVar & ко в монаде STM тоже персистентены. То есть данные нужно либо копировать, либо осилить нормальное STM для полностью мутируемых данных.
Ну не позорься так. В clojure когда я добавляю элемент в вектор (conj v :new-elem), то у меня будет уже два вектора: исходный v и новый, реюзающие все елементы, кроме добавленного. Если я изменяю значение у ключа в мапе (assoc m :key10 :new-value), то у меня будет два мапа, реюзающие все пары мапа, кроме пары с ключом :key10. Покажи мне аналог в хаскеле?
Так делать не нужно
Промолчал бы, не заметили, правда? Ты не можешь даже хоть как-то аргументировать свое «не нужно». Если у тебя в языке этого нет, то конечно оно «не нужно».
Ты не врубаешься, это то что реально нужно в функциональном языке. Самое смешное, что это реализовано в каком-то clojure, а не в чисто функциоанальном языке хаскеле. Вот это самое интересное.
смысл в атомарных комбинируемых транзакциях с семантикой суть которой непосредственно в мутации структуры данных,
Ты явно не понимаешь, для чего persistent data structure и как оно работает в clojure. Не позорься, пожалуйста, дальше. Что ты там посмотрел? Ты не понимаешь концепции работы с изменяемыми данными в виде независимых сущностей state, identity и values. Значения никогда, читай еще раз, НИКОГДА не изменяются. Это фундаментальное понимание. Меняется state у identity. Механизм управления таким изменением реализован в языке. Работа с изменяемыми данными в хаскеле как я увидел, просто примитивное громоздкое уродство по сравнению с STM clojure, не говоря, что в clojure, благодаря persistent data structure, возможна эффективная работа с иммутабельными данными.
Когда Хикки говорит, что он хочет понимать под изменением что-то вроде state monad
Грамотой владеешь? Открой мануал по refs, atoms и agents в clojure и посмотри принцип работы и примеры. Потом уже пытайся что-то сказать.
Кстати, то что persistent тормозит относительно transistent это нормально
Что там у тебя тормозит? Не мямли, а напиши конкретно с примерами.
TVar тоже будет тормозить относительно IORef, но с последним проще отстрелить себе ноги.
Ага. По мне, так лучше вообще застрелиться, чем так мучиться.
Исходная версия Ritmik, :
Т.е. все-таки пришлось писать отдельный мап для монад?
Тебе нужно заворачивать в return начальное значение, также интересен результат fold-а.А как ты хочешь?
Я хочу, чтобы работа с побочными эффектами не была реализована через жопу и чтобы у меня всегда была функции, чтобы я мог применить всю мощь фп к ним, а не городить отдельную несовместимую вселенную _M_, а после героически пытаться все это скрестить.
То есть как предлагаешь делать в чистом языке?
Ты с умным видом влез в разговор со своими фантазиями, после чего отмазываешься фразами «как предлагаешь делать в чистом языке?». Я предлагаю, тебе в теме про лисп не заикаться про хаскель, если тебе нечего сказать по конкретно обсуждаемой теме.
А если это не нравится - хаскель вместе с чистотой сразу отправляется куда подальше.
Я это сразу понимал, а тебе сделал этот вывод на 16-й странице. Поздравляю.
Кстати, я не предлагаю отправлять хаскель с чистотой куда подальше, напротив, хаскель должен развиваться и использоваться как можно больше. Я уже писал выше по этому поводу.
(reduce (fn [res x] (println x) (+ res x)) [1 2 3])
У меня будет нормальный ответ «6», никаких заворачиваний в return, да еще и побочный эффект сработает в виде вывода на stdout значений элементов коллекции. Сможешь привести аналог на хаскеле?
Это конкретно называется Debug.Trace из base.
Т.е. ты написать аналогичный код на хаскеле сам не можешь. Так?
Чем не понятно тело foreach?
Простейший foreach ещё ничего, но просто никто на этом не останавливается - начинаются разные loop с iterate.
Не уходи от темы. Что значит «еще ничего»? Или ты к телу foreach уже претензий не имеешь и отказываешься от своих слов?
Ок. Теперь ты хочешь поговорить про loop и iterate?
http://clojuredocs.org/clojure_core/clojure.core/loop http://clojuredocs.org/clojure_core/clojure.core/iterate
Что в их телах непонятного? Или ты про коммно лисповые? А там что непонятно?
Повторю, раз не въезжаешь. ФП не обязано быть чистым, как в хаскеле, ФП не обязано быть типизированным как в хаскеле. Есть масса нечистых фп языков, в их числе и clojure, которые не используют так понятийный аппарат теории категорий. Теперь понятно, про что был мой ответ?
Так я не отрицаю, что это очень узкий взгляд на ФП, фактически, это ФП + чистота = плюшки + логические ограничения = плюшки + «матан» = плюшки.
Что за плюшки? Ты написал фигню а не равенство. Опиши словами.
persistent data structures
TVar & ко в монаде STM тоже персистентены. То есть данные нужно либо копировать, либо осилить нормальное STM для полностью мутируемых данных.
Ну не позорься так. В clojure когда я добавляю элемент в вектор (conj v :new-elem), то у меня будет уже два вектора: исходный v и новый, реюзающие все елементы, кроме добавленного. Если я изменяю значение у ключа в мапе (assoc m :key10 :new-value), то у меня будет два мапа, реюзающие все пары мапа, кроме пары с ключом :key10. Покажи мне аналог в хаскеле?
Так делать не нужно
Промолчал бы, не заметили, правда? Ты не можешь даже хоть как-то аргументировать свое «не нужно». Если у тебя в языке этого нет, то конечно оно «не нужно».
Ты не врубаешься, это то что реально нужно в функциональном языке. Самое смешное, что это реализовано в каком-то clojure, а не в чисто функциоанальном языке хаскеле. Вот это самое интересное.
смысл в атомарных комбинируемых транзакциях с семантикой суть которой непосредственно в мутации структуры данных,
Ты явно не понимаешь, для чего persistent data structure и как оно работает в clojure. Не позорься, пожалуйста, дальше. Что ты там посмотрел? Ты не понимаешь концепции работы с изменяемыми данными в виде независимых сущностей state, identity и values. Значения никогда, читай еще раз, НИКОГДА не изменяются. Это фундаментальное понимание. Меняется state у identity. Механизм управления таким изменением реализован в языке. Работа с изменяемыми данными в хаскеле как я увидел, просто примитивное громоздкое уродство по сравнению с STM clojure, не говоря, что в clojure, благодаря persistent data structure, возможна эффективная работа с иммутабельными данными.
Когда Хикки говорит, что он хочет понимать под изменением что-то вроде state monad
Грамотой владеешь? Открой мануал по refs, atoms и agents в clojure и посмотри принцип работы и примеры. Потом уже пытайся что-то сказать.
Кстати, то что persistent тормозит относительно transistent это нормально
Что там у тебя тормозит? Не мямли, а напиши конкретно с примерами.
TVar тоже будет тормозить относительно IORef, но с последним проще отстрелить себе ноги.
Ага. По мне, так лучше вообще застрелиться, чем там мучиться.