[Haskell]fold vs. не fold
От: Mr.Cat  
Дата: 01.02.08 22:40
Оценка:
Допустим, нам надо произвести некое относительно простую "агрегирующую" операцию над списком. С одной стороны, специально для этого есть функции 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 (т.к., насколько я понимаю, здесь возможны ленивые вычисления, поправьте, если это не так)
sequenceIO :: [IO a] -> IO [a]
sequenceIO = foldr (\io acc -> do {x<-io; xs<-acc; return (x:xs) }) (return [])

Строчек (и букв) меньше (в полтора раза ). И вроде чуть более читабельно.

Вот мои мысли. Есть такой паттерн — "агрегирующая функция" (не знаю, как правильно назвать). И fold* — "хелперы" для этого паттерна. Они, может, не всегда полезны для самого разработчика, но код читать помогают (собственно, это ко многим подобным функциям относится: scan*, map и т.п.).

PS: Или мне просто пора немного отдохнуть?
Re: [Haskell]fold vs. не fold
От: Аноним  
Дата: 02.02.08 00:50
Оценка: +1
MC> Не считается ли моветоном неиспользование fold* там, где его логично использовать?

Вроде как считается. Есть мнение, что явная рекурсия — это как goto: использовать можно, но лучше выделить некие общие паттерны и использовать их (катаморфизмы, анаморфизмы етц).
Re: [Haskell]fold vs. не fold
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 02.02.08 11:27
Оценка: 61 (3) +1
Здравствуйте, Mr.Cat, Вы писали:

MC>Допустим, нам надо произвести некое относительно простую "агрегирующую" операцию над списком. С одной стороны, специально для этого есть функции fold*. С другой стороны — можно просто реализовать рекурсивную функцию. Но как лучше поступить? Есть ли какие-либо подводные камни? Не считается ли моветоном неиспользование fold* там, где его логично использовать?


Лучше использовать. Повышение уровня абстракции и всё такое...

MC>То же самое можно сделать, допустим с foldr (т.к., насколько я понимаю, здесь возможны ленивые вычисления, поправьте, если это не так)

MC>
MC>sequenceIO :: [IO a] -> IO [a]
MC>sequenceIO = foldr (\io acc -> do {x<-io; xs<-acc; return (x:xs) }) (return [])
MC>

MC>Строчек (и букв) меньше (в полтора раза ). И вроде чуть более читабельно.

Лямбда внутри foldr сокращается до liftM2 (

sequenceIO = foldr (liftM2 (:)) (return [])


MC>PS: Или мне просто пора немного отдохнуть?


Это по желанию
Re[2]: [Haskell]fold vs. не fold
От: Курилка Россия http://kirya.narod.ru/
Дата: 02.02.08 12:02
Оценка: +1
Здравствуйте, lomeo, Вы писали:

L>Здравствуйте, Mr.Cat, Вы писали:


MC>>Допустим, нам надо произвести некое относительно простую "агрегирующую" операцию над списком. С одной стороны, специально для этого есть функции fold*. С другой стороны — можно просто реализовать рекурсивную функцию. Но как лучше поступить? Есть ли какие-либо подводные камни? Не считается ли моветоном неиспользование fold* там, где его логично использовать?


L>Лучше использовать. Повышение уровня абстракции и всё такое...


Ага, только вопрос — не аукнется ли потом это "повышение уровня"?
(возвращаясь к нашему обсуждению стандарту программирования, у thesz вроде)
Вопрос: если развернуть вот это приведённое ниже в такую, чтоб стало понятно, ну не знаю, какому-нибудь "среднему программисту", то сколько по объёму выйдет?

L>Лямбда внутри foldr сокращается до liftM2 (


L>
L>sequenceIO = foldr (liftM2 (:)) (return [])
L>
Re[3]: [Haskell]fold vs. не fold
От: deniok Россия  
Дата: 02.02.08 12:28
Оценка:
Здравствуйте, Курилка, Вы писали:

К>Здравствуйте, lomeo, Вы писали:




К>Ага, только вопрос — не аукнется ли потом это "повышение уровня"?

К>(возвращаясь к нашему обсуждению стандарту программирования, у thesz вроде)
К>Вопрос: если развернуть вот это приведённое ниже в такую, чтоб стало понятно, ну не знаю, какому-нибудь "среднему программисту", то сколько по объёму выйдет?

liftM2 — стандартный монадический комбинатор. Их там, в Control.Monad всего ничего, меньше чем у списков.
A tour of the Haskell Monad functions

L>>Лямбда внутри foldr сокращается до liftM2 (


L>>
L>>sequenceIO = foldr (liftM2 (:)) (return [])
L>>
Re[4]: [Haskell]fold vs. не fold
От: Курилка Россия http://kirya.narod.ru/
Дата: 02.02.08 12:42
Оценка:
Здравствуйте, deniok, Вы писали:

D>liftM2 — стандартный монадический комбинатор. Их там, в Control.Monad всего ничего, меньше чем у списков.

D>A tour of the Haskell Monad functions

Хинт: объясни про это лидеру топа рсдн (без намёков на наезд на Влада).
Я ведь не говорю, что понять это можно, вопрос скорей в том уровне абстракции, когда краткость достаточна для понимания. Плюс это дело зависит от уровня владения этими абстракциями тем, кому их нужно понимать.
Про некоторую сложность набора индусов на разработку мегапрограмм на хаскеле, думаю, даже упоминать будет перебором
Re[3]: [Haskell]fold vs. не fold
От: Quintanar Россия  
Дата: 03.02.08 09:52
Оценка:
Здравствуйте, Курилка, Вы писали:

К>Ага, только вопрос — не аукнется ли потом это "повышение уровня"?

К>(возвращаясь к нашему обсуждению стандарту программирования, у thesz вроде)
К>Вопрос: если развернуть вот это приведённое ниже в такую, чтоб стало понятно, ну не знаю, какому-нибудь "среднему программисту", то сколько по объёму выйдет?

L>>Лямбда внутри foldr сокращается до liftM2 (


L>>
L>>sequenceIO = foldr (liftM2 (:)) (return [])
L>>


А это не повышение уровня. Это обход гемороя, связанного с ленивостью Хаскеля. Поэтому у среднего программиста код только сократится.
Re[5]: [Haskell]fold vs. не fold
От: Quintanar Россия  
Дата: 03.02.08 09:55
Оценка:
Здравствуйте, Курилка, Вы писали:

К>Хинт: объясни про это лидеру топа рсдн (без намёков на наезд на Влада).

К>Я ведь не говорю, что понять это можно, вопрос скорей в том уровне абстракции, когда краткость достаточна для понимания. Плюс это дело зависит от уровня владения этими абстракциями тем, кому их нужно понимать.
К>Про некоторую сложность набора индусов на разработку мегапрограмм на хаскеле, думаю, даже упоминать будет перебором

Эти абстракции — суть набор инструментов для программирования конкретно на Хаскеле. В других языках они не нужны и поэтому не понятно, к чему эти рассуждения.
Re[6]: [Haskell]fold vs. не fold
От: Курилка Россия http://kirya.narod.ru/
Дата: 03.02.08 10:02
Оценка:
Здравствуйте, Quintanar, Вы писали:

Q>Здравствуйте, Курилка, Вы писали:


К>>Хинт: объясни про это лидеру топа рсдн (без намёков на наезд на Влада).

К>>Я ведь не говорю, что понять это можно, вопрос скорей в том уровне абстракции, когда краткость достаточна для понимания. Плюс это дело зависит от уровня владения этими абстракциями тем, кому их нужно понимать.
К>>Про некоторую сложность набора индусов на разработку мегапрограмм на хаскеле, думаю, даже упоминать будет перебором

Q>Эти абстракции — суть набор инструментов для программирования конкретно на Хаскеле. В других языках они не нужны и поэтому не понятно, к чему эти рассуждения.


Хинт: обсуждается в данный момент программирование на Хаскеле.
Re[6]: [Haskell]fold vs. не fold
От: Mr.Cat  
Дата: 03.02.08 13:00
Оценка:
Здравствуйте, Quintanar, Вы писали:
Q>Эти абстракции — суть набор инструментов для программирования конкретно на Хаскеле. В других языках они не нужны и поэтому не понятно, к чему эти рассуждения.

Если liftM2 еще можно приписать к "конкретно Хаскелю", то fold — это катаморфизм (поправьте, если вру) — не такая уж ненужная вещь, как кажется на первый взгляд. По крайней мере, она заслуживает отнесения к уровням абстракции.
Re[7]: [Haskell]fold vs. не fold
От: Курилка Россия http://kirya.narod.ru/
Дата: 03.02.08 13:06
Оценка:
Здравствуйте, Mr.Cat, Вы писали:

MC>Здравствуйте, Quintanar, Вы писали:

Q>>Эти абстракции — суть набор инструментов для программирования конкретно на Хаскеле. В других языках они не нужны и поэтому не понятно, к чему эти рассуждения.

MC>Если liftM2 еще можно приписать к "конкретно Хаскелю", то fold — это катаморфизм (поправьте, если вру) — не такая уж ненужная вещь, как кажется на первый взгляд. По крайней мере, она заслуживает отнесения к уровням абстракции.


Кстати, вот интересная, на мой взгляд, точка зрения, что паттерн визитор по сути тоже есть fold, правда завуалированный в C++ (думаю, тут можно подставить и не только C++)
И монады (и liftM2) по-моему не являются прерогативой ленивых языков, хотя в Хаскеле, конечно, являются очень употребительной абстракцией (паттерном?).
Re[7]: [Haskell]fold vs. не fold
От: z00n  
Дата: 03.02.08 16:33
Оценка: 1 (1)
Здравствуйте, 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", намного круче того, что в яве
Re[8]: [Haskell]fold vs. не fold
От: Курилка Россия http://kirya.narod.ru/
Дата: 03.02.08 16:34
Оценка: +1 :)
Здравствуйте, z00n, Вы писали:

Z>Что касается монад вообще, то Одерски в Скале поступает наиболее разумно: он вообще избегает этого слова, do-notation он переименовал в for-comprehension, непонятный bind в flatMap, непонятный mzero в filter, а return в yield. В тьюториалах пишут, что это просто крутой "for", намного круче того, что в яве


warm fuzzy thing
Re[9]: [Haskell]fold vs. не fold
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 04.02.08 07:54
Оценка: 1 (1)
Курилка,

Z>>Что касается монад вообще, то Одерски в Скале поступает наиболее разумно: он вообще избегает этого слова, do-notation он переименовал в for-comprehension, непонятный bind в flatMap, непонятный mzero в filter, а return в yield. В тьюториалах пишут, что это просто крутой "for", намного круче того, что в яве


К>warm fuzzy thing


А!, ты тоже помнишь то сообщение Ульфа Вигера? (когда он говорил, что чуть ли не основная проблема монад в их нехорошем названии)
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[10]: [Haskell]fold vs. не fold
От: Курилка Россия http://kirya.narod.ru/
Дата: 04.02.08 08:18
Оценка:
Здравствуйте, Lazy Cjow Rhrr, Вы писали:

LCR>Курилка,


Z>>>Что касается монад вообще, то Одерски в Скале поступает наиболее разумно: он вообще избегает этого слова, do-notation он переименовал в for-comprehension, непонятный bind в flatMap, непонятный mzero в filter, а return в yield. В тьюториалах пишут, что это просто крутой "for", намного круче того, что в яве


К>>warm fuzzy thing


LCR>А!, ты тоже помнишь то сообщение Ульфа Вигера? (когда он говорил, что чуть ли не основная проблема монад в их нехорошем названии)


Ульф по ходу его у SPJ подхватил, по меньшей мере gmane мне даёт его пост, где он ссылается на SPJ
Как-то вот странно, что о монадах в Эрланге я вообще до сих пор не думал
Re[10]: [Haskell]fold vs. не fold
От: Курилка Россия http://kirya.narod.ru/
Дата: 04.02.08 08:24
Оценка:
Здравствуйте, Lazy Cjow Rhrr, Вы писали:

LCR>Курилка,


К>>warm fuzzy thing


LCR>А!, ты тоже помнишь то сообщение Ульфа Вигера? (когда он говорил, что чуть ли не основная проблема монад в их нехорошем названии)


А помнить я его не могу, т.к. в омут Эрланга меня затянуло примерно летом 2006-го (в смысле на мейллист тогда подписался)
Re[3]: [Haskell]fold vs. не fold
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 04.02.08 08:43
Оценка:
Здравствуйте, Курилка, Вы писали:

К>Ага, только вопрос — не аукнется ли потом это "повышение уровня"?

К>(возвращаясь к нашему обсуждению стандарту программирования, у thesz вроде)
К>Вопрос: если развернуть вот это приведённое ниже в такую, чтоб стало понятно, ну не знаю, какому-нибудь "среднему программисту", то сколько по объёму выйдет?

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

... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[8]: [Haskell]fold vs. не fold
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 04.02.08 08:43
Оценка:
Здравствуйте, z00n, Вы писали:

Z>liftM2 — это просто другое название для map, чтобы не путать.


С liftM не путаешь?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: [Haskell]fold vs. не fold
От: Курилка Россия http://kirya.narod.ru/
Дата: 04.02.08 08:52
Оценка:
Здравствуйте, lomeo, Вы писали:

L>Здравствуйте, Курилка, Вы писали:


К>>Ага, только вопрос — не аукнется ли потом это "повышение уровня"?

К>>(возвращаясь к нашему обсуждению стандарту программирования, у thesz вроде)
К>>Вопрос: если развернуть вот это приведённое ниже в такую, чтоб стало понятно, ну не знаю, какому-нибудь "среднему программисту", то сколько по объёму выйдет?

L>До какого уровня разврачивать? Этот вопрос изморфен, как ты любишь говорить , вопросу о том, что такое средний программист.


L>


Дак о том и речь, что где обнаружится "предельная планка" повышения абстракций — хз.
Скажем вот я вроде как минимум на среднего вроде "канаю", а зачастую тоже "затыки" вылезают, к сожалению, не очень большая часть народа приближаются к уровням SPJ, вадлера или пирса. Ну и тут решает бизнес скорее кого нанимать: толпу индусов по 500 баксов или "гуру" за 5000 (цифры почти с потолка).
Кстати, вспоминается вопрос: а есть ли серьёзные проекты (и комманды) на Хаскеле кроме GHC? Такие, чтоб пары человек не хватало, а был хотяб десяток?
Re[4]: [Haskell]fold vs. не fold
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 04.02.08 08:54
Оценка:
Здравствуйте, Quintanar, Вы писали:

L>>>
L>>>sequenceIO = foldr (liftM2 (:)) (return [])
L>>>


Q>А это не повышение уровня. Это обход гемороя, связанного с ленивостью Хаскеля. Поэтому у среднего программиста код только сократится.


Долго смотрел, не нашёл, где тут обход ленивости — в каком именно месте?

Или имеется в виду конкретизация типа по IO? Тогда это неинтересно — возьмите более общий тип.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: [Haskell]fold vs. не fold
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 04.02.08 09:04
Оценка: 1 (1)
Здравствуйте, Курилка, Вы писали:

К>Дак о том и речь, что где обнаружится "предельная планка" повышения абстракций — хз.

К>Скажем вот я вроде как минимум на среднего вроде "канаю", а зачастую тоже "затыки" вылезают, к сожалению, не очень большая часть народа приближаются к уровням SPJ, вадлера или пирса. Ну и тут решает бизнес скорее кого нанимать: толпу индусов по 500 баксов или "гуру" за 5000 (цифры почти с потолка).
К>Кстати, вспоминается вопрос: а есть ли серьёзные проекты (и комманды) на Хаскеле кроме GHC? Такие, чтоб пары человек не хватало, а был хотяб десяток?

Я не знаю.

Вообще меня в изучении Хаскеля интересует больше вопрос моего образования. Вопросы, связанные с тем, кого нанимать передо мной не стоят: я и сам то работаю на Яве

С этой точки зрения ответ на вопрос "где планка" такой — для того, чтобы понимать некоторые механизмы и уметь с ними обращаться легко и непринуждённо (т.е. чтобы они приносили пользу), нужно поднимать уровень своего образования. Если среднему программисту что-то непонятно, я постараюсь объяснить и/или дать ссылки на информацию.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[7]: [Haskell]fold vs. не fold
От: Quintanar Россия  
Дата: 04.02.08 12:01
Оценка:
Здравствуйте, Mr.Cat, Вы писали:

MC>Если liftM2 еще можно приписать к "конкретно Хаскелю", то fold — это катаморфизм (поправьте, если вру) — не такая уж ненужная вещь, как кажется на первый взгляд. По крайней мере, она заслуживает отнесения к уровням абстракции.


Я имел в виду монадный мусор. Фолд — универсальная концепция.
Re[11]: [Haskell]fold vs. не fold
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 04.02.08 12:54
Оценка:
Курилка,

К>Ульф по ходу его у SPJ подхватил, по меньшей мере gmane мне даёт его пост, где он ссылается на SPJ

Ага, именно это сообщение

К>Как-то вот странно, что о монадах в Эрланге я вообще до сих пор не думал

А зачем думать?
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[12]: [Haskell]fold vs. не fold
От: Курилка Россия http://kirya.narod.ru/
Дата: 04.02.08 13:00
Оценка:
Здравствуйте, Lazy Cjow Rhrr, Вы писали:

LCR>Курилка,

К>>Как-то вот странно, что о монадах в Эрланге я вообще до сих пор не думал
LCR>А зачем думать?

Всё что не убивает, делает нас сильней
Re[10]: [Haskell]fold vs. не fold
От: Klapaucius  
Дата: 04.02.08 14:05
Оценка: :))) :)))
Здравствуйте, 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
Re[11]: [Haskell]fold vs. не fold
От: Трурль  
Дата: 04.02.08 15:12
Оценка:
Здравствуйте, Klapaucius, Вы писали:

K>Ну конечно. Для индусского программиста слово "монада" ассоциируется с философией Лейбница, которую вышеозначенный программист, являясь, разумеется, эмпиристом старой британской школы, привык подвергать уничтожающей критике.


Да и для нас, православных, "Бог Един и вне Единого и превыше самой Монады".
Re[9]: [Haskell]fold vs. не fold
От: z00n  
Дата: 04.02.08 19:48
Оценка: +1
Здравствуйте, lomeo, Вы писали:

L>Здравствуйте, z00n, Вы писали:


Z>>liftM2 — это просто другое название для map, чтобы не путать.


L>С liftM не путаешь?

Нет С точки зрения абстракций это одна фигня.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.