Допустим, нам надо произвести некое относительно простую "агрегирующую" операцию над списком. С одной стороны, специально для этого есть функции fold*. С другой стороны — можно просто реализовать рекурсивную функцию. Но как лучше поступить? Есть ли какие-либо подводные камни? Не считается ли моветоном неиспользование fold* там, где его логично использовать?
Чтобы не быть голословным — вот пример. Пусть у нас стоит такая задача (взята из викикнижки по хаскелю):
Implement a function sequenceIO :: [IO a] -> IO [a]. Given a list of actions, this function runs each of the actions in order and returns all their results as a list.
Авторы предлагают такое решение — без fold
sequenceIO :: [IO a] -> IO [a]
sequenceIO [] = return []
sequenceIO (a:as) = do {v <-a ; vs <- (sequenceIO as) ; return (v : vs)}
То же самое можно сделать, допустим с foldr (т.к., насколько я понимаю, здесь возможны ленивые вычисления, поправьте, если это не так)
Строчек (и букв) меньше (в полтора раза ). И вроде чуть более читабельно.
Вот мои мысли. Есть такой паттерн — "агрегирующая функция" (не знаю, как правильно назвать). И fold* — "хелперы" для этого паттерна. Они, может, не всегда полезны для самого разработчика, но код читать помогают (собственно, это ко многим подобным функциям относится: scan*, map и т.п.).
MC> Не считается ли моветоном неиспользование fold* там, где его логично использовать?
Вроде как считается. Есть мнение, что явная рекурсия — это как goto: использовать можно, но лучше выделить некие общие паттерны и использовать их (катаморфизмы, анаморфизмы етц).
Здравствуйте, Mr.Cat, Вы писали:
MC>Допустим, нам надо произвести некое относительно простую "агрегирующую" операцию над списком. С одной стороны, специально для этого есть функции fold*. С другой стороны — можно просто реализовать рекурсивную функцию. Но как лучше поступить? Есть ли какие-либо подводные камни? Не считается ли моветоном неиспользование fold* там, где его логично использовать?
Лучше использовать. Повышение уровня абстракции и всё такое...
MC>То же самое можно сделать, допустим с foldr (т.к., насколько я понимаю, здесь возможны ленивые вычисления, поправьте, если это не так) MC>
Здравствуйте, lomeo, Вы писали:
L>Здравствуйте, Mr.Cat, Вы писали:
MC>>Допустим, нам надо произвести некое относительно простую "агрегирующую" операцию над списком. С одной стороны, специально для этого есть функции fold*. С другой стороны — можно просто реализовать рекурсивную функцию. Но как лучше поступить? Есть ли какие-либо подводные камни? Не считается ли моветоном неиспользование fold* там, где его логично использовать?
L>Лучше использовать. Повышение уровня абстракции и всё такое...
Ага, только вопрос — не аукнется ли потом это "повышение уровня"?
(возвращаясь к нашему обсуждению стандарту программирования, у thesz вроде)
Вопрос: если развернуть вот это приведённое ниже в такую, чтоб стало понятно, ну не знаю, какому-нибудь "среднему программисту", то сколько по объёму выйдет?
L>Лямбда внутри foldr сокращается до liftM2 (
L>
Здравствуйте, Курилка, Вы писали:
К>Здравствуйте, lomeo, Вы писали:
К>Ага, только вопрос — не аукнется ли потом это "повышение уровня"? К>(возвращаясь к нашему обсуждению стандарту программирования, у thesz вроде) К>Вопрос: если развернуть вот это приведённое ниже в такую, чтоб стало понятно, ну не знаю, какому-нибудь "среднему программисту", то сколько по объёму выйдет?
liftM2 — стандартный монадический комбинатор. Их там, в Control.Monad всего ничего, меньше чем у списков. A tour of the Haskell Monad functions
L>>Лямбда внутри foldr сокращается до liftM2 (
L>>
Здравствуйте, deniok, Вы писали:
D>liftM2 — стандартный монадический комбинатор. Их там, в Control.Monad всего ничего, меньше чем у списков. D>A tour of the Haskell Monad functions
Хинт: объясни про это лидеру топа рсдн (без намёков на наезд на Влада).
Я ведь не говорю, что понять это можно, вопрос скорей в том уровне абстракции, когда краткость достаточна для понимания. Плюс это дело зависит от уровня владения этими абстракциями тем, кому их нужно понимать.
Про некоторую сложность набора индусов на разработку мегапрограмм на хаскеле, думаю, даже упоминать будет перебором
Здравствуйте, Курилка, Вы писали:
К>Ага, только вопрос — не аукнется ли потом это "повышение уровня"? К>(возвращаясь к нашему обсуждению стандарту программирования, у thesz вроде) К>Вопрос: если развернуть вот это приведённое ниже в такую, чтоб стало понятно, ну не знаю, какому-нибудь "среднему программисту", то сколько по объёму выйдет?
L>>Лямбда внутри foldr сокращается до liftM2 (
L>>
Здравствуйте, Курилка, Вы писали:
К>Хинт: объясни про это лидеру топа рсдн (без намёков на наезд на Влада). К>Я ведь не говорю, что понять это можно, вопрос скорей в том уровне абстракции, когда краткость достаточна для понимания. Плюс это дело зависит от уровня владения этими абстракциями тем, кому их нужно понимать. К>Про некоторую сложность набора индусов на разработку мегапрограмм на хаскеле, думаю, даже упоминать будет перебором
Эти абстракции — суть набор инструментов для программирования конкретно на Хаскеле. В других языках они не нужны и поэтому не понятно, к чему эти рассуждения.
Здравствуйте, Quintanar, Вы писали:
Q>Здравствуйте, Курилка, Вы писали:
К>>Хинт: объясни про это лидеру топа рсдн (без намёков на наезд на Влада). К>>Я ведь не говорю, что понять это можно, вопрос скорей в том уровне абстракции, когда краткость достаточна для понимания. Плюс это дело зависит от уровня владения этими абстракциями тем, кому их нужно понимать. К>>Про некоторую сложность набора индусов на разработку мегапрограмм на хаскеле, думаю, даже упоминать будет перебором
Q>Эти абстракции — суть набор инструментов для программирования конкретно на Хаскеле. В других языках они не нужны и поэтому не понятно, к чему эти рассуждения.
Хинт: обсуждается в данный момент программирование на Хаскеле.
Здравствуйте, Quintanar, Вы писали: Q>Эти абстракции — суть набор инструментов для программирования конкретно на Хаскеле. В других языках они не нужны и поэтому не понятно, к чему эти рассуждения.
Если liftM2 еще можно приписать к "конкретно Хаскелю", то fold — это катаморфизм (поправьте, если вру) — не такая уж ненужная вещь, как кажется на первый взгляд. По крайней мере, она заслуживает отнесения к уровням абстракции.
Здравствуйте, Mr.Cat, Вы писали:
MC>Здравствуйте, Quintanar, Вы писали: Q>>Эти абстракции — суть набор инструментов для программирования конкретно на Хаскеле. В других языках они не нужны и поэтому не понятно, к чему эти рассуждения.
MC>Если liftM2 еще можно приписать к "конкретно Хаскелю", то fold — это катаморфизм (поправьте, если вру) — не такая уж ненужная вещь, как кажется на первый взгляд. По крайней мере, она заслуживает отнесения к уровням абстракции.
Кстати, вот интересная, на мой взгляд, точка зрения, что паттерн визитор по сути тоже есть fold, правда завуалированный в C++ (думаю, тут можно подставить и не только C++)
И монады (и liftM2) по-моему не являются прерогативой ленивых языков, хотя в Хаскеле, конечно, являются очень употребительной абстракцией (паттерном?).
Здравствуйте, Mr.Cat, Вы писали:
MC>Здравствуйте, Quintanar, Вы писали: Q>>Эти абстракции — суть набор инструментов для программирования конкретно на Хаскеле. В других языках они не нужны и поэтому не понятно, к чему эти рассуждения.
MC>Если liftM2 еще можно приписать к "конкретно Хаскелю",
liftM2 — это просто другое название для map, чтобы не путать. Вообще, подымание скалярной функции до уровня контейнера- это такая общая абстракция, что даже в С++ есть.
Забавно, я сейчас ковыряюсь с Flapjax (библиотека FRP для веба, написанная на javascript). Поскольку там несколько разработчиков — они никак не могут договорится о том, как называть свой набор абстракций, поэтому название каждого важного комбинатора у них имеет по несколько алиасов, например алиасами lift_e(lift для events любой арности)являются: map_e, transform, transform_e apply_e, а lift1_e называется map_ev.
Что касается монад вообще, то Одерски в Скале поступает наиболее разумно: он вообще избегает этого слова, do-notation он переименовал в for-comprehension, непонятный bind в flatMap, непонятный mzero в filter, а return в yield. В тьюториалах пишут, что это просто крутой "for", намного круче того, что в яве
Здравствуйте, z00n, Вы писали:
Z>Что касается монад вообще, то Одерски в Скале поступает наиболее разумно: он вообще избегает этого слова, do-notation он переименовал в for-comprehension, непонятный bind в flatMap, непонятный mzero в filter, а return в yield. В тьюториалах пишут, что это просто крутой "for", намного круче того, что в яве
Курилка,
Z>>Что касается монад вообще, то Одерски в Скале поступает наиболее разумно: он вообще избегает этого слова, do-notation он переименовал в for-comprehension, непонятный bind в flatMap, непонятный mzero в filter, а return в yield. В тьюториалах пишут, что это просто крутой "for", намного круче того, что в яве
К>warm fuzzy thing
А!, ты тоже помнишь то сообщение Ульфа Вигера? (когда он говорил, что чуть ли не основная проблема монад в их нехорошем названии)
Здравствуйте, Lazy Cjow Rhrr, Вы писали:
LCR>Курилка,
Z>>>Что касается монад вообще, то Одерски в Скале поступает наиболее разумно: он вообще избегает этого слова, do-notation он переименовал в for-comprehension, непонятный bind в flatMap, непонятный mzero в filter, а return в yield. В тьюториалах пишут, что это просто крутой "for", намного круче того, что в яве
К>>warm fuzzy thing
LCR>А!, ты тоже помнишь то сообщение Ульфа Вигера? (когда он говорил, что чуть ли не основная проблема монад в их нехорошем названии)
Ульф по ходу его у SPJ подхватил, по меньшей мере gmane мне даёт его пост, где он ссылается на SPJ
Как-то вот странно, что о монадах в Эрланге я вообще до сих пор не думал
Здравствуйте, Lazy Cjow Rhrr, Вы писали:
LCR>Курилка,
К>>warm fuzzy thing
LCR>А!, ты тоже помнишь то сообщение Ульфа Вигера? (когда он говорил, что чуть ли не основная проблема монад в их нехорошем названии)
А помнить я его не могу, т.к. в омут Эрланга меня затянуло примерно летом 2006-го (в смысле на мейллист тогда подписался)
Здравствуйте, Курилка, Вы писали:
К>Ага, только вопрос — не аукнется ли потом это "повышение уровня"? К>(возвращаясь к нашему обсуждению стандарту программирования, у thesz вроде) К>Вопрос: если развернуть вот это приведённое ниже в такую, чтоб стало понятно, ну не знаю, какому-нибудь "среднему программисту", то сколько по объёму выйдет?
До какого уровня разврачивать? Этот вопрос изморфен, как ты любишь говорить , вопросу о том, что такое средний программист.
Здравствуйте, lomeo, Вы писали:
L>Здравствуйте, Курилка, Вы писали:
К>>Ага, только вопрос — не аукнется ли потом это "повышение уровня"? К>>(возвращаясь к нашему обсуждению стандарту программирования, у thesz вроде) К>>Вопрос: если развернуть вот это приведённое ниже в такую, чтоб стало понятно, ну не знаю, какому-нибудь "среднему программисту", то сколько по объёму выйдет?
L>До какого уровня разврачивать? Этот вопрос изморфен, как ты любишь говорить , вопросу о том, что такое средний программист.
L>
Дак о том и речь, что где обнаружится "предельная планка" повышения абстракций — хз.
Скажем вот я вроде как минимум на среднего вроде "канаю", а зачастую тоже "затыки" вылезают, к сожалению, не очень большая часть народа приближаются к уровням SPJ, вадлера или пирса. Ну и тут решает бизнес скорее кого нанимать: толпу индусов по 500 баксов или "гуру" за 5000 (цифры почти с потолка).
Кстати, вспоминается вопрос: а есть ли серьёзные проекты (и комманды) на Хаскеле кроме GHC? Такие, чтоб пары человек не хватало, а был хотяб десяток?
Здравствуйте, Курилка, Вы писали:
К>Дак о том и речь, что где обнаружится "предельная планка" повышения абстракций — хз. К>Скажем вот я вроде как минимум на среднего вроде "канаю", а зачастую тоже "затыки" вылезают, к сожалению, не очень большая часть народа приближаются к уровням SPJ, вадлера или пирса. Ну и тут решает бизнес скорее кого нанимать: толпу индусов по 500 баксов или "гуру" за 5000 (цифры почти с потолка). К>Кстати, вспоминается вопрос: а есть ли серьёзные проекты (и комманды) на Хаскеле кроме GHC? Такие, чтоб пары человек не хватало, а был хотяб десяток?
Я не знаю.
Вообще меня в изучении Хаскеля интересует больше вопрос моего образования. Вопросы, связанные с тем, кого нанимать передо мной не стоят: я и сам то работаю на Яве
С этой точки зрения ответ на вопрос "где планка" такой — для того, чтобы понимать некоторые механизмы и уметь с ними обращаться легко и непринуждённо (т.е. чтобы они приносили пользу), нужно поднимать уровень своего образования. Если среднему программисту что-то непонятно, я постараюсь объяснить и/или дать ссылки на информацию.
Здравствуйте, Mr.Cat, Вы писали:
MC>Если liftM2 еще можно приписать к "конкретно Хаскелю", то fold — это катаморфизм (поправьте, если вру) — не такая уж ненужная вещь, как кажется на первый взгляд. По крайней мере, она заслуживает отнесения к уровням абстракции.
Я имел в виду монадный мусор. Фолд — универсальная концепция.
Курилка,
К>Ульф по ходу его у SPJ подхватил, по меньшей мере gmane мне даёт его пост, где он ссылается на SPJ
Ага, именно это сообщение
К>Как-то вот странно, что о монадах в Эрланге я вообще до сих пор не думал
А зачем думать?
Здравствуйте, Lazy Cjow Rhrr, Вы писали:
LCR>А!, ты тоже помнишь то сообщение Ульфа Вигера? (когда он говорил, что чуть ли не основная проблема монад в их нехорошем названии)
Ну конечно. Для индусского программиста слово "монада" ассоциируется с философией Лейбница, которую вышеозначенный программист, являясь, разумеется, эмпиристом старой британской школы, привык подвергать уничтожающей критике.
... << RSDN@Home 1.2.0 alpha rev. 774>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Здравствуйте, Klapaucius, Вы писали:
K>Ну конечно. Для индусского программиста слово "монада" ассоциируется с философией Лейбница, которую вышеозначенный программист, являясь, разумеется, эмпиристом старой британской школы, привык подвергать уничтожающей критике.
Да и для нас, православных, "Бог Един и вне Единого и превыше самой Монады".
Здравствуйте, lomeo, Вы писали:
L>Здравствуйте, z00n, Вы писали:
Z>>liftM2 — это просто другое название для map, чтобы не путать.
L>С liftM не путаешь?
Нет С точки зрения абстракций это одна фигня.