Re[9]: Ленивые языки - за и против
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 18.12.08 12:21
Оценка: :))) :))) :)))
Gaperton,

T>Буквально, год назад объяснил тебе всё, что сейчас пытаюсь объяснить. Вроде, ты сказал, что понял. И вот снова вынужден это делать.


G>Для опровежения тезиса не канают: ...

G>5) Жим штанги на 120 кг, и прочие килограмм-амперы.

Аааааа!!! Я понял, почему thesz тебя в реале убедил, а здесь ну никак убедить не может!
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[13]: Ленивые языки - за и против
От: Аноним  
Дата: 20.12.08 04:06
Оценка: 26 (5) +2
Здравствуйте, VladD2, Вы писали:

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


VE>>Всё-таки тебя пугает факт наличия страшной монады. Было бы ключевое слово "action of", наверняка бы не волновался. Типа как mutable для обозначения изменяемой переменной, так и action для обозначения нечистого блока кода.


VD>Ага. Мене вообще не понятно, зачем заниматься связыванием вычислений через кучу косвенных ссылок и хип когда их можно просто выполнить последовательно.


Это детали реализации. И не забывай про оптимизации — сейчас, думаю, 99% процентов компиляторов занимаются этим. И делают это они довольно успешно. Тем более, что сейчас обсуждаются не детали реализации ленивых вычислений (или уже они?), а сами ленивые вычисления.

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


Так, приехали.
Во-первых, всё очень просто (хотя, конечно же, для некоторых людей это не очень просто, а просто просто).
Во-вторых, всё так и есть. Т.е. компилятору можно говорить, что вот этот блок кода нужно выполнять последовательно, а вот этот — когда понадобится (если вообще его нужно вычислять). Значит ли это, что у тебя уже нет вопросов?

VD>Но в борьбе за чистоту возможность выполнить что-то последовательно просто отняли.


Хватит говорить ерунду о невозможности "выполнить что-то последовательно". Это не правда.

Пример 1:

e = f . g


Ах да, это "слишком простой пример", и кому-то может быть не понятно, о чем собственно речь. Вот пример использования примера 1:

Пример 2:

sincos = sin . cos


Только не нужно пытаться мне доказать, что тут синус может быть посчитан до косинуса. Всё прекрасно вычислятеся последовательно. И никаких монад. Опять же, монада — это всего лишь интерфейс, обязующий предоставлять часть функций, удовлетворяющих некоторым условиям. Всё просто. На детали реализации ограничений никаких нет, так что не стоит судить об этих самых деталях.

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

Так что вы либо неверно сформулировали вашу мысль, и тем самым лишили собеседников возможности понять вас и что-то обьяснить, либо имеете не совсем верное представление о хаскелле и ФП вообще.


Очень часто порядок соблюдать порядок вычислений не обязательно. Пример:

fact n = product [1..n]


Тут не важно, в каком порядке производить умножение. Тут важен результат — получить произведение. Так что получившуюся свободу можно отдать на откуп компилятору для оптимизации. Лично я не против.

Если вам нужен "полный контроль" — пишите на асме для RTOS и руками распределяйте регистры и просчитавайте кэш-миссы.

Видимо, так как хаскелл это не язык для написания RTOS и приложений для них, то ленивость по умолчанию в нём никому ничего плохого не делает и не мешает. Ну, а если мешает — то ленивость можно и убрать.

А теперь, если посмотреть на исходники на хаскеле и на количетсво использований bang patterns и seq — то получается, что этих самых приседаний очень мало. И делать всё наоборот смысла особого нет (т.е. зачем загромождать код не несущими смысла конструкциями?)

VD>И предлагают вместо этого связывать вычисления сентетическими кострукциями. А синтаксчис — это как раз мелочи...


Ммм, кажется, именно это тот случай, когда граманаци оказался бы прав, придравшись к ошибкам. Я так и не понял, о чём вы хотели написать. Ну да ладно, попробую угадать.

1. Если вы имели ввиду "связывать синтаксическими конструкциями", так тогда я не могу понять, чем же вы недовольны. По-моему, так везде. Т.е. в языках всё связывается синтаксическими конструкциями.
2. А если "связывать синтетическими конструкциями", то опять не ясно, чем же они отличаются от "синтаксических". Окей, попробую угадать ещё раз. Вы столкнулись с "чуждой" функциональной парадигмой, и, более того, тут вспыли "warm fuzzy things", и вам не понятно, какого чёрта они нужны. Ведь у вас уже есть свой любимый язык и там так всё просто и понятно.
3. А дальше я теряюсь в догадках и прошу помощи.

P.S. Читая эту тему я поразился бурному обсуждению и количеству шума. Самое печальное — это отрыв от реальности, т.е. я нигде так и не увидел, что же именно хочется закодировать/какая область/и т.п. Несколько мыслей:

1. В треде как-то смешались ленивость, порядок вычислений, монады и ещё фиг знает что. Каждый что-то пытается доказать другим, и я так не смог понять, кто что доказывает. Одни говорят, что ленивость губит на корню порядок вычислений, и что использование монад для "форсирования" порядка вычислений это слишком. Смешно, можно подумать, что монады используются только для IO.

И тут и там как-то неявно подразумевается, что в других языках (немерле, ява, си-шарп, Си, Си++) с этим всё отлично и там всегда всё выполняется "последовательно". Хотя порядок вычислений операндов и аргументов функций в Си, например, неопределен (вспомним i = ++i + ++i). И ведь ничего, никто не плачется о вреде неопределённости и небходимости помнить про сиквенс-поинты.

А вот стоило людям убрать неявные "фичи" языка и сделать их явными — так начинается ворчание. Может, стоит забыть про свой возраст, "открыть мозг" и выучить что-то новое, может эти "warm fuzzy things" не такие уж и страшные?

2. Всем понятно, что если есть MCU c 32kib флэшем и 10kib ram, то ни о каких nemerle,C#,F#,Haskell,java говорить не стоит. Как и не стоит говорить про окамль с питоном.
Если есть Embedded device с 2mib RAM и 4mib flash и от него нужен гарантированный отклик при обслуживании энного количества клиентов, то erlang сюда не вписывается, каким хорошим бы он не был. Тут остается выбор между ASM, C и, возможно С++, хотя использование последнего требует более высокой квалификации разработчика.
Когда есть устройство с 128mib RAM и 32mib flash и всё ещё нужен realtime, то никто в здравом уме не станет сюда тянуть nemerle/java. Они плохо подходят, хотя не всё так плохо и есть возможность заставить их работать (как можно написать ОС на паскале, сделать можно, особенно если хочется что-то кому-то доказать, но смысл?).
Для каждой задачи есть свои инструменты. Так почему же в этом треде так не сформулированна задача и исходные условия/окружение? Вот и получается, что каждый что-то "подразумевает" и надеется, что все остальные "адекватны" и "подразумевают" то же самое, что и они.

3. Никто не хочет читать рекомендумые статейки, а только продавливает своё "авторитетное" мнение. Нехорошо получается. Ну да ладно.

4. Несколько мыслей, что пришли мне в голову:


Re: Ленивые языки - за и против
От: vshabanov http://vshabanov-ru.blogspot.com
Дата: 18.12.08 12:26
Оценка: 18 (4)
Здравствуйте, Gaperton, Вы писали:

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


G>Короче, я сторонник контроля над оружием, тьфу, явного управления ленивостью, посредством фьючерсов и стримов (ленивых списков), и строгости по умолчанию.


Насчет строгости по-умолчанию. У меня, к примеру, есть небольшой DSL для описания конечных автоматов (типа FRP).

На Хаскеле типичный код будет выглядеть так:
-- | переключалка между несколькими сценами
scene = state1
    where state1 = switch scene1 [event1 --> state2,
                                  event2 --> state3]
          state2 = switch scene2 [event3 --> ...]
          ...
          stateN = ...

-- | тупой счетчик
counter n = switch (pure n) [tick --> counter (n+1)]


Здесь state1..N/counter и т.д. -- это обычные ленивые хаскельные выражения. Спокойно взаиморекурсивно ссылаются друг на друга.

В кемле (и в любом eager языке) так сделать не получится. Не даст он запросто выражениям ссылаться друг на друга

Тот же код на кемле
(** переключалка между несколькими сценами *)
let scene = 
  let rec state1 _ = switch scene1 [event1 -=> state2,
                                    event2 -=> state3]
  and     state2 _ = switch scene2 [event3 -=> ...]
  ...
  and     stateN _ = ...
  in
    state1 ()

(** тупой счетчик *)
let rec counter n = switch (pure n) [tick -=> fun _ -> counter (n+1)]


Тут приходится вместо выражений делать ф-ии с фейковым параметром. Приходится добавлять еще один оператор (-=>), чтобы уметь переходить не сразу на следующее выражение, как (-->), а вызывать ф-ию, и только потом переходить на ее результат. И если первый пример (со взаиморекурсивными выражениями) без фейковых ф-ий даже компилиться не будет, то второй отлично скомпилится и упадет по stack overflow (что хоть лечится и быстро, но все равно неприятно).

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

А главная проблема строгости по-умолчанию -- это то, что ты работаешь с вычислениями, где надо думать, что и в какой последовательности считается (особенно, если язык не чистый). В ленивом языке ты работаешь с выражениями, а это уже другой уровень. Даже какой-нить print foo в хаскеле -- это не вывод на экран, а выражение-действие, которое выведет что-то на экран только когда оно попадет в main. До того, как оно попало в main с ним можно делать что угодно. mapM/replicateM -- это не циклы, а всего-лишь ф-ии, работающие с выражениями, и возвращающие выражения. В неленивом языке пришлось бы делать процедуры и управляющие структуры, учить больше, работать уровнем ниже.

Может объяснил и несколько сумбурно (мне кажется этот момент надо почувствовать, так его не передать), но важно то, что ленивость позволяет подняться уровнем выше, и это ее главный плюс. А если по-умолчанию все строго, то возможность работать на более высоком уровне становится очень призрачной (надо везде ручками писать lazy). Это возврат в обычное структурное программирование, шаг назад.
Re[7]: Ленивые языки - за и против
От: yumi  
Дата: 18.12.08 03:32
Оценка: 6 (1) :)))
Здравствуйте, VladD2, Вы писали:

L>>Для начала классика: Why FP matters. Must read.

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

Может наоборот, религия не позволяет прочитать? Или лень? Если второе, то да, ленивость по умолчанию это плохо

VD>Это мы отвергаем сразу по двум причинам:

VD>1. Ленивые структуры данных доступны и не ленивых по умолчанию языках.

+1.

VD>2. Ни фига они ни не дает грандиозного выигрыша в общем случае. Большую часть времени программист возится со списками или массивами.


И именно поэтому, это дает выигрыш, кумулятивный эффект видите ли.

L>>4. eDSL без макросов — следствие ленивости (одна из причин)!

VD>Ой. Только не на до про ДСЛ-и. Ладно? Есть разные пути их создания.

Я вижу два пути создания eDSL, это путь Лиспа (который кстати и использует Немерле) путем манипуляции АСТ. А есть второй путь, путь Хаскеля, он вообще я бы сказал ортогонален пути Лиспа. Можно конечно порассуждать на тему, плюсы и минусы обоих подходов, но что-то неохота

VD>Вообще, надо бы стравить Лиспаря и Хаскелиста... и поглядеть на получившийся флэйм.


Я бы поставил на Лиспаря, обычно от Хаскеллистов так и прет непонятным фанатизмом. В этом плане, Лисп все же более приземленный язык близкий к real-world.

VD>Можно. Но все это треп и понты. А по жизни код есть код. Ленивость при обработке списков иногда полезно. Но ее не трудно достичь и в не ленивом языке. А ленивость в обычном коде скорее создает проблемы, чем их решает.


+1.

VD>А вот, то что код нельзя тупо превратить в машинные команды, а надо заниматься разными бета-редукциями — это проблема. Сколько слов сказано о том, что в Хаскеле все можно соптимизировать? И где эти оптимизации?


Бедные Хаскеллисты, прям их жалко стало (пускаю скупую мужскую слезу) занимаются разными нехорошими и непонятными бета-редукциями А тем временем в деревне вилла-бадже дотнетисты и джависты не занимаются не понятными бета-редукциями, их код весело превращается сразу в машинные команды.

VD>Чушь полнейшая. Во-первых, только у теоретиков везде возникают бесконечные списки. У всех остальных есть списко и его надо обработать. 99% программистов их до сих пор for-ами на Cxx обрабатывают. Ну, и если вдруг появляется нужда в ленивых map/filter/fold, то нет проблем их использовать. Как, по-твоему, работают Select, Where, Aggregate в LINQ?


Бесконечный список, это абстракция. Она возникает не только у теоретиков, но и у практиков. Как и всякая любая абстракция, она призвана упростить понимание и использование такой сущности как список. В этом нет ничего плохого, как и в том, что 99% лет десять-двадцать назад писали на голом ассемблере без for-ов.

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


Оргазмы лучше получать от других занятий Нет, я имею ввиду, что есть люди получающие оргазм от новых крутых, концептуально чистых вещей и есть люди получающие оргазм от успешно завершенного проекта. Правда оргазмы всякие разные полезны, и те и те, гораздо хуже вообще их не получать
Lisp is not dead. It’s just the URL that has changed:
http://clojure.org
Re[9]: Ленивые языки - за и против
От: Mamut Швеция http://dmitriid.com
Дата: 18.12.08 10:02
Оценка: :))) :)
VD>Хочу узнать когда Хаскель порвет (ну или хотя бы приблизится) по скорости MS С++ (об Intel я вообще молчу) скажем на тесте альфа-блэнда пробегавшем у нас в Философии?

А что, Nemerle уже порвал?


dmitriid.comGitHubLinkedIn
Re[10]: Ленивые языки - за и против
От: Gaperton http://gaperton.livejournal.com
Дата: 18.12.08 13:16
Оценка: :))) :)
Здравствуйте, Lazy Cjow Rhrr, Вы писали:

T>>Буквально, год назад объяснил тебе всё, что сейчас пытаюсь объяснить. Вроде, ты сказал, что понял. И вот снова вынужден это делать.


G>>Для опровежения тезиса не канают: ...

G>>5) Жим штанги на 120 кг, и прочие килограмм-амперы.

LCR>Аааааа!!! Я понял, почему thesz тебя в реале убедил, а здесь ну никак убедить не может!






Однажды мне некий Игорь, менеджер из соседнего направления, рассказывал:
— Я боксер, и вообще мало кого боюсь. В нашей конторе, например, я боюсь только двоих.
— Кого же? — с любопытством спросил я.
— Ну первый — это замдиректора.
— Почему? — удивился я.
— Он больно здоровый. Такого сложно завалить.
— А второй кто?
— Но больше всего я боюсь этого твоего зверя, у тебя в отделе работает. Лысый, здоровый, — со смесью непоодельного страха и уважения говорит Игорь, — с этим ваще никаких шансов!
— А, я кажется понял, о ком ты говоришь. У него, кстати, — небрежно говорю я, — жим штанги 120, ты знаешь?
— Нет! — с ужасом и завистью говорит Игорь, — у меня только 90, но блин 120!!
— А еще, он каратэ в молодости занимался. Кекусинкай, силовой стиль.
— Блин!
— И кроме того, — с годостью перехожожу к финальной части я, — в прошлый новый год он выиграл конкурс "самый умный сотрудник", и ему выдали футболку с соответствующей надписью. Так что "этот зверь" — наш самый крупный специалист. Гордость отдела.
— Да ну?! Что, был такой конкурс? — вконец изумился Игорь. Он был полностью раздавлен.
— Конечно. Первый человек, которого ты боишься, кстати, тоже выиграл этот конкурс — только в номинации "самый красивый".
Re[13]: Ленивые языки - за и против
От: geniepro http://geniepro.livejournal.com/
Дата: 19.12.08 19:32
Оценка: 20 (3)
Здравствуйте, VladD2, Вы писали:

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


M>>

M>>Хочу узнать когда Хаскель порвет (ну или хотя бы приблизится) по скорости MS С++ (об Intel я вообще молчу) скажем на тесте альфа-блэнда пробегавшем у нас в Философии?


M>>)


VD>Ну, и? Где тест Хаскеля на этом примере?


Не вот это ли ты ищешь: [Haskell] Alpha Blend
Автор: R.K.
Дата: 07.06.07
?

Насколько я помню по своим замерам, этот вариант на Хаскелле был в два раза медленнее, чем у Visual C++ (на Celeron-D 2.8).
Ещё я помню, что где-то в обсуждениях альфа-бленда вариант на C# тоже уступил С++ в два раза.
Так что тут Хаскелл по крайней мере не уступил C#, а значит и Немерле, который, по признанию авторов Немерле, компилируется хуже (код медленнее), чем С#...
Re[5]: Ленивые языки - за и против
От: Gaperton http://gaperton.livejournal.com
Дата: 24.12.08 09:59
Оценка: 8 (3)
Здравствуйте, Аноним, Вы писали:

А>Да, ты верно говоришь, что у хаскеля другой уровень и другая область применения. Никто не станет писать ray-tracer на erlang, и от того, что erlang медленнее хаскеля/clean/etc в какой-то области его никто не станет выбрасывать, так как он затачивался под другие задачи.


А>Но, к сожалению, всё дискусия построенна на том, что Gaperton тупо игнорирует вопросы о подразумеваемой им области применения в которых он считает, что ленивость по-умолчанию не нужна. Про интенсивные вычисления и реал-тайм понятно, но опять же, cpu-hungry код выносится в либы и используется через FFI, а всю логику и описание control flow можно писать уже на другом языке.


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

В больших программах на Хаскеле встречаются трудноуловимые утечки памяти, независимо от области применения. Чтоб нам было на эти проблемы плевать, "область применения" в результате не может являться:
1) Долгоработающим приложением. Все сервера 24х7 идут лесом в колонну по два. Все настольные аппликухи, которые могут долго работать — за ними.
2) Интерактивным приложением с софт-рилтайм гарантиями. Телеком, сетевые приложения, трейдинг, задачи управления и контроля идут лесом.
3) Приложением, которые работает в условиях ограниченных ресурсов. Embedded-разработка, обработка больших объемов данных — все лесом.

Остаются быстро работающие консольные аппликухи, которые не ограниченны памятью, и не жуют обчень больших данных. Только в данном классе приложений нам данная проблема не доставит проблем. Офигенный "класс приложений". Рекомендую.

А>Именно поэтому что-то обьяснить ему не получится — так как всегда можно найти примеры, где ленивость не нужна (опять же, real-time приложения, интенсивные вычисления и т.п.). Вот так и получается, что раз "плоской" отвёрткой крутить шурупы с другим шлицом неудобно, то отвёртку нужно выбрость, потому что она больно не универсальная, и ещё нужно думать, какие отвёртки выбирать.


Объяснить ничего не получается, если не понимаешь, о чем идет разговор. Сочувствую. Я нигде не говорил, что "ленивость не нужна". Я говорил, что у полной ленивости по умолчанию есть проблемы. Это очень сложно понять? Очень сложно, блин, не заметить разницы между этими двумя тезисами?
Re[6]: Ленивые языки - за и против
От: BulatZiganshin  
Дата: 30.12.08 15:35
Оценка: 5 (2)
Здравствуйте, Gaperton, Вы писали:

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


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


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

из моего опыта: да, в моём архиваторе утечки есть. поскольку написан он на хаскел и c++, и утечки как раз в этой сишной части. поскольку без выделения памяти не обойтись, а освобождать всё выделенное явно — это ещё больше усложнять программу. плюс к этому память фрагментируется, так что сжать скажем миллион файлов поодиночке не получится. в хаскеловской же части наоборот — была одна крупная "утечка", в смысле невычислявшийся thunk, болтавшийся в памяти. когда я просёк что такое l;azy evaluation, я эту проблему нашёл и изничтожил. но, надо сказать, произошло это только через полтора года после начала написания архиватора, т.е. после полутора лет использования языка. так что предположение о том, что не очень опытные в хаселе программисты будут допускать такие утечки — совершенно верно
Люди, я люблю вас! Будьте бдительны!!!
Re[5]: Ленивые языки - за и против
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 17.12.08 10:00
Оценка: 3 (2)
Здравствуйте, VladD2, Вы писали:

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


VD>Это утверждение требует доказательства. Пока что такие доказательства дальше разных фибоначей не пошли.


Для начала классика: Why FP matters. Must read.

Теперь обоснования

1. Бесконечные и потенциально бесконечные структуры данных. Сильно сокращают код. Ну, может и не сильно, но заметно. Однако, для того, чтобы понять это, надо для начала пописать что-то отличное от потоков. К сожалению, для этого надо немного поменять мышление — научиться смотреть на задачу по другому.
2. Лёгкое отделение генерации от выборки. В коде просто видно — вот тут мы создаём структуру данных, а тут обрабатываем её. При ленивости по умолчанию не нужно смешивать эти два отдельных по сути этапа, чтобы создать только то, что будет обработано. Учитывая, что каждый из этих этапов сам может разбиваться на подэтапы, порождающие структуры (map f . map g . map h) — ленивость играет большую роль.
3. Соответственно подобное разделение позволяет выписывать комбинаторы и использовать их отдельно. Повторное использование, что тоже показатель лаконичности.
4. eDSL без макросов — следствие ленивости (одна из причин)!
5. Можно ещё много чего дописать — всё это связано с тем, что бета-редукция при ленивости не ограничивается никаким порядком.

VD>Мое мнение — ленивость нужна только при обработке списков, да и то не все время. В большинстве случаев совершенно все равно лениво обрабатывается список или нет. А вот быстро это делается или медленно зачастую важно. Так что для реальной жизни важно чтобы map, fold, filter, forall и т.п. не проигрывали по скорости аналогичным циклам в компилируемых языках. А ленивы он или нет дело десятое.


1. В цепочке map/filter/fold важно ленивы они или нет. Неленивые — неэффективны (или вообще невозможны для бесконечных списков). Поэтому так популярны итераторы.
2. Про медленную ленивую обработку списков — это утверждение тоже требует доказательства
3. Ленивость нужна не только при обработке списков. Предполагаю, что тебе так кажется, потому что ты не пробовал писать лениво, а ленивость у тебя прочно ассоциируется с потоками. Тут уж, как ты выражаешься, эффект Блаба — надо получить опыт.

VD>Ленивость же в обработке списков вполне легко достигается во многих не ленивых языках. Даже в Яве это возможно. А уже в C# это как два пальца об асфальт.


Никто не спорит. Strictness тоже легко достигается в ленивых языках.
Re[4]: Ленивые языки - за и против
От: VladD2 Российская Империя www.nemerle.org
Дата: 17.12.08 06:57
Оценка: +2
Здравствуйте, lomeo, Вы писали:

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


Это утверждение требует доказательства. Пока что такие доказательства дальше разных фибоначей не пошли.

Мое мнение — ленивость нужна только при обработке списков, да и то не все время. В большинстве случаев совершенно все равно лениво обрабатывается список или нет. А вот быстро это делается или медленно зачастую важно. Так что для реальной жизни важно чтобы map, fold, filter, forall и т.п. не проигрывали по скорости аналогичным циклам в компилируемых языках. А ленивы он или нет дело десятое.

Ленивость же в обработке списков вполне легко достигается во многих не ленивых языках. Даже в Яве это возможно. А уже в C# это как два пальца об асфальт.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Ленивые языки - за и против
От: Gaperton http://gaperton.livejournal.com
Дата: 17.12.08 22:06
Оценка: +1 :)
Здравствуйте, thesz, Вы писали:

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

VD>>Это утверждение требует доказательства. Пока что такие доказательства дальше разных фибоначей не пошли.
VD>>Мое мнение — ленивость нужна только при обработке списков, да и то не все время. В большинстве случаев совершенно все равно лениво обрабатывается список или нет. А вот быстро это делается или медленно зачастую важно. Так что для реальной жизни важно чтобы map, fold, filter, forall и т.п. не проигрывали по скорости аналогичным циклам в компилируемых языках. А ленивы он или нет дело десятое.

T>Ленивость позволяет класть код так, как этого требует мысль, а не последовательность вычислений.


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

T>Например, я часто применяю операции наподобие (head:tail) = someListThatMayBeEmpty и потом беру результаты этого опасного сравнения с образцом исходя из других критериев, когда, например, этот список точно не может быть пуст.


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

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


Я так понимаю, ты сторонник обфускации, потому что не любишь, когда чужие люби читают твои программы.
Re[11]: Ленивые языки - за и против
От: deniok Россия  
Дата: 18.12.08 12:40
Оценка: :))
Здравствуйте, geniepro, Вы писали:

G>Хаскел-то и разработали, что бы избавиться от гнёта Миранды... :о)


Не дали Тёрнеру заработать
Re[3]: Ленивые языки - за и против
От: thesz Россия http://thesz.livejournal.com
Дата: 16.12.08 09:38
Оценка: 14 (1)
G>>>Короче, я сторонник контроля над оружием, тьфу, явного управления ленивостью, посредством фьючерсов и стримов (ленивых списков), и строгости по умолчанию.

T>>Короче, ты сторонник преждевременной оптимизации.


G>И вообще. "Оптимизация" — это расстановка strictness annotaation. При этом, ты полагаешься на исскуственный интеллект в виде анализатора строгости.


Не вижу в этом ничего плохого.

Компилируют же плюсовики свои проекты с -O3.

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


Так говорят все сторонники преждевременной оптимизации.

Все они оптимизацию закладывают ещё при проектировании.

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

G>Тезис: никакого значимого выигрыша от ленивости везде по умолчанию нет. Обоснование: ты все равно при проектировании и детальном дизайне (что в случае хаскеля почти кодирование) прикидываешь сложность алгоритмов с учетом ленивости, с рассчетом на нее. Таким образом, все места, где ленивость для тебя действительно существенна, ты отмечаешь в голове, и тебя не затруднит их пометить в коде явно аннотацией. Что, кстати, существенно облегчит _чтение_ твоего кода другим программистом, так как он видит, на что ты заложился в коде явно, и не должен это реконструировать. В тех же местах, где ленивость для тебя не важна — от нее в основном вред, а не польза — она дает замедление, неконтроллируемые задержки, и неконтроллируемый расход памяти.


G>Опровергать тезис по существу будешь? Я бы хотел наглядный и убедительный контрпример, лишенный эмоций и шелухи.


Что значит "лишённый эмоций и шелухи"? Я могу говорить только по личному опыту и только чуть по чужому. Поэтому здесь будут и эмоции, и шелуха.

При кодировании на Хаскеле я вообще не беру в расчёт сложность алгоритмов до получения первых результатов. Looking at algorithm complexity is soooo 1980. Сейчас, максимум, что надо учитывать, это класс задачи, P она, или NP.

Ленивость важна при описании функциональных преобразований. Я могу не придерживаться определённого порядка, я могу производить опасные действия (в блоге у меня есть на эту тему: http://thesz.livejournal.com/488747.html).

А вот не моё, но от опытного функционального программиста: http://enfranchisedmind.com/blog/2008/05/07/why-ocaml-sucks/

The design patterns of Brian Hurt circa 2008 are radically different than the design patterns of Brian Hurt circa 2003. For example, were I to redo extlib now, it's be purely applicative, heavily functorized, lots of monads, and a fair bit of lazy evaluation, as opposed to the code I wrote in 2003.

Ленивые вычисления повышают модульность программы. Они выгодны в качестве порядка вычислений по умолчанию. Как только ты набираешься опыта в программировании на (более-менее нормальном) функциональном языке, то они начинают вылезать всюду. Просто потому, что они удобны и полезны.

Full throttle emotions

Ты говоришь с высоты своего не очень большого опыта. Ну сколько ты написал на ленивом ФЯ? Сотни три строчек, наверное. А сколько на строгом? Да примерно столько же. А писал ли ты на любом из них скорость получения первого результата? Нет, не писал.

Да ты даже Вадлера не читал толком. У него про пользу ленивых вычислений отдельная статья.

Emotions throttle off

Как контролируются задержки в ленивом ФЯ, я уже рассказывал. Как и всё в таких ФЯ, они контролируются высокомодульно — есть генератор, есть потребитель. Потребитель потребляет создаваемое, пока не сочтёт, что упёрся или не завершится время на решение.

Неконтролируемый расход памяти — это да, проблема. Но она менее серьёзна, чем её пытаются представить. Let it crash никто не отменял.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[12]: Ленивые языки - за и против
От: nikov США http://www.linkedin.com/in/nikov
Дата: 19.12.08 13:04
Оценка: 7 (1)
Здравствуйте, deniok, Вы писали:

D>А кстати, вот, насколько я помню, в C++ нет гарантии последовательного исполнения в конструкции f(A(),B()). Имеется в виду порядок вычисления аргументов. Дотнет и/или Немерле дают здесь какую-либо гарантию?


Спецификация C# гарантирует выполнение аргументов слева направо, и я никогда не встречал отклонений от этого правила. У немерле, к сожалению, нет спецификации, но насколько мне известно, там это правило тоже соблюдается.
Re[6]: Ленивые языки - за и против
От: BulatZiganshin  
Дата: 30.12.08 15:42
Оценка: 6 (1)
Здравствуйте, FR, Вы писали:

А>>Да, ты верно говоришь, что у хаскеля другой уровень и другая область применения. Никто не станет писать ray-tracer на erlang, и от того, что erlang медленнее хаскеля/clean/etc в какой-то области его никто не станет выбрасывать, так как он затачивался под другие задачи.


FR>Вот мне как раз интересна реальная область применения Хаскеля. И я пока вижу что она очень узка и в основном сводится к прототипированию и компиляторам.


на мой взгляд хаскел нет смысла применять в двух областях — 1) там где требуется высокая эффективность — пишите на С++. 2) там где уже есть готовые RAD toold — в частности при разработке "бизнес-приложений", вы просто не получите от хаскела выигрыша

во всём остальном его применять выгодно — будь то веб-сервисы, манипуляции с текстами или игры

конкретно, в моей программе алгоритмы сжатия написаны на C++, управляющая логика — на хаскеле, и GUI я надеюсь приписать на C#. и это — оптимальное разделение ролей
Люди, я люблю вас! Будьте бдительны!!!
Re[13]: Ленивые языки - за и против
От: deniok Россия  
Дата: 19.12.08 19:20
Оценка: 3 (1)
Здравствуйте, VladD2, Вы писали:

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


VE>>Всё-таки тебя пугает факт наличия страшной монады. Было бы ключевое слово "action of", наверняка бы не волновался. Типа как mutable для обозначения изменяемой переменной, так и action для обозначения нечистого блока кода.


VD>Ага. Мене вообще не понятно, зачем заниматься связыванием вычислений через кучу косвенных ссылок и хип когда их можно просто выполнить последовательно.


Потому что если у тебя есть влияние одного вычисления на другое, то синтаксис гражданских языков не требует уточнения этого влияния. А в Хаскелле ты указываешь, какое влияние A на B. Если нет влияния, то связывание >>, если есть (через результат), то связывание >>=. Плюс ещё конкретная монада задает стратегию связывания: в пресловутой IO, которую ты, похоже, имеешь в виду, произнося "монада", это действительно "одно, затем другое, потому что ввод-вывод". А в монаде Maybe "одно, и если удачно, то другое". А в монаде списка — "одно, и все другие, которые прицепились":
Prelude> [1,2] >>= (\x -> [10+x,20+x])
[11,21,12,22]

(на этом, кстати, основан сахар лист компрехеншэн)

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

Отняли возможность последовательно чудить с побочными эффектами любого рода втайне от компилятора. Хочешь чтобы B зависело от A — будь добр, опиши компилятору каким образом. Если B нужен просто результат A, то никаких монад для последовательного исполнения не требуется: B( A() ).
Re[18]: Ленивые языки - за и против
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 22.12.08 17:18
Оценка: 3 (1)
Здравствуйте, FR, Вы писали:

FR>В случае же Хаскеля по моему есть парадокс, популярность достаточно высокая, но выхлоп в виде приложений низкий. Вот мне и интересно почему.


1. Мне кажется, дело именно в тех проблемах, о которых говорили Gaperton и другие в этом треде — следствиях ленивости по умолчанию. Пока пишешь маленькие утилитки, все хорошо, красиво и приятно, о ликах можно не думать. А вот что-то большое и долгоиграющее сделать намного сложнее, если ты конечно не автор компилятора.

2. Про использование в индустрии видел интересное мнение одного известного флеймера (Jon Harrop — автор нескольких книг по Окамлу и F#):

I did extensive research on all of the most popular functional languages last
year, including Haskell. In case you are trying to do something similar, I'll
warn you that almost all of the examples of Haskell's use in industry are
fakes, e.g. companies that have no products, companies that have one product
that never used Haskell, companies that happen to have two Haskell advocates
working for them out of 150 developers, companies where one employee once did
a preliminary Haskell program but nothing since and, finally, plain old spam
where companies that have never had anything to do with Haskell have hijacked
the Haskell site to advertise on-line only to be hailed as a "real world"
example of Haskell in industry by its proponents. I was rather baffled when I
discovered this and have never seen behaviour like it.

//Caml-list Digest, Vol 38, Issue 20

Re[6]: Ленивые языки - за и против
От: VladD2 Российская Империя www.nemerle.org
Дата: 17.12.08 11:47
Оценка: 1 (1)
Здравствуйте, lomeo, Вы писали:

L>Для начала классика: Why FP matters. Must read.


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

L>Теперь обоснования


L>1. Бесконечные и потенциально бесконечные структуры данных. Сильно сокращают код. Ну, может и не сильно, но заметно. Однако, для того, чтобы понять это, надо для начала пописать что-то отличное от потоков. К сожалению, для этого надо немного поменять мышление — научиться смотреть на задачу по другому.


Это мы отвергаем сразу по двум причинам:
1. Ленивые структуры данных доступны и не ленивых по умолчанию языках.
2. Ни фига они ни не дает грандиозного выигрыша в общем случае. Большую часть времени программист возится со списками или массивами.

L>2. Лёгкое отделение генерации от выборки. В коде просто видно — вот тут мы создаём структуру данных, а тут обрабатываем её. При ленивости по умолчанию не нужно смешивать эти два отдельных по сути этапа, чтобы создать только то, что будет обработано. Учитывая, что каждый из этих этапов сам может разбиваться на подэтапы, порождающие структуры (map f . map g . map h) — ленивость играет большую роль.


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

L>3. Соответственно подобное разделение позволяет выписывать комбинаторы и использовать их отдельно. Повторное использование, что тоже показатель лаконичности.


Не видел подобных проблем в не ленивых языках.

L>4. eDSL без макросов — следствие ленивости (одна из причин)!


Ой. Только не на до про ДСЛ-и. Ладно? Есть разные пути их создания.
Вообще, надо бы стравить Лиспаря и Хаскелиста... и поглядеть на получившийся флэйм.

L>5. Можно ещё много чего дописать — всё это связано с тем, что бета-редукция при ленивости не ограничивается никаким порядком.


Можно. Но все это треп и понты. А по жизни код есть код. Ленивость при обработке списков иногда полезно. Но ее не трудно достичь и в не ленивом языке. А ленивость в обычном коде скорее создает проблемы, чем их решает.

А вот, то что код нельзя тупо превратить в машинные команды, а надо заниматься разными бета-редукциями — это проблема. Сколько слов сказано о том, что в Хаскеле все можно соптимизировать? И где эти оптимизации?

VD>>Мое мнение — ленивость нужна только при обработке списков, да и то не все время. В большинстве случаев совершенно все равно лениво обрабатывается список или нет. А вот быстро это делается или медленно зачастую важно. Так что для реальной жизни важно чтобы map, fold, filter, forall и т.п. не проигрывали по скорости аналогичным циклам в компилируемых языках. А ленивы он или нет дело десятое.


L>1. В цепочке map/filter/fold важно ленивы они или нет. Неленивые — неэффективны (или вообще невозможны для бесконечных списков). Поэтому так популярны итераторы.


Чушь полнейшая. Во-первых, только у теоретиков везде возникают бесконечные списки. У всех остальных есть списко и его надо обработать. 99% программистов их до сих пор for-ами на Cxx обрабатывают. Ну, и если вдруг появляется нужда в ленивых map/filter/fold, то нет проблем их использовать. Как, по-твоему, работают Select, Where, Aggregate в LINQ?

L>2. Про медленную ленивую обработку списков — это утверждение тоже требует доказательства


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

L>3. Ленивость нужна не только при обработке списков. Предполагаю, что тебе так кажется, потому что ты не пробовал писать лениво, а ленивость у тебя прочно ассоциируется с потоками. Тут уж, как ты выражаешься, эффект Блаба — надо получить опыт.


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

VD>>Ленивость же в обработке списков вполне легко достигается во многих не ленивых языках. Даже в Яве это возможно. А уже в C# это как два пальца об асфальт.


L>Никто не спорит. Strictness тоже легко достигается в ленивых языках.


Может быть. Только я таких не знаю. Идею применять монады для того чтобы сделать код последовательным нельзя не только назвать простой, но и здоровой. Это же надо так извращаться чтобы достичь то, что и так есть?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Ленивые языки - за и против
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 17.12.08 12:40
Оценка: 1 (1)
Здравствуйте, VladD2, Вы писали:

L>>Для начала классика: Why FP matters. Must read.


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


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

VD>Это мы отвергаем сразу по двум причинам:

VD>1. Ленивые структуры данных доступны и не ленивых по умолчанию языках.
VD>2. Ни фига они ни не дает грандиозного выигрыша в общем случае. Большую часть времени программист возится со списками или массивами.

1. Да, но записываются они не так лаконично, как в ленивых. А мы же о лаконичности, как преимуществе ленивости, не так ли?
2. Про грандиозный я не говорил. Я говорил про заметный. Большую часть времени программист возится со списками и массивами — это что? Опровержение того, что ленивый код лаконичен? Если да — разверни. Если нет — поясни, зачем ты это написал.

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


а) А если не списки?
б) А что на Камлах и Немерлях пишут — map f . map g . map h? Или всё таки map (f . g . h)?

L>>3. Соответственно подобное разделение позволяет выписывать комбинаторы и использовать их отдельно. Повторное использование, что тоже показатель лаконичности.


VD>Не видел подобных проблем в не ленивых языках.


Я же написал почему. В ленивом языке мы можем объединять их, потому что промежуточные структуры будут удаляться.
Давай вернёмся к нашему map f . map g . map h. Представь, что всё это осмысленные операции: foo = map f, goo = map g, hoo = map h.
И теперь нам надо foo.goo.hoo. В неленивом языке придётся выписывать map (f.g.h). Ну и где переиспользование в неленивом языке?

L>>4. eDSL без макросов — следствие ленивости (одна из причин)!


VD>Ой. Только не на до про ДСЛ-и. Ладно? Есть разные пути их создания.


Ладно. Я только к тому, что eDSL-и они же тоже для лаконичности, выразительности и всего-всего. И их можно не только на макросах делать. Но, если не хочешь, не будем это связывать.

VD>Вообще, надо бы стравить Лиспаря и Хаскелиста... и поглядеть на получившийся флэйм.

А что тут смотреть! Лисп мощнее (можно больше), Хаскель мягче (пользуем только уровень функций, никаких макр)

L>>5. Можно ещё много чего дописать — всё это связано с тем, что бета-редукция при ленивости не ограничивается никаким порядком.


VD>Можно. Но все это треп и понты. А по жизни код есть код. Ленивость при обработке списков иногда полезно. Но ее не трудно достичь и в не ленивом языке. А ленивость в обычном коде скорее создает проблемы, чем их решает.


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

VD>А вот, то что код нельзя тупо превратить в машинные команды, а надо заниматься разными бета-редукциями — это проблема. Сколько слов сказано о том, что в Хаскеле все можно соптимизировать? И где эти оптимизации?


А что в С# код прямо так превращается в машинные команды, безо всяких разных преобразований?
Насчёт оптимизаций — давай без риторических вопросов, что ты хочешь узнать? В GHC есть оптимизации, могу показать много. Всё соптимизировать разумеется нельзя. Хотя бы в силу того, что уже соптимизированное соптимизировать трудно.

VD>>>Мое мнение — ленивость нужна только при обработке списков, да и то не все время. В большинстве случаев совершенно все равно лениво обрабатывается список или нет. А вот быстро это делается или медленно зачастую важно. Так что для реальной жизни важно чтобы map, fold, filter, forall и т.п. не проигрывали по скорости аналогичным циклам в компилируемых языках. А ленивы он или нет дело десятое.


L>>1. В цепочке map/filter/fold важно ленивы они или нет. Неленивые — неэффективны (или вообще невозможны для бесконечных списков). Поэтому так популярны итераторы.


VD>Чушь полнейшая. Во-первых, только у теоретиков везде возникают бесконечные списки. У всех остальных есть списко и его надо обработать. 99% программистов их до сих пор for-ами на Cxx обрабатывают. Ну, и если вдруг появляется нужда в ленивых map/filter/fold, то нет проблем их использовать. Как, по-твоему, работают Select, Where, Aggregate в LINQ?


Где чушь? Конкретно какие из моих слов являются чушью? Я тебе пишу одно, ты мне отвечаешь совсем другое. Ты вообще читал, что я тебе написал?
Повторю свою мысль — цепочка неленивых map/filter/fold неэффективна. Обосную — в силу создания промежуточных структур.

И зачем ты мне про LINK написал я не понимаю. Я же тебе написал про итераторы, как ты хочешь моими же аргументами эти же аргументы опровергнуть?

L>>2. Про медленную ленивую обработку списков — это утверждение тоже требует доказательства


VD>Скорее обратное доказательства. Если обработка не переписана в код аналогичный for, то ее скорость по любому оставляет желать лучшего. А добиться отложенности вычислений на современных процессорах без доп.затрат нельзя в принципе.


Нет, не скорее. Заявление сделал ты, тебе и доказывать. Насчёт обработки в аналогичный for — смотри на оптимизацию под названием stream fusion.

L>>3. Ленивость нужна не только при обработке списков. Предполагаю, что тебе так кажется, потому что ты не пробовал писать лениво, а ленивость у тебя прочно ассоциируется с потоками. Тут уж, как ты выражаешься, эффект Блаба — надо получить опыт.


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


Сомневаюсь. Я имею в виду, что ты дизайнил задачу в ленивых структурах и функциях, реализовывал это на ленивом языке? И тем не менее не увидел преимущества лени? Это очень странно.

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

VD>>>Ленивость же в обработке списков вполне легко достигается во многих не ленивых языках. Даже в Яве это возможно. А уже в C# это как два пальца об асфальт.


L>>Никто не спорит. Strictness тоже легко достигается в ленивых языках.


VD>Может быть. Только я таких не знаю. Идею применять монады для того чтобы сделать код последовательным нельзя не только назвать простой, но и здоровой. Это же надо так извращаться чтобы достичь то, что и так есть?


При чём здесь монады? А стриктнесс в Хаскеле достигается совсем другими механизмами. Подавляющее большинство монад — ленивы. Я же говорю — не разобрался.
Re[7]: Ленивые языки - за и против
От: thesz Россия http://thesz.livejournal.com
Дата: 17.12.08 14:54
Оценка: 1 (1)
L>>2. Лёгкое отделение генерации от выборки. В коде просто видно — вот тут мы создаём структуру данных, а тут обрабатываем её. При ленивости по умолчанию не нужно смешивать эти два отдельных по сути этапа, чтобы создать только то, что будет обработано. Учитывая, что каждый из этих этапов сам может разбиваться на подэтапы, порождающие структуры (map f . map g . map h) — ленивость играет большую роль.
VD>ОК, принимается. С оговоркой. Ленивые списки (или их аналоги) сейчас есть практически везде. И функции склеивать можно даже в C#. А уж для разных ОКамлов и Немерлов это самая, что ни на есть банальщина.

I believe it when I see it.

Как минимум для OCaml ты не прав.

Rewrite rules для OCaml нет. Более того, deforestation (которая склейка функций) для строгих языков может изменить семантику программы. Без этой оптимизации программа не будет работать, а с оптимизацией — будет. Поэтому такие преобразования никто для ML семейства не пишет (за исключением Lazy ML).

L>>3. Соответственно подобное разделение позволяет выписывать комбинаторы и использовать их отдельно. Повторное использование, что тоже показатель лаконичности.

VD>Не видел подобных проблем в не ленивых языках.

Какие комбинаторы ты на них писал?

L>>4. eDSL без макросов — следствие ленивости (одна из причин)!

VD>Ой. Только не на до про ДСЛ-и. Ладно? Есть разные пути их создания.
VD>Вообще, надо бы стравить Лиспаря и Хаскелиста... и поглядеть на получившийся флэйм.

Лисперы быстро обижаются и отваливаются. Проходили. Они же как дети.

L>>5. Можно ещё много чего дописать — всё это связано с тем, что бета-редукция при ленивости не ограничивается никаким порядком.

VD>Можно. Но все это треп и понты. А по жизни код есть код. Ленивость при обработке списков иногда полезно. Но ее не трудно достичь и в не ленивом языке. А ленивость в обычном коде скорее создает проблемы, чем их решает.

Лично для меня сейчас написание последовательного кода на Java является проблемой.

Там надо думать, что за чем идёт.

И переменные можно переписать, а значит, испортить.

VD>А вот, то что код нельзя тупо превратить в машинные команды, а надо заниматься разными бета-редукциями — это проблема. Сколько слов сказано о том, что в Хаскеле все можно соптимизировать? И где эти оптимизации?


О!

Я так и знал.

Всё сведётся к банальной оптимизации.

Тебе сперва проблему надо решить, а потом оптимизировать решение.

L>>1. В цепочке map/filter/fold важно ленивы они или нет. Неленивые — неэффективны (или вообще невозможны для бесконечных списков). Поэтому так популярны итераторы.

VD>Чушь полнейшая. Во-первых, только у теоретиков везде возникают бесконечные списки. У всех остальных есть списко и его надо обработать. 99% программистов их до сих пор for-ами на Cxx обрабатывают. Ну, и если вдруг появляется нужда в ленивых map/filter/fold, то нет проблем их использовать. Как, по-твоему, работают Select, Where, Aggregate в LINQ?

Это когда появилось-то? Год назад?

А почему появилось-то?

Ну, да ладно.

L>>2. Про медленную ленивую обработку списков — это утверждение тоже требует доказательства

VD>Скорее обратное доказательства. Если обработка не переписана в код аналогичный for, то ее скорость по любому оставляет желать лучшего. А добиться отложенности вычислений на современных процессорах без доп.затрат нельзя в принципе.

Вот, смотри: http://thesz.mskhug.ru/browser/hiersort/core/S.hs

Это ядро моей самопальной системы моделирования аппаратуры.

Оно пишется за 15 минут и сразу готово к использованию.

Такое же дело на сообщениях для Эрланга товарищ Gaperton продумывал в районе недели, не меньше.

L>>Никто не спорит. Strictness тоже легко достигается в ленивых языках.

VD>Может быть. Только я таких не знаю. Идею применять монады для того чтобы сделать код последовательным нельзя не только назвать простой, но и здоровой. Это же надо так извращаться чтобы достичь то, что и так есть?

Монады-то здесь причём?

Монады к strictness отношения не имеют.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[18]: Ленивые языки - за и против
От: geniepro http://geniepro.livejournal.com/
Дата: 22.12.08 10:43
Оценка: 1 (1)
Здравствуйте, FR, Вы писали:

А>>3. Большие/небольшие приложения это довольно спорный вопрос. Вот, например, ghc — это большое приложение?


FR>Для меня вполне большое. Вот только странно что ничего сопоставимого по размеру — сложности больше на Хаскеле и нету, или я плохо смотрел?


Сравнимый c GHC -- наверное только PUGS, интерпретатор Perl6. Я так и не смог укачать его исходники...
Есть проекты попроще -- Epigram, Agda2, xmonad, Yi, Leskah, HAppS, игрушка Frag -- упрощённый клон квейка-3...

http://en.wikipedia.org/wiki/Category:Haskell_software
http://www.haskell.org/haskellwiki/Haskell_in_industry

Тот же Bluespec делает на Хаскелле софт по разработке чипов...
Re[20]: Ленивые языки - за и против
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 23.12.08 02:21
Оценка: 1 (1)
Здравствуйте, dmz, Вы писали:

dmz>А с другой стороны, где нибудь есть success stories окамла?


Из того же треда:
Debian and Ubuntu registered installs
-------------------------------------
184,574: FFTW (14,298 lines of OCaml)
 12,866: Unison (23,993 lines of OCaml)
  7,286: MLDonkey (171,332 lines of OCaml)
  4,365: Darcs (3,939 lines of Haskell)
  4,066: FreeTennis (7,419 lines of OCaml)
  4,057: Planets (3,296 lines of OCaml)
  3,465: HPodder (2,225 lines of Haskell)
  2,965: LEdit (2,048 lines of OCaml)
  2,822: Hevea (11,596 lines of OCaml)
  2,657: Polygen (1,331 lines of OCaml)


Плюс множество (в основном исследовательских) компиляторов (джавы, оберона, Haxe и др.) и интерпретаторов. Плюс внутреннее использование компаниями (Janse St. Capital, Lexifi, Merjis, ...). Про эти компании по крайней мере можно найти довольно подробные рассказы об использовании окамла. Merjis, например, обрабатывает десятки гигов данных с его помощью.
Re[20]: Ленивые языки - за и против
От: Tonal- Россия www.promsoft.ru
Дата: 28.12.08 10:38
Оценка: 1 (1)
Здравствуйте, FR, Вы писали:
FR>По Хаскелею вообще хоть что-то бы, а то я кроме компиляторов, Булатовского архиватора и оконого менеджера для linux и не слышал больше ничего.
Ещё darcs есть.
... << RSDN@Home 1.2.0 alpha 4 rev. 0>>
Re[20]: Ленивые языки - за и против
От: Курилка Россия http://kirya.narod.ru/
Дата: 28.12.08 11:08
Оценка: 1 (1)
Здравствуйте, FR, Вы писали:

FR>По Хаскелею вообще хоть что-то бы, а то я кроме компиляторов, Булатовского архиватора и оконого менеджера для linux и не слышал больше ничего.


Cryptol ?
Re: Ленивые языки - за и против
От: thesz Россия http://thesz.livejournal.com
Дата: 15.12.08 09:23
Оценка: :)
G>Короче, я сторонник контроля над оружием, тьфу, явного управления ленивостью, посредством фьючерсов и стримов (ленивых списков), и строгости по умолчанию.

Короче, ты сторонник преждевременной оптимизации.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[2]: Ленивые языки - за и против
От: Gaperton http://gaperton.livejournal.com
Дата: 15.12.08 18:21
Оценка: +1
Здравствуйте, thesz, Вы писали:

G>>Короче, я сторонник контроля над оружием, тьфу, явного управления ленивостью, посредством фьючерсов и стримов (ленивых списков), и строгости по умолчанию.


T>Короче, ты сторонник преждевременной оптимизации.


И вообще. "Оптимизация" — это расстановка strictness annotaation. При этом, ты полагаешься на исскуственный интеллект в виде анализатора строгости.

Я не сторонник оптимизаций, а противник исскуственного интеллекта, в особенности если ему доверяют принятие важных решений, относящихся по сути к дизайну системы. Строгость по умолчанию, и явная аннотация ленивости — это по всем понятиям не "оптимизация", а упрощение проектирования.

Тезис: никакого значимого выигрыша от ленивости везде по умолчанию нет. Обоснование: ты все равно при проектировании и детальном дизайне (что в случае хаскеля почти кодирование) прикидываешь сложность алгоритмов с учетом ленивости, с рассчетом на нее. Таким образом, все места, где ленивость для тебя действительно существенна, ты отмечаешь в голове, и тебя не затруднит их пометить в коде явно аннотацией. Что, кстати, существенно облегчит _чтение_ твоего кода другим программистом, так как он видит, на что ты заложился в коде явно, и не должен это реконструировать. В тех же местах, где ленивость для тебя не важна — от нее в основном вред, а не польза — она дает замедление, неконтроллируемые задержки, и неконтроллируемый расход памяти.

Опровергать тезис по существу будешь? Я бы хотел наглядный и убедительный контрпример, лишенный эмоций и шелухи.
Re[8]: Ленивые языки - за и против
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 18.12.08 02:30
Оценка: +1
Здравствуйте, lomeo, Вы писали:

L>б) А что на Камлах и Немерлях пишут — map f . map g . map h?


Пишут, пишут! Просто не List.map (который создает новый список), а, например, Enum.map (который ленивый).

Например, полный исходник решения задачки 42 из Project Euler:
open ExtString;;
open ExtList;;

let (>>) f g = g f;;
let flip f x y = f y x;;
let wordvalue s = String.enum s >> Enum.map (fun c->int_of_char c - 64) >> Enum.fold (+) 0;;
let triangs = Enum.init 20 (fun n-> (n+1)*(n+2)/2) >> List.of_enum;;
let istriang s = if List.mem (wordvalue s) triangs then 1 else 0;;

"words.txt" >> Std.input_file >> flip String.nsplit "," >> List.enum >>
Enum.map (fun s->String.sub s 1 (String.length s - 2)) >> Enum.map istriang >> Enum.fold (+) 0 >> print_int;;
Re[8]: Ленивые языки - за и против
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.12.08 06:56
Оценка: +1
Здравствуйте, awson, Вы писали:

G>>Меня бесполезно агитировать. И я не считаю Хаскель оптимальным выбором для очень широкого круга задач. И в особенности — высоконагруженных серверов. Как я сказал — верования меня не интересуют, меня интересуют факты, и рассуждения.

A>Вы, боюсь, недостаточно знаете Хаскелл, чтобы такие обсуждения имели смысл.

А ты уверен, что надо быть курицей, чтобы рассуждать о вкусе яичницы?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Ленивые языки - за и против
От: Qbit86 Кипр
Дата: 18.12.08 09:51
Оценка: -1
VD>>А ты уверен, что надо быть курицей, чтобы рассуждать о вкусе яичницы?

T>Поваром — да.


Бред.
Глаза у меня добрые, но рубашка — смирительная!
Re[8]: Ленивые языки - за и против
От: Gaperton http://gaperton.livejournal.com
Дата: 18.12.08 11:39
Оценка: +1
Здравствуйте, thesz, Вы писали:

G>>2) Твой опыт исключается двумя темами, из которых одну вы с potan не доделали, а вторая — это архитектурные прототипы харда, который ты делал в одиночку на выброс.


T>Я совсем не понял этого предложения.

Ты ничего кроме прототипов не писал на Хаскеле. Это понятно?

T>Ээээ. И?

T>Ээээ. И?

Я тебе все сказал в предыдущем посте.

Это не засчитывается за значимый опыт разработки. Это так называемое "экспериментальное программирование".


T>>>Видимо, то было лично, вне просторов RSDN, а это "не считается".

G>>Видимо, сейчас ты просто придумываешь те события, которых не было.

T>Это было при свидетелях. При том же самом potan.


Я не понимаю, что "это".

T>Действительно, всё, что вне просторов RSDN, в зачёт не идёт.


В зачет не идут туманные намеки на то, не знаю что. Независимо от того, проходит то, неизвестно что, на просторах RSDN, или нет. Я не понимаю, как ты можешь говорить, что в реале ты меня в переубедил в "этом" споре, и одновременно не понимать, о чем мы спорим.

T>Запомню.


Запомни.

T>>>И как ты просто обязан знать, "знать и применять" не означает "способен просто и доходчиво объяснить другим".

G>>Ну да, это на самом деле так. Способность научить — третий, высший уровень понимания предмета. Первый — повторение, второй — умение применять.
G>>Удивительно, как же у тебя тогда-то получилось мне все объяснить, буквально год назад, а сейчас ты почему-то даже не пытаешься, все больше взываешь у духу святого Вадлера и грозишь гневом монад.

T>Личное общение и общение через форум полностью эквивалентны?


Раз не можешь объяснить — значит не понимаешь. Это раз. На форуме ты в более выгодных условиях, чем в очном разговоре, так как не должен отвечать немедленно, и можешь как следует подумать. Это два. И третье — общение через форум — это публичная дискуссия, и поэтому ты должен трижды подумать, прежде чем перейти на личности. Компрене ву?

T>>>Я повторю свой вопрос: О чем же мы тогда спорим?

T>>>Какой тезис я доказываю, с твоей точки зрения?
G>>Начал ты с того, что обвинил меня в преждевременной оптимизации.

T>Формально там обвинения нет.


Короче, ты сторонник преждевременной оптимизации.


Формально, я на это ответил не как на обвинение, а дал вежливое разъяснение своей позиции.

T>Добавлю, что формально ты прав, конечно. За исключением того, что это не ответ на вопрос о тезисе, это рассказ об исторических событиях.


У моего тезиса не выросли ножки, он никуда не убежал, и до сих пор находится по тому же адресу. Если тебе что-то в нем непонятно, он кажется тебе размытым и неоднозначно сформулированным — готов его уточнить по любому из твоих вопросов.
http://rsdn.ru/forum/message/3215352.1.aspx
Автор: Gaperton
Дата: 15.12.08


G>>Потом я сказал, что считаю lazy annotation более продуктивной, чем strictness annotation. Привел обоснование. И попросил тебя по правилам это опровергнуть.


T>Опять не о моём тезисе.


Единственный твой тезис, который ты сформулировал четко, состоял в том, что я ничего не понимаю в функциональном программировании, и не могу понимать, потому что написал на ФЯ несколько сотен строк кода. Я это даже комментировать не буду. Если ты ограничишься им, то я просто буду вынужден послать тебя в жопу — это будет наиболее адекватный ответ. Тезис, Сергей, формулируют спокойно, без эмоций.

T>То есть, ты не выдаешь критериев, которым должны соответствовать примеры или доказательства, а оставляешь решение за собой.

T>То есть, никто никогда не сможет соответствовать твоим внутренним критериям, пока ты так не решишь.
T>Подобрать аргументы в таком случае не представляется возможным по объективным причинам.

Для опровержения моего тезиса достаточно любого из трех способов:
1) Опровергнуть или доказать небольшую значимость (путем приведения workaround, например) для двух проблем (память + задержки), лежащих в его основе.
2) Показать неверность рассуждения в обосновании.
3) Привести контрпример.

L>Ты хочешь, чтобы я показал, что ленивый код лаконичен? Или что лаконичность — это преимущество, я не очень понимаю, что от меня требуется.

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


Для опровежения тезиса не канают:
1) Переходы на личности.
2) Обвинение меня в недостаточном профессионализме.
3) Разрывание тельжек на грудях.
4) Биение себя пятками в грудь.
5) Жим штанги на 120 кг, и прочие килограмм-амперы.
Re[9]: Ленивые языки - за и против
От: VoidEx  
Дата: 18.12.08 12:32
Оценка: +1
Здравствуйте, VladD2, Вы писали:

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


G>>>Меня бесполезно агитировать. И я не считаю Хаскель оптимальным выбором для очень широкого круга задач. И в особенности — высоконагруженных серверов. Как я сказал — верования меня не интересуют, меня интересуют факты, и рассуждения.

A>>Вы, боюсь, недостаточно знаете Хаскелл, чтобы такие обсуждения имели смысл.

VD>А ты уверен, что надо быть курицей, чтобы рассуждать о вкусе яичницы?


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

Я поражаюсь, как ты умудряешься пол сообщения говорить здраво, а в конце ляпнуть в полной уверенности какую-нибудь чушь в предмете, в котором ты не разобрался.
Re[9]: Ленивые языки - за и против
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 18.12.08 13:00
Оценка: +1
Здравствуйте, VladD2, Вы писали:

VD>А ты уверен, что надо быть курицей, чтобы рассуждать о вкусе яичницы?


Попробовать то надо.
Re[10]: Ленивые языки - за и против
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.12.08 05:34
Оценка: :)
Здравствуйте, Mamut, Вы писали:

M>А что, Nemerle уже порвал?


В некоторых случаях — да. В среднем, позволяет писать код близкий по скорости к С++-ному.
И уж точно нет проблем Хаскеля.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[13]: Ленивые языки - за и против
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 19.12.08 11:10
Оценка: +1
Здравствуйте, VladD2, Вы писали:

VD>И как из этих слов ты вывел, что я говорил о не ленивых версиях этих функций? Как раз очевидно видно, что я говорил обо всех вариантах.


Вот именно.

P.S. Мы уже какую то фигню обсуждаем — вряд ли что то путное из этого выйдет.
Re[14]: Ленивые языки - за и против
От: Аноним  
Дата: 22.12.08 04:44
Оценка: +1
Здравствуйте, Gaperton, Вы писали:

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


VE>>А и не надо, чтобы находили всю строгость, надо, чтобы лучше человека. Для человека эта задача тоже NP-полная и он тоже её решить не в состоянии.


G>Зачем ее решать, если задача указать ленивость при строгости по умолчанию — для человека тривиальна?


Если эта задача тривиальна, то тривиальна и обратная задача. Но дело не в этом. Дело в том, что написанием альфа-блендера и решета эратосфена это только 0.001% от возможных применений языков. Серебрянной пули нет. Ну нет и всё. И как бы хорошо С++ не был на этих тестах, он обязательно сольёт в других тестах (например, на скорость реализации какого-нить нетривиального алгоритма и на отладке оного).

1. Ленивые языки работают медленне неленивых при высокой загрузке числодроблением (без использования внешних оптимизированных либ для числодробления)
2. Значит, писать на том же хаскеле альфа-блендинг и т.п. смысла нет, так как в этом места нужна очень сильная оптимизация не алгоритма (т.е. импелентация более продвинутого), а просто эффективная трансляция в код для железа.
3. Опять же, сравнение "портабельного" ассемблера ака Си с Хаскелем на числодроблении не корректно, так же как и сравнение PL/SQL и Delphi (или, по-вашему, PL/SQL sucks так как на нём блендинг плохо работает?). Из-за того, что и на Хаскеле и на С/С++ можно написать блендер совсем не значит, что именно это и нужно делать и что на этом стоит останавливаться. Можно быстро опробовать несколько вариантов алгоритмов на хаскеле, отпрофилировать, выбрать оптимальный и закодировать его на Си.
4. Будьте добры в конце-концов уточнить, о каком применении ленивых языков вы думаете и о какой сфере применения. Да, на Си/С++ можно программить микро-контроллеры и писать ОСи. А на хаскеле нет :\ Всё, выкидываем его на помойку, да?
Re[15]: Ленивые языки - за и против
От: geniepro http://geniepro.livejournal.com/
Дата: 22.12.08 05:41
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А> И как бы хорошо С++ не был на этих тестах, он обязательно сольёт в других тестах ...


Сливает, на многопоточности, например. Достаточно взглянуть на Great Language Shootout...

А> ... Да, на Си/С++ можно программить микро-контроллеры и писать ОСи. А на хаскеле нет :\ ...


Как так нельзя? Ведь сделали же несколько ОС -- House, Kinetic, микроядро seL4 (хоть его и переписали потом на Си)...
Re[16]: Ленивые языки - за и против
От: Аноним  
Дата: 22.12.08 07:57
Оценка: +1
Здравствуйте, FR, Вы писали:

FR>Здравствуйте, Аноним, Вы писали:


А>>4. Будьте добры в конце-концов уточнить, о каком применении ленивых языков вы думаете и о какой сфере применения. Да, на Си/С++ можно программить микро-контроллеры и писать ОСи. А на хаскеле нет :\ Всё, выкидываем его на помойку, да?


FR>У меня пока складывается ощущение, и это обсуждение его усилило, что Haskell почему-то пригоден и реально используется только для прототипирования и написания небольших приложений.

FR>Притом по результатам моего присматривания к нему, показалось что и с библиотеками и с FFI и с комьюнити, у него заметно лучше чем у Ocaml'а к примеру, но почему-то приложений на Ocaml'е при этом гораздо больше.
FR>Хаскелисты можете объяснить почему?
FR>Или я заблуждаюсь?

А на питоне ещё больше приложений, и ещё больше модулей, предостовляющих интерфейс к "сишным функциям" через FFI.
На Си ещё больше кода, чем на питоне и на окамле вместе взятых.

Плохого и хорошего тут нет, это только значит, что больше людей пишут/используют эти языки. Скорее всего, это происходит потому, что:

1. Освоить питон намного проще окамля, поэтому больше людей пишут на питоне, чем на окамле (большинтсво, почему-то, часто останавливается и перестаёт играться с новыми языками, так и не доходят до лиспа/окамля/хаскеля, либо просто вскоре забрасывают). Вина тут совсем не в ограниченности людей, сколько в начальном обучении, и, как ни печально, в отсутсвии мотивации. Т.е. человек спокойно выбираеть популярную область (PHP,C#,Java), и потихоньку пишет одно и тоже изо дня в день на одном и том же языке. Денег ему хватает, если он хочет больше — ему проще остаться на сверх-урочные либо подработать (занимаясь либо тем же самым, либо установкой/настройкой чего-либо), или уйти в другую такую же фирму, или "дослужиться до менеджера". Всё то же самое происходит при сравнении ocaml vs. haskell, только различие имх не столь значительно, как при python vs. ocaml.

2. Квалификация программиста очень сильно влияет на используемые им языки (и наоборот). Конечно, это работает "в среднем", т.е. судить о том, что конктректный программист на PHP менее сообразительный конкретного программиста на хаскелле нельзя. Но в целом программирование на хаскелле/етц требует другого (функционального, например) подхода, который человек может не знать, плюс ещё заставляет человека иметь представление о теории категорий (или хотя бы понимать, что такое сильная монада, функтор, и т.р.). По моим наблюдениям, далеко не все могут (не могут = не имеют достаточной мотивации на перераспределение времени для изучения хаскеля/и т.п. и связанных с ним областей) освоить тот же ocaml, не говоря уже о хаскеле. Хотя, на мой взгляд, вреда абсолютно никакого не будет, только наоборот.

3. Большие/небольшие приложения это довольно спорный вопрос. Вот, например, ghc — это большое приложение?
И тут ещё нужно правильно считать, т.е. не просто абсолютное количество приложений на том и на другом языках, а, скорее, относительное. Ходят слухи, что хаскель активно применяется в финансовой индустрии, но лично я кода не видел и говорить ничего не могу. Потом, опять же, большинство приложений на хаскеле занимают ощутимо меньше строчек кода, чем аналогичное на Си/Си++.

4. Из-за малой распространённости хаскеля и малой популярности трудно найти специалистов. А 99% крупных (как коммерческих, так и нет) продуктов поддерживаются командами, и состав может часто меняться. Сформировать команду, как и искать новых программистов на хаскеле в случае движений в команде, очень и очень напряжно. Да и редко какой руководитель примет решение писать большой проект на хаскеле — слишком много рисков и неизвестности. Выходит, что реально люди готовы использовать этот язык либо там, где они могут позволить себе нанять дорогих специалистов (финансисты, где крутятся большие деньги, и где они могут потратить много денег на нового спеца, где прибыль покрывает всё и где нужна очень быстрая разработка и анализ, а на скорость кода можно коменсировать железом), либо там, где невилик риск, а это — прототипирование. Первая область проприетарная насквозь, вторая — напротив. Поэтому имеем такие результаты — видны прототипы и мелкие проекты.

Что использовать, стоит ли браться за хаскель? Конечно стоит. Но если нет должной подготовки, то можно посмотреть на ocaml, более-менее освоится с ним и двигаться дальше (не обязательно хаскель, можно посмотреть и пролог, и лисп/схему, или smalltalk/io). Использовать ли хаскель на работе при прототировании? Нет, если у вас нет опыта. В этом случае с хаскелем лучше стоит играться паралельно (в свободное время, либо просто для разгрузки).


P.S. Это моё личное видение
Re[20]: Ленивые языки - за и против
От: Qbit86 Кипр
Дата: 22.12.08 10:51
Оценка: +1
FR>Шум вокруг Хаскеля точно больше, да и даже стандартные библиотеки полнее и качественей камловских. Так что тут еще кто маргинальней непонятно.

С учётом инкранации ОКамла в F#, со станартными библиотеками всё ок.
Глаза у меня добрые, но рубашка — смирительная!
Re[6]: Ленивые языки - за и против
От: thesz Россия http://thesz.livejournal.com
Дата: 24.12.08 14:16
Оценка: +1
G>В больших программах на Хаскеле встречаются трудноуловимые утечки памяти, независимо от области применения.

"Встречаются" — это просто песня.

Сейчас попробую развить...

Вот!

В больших программах на K встречаются опечатки вне зависимости от области применения.

Или.

В больших программах на C++ встречается всё, что угодно, я, однажды, гнома встретил. Тоже вне области применения.

Или вот:

В больших программах на C/C++/Фортране встречается сделанная на коленке, кривая и косая, медленная и полная багов половина реализации Common LISP, вне зависимости от области применения.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[3]: Ленивые языки - за и против
От: Аноним  
Дата: 25.12.08 01:00
Оценка: +1
Здравствуйте, Gaperton, Вы писали:


G>Отвечу кратко. <skipped> Аналогичный код в "строгом Хаскеле", с предлагаемой (примерной) аннотацией ленивости.


G>
G>-- | переключалка между несколькими сценами
G>scene = state1
G>    where state1 = ? switch scene1 [event1 --> state2, event2 --> state3]
G>          state2 = ? switch scene2 [event3 --> ...]
G>          ...
G>          stateN = ? ...

G>Разница только в том, что места, где вы полагаетесь на ленивость, указаны явно. А не наоборот. И все. Насчет счетчика, я уверен, вы сами проставите ленивость, где надо. ? - говорит о том, что вычисления на том же уровне ленивы. Его scope ограничен скобками, например.

G>-- | тупой счетчик
G>counter n = switch (pure n) [tick --> counter (n+1)]
G>



Вы замечательно придумали, на N+1 строчку N аннотаций ленивости. Спасибо, очень удобно. А всё то, что будет использовать этот код, мне тоже помечать?

Получается, что аннотация расползается всё дальше и дальше, и на каком-то этапе проще забить на неё и сделать дефолтной.
Ленивые языки - за и против
От: Gaperton http://gaperton.livejournal.com
Дата: 15.12.08 01:42
Оценка:
Здравствуйте, awson, Вы писали:

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

18.12.08 09:44: Ветка выделена из темы Фя. какие языки живут?
Автор: SuperRockStar
Дата: 11.12.08
— VladD2
Re[2]: Ленивые языки - за и против
От: Gaperton http://gaperton.livejournal.com
Дата: 15.12.08 18:01
Оценка:
Здравствуйте, thesz, Вы писали:

G>>Короче, я сторонник контроля над оружием, тьфу, явного управления ленивостью, посредством фьючерсов и стримов (ленивых списков), и строгости по умолчанию.


T>Короче, ты сторонник преждевременной оптимизации.


Так можно было бы сказать, если бы проблемы памяти и отклика являлись вопросом оптимизации.

Однако, они ведут себя как самые настоящие баги, подчас делая систему неработоспособной. Помнишь у тебя на симуляторе лик был из-за накапливающейся невычисленной цепочки? Это баг, с хорошим таким почти фатальным severity — симулятор не может работать больше нескольких дней. Баг поганый, неожиданный и непредсказуемый, и трудноуловимый.
Re[3]: Ленивые языки - за и против
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 16.12.08 10:10
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Тезис: никакого значимого выигрыша от ленивости везде по умолчанию нет.

G>Опровергать тезис по существу будешь? Я бы хотел наглядный и убедительный контрпример, лишенный эмоций и шелухи.

Например, при ленивости по умолчанию код более лаконичен. Это считается выигрышем?
Re[4]: Ленивые языки - за и против
От: Gaperton http://gaperton.livejournal.com
Дата: 16.12.08 19:40
Оценка:
Здравствуйте, thesz, Вы писали:

G>>И вообще. "Оптимизация" — это расстановка strictness annotaation. При этом, ты полагаешься на исскуственный интеллект в виде анализатора строгости.


T>Не вижу в этом ничего плохого.


T>Компилируют же плюсовики свои проекты с -O3.


Использование или не использование о3 не приводит к таким результатам, как мемори лик в программе из-за невычисленной цепочки. Эффект от о3 в целом презсказуем. В этом разница.

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


T>Так говорят все сторонники преждевременной оптимизации.


Не думаю, что так говорят все сторонники преждевременной оптимизации.

T>Все они оптимизацию закладывают ещё при проектировании.


Так как я к ним не отношусь, то комментировать не буду. Хотя, я в самом деле сторонник подхода поменьше прыгать, побольше думать. Однако, одновременно я сторонник подхода сделать проще, проще настолько, насколько это возможно, но не слишком. Что подразумевает откладывание усложнений на потом.

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

T>Как раньше распределяли регистры, а позже следили за владением динамической памятью.


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

G>>Опровергать тезис по существу будешь? Я бы хотел наглядный и убедительный контрпример, лишенный эмоций и шелухи.


T>Что значит "лишённый эмоций и шелухи"? Я могу говорить только по личному опыту и только чуть по чужому. Поэтому здесь будут и эмоции, и шелуха.


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

T>При кодировании на Хаскеле я вообще не беру в расчёт сложность алгоритмов до получения первых результатов. Looking at algorithm complexity is soooo 1980. Сейчас, максимум, что надо учитывать, это класс задачи, P она, или NP.


Любопытно. Обоснуй. Впрочем, я догадываюсь, почему ты так делаешь. Тебе сложно в голове предсказать сложность даже относительно простых алгоритмов в условиях тотальной ленивости, поэтому ты предпочитаешь мерять. А потом — ломать (или не ломать) голову, почему результаты именно такие. Это не мой метод.

T>Ленивость важна при описании функциональных преобразований. Я могу не придерживаться определённого порядка, я могу производить опасные действия (в блоге у меня есть на эту тему: http://thesz.livejournal.com/488747.html).


Прочитаю, отвечу по существу.

T>А вот не моё, но от опытного функционального программиста: http://enfranchisedmind.com/blog/2008/05/07/why-ocaml-sucks/


T>The design patterns of Brian Hurt circa 2008 are radically different than the design patterns of Brian Hurt circa 2003. For example, were I to redo extlib now, it's be purely applicative, heavily functorized, lots of monads, and a fair bit of lazy evaluation, as opposed to the code I wrote in 2003.


Это мнение напрямую не относится к нашей теме — ленивость по умолчанию. Ну стало у чувака больше монад, и fair bit ленивости. О чем он и говорит. Стал опытнее, стал умнее. И все.

T>Ленивые вычисления повышают модульность программы. Они выгодны в качестве порядка вычислений по умолчанию. Как только ты набираешься опыта в программировании на (более-менее нормальном) функциональном языке, то они начинают вылезать всюду. Просто потому, что они удобны и полезны.


Это твое _мнение_, которое я тебя просил подтвердить содержательным контрпримером. А не "авторитетами". Раз они "вылезают повсюду" — то в чем сложность привести пример? Неужто на авторитеты ссылаться проще (разновидность замера пиписьками)?

T>Full throttle emotions


А вот это ты зря. Сам понимаешь, если ты не прав, то зачем волноваться? Это как то по детски. Ну а теперь, допустим, что ты прав. Ну, тогда тем более непонятно, что ты волнуешься.

T>Ты говоришь с высоты своего не очень большого опыта. Ну сколько ты написал на ленивом ФЯ? Сотни три строчек, наверное. А сколько на строгом? Да примерно столько же. А писал ли ты на любом из них скорость получения первого результата? Нет, не писал.


Если бы мой "не очень большой опыт" исчерпывался строками кода на ФЯ, то я бы немедленно посыпал голову пеплом. Однако, мой опыт коммерческой разработки не меньше твоего. А если говорить о высоконагруженных надежных серверных приложениях — то он существенно превышает твой опыт, Сергей. Ты ведь на поддержке софтины, написанной не тобой, вообще никогда не сидел, не так ли? Предлагаю замять для ясности, и тему не развивать.

T>Да ты даже Вадлера не читал толком. У него про пользу ленивых вычислений отдельная статья.


Ты читал Вадлера толком — так почему тебе проще обсуждать мою личность, а не объяснить мне Вадлера? Тем более, что я с тобой разговариваю, и тебя об этом прошу. В чем проблема? Вот ты Вадлера толком понял — и что, ты не в состоянии это просто и доходчиво объяснить другим?

T>Emotions throttle off


Ну слава богу.

T>Как контролируются задержки в ленивом ФЯ, я уже рассказывал. Как и всё в таких ФЯ, они контролируются высокомодульно — есть генератор, есть потребитель. Потребитель потребляет создаваемое, пока не сочтёт, что упёрся или не завершится время на решение.


Я тебя просил привести пример. Пример будет?

T>Неконтролируемый расход памяти — это да, проблема. Но она менее серьёзна, чем её пытаются представить. Let it crash никто не отменял.


Let is crash тут не причем. Твое мнение о серьезности или не серьезности данной пробемы я приму во внимание, когда ты напишешь на Хаскеле хотя бы один нетривиальный высоконагруженный сервер. А пока ты этого не сделал, извини — я хочу доказательств, или хотя бы обоснований.
Re[4]: Ленивые языки - за и против
От: Gaperton http://gaperton.livejournal.com
Дата: 16.12.08 19:41
Оценка:
Здравствуйте, lomeo, Вы писали:

G>>Тезис: никакого значимого выигрыша от ленивости везде по умолчанию нет.

G>>Опровергать тезис по существу будешь? Я бы хотел наглядный и убедительный контрпример, лишенный эмоций и шелухи.

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


Возможно, если это оправдывает приведенные недостатки. Пример, пожалуйста, для иллюстрации вашей мысли.
Re[5]: Ленивые языки - за и против
От: awson  
Дата: 16.12.08 21:52
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Использование или не использование о3 не приводит к таким результатам, как мемори лик в программе из-за невычисленной цепочки. Эффект от о3 в целом презсказуем. В этом разница.

G>Для встраиваемой железки или высоконагруженного сервера такие свойства, как расход памяти, должны быть доказуемы. Так дешевле. В этом смысле — да, до сих пор следим за динамической памятью.
G>Let is crash тут не причем. Твое мнение о серьезности или не серьезности данной пробемы я приму во внимание, когда ты напишешь на Хаскеле хотя бы один нетривиальный высоконагруженный сервер. А пока ты этого не сделал, извини — я хочу доказательств, или хотя бы обоснований.

Все так. Проблемы с ленивыми вычислениями есть и они объективны. НО. Как показывает опыт, люди научаются с ними работать и справляться. Т.о., речь не идет об абстрактных вопросах — что лучше — ленивые или энергичные вычисления, а о вполне прагматичных, типа — какие инструменты у нас под рукой? Любая из рапространенных платформ имеет свои недостатки и преимущества. Когда я обсуждал с заказчиком одного небольшого проекта стоит ли (и почему я собираюсь) в нем использовать Хаскелл — я честно написал, что с ним проблем — вагон и маленькая тележка, но в нашем конкретном случае его выразительность и мощь — перевешивают. Основные проблемы здесь — недостаток опыта использования в *реальных* приложениях.

И да, для меня, например, появление rvalue references в С++ означает *реальную* возможность работать на C++ в *чистом* функциональном стиле, хотя, например, мне никто не мешает выкинуть mutable state в С++ безо всяких rvalue references и с т. зр. thesz, это — "преждевременная оптимизация". Равно как и идиома left-fold enumerator — почти тривиальная — доставляет возможность возможность реализации разннобразных traversing стратегий (и IO в том числе) в Хаскелле безо всяких утечек ресурсов.

Иными словами, я агитирую за Хаскелл не потому, что он во всех отношениях безупречен, а потому, что для очень очень широкого круга задач (высоконагруженных серверов тож) это — оптимальный выбор.
Re[6]: Ленивые языки - за и против
От: EvilChild Ниоткуда  
Дата: 16.12.08 22:02
Оценка:
Здравствуйте, awson, Вы писали:

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

А есть опыт создания высоконагруженных серверов на Haskell?
now playing: Plastic Sound — Kikomotto
Re[7]: Ленивые языки - за и против
От: awson  
Дата: 16.12.08 22:29
Оценка:
Здравствуйте, EvilChild, Вы писали:
EC>А есть опыт создания высоконагруженных серверов на Haskell?
У меня до этого дела пока так и не дошло, хотя я сделал довольно серьезную оценку и пришел к выводу, что проканает. Заказчик закрыл проект по коммерческим соображениям.
Re[5]: Ленивые языки - за и против
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 16.12.08 22:39
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>>>Тезис: никакого значимого выигрыша от ленивости везде по умолчанию нет.

G>>>Опровергать тезис по существу будешь? Я бы хотел наглядный и убедительный контрпример, лишенный эмоций и шелухи.

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


G>Возможно, если это оправдывает приведенные недостатки. Пример, пожалуйста, для иллюстрации вашей мысли.


Ну! Ты говорил, что вообще "никакого значимого выигрыша от ленивости везде по умолчанию нет." Я показал то, что считаю выигрышем (для ясности — мы же под этим словом понимаем преимущество?). А оправдывает он или нет приведенные недостатки зависит от задачи, полагаю. Может в некоторых задачах вообще этих недостатков нет или они неважны.
Re[5]: Ленивые языки - за и против
От: thesz Россия http://thesz.livejournal.com
Дата: 17.12.08 09:10
Оценка:
T>>Все они оптимизацию закладывают ещё при проектировании.

G>Так как я к ним не отношусь, то комментировать не буду. Хотя, я в самом деле сторонник подхода поменьше прыгать, побольше думать. Однако, одновременно я сторонник подхода сделать проще, проще настолько, насколько это возможно, но не слишком. Что подразумевает откладывание усложнений на потом.


Считать ли этот комментарий признанием?

G>В целом, я сторонник предсказуемых результатов, только и всего.


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

Вот, смотри, я же тоже сторонник предсказуемых результатов.

О чем же мы тогда спорим?

G>>>Опровергать тезис по существу будешь? Я бы хотел наглядный и убедительный контрпример, лишенный эмоций и шелухи.

T>>Что значит "лишённый эмоций и шелухи"? Я могу говорить только по личному опыту и только чуть по чужому. Поэтому здесь будут и эмоции, и шелуха.
G>Это означает привести содержательный контрпример, а не выражать свое мнение касательно моего опыта, как ты делаешь ниже.

Мне можно. Я всё воспринимаю очень лично.

T>>При кодировании на Хаскеле я вообще не беру в расчёт сложность алгоритмов до получения первых результатов. Looking at algorithm complexity is soooo 1980. Сейчас, максимум, что надо учитывать, это класс задачи, P она, или NP.

G>Любопытно. Обоснуй. Впрочем, я догадываюсь, почему ты так делаешь. Тебе сложно в голове предсказать сложность даже относительно простых алгоритмов в условиях тотальной ленивости, поэтому ты предпочитаешь мерять. А потом — ломать (или не ломать) голову, почему результаты именно такие. Это не мой метод.

Как там в Крепком Орешке? "Bzz, Hans, wrong answer"?

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

Было. До pattern guards. Сейчас я на них переползаю.

T>>А вот не моё, но от опытного функционального программиста: http://enfranchisedmind.com/blog/2008/05/07/why-ocaml-sucks/

T>>The design patterns of Brian Hurt circa 2008 are radically different than the design patterns of Brian Hurt circa 2003. For example, were I to redo extlib now, it's be purely applicative, heavily functorized, lots of monads, and a fair bit of lazy evaluation, as opposed to the code I wrote in 2003.
G>Это мнение напрямую не относится к нашей теме — ленивость по умолчанию. Ну стало у чувака больше монад, и fair bit ленивости. О чем он и говорит. Стал опытнее, стал умнее. И все.

И стало больше ленивости.

Нешто это не доказательство, что выбор умного человека — ленивость?

T>>Ленивые вычисления повышают модульность программы. Они выгодны в качестве порядка вычислений по умолчанию. Как только ты набираешься опыта в программировании на (более-менее нормальном) функциональном языке, то они начинают вылезать всюду. Просто потому, что они удобны и полезны.

G>Это твое _мнение_, которое я тебя просил подтвердить содержательным контрпримером. А не "авторитетами". Раз они "вылезают повсюду" — то в чем сложность привести пример? Неужто на авторитеты ссылаться проще (разновидность замера пиписьками)?

http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.30.5644
Laziness is an advantage precisely when it is difficult to predict the required order of evaluation in advance, while strictness is an advantage precisely because it allows such prediction.

Для получения решения большинства встречавшихся мне задач совершенно нет необходимости заботиться о последовательности вычислений.

T>>Full throttle emotions

G>А вот это ты зря. Сам понимаешь, если ты не прав, то зачем волноваться? Это как то по детски. Ну а теперь, допустим, что ты прав. Ну, тогда тем более непонятно, что ты волнуешься.

Как ты сам понимаешь, мне может просто нравится волноваться в таких ситуациях.

Грех не воспользоваться возможностью.

T>>Ты говоришь с высоты своего не очень большого опыта. Ну сколько ты написал на ленивом ФЯ? Сотни три строчек, наверное. А сколько на строгом? Да примерно столько же. А писал ли ты на любом из них скорость получения первого результата? Нет, не писал.

G>Если бы мой "не очень большой опыт" исчерпывался строками кода на ФЯ, то я бы немедленно посыпал голову пеплом. Однако, мой опыт коммерческой разработки не меньше твоего. А если говорить о высоконагруженных надежных серверных приложениях — то он существенно превышает твой опыт, Сергей. Ты ведь на поддержке софтины, написанной не тобой, вообще никогда не сидел, не так ли? Предлагаю замять для ясности, и тему не развивать.

Как так? Я же неоднократно тебе рассказывал про программу с глобальным int i.

В ПСиТ я вообще исправлял ошибки за всей командой, без малого. В высоконадёжной системе, тоже связанной с финансами.

Так что я не вижу причин, по которым надо это заминать.

Да и носки у меня стоят лучше. Просто потому, что я старше.

T>>Да ты даже Вадлера не читал толком. У него про пользу ленивых вычислений отдельная статья.

G>Ты читал Вадлера толком — так почему тебе проще обсуждать мою личность, а не объяснить мне Вадлера? Тем более, что я с тобой разговариваю, и тебя об этом прошу. В чем проблема? Вот ты Вадлера толком понял — и что, ты не в состоянии это просто и доходчиво объяснить другим?

Ты как-то странно об этом просишь.

Буквально, год назад объяснил тебе всё, что сейчас пытаюсь объяснить. Вроде, ты сказал, что понял. И вот снова вынужден это делать.

Видимо, то было лично, вне просторов RSDN, а это "не считается".

И как ты просто обязан знать, "знать и применять" не означает "способен просто и доходчиво объяснить другим".

Да и место для объяснений здесь так себе. Некая нехорошая аура.

T>>Emotions throttle off


G>Ну слава богу.


T>>Как контролируются задержки в ленивом ФЯ, я уже рассказывал. Как и всё в таких ФЯ, они контролируются высокомодульно — есть генератор, есть потребитель. Потребитель потребляет создаваемое, пока не сочтёт, что упёрся или не завершится время на решение.

G>Я тебя просил привести пример. Пример будет?

Я не смогу написать что-то, отличное от абзаца выше.

Поэтому — почему это не контрпример?

T>>Неконтролируемый расход памяти — это да, проблема. Но она менее серьёзна, чем её пытаются представить. Let it crash никто не отменял.

G>Let is crash тут не причем. Твое мнение о серьезности или не серьезности данной пробемы я приму во внимание, когда ты напишешь на Хаскеле хотя бы один нетривиальный высоконагруженный сервер. А пока ты этого не сделал, извини — я хочу доказательств, или хотя бы обоснований.

Я повторю свой вопрос: О чем же мы тогда спорим?

Какой тезис я доказываю, с твоей точки зрения?
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[5]: Ленивые языки - за и против
От: thesz Россия http://thesz.livejournal.com
Дата: 17.12.08 09:14
Оценка:
L>>Например, при ленивости по умолчанию код более лаконичен. Это считается выигрышем?
VD>Это утверждение требует доказательства. Пока что такие доказательства дальше разных фибоначей не пошли.
VD>Мое мнение — ленивость нужна только при обработке списков, да и то не все время. В большинстве случаев совершенно все равно лениво обрабатывается список или нет. А вот быстро это делается или медленно зачастую важно. Так что для реальной жизни важно чтобы map, fold, filter, forall и т.п. не проигрывали по скорости аналогичным циклам в компилируемых языках. А ленивы он или нет дело десятое.

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

Например, я часто применяю операции наподобие (head:tail) = someListThatMayBeEmpty и потом беру результаты этого опасного сравнения с образцом исходя из других критериев, когда, например, этот список точно не может быть пуст.

В результате мой код полон ленивых сравнений с образцом и, соответственно, он сильно завязан на ленивые вычисления.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[6]: Ленивые языки - за и против
От: VladD2 Российская Империя www.nemerle.org
Дата: 17.12.08 11:26
Оценка:
Здравствуйте, thesz, Вы писали:

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

VD>>Это утверждение требует доказательства. Пока что такие доказательства дальше разных фибоначей не пошли.
VD>>Мое мнение — ленивость нужна только при обработке списков, да и то не все время. В большинстве случаев совершенно все равно лениво обрабатывается список или нет. А вот быстро это делается или медленно зачастую важно. Так что для реальной жизни важно чтобы map, fold, filter, forall и т.п. не проигрывали по скорости аналогичным циклам в компилируемых языках. А ленивы он или нет дело десятое.

T>Ленивость позволяет класть код так, как этого требует мысль, а не последовательность вычислений.


Ну, главное чтобы класть код, а не класть на код.

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

Потом если бы ленивость была бесплатной (в данном случае речь не о производительности), а так за отложенность вычислений прихдится платить тем, что приходится повсеместно возиться с головоломными монадами. А ведь голова не компьютер. Она уровень косвенности больше 2 переваривает с трудом.

T>Например, я часто применяю операции наподобие (head:tail) = someListThatMayBeEmpty и потом беру результаты этого опасного сравнения с образцом исходя из других критериев, когда, например, этот список точно не может быть пуст.


На мой взгляд опасный код вообще не нужно допускать (если это не крайне необходимо).
Ну, да речь не о том. Ты пытаешся обосновать глобальное утверждение тем, что ты используешь тот или иной трюк. Но где доказательство, что этот трюк действительно радикально упрощает код, и что нет других подходов которые не давали бы лучший результат без создания проблем?

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


И в результате главным достоинством твоего кода становится, то что тебя прёт он него. А то что другим его не понять только потешит твое самолюбие...
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Ленивые языки - за и против
От: VoidEx  
Дата: 17.12.08 13:06
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Может быть. Только я таких не знаю. Идею применять монады для того чтобы сделать код последовательным нельзя не только назвать простой, но и здоровой. Это же надо так извращаться чтобы достичь то, что и так есть?

А в чём ты углядел извращение? Там сложного ничего нет.
Применение итераторов для достижения ленивости — это просто и здраво?
Re[7]: Ленивые языки - за и против
От: thesz Россия http://thesz.livejournal.com
Дата: 17.12.08 13:48
Оценка:
VD>Ну, а по делу скажу только то, что не так много на свете людей у которых мыслительный процесс расходится с ходом вычислений.

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

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

VD>Потом если бы ленивость была бесплатной (в данном случае речь не о производительности), а так за отложенность вычислений прихдится платить тем, что приходится повсеместно возиться с головоломными монадами. А ведь голова не компьютер. Она уровень косвенности больше 2 переваривает с трудом.

http://mskhug.ru/wiki/monadicparsers — самое сложное, что тебя может ожидать.

Ничего головоломного.

Это опыт 10 лет использования Хаскеля.

T>>Например, я часто применяю операции наподобие (head:tail) = someListThatMayBeEmpty и потом беру результаты этого опасного сравнения с образцом исходя из других критериев, когда, например, этот список точно не может быть пуст.

VD>На мой взгляд опасный код вообще не нужно допускать (если это не крайне необходимо).
VD>Ну, да речь не о том. Ты пытаешся обосновать глобальное утверждение тем, что ты используешь тот или иной трюк. Но где доказательство, что этот трюк действительно радикально упрощает код, и что нет других подходов которые не давали бы лучший результат без создания проблем?

Последний вопрос совершенно бессмыслен.

Я могу сравнивать только с известными мне и при этом существующими.

Теоретический аргумент, точнее, два аргумента: лямбда-исчисление самый простой метод вычислений (всего одна операция упрощения) и нормальный порядок упрощения (ленивость) самый полный порядок упрощений. В ленивом порядке вычислений вычисляется всё то, что может быть теоретически вычислено, в отличии от других способов упрощений.

Практический аргумент: с помощью ленивости я могу создать большее количество структур, не теряя прозрачности по ссылкам (функциональной чистоты). В частности, я могу создавать циклические и циклически определённые структуры. Ты, надеюсь, не будешь спорить о пользе функциональной чистоты.

При этом для ленивого ЛИ есть отличная система типов с big step семантикой — Hindley-Milner с алгебраическими типами, ага.

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

Переписывание термов — не Тьюринг-полно, либо слабо типизировано (нет системы типов, нет вывода типов — на выбор). Пролог — проблемы с типизацией (нет системы типов, нет вывода типов, нет единственного наибольшего типа), если рассматривается полный Пролог. Про обычное императивное программирование говорить не буду.

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

VD>И в результате главным достоинством твоего кода становится, то что тебя прёт он него. А то что другим его не понять только потешит твое самолюбие...

Главным достоинством моего кода является то, что его рабочий вариант (решающий проблему) я получаю, в среднем, чуток быстрее других.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[6]: Ленивые языки - за и против
От: Gaperton http://gaperton.livejournal.com
Дата: 17.12.08 14:25
Оценка:
Здравствуйте, lomeo, Вы писали:

G>>>>Тезис: никакого значимого выигрыша от ленивости везде по умолчанию нет.

G>>>>Опровергать тезис по существу будешь? Я бы хотел наглядный и убедительный контрпример, лишенный эмоций и шелухи.

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


G>>Возможно, если это оправдывает приведенные недостатки. Пример, пожалуйста, для иллюстрации вашей мысли.


L>Ну! Ты говорил, что вообще "никакого значимого выигрыша от ленивости везде по умолчанию нет." Я показал то, что считаю выигрышем (для ясности — мы же под этим словом понимаем преимущество?). А оправдывает он или нет приведенные недостатки зависит от задачи, полагаю. Может в некоторых задачах вообще этих недостатков нет или они неважны.


Да. И продолжаю так думать и говорить, так как ты ничего не делаешь, чтобы меня разубедить. Я, что характерно, не прочь разубедится в этом, увидев контрпример. Почему ты его не приводишь, это ж должно быть так элементарно просто и очевидно, нет? Стесняться не надо, все свои.
Re[7]: Ленивые языки - за и против
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 17.12.08 14:29
Оценка:
Здравствуйте, Gaperton, Вы писали:

L>>Ну! Ты говорил, что вообще "никакого значимого выигрыша от ленивости везде по умолчанию нет." Я показал то, что считаю выигрышем (для ясности — мы же под этим словом понимаем преимущество?). А оправдывает он или нет приведенные недостатки зависит от задачи, полагаю. Может в некоторых задачах вообще этих недостатков нет или они неважны.


G>Да. И продолжаю так думать и говорить, так как ты ничего не делаешь, чтобы меня разубедить. Я, что характерно, не прочь разубедится в этом, увидев контрпример. Почему ты его не приводишь, это ж должно быть так элементарно просто и очевидно, нет? Стесняться не надо, все свои.


У нас какой то разговор странный получается. Пример чего я должен привести? И в чём я тебя должен разубедить?
Ты хочешь, чтобы я показал, что ленивый код лаконичен? Или что лаконичность — это преимущество, я не очень понимаю, что от меня требуется.
Re[6]: Ленивые языки - за и против
От: Gaperton http://gaperton.livejournal.com
Дата: 17.12.08 21:54
Оценка:
Здравствуйте, awson, Вы писали:

G>>Использование или не использование о3 не приводит к таким результатам, как мемори лик в программе из-за невычисленной цепочки. Эффект от о3 в целом презсказуем. В этом разница.

G>>Для встраиваемой железки или высоконагруженного сервера такие свойства, как расход памяти, должны быть доказуемы. Так дешевле. В этом смысле — да, до сих пор следим за динамической памятью.
G>>Let is crash тут не причем. Твое мнение о серьезности или не серьезности данной пробемы я приму во внимание, когда ты напишешь на Хаскеле хотя бы один нетривиальный высоконагруженный сервер. А пока ты этого не сделал, извини — я хочу доказательств, или хотя бы обоснований.

A>Все так. Проблемы с ленивыми вычислениями есть и они объективны. НО. Как показывает опыт, люди научаются с ними работать и справляться. Т.о., речь не идет об абстрактных вопросах — что лучше — ленивые или энергичные вычисления, а о вполне прагматичных, типа — какие инструменты у нас под рукой?


Я ничего не говорил про проблемы с ленивыми вычислениями. Я говорил про проблемы, возникающие при тотальной ленивости по умолчанию, когда она возникает везде, а не там где ты хочешь. И что строгость по умолчанию с lazy annotation (а не ленивость с strictness annotation) — самый простой и практичный на мой взгляд способ решения этих проблем, при сохранении выгоды от ленивости.

Вы когда-нибудь научитесь читать, что вам пишут?

A>Любая из рапространенных платформ имеет свои недостатки и преимущества. Когда я обсуждал с заказчиком одного небольшого проекта стоит ли (и почему я собираюсь) в нем использовать Хаскелл — я честно написал, что с ним проблем — вагон и маленькая тележка, но в нашем конкретном случае его выразительность и мощь — перевешивают.


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

A>Основные проблемы здесь — недостаток опыта использования в *реальных* приложениях.


Раз нет такого опыта, то ты не можешь утверждать, что перевешивает. Ты просто не можешь этого знать.

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


Меня бесполезно агитировать. И я не считаю Хаскель оптимальным выбором для очень широкого круга задач. И в особенности — высоконагруженных серверов. Как я сказал — верования меня не интересуют, меня интересуют факты, и рассуждения.
Re[8]: Ленивые языки - за и против
От: Gaperton http://gaperton.livejournal.com
Дата: 17.12.08 22:01
Оценка:
Здравствуйте, lomeo, Вы писали:

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


L>>>Ну! Ты говорил, что вообще "никакого значимого выигрыша от ленивости везде по умолчанию нет." Я показал то, что считаю выигрышем (для ясности — мы же под этим словом понимаем преимущество?). А оправдывает он или нет приведенные недостатки зависит от задачи, полагаю. Может в некоторых задачах вообще этих недостатков нет или они неважны.


G>>Да. И продолжаю так думать и говорить, так как ты ничего не делаешь, чтобы меня разубедить. Я, что характерно, не прочь разубедится в этом, увидев контрпример. Почему ты его не приводишь, это ж должно быть так элементарно просто и очевидно, нет? Стесняться не надо, все свои.


L>У нас какой то разговор странный получается. Пример чего я должен привести? И в чём я тебя должен разубедить?


Советую внимательно перечитать пост, на который ты отвечал. Надо же понимать, на что отвечаешь, а то будет получаться странный разговор.
http://rsdn.ru/forum/message/3215352.1.aspx
Автор: Gaperton
Дата: 15.12.08

Тезис: никакого значимого выигрыша от ленивости везде по умолчанию нет. Обоснование: ты все равно при проектировании и детальном дизайне (что в случае хаскеля почти кодирование) прикидываешь сложность алгоритмов с учетом ленивости, с рассчетом на нее. Таким образом, все места, где ленивость для тебя действительно существенна, ты отмечаешь в голове, и тебя не затруднит их пометить в коде явно аннотацией. Что, кстати, существенно облегчит _чтение_ твоего кода другим программистом, так как он видит, на что ты заложился в коде явно, и не должен это реконструировать. В тех же местах, где ленивость для тебя не важна — от нее в основном вред, а не польза — она дает замедление, неконтроллируемые задержки, и неконтроллируемый расход памяти.

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


L>Ты хочешь, чтобы я показал, что ленивый код лаконичен? Или что лаконичность — это преимущество, я не очень понимаю, что от меня требуется.


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

Я хоть от кого-нибудь из вас услышу ответ на свой вопрос, в конце концов? Уже десяток постов ни о чем в форум легло.
Re[6]: Ленивые языки - за и против
От: Gaperton http://gaperton.livejournal.com
Дата: 17.12.08 22:08
Оценка:
Здравствуйте, lomeo, Вы писали:

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


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


VD>>Это утверждение требует доказательства. Пока что такие доказательства дальше разных фибоначей не пошли.


L>Для начала классика: Why FP matters. Must read.


L>Теперь обоснования

...
L>Никто не спорит. Strictness тоже легко достигается в ленивых языках.

И какое из этих обоснований говорит в пользу того, что все должно быть по умолчанию ленивым, а не строгим?
Re[6]: Ленивые языки - за и против
От: Gaperton http://gaperton.livejournal.com
Дата: 17.12.08 22:38
Оценка:
Здравствуйте, thesz, Вы писали:

T>>>Full throttle emotions

G>>А вот это ты зря. Сам понимаешь, если ты не прав, то зачем волноваться? Это как то по детски. Ну а теперь, допустим, что ты прав. Ну, тогда тем более непонятно, что ты волнуешься.

T>Как ты сам понимаешь, мне может просто нравится волноваться в таких ситуациях.


T>Грех не воспользоваться возможностью.


T>>>Ты говоришь с высоты своего не очень большого опыта. Ну сколько ты написал на ленивом ФЯ? Сотни три строчек, наверное. А сколько на строгом? Да примерно столько же. А писал ли ты на любом из них скорость получения первого результата? Нет, не писал.

G>>Если бы мой "не очень большой опыт" исчерпывался строками кода на ФЯ, то я бы немедленно посыпал голову пеплом. Однако, мой опыт коммерческой разработки не меньше твоего. А если говорить о высоконагруженных надежных серверных приложениях — то он существенно превышает твой опыт, Сергей. Ты ведь на поддержке софтины, написанной не тобой, вообще никогда не сидел, не так ли? Предлагаю замять для ясности, и тему не развивать.

T>Как так? Я же неоднократно тебе рассказывал про программу с глобальным int i.


T>В ПСиТ я вообще исправлял ошибки за всей командой, без малого. В высоконадёжной системе, тоже связанной с финансами.


T>Так что я не вижу причин, по которым надо это заминать.


Ну, если бы ты видел причины, то не заставил бы меня напоминать тебе, что:
1) ни одного коммерческого ПО, которое дошло бы до продакшн, и которому требуется поддержка, ты на Хаскеле не написал.
2) Твой опыт исключается двумя темами, из которых одну вы с potan не доделали, а вторая — это архитектурные прототипы харда, который ты делал в одиночку на выброс.
3) Ни одна из этих программ не работала на пределе возможностей оборудования, и не была интерактивной.

Это не засчитывается за значимый опыт разработки. Это так называемое "экспериментальное программирование".

T>Да и носки у меня стоят лучше. Просто потому, что я старше.


Старше, значит — соображаешь медленнее :Р.

T>>>Да ты даже Вадлера не читал толком. У него про пользу ленивых вычислений отдельная статья.

G>>Ты читал Вадлера толком — так почему тебе проще обсуждать мою личность, а не объяснить мне Вадлера? Тем более, что я с тобой разговариваю, и тебя об этом прошу. В чем проблема? Вот ты Вадлера толком понял — и что, ты не в состоянии это просто и доходчиво объяснить другим?

T>Ты как-то странно об этом просишь.


T>Буквально, год назад объяснил тебе всё, что сейчас пытаюсь объяснить. Вроде, ты сказал, что понял. И вот снова вынужден это делать.


Ты так хорошо объясняешь, что я слабо понимаю, что ты мне вообще хочешь сейчас объяснить.

T>Видимо, то было лично, вне просторов RSDN, а это "не считается".


Видимо, сейчас ты просто придумываешь те события, которых не было.

T>И как ты просто обязан знать, "знать и применять" не означает "способен просто и доходчиво объяснить другим".


Ну да, это на самом деле так. Способность научить — третий, высший уровень понимания предмета. Первый — повторение, второй — умение применять.

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

T>Да и место для объяснений здесь так себе. Некая нехорошая аура.


Так. Вот не надо сейчас на дурную ауру все списывать — типа место предрасполагает к флейму!

Нет уж. Взялся за гуж — полезай в корзину.

T>>>Как контролируются задержки в ленивом ФЯ, я уже рассказывал. Как и всё в таких ФЯ, они контролируются высокомодульно — есть генератор, есть потребитель. Потребитель потребляет создаваемое, пока не сочтёт, что упёрся или не завершится время на решение.

G>>Я тебя просил привести пример. Пример будет?

T>Я не смогу написать что-то, отличное от абзаца выше.


Ты не сможешь этим методом контроллировать задержку, вознкающую на накопившейся невычисленной цепочке. Ты не сможешь доказать отсутствия возможности накопления таких цепочек. Поэтому, ты никак не можешь контроллировать эти задержки, не поставив везде strictness.

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

T>Поэтому — почему это не контрпример?


"Контпример" происходит от слова "пример". Не вижу в этом никакого намека на пример.

T>>>Неконтролируемый расход памяти — это да, проблема. Но она менее серьёзна, чем её пытаются представить. Let it crash никто не отменял.

G>>Let is crash тут не причем. Твое мнение о серьезности или не серьезности данной пробемы я приму во внимание, когда ты напишешь на Хаскеле хотя бы один нетривиальный высоконагруженный сервер. А пока ты этого не сделал, извини — я хочу доказательств, или хотя бы обоснований.

T>Я повторю свой вопрос: О чем же мы тогда спорим?


T>Какой тезис я доказываю, с твоей точки зрения?


Начал ты с того, что обвинил меня в преждевременной оптимизации.
Потом я сказал, что считаю lazy annotation более продуктивной, чем strictness annotation. Привел обоснование. И попросил тебя по правилам это опровергнуть.
В ответ ты возмутился, грязно не по делу наехал, и в конце конов забыл, о чем споришь, и стал жаловаться на дурную карму этого места.

Примерно такая хронология событий. А-аставайтесь с нами.
Re[7]: Ленивые языки - за и против
От: awson  
Дата: 17.12.08 23:54
Оценка:
Здравствуйте, Gaperton, Вы писали:

A>>Все так. Проблемы с ленивыми вычислениями есть и они объективны. НО. Как показывает опыт, люди научаются с ними работать и справляться. Т.о., речь не идет об абстрактных вопросах — что лучше — ленивые или энергичные вычисления, а о вполне прагматичных, типа — какие инструменты у нас под рукой?

G>Я ничего не говорил про проблемы с ленивыми вычислениями. Я говорил про проблемы, возникающие при тотальной ленивости по умолчанию, когда она возникает везде, а не там где ты хочешь. И что строгость по умолчанию с lazy annotation (а не ленивость с strictness annotation) — самый простой и практичный на мой взгляд способ решения этих проблем, при сохранении выгоды от ленивости.
Разговоры, что лучше — в лоб или по лбу, с моей точки зрения, совершенно пустые. Содержательно, проблема именно в семантике вычислений, а не в том, куда двигать "умолчание". В том же Хаскелле strictness annotation можно расставить отнюдь не везде и отнюдь не всякое вычисление сделать строгим. Я не знаю, что конкретно Вы имеете в виду (если вообще) под "строгостью по умолчанию с lazy annotation", но предполагаю, что с этим будет еще хуже.

G>Вы когда-нибудь научитесь читать, что вам пишут?

Э? Я же написал что речь идет о вопросах "вполне прагматичных, типа — какие инструменты у нас под рукой?" и о Хаскелле, который я выбираю и который ленив "по умолчанию" как Вы изящно выражаетесь. Если Вам известны реальные инструменты, дающие ленивость "не везде, а там где ты хочешь" и Вам они нравятся — можно это обсудить предметно. Однако, у меня есть смутное ощущение, что лучше обойтись без этого.

A>>Любая из рапространенных платформ имеет свои недостатки и преимущества. Когда я обсуждал с заказчиком одного небольшого проекта стоит ли (и почему я собираюсь) в нем использовать Хаскелл — я честно написал, что с ним проблем — вагон и маленькая тележка, но в нашем конкретном случае его выразительность и мощь — перевешивают.

G>Покажи мне ход твоих рассуждений, и я, может быть, с ним соглашусь. А может нет. Пока я не вижу никаких рассуждений, с чем можно было соглашаться или не соглашаться. Во что ты веришь, мне не интересно — это абсолютно практически бесполезно для меня, и мне это все равно.
A>>Иными словами, я агитирую за Хаскелл не потому, что он во всех отношениях безупречен, а потому, что для очень очень широкого круга задач (высоконагруженных серверов тож) это — оптимальный выбор.
G>Меня бесполезно агитировать. И я не считаю Хаскель оптимальным выбором для очень широкого круга задач. И в особенности — высоконагруженных серверов. Как я сказал — верования меня не интересуют, меня интересуют факты, и рассуждения.
Вы, боюсь, недостаточно знаете Хаскелл, чтобы такие обсуждения имели смысл.
Re[8]: Ленивые языки - за и против
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.12.08 05:58
Оценка:
Здравствуйте, lomeo, Вы писали:

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


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


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


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

Возьмем пример из этой статьи.

Since the Newton-Raphson algorithm computes a sequence of approximations it is natural to represent this explicitly in the program by a list of approximations.
Each approximation is derived from the previous one by the function

next N x = (x + N/x) / 2

so (next N) is the function mapping one approximation onto the next. Calling this function f, the sequence of approximations is
[a0, f a0, f(f a0), f(f(f a0)), ..]

We can define a function to compute this:
repeat f a = cons a (repeat f (f a))

so that the list of approximations can be computed by
repeat (next N) a0

Удобно ли для решения этой конкретной задачи применять ленивую функцию "repeat"?
Наверно — да.
Нужно ли для ее создания, чтобы язык на котором ее пишут был ленивым по умолчанию?
Точно — нет.
Вот тебе пример такой функции на Nemerle (его не сложно написать и на C# 2.0, но мне проще писать на Немерле):
using System.Console;
using System.Collections.Generic;

module Program
{
  Repeat[T](n : T, f : T -> T) : IEnumerable[T]
  {
    def loop(n)
    {
      yield n;
      loop(f(n))      
    }
    
    loop(n)
  }
  
  Main() : void
  {
    def res = Repeat(1, x => x + 1); // Для наглядности применяем простой инкремент 
    WriteLine("Мы получили бесконечный список :)");
    foreach (x in res)
      WriteLine(x);
  }


Можно конечно возразить, что писать функции аналогичные Repeat проще на ленивом языке, но ёлы-палы, кто же будет их писать постоянно? Нам реально нужны Map и Fiter. Ну, на крайняк напишем еще пару более специализированных функций. А скажем функции вроде Fold вообще бессмысленно делать ленивыми. Нам же ведь нужен результат, а не процесс!

VD>>Это мы отвергаем сразу по двум причинам:

VD>>1. Ленивые структуры данных доступны и не ленивых по умолчанию языках.
VD>>2. Ни фига они ни не дает грандиозного выигрыша в общем случае. Большую часть времени программист возится со списками или массивами.

L>1. Да, но записываются они не так лаконично, как в ленивых. А мы же о лаконичности, как преимуществе ленивости, не так ли?


На фи не нужна экономия 2 символов раз в пол года. В тома же Немерле мне нужно дописать lazy в паре мест, чтобы получить ленивую структуру. Но на практике я, написав на том же Немерле пару мег кода, не создал ни одной (!) ленивой структуры данных. Ну, не нужны они мне.
Может быть конечно, что мой мозг так устроен. Но мне кажется дело в другом (о чем я уже говорл). Дело в том, что:
1. Я могу получать ленивость и другими средствами.
2. Ленивость реально полезна только для списков (деревья приравниваем к ним).
3. Большинство реальных задач не требует ленивости и не страдает от того, что ее не использовали.

L>2. Про грандиозный я не говорил. Я говорил про заметный. Большую часть времени программист возится со списками и массивами — это что? Опровержение того, что ленивый код лаконичен?


Нет. Но и не доказательство обратного.

L>Если да — разверни. Если нет — поясни, зачем ты это написал.


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

Ну, а для обработки списков в ленивой манере можно сделать библиотеку содержащую набор ленивых функций. Вот тот же LINQ отличный пример такого подхода. Столь удобной библиотеки я не видел ни в одном самом ленивом языке. Хотя казалось бы Шарпу (на котором написаны библиотеки LINQ-а) до ФЯ как до Пекина раком.

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


L>а) А если не списки?


То и это редкость ради которой не стоит иметь тот геморрой и проблемы с производительностью которые появляются в ленивых языках.

L>б) А что на Камлах и Немерлях пишут — map f . map g . map h? Или всё таки map (f . g . h)?


Там пишут по разному. Есть к примеру оператор |> который теми же F#-щиками юзается на право и на лево.
Результат получается аналогичным твоему примеру.

То что Парсек повторен на том же Немерле и реализация получилась вполне компактная не сильно заденет твое самолюбие?


VD>>Не видел подобных проблем в не ленивых языках.


L>Я же написал почему. В ленивом языке мы можем объединять их, потому что промежуточные структуры будут удаляться.

L>Давай вернёмся к нашему map f . map g . map h. Представь, что всё это осмысленные операции: foo = map f, goo = map g, hoo = map h.

В не ленивых тоже можно, если функции композицию которых мы делаем тоже ленивы.
Ну, ёлы-палы, пойми — это тоже самое но вместо map нам надо будет взять map_lazy.

L>И теперь нам надо foo.goo.hoo. В неленивом языке придётся выписывать map (f.g.h). Ну и где переиспользование в неленивом языке?


Да, пиши так же. Только используй foo_lazy.goo_lazy.hoo_lazy и вместо точки оператор >>.

L>Ладно. Я только к тому, что eDSL-и они же тоже для лаконичности, выразительности и всего-всего. И их можно не только на макросах делать. Но, если не хочешь, не будем это связывать.


Можно. А можно и на макросах. Причем то что скажем Лисп и Немерле имеют первоклассные макросы не отменяет возможности создавать и ДСЛ-и на базе комбинаторов. Пример с повторением Парсека на Немерле я тебе уже привел. Разве его существование не отрицается твоей теорией?

VD>>Вообще, надо бы стравить Лиспаря и Хаскелиста... и поглядеть на получившийся флэйм.

L>А что тут смотреть! Лисп мощнее (можно больше), Хаскель мягче (пользуем только уровень функций, никаких макр)

Да, то что каждый уперт в свою "правду" и кроме искр ничего не выйдет. Но искр будет много ,

L>Почему трёп? Почему понты?

L>Что же касается проблем — я сейчас не об этом спорю. Я говорю о ленивости, как о средстве писать лаконичный код.

Да согласная я! Согласная!!! При условии, что ты добавишь слово "иногда".
Вот только я тебе устал повторять. Она (ленивость) есть в ленивых по умолчанию языках.

Пойми, если бы ленивость действительно постоянно давала бы ощутимый выигрыш, то в Лиспе и Немерле давно бы сделали макрос:
lazy
{
  блок с ленивыми по умолчанию вычислениями.
}

и не парились бы.
Вот только овчинка выделки не стоит.

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

L>А что в С# код прямо так превращается в машинные команды, безо всяких разных преобразований?


С преобразованиями. Но преобразования эти просты и линейны, так как система одна и та же — Фоннэймоновская.

L>Насчёт оптимизаций — давай без риторических вопросов, что ты хочешь узнать? В GHC есть оптимизации, могу показать много. Всё соптимизировать разумеется нельзя. Хотя бы в силу того, что уже соптимизированное соптимизировать трудно.


Хочу узнать когда Хаскель порвет (ну или хотя бы приблизится) по скорости MS С++ (об Intel я вообще молчу) скажем на тесте альфа-блэнда пробегавшем у нас в Философии?

L>Где чушь?


В предпосылках.

L>Повторю свою мысль — цепочка неленивых map/filter/fold неэффективна. Обосную — в силу создания промежуточных структур.


Вот это и есть чушь. Цепочка ЛЮБЫХ map/filter/fold неэффективна в сравнении с аналогичным императивным кодом в силу наличия лишних телодвижений и косвенности. Единственный верный путь оптимизации этих цепочек — это суровый инланинг и превращение их в банальные циклы. Тогда не будет не только промежуточных структур данных, но и вообще ничего лишнего. Будет только сам алгоритм приведенный к виду наиболее эффективно вычисляемому на современных процессорах.

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

L>И зачем ты мне про LINK написал я не понимаю. Я же тебе написал про итераторы, как ты хочешь моими же аргументами эти же аргументы опровергнуть?


Твои аргументы за ленивый язык. А это пример ленивой обработки списков (притом весьма выразительной) в на сквозь императивном не ленивом языке. Понятно?

VD>>Скорее обратное доказательства. Если обработка не переписана в код аналогичный for, то ее скорость по любому оставляет желать лучшего. А добиться отложенности вычислений на современных процессорах без доп.затрат нельзя в принципе.


L>Нет, не скорее. Заявление сделал ты, тебе и доказывать. Насчёт обработки в аналогичный for — смотри на оптимизацию под названием stream fusion.


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

В теории практика и теория аналогичны.
На практике же — нет.


L>Сомневаюсь. Я имею в виду, что ты дизайнил задачу в ленивых структурах и функциях, реализовывал это на ленивом языке? И тем не менее не увидел преимущества лени? Это очень странно.


Мне надоело отвечать на одни и те же вопросы по сто раз. Отвечаю в последний раз. Увидел. Но не везде и не увидел зачем для этого иметь ленивый язык.

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


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

Если рассуждать о Хаскеле, то мне в нем намного больше нравится его система типов поддерживающая классы типов. Вот это действительно интересное решение которое способно повлиять на лаконичность в масштабах всего приложения. А ленивость по умолчанию... Ну, короче ты понял.

L>При чём здесь монады?


Притом, что их повсеместное применение в Хаскле как раз вызвано его ленивостью. В обычных языках монады могут понадобиться раз в год. Скажем в F# вот сделали интересное решение для поддержки параллельных вычислений на их базе. Такое их применение я расцениваю как красивое решение. А выводить с их помощью значения на консоль — это, извините за грубость — маразм!

L>А стриктнесс в Хаскеле достигается совсем другими механизмами. Подавляющее большинство монад — ленивы. Я же говорю — не разобрался.


Да, ну? Другими средствами? Ой как я сер! Просвети, плиз. Что за другие механизмы такие?

Что же до ленивости монад, то как я их понимаю — это средство заставить вычисления быть последовательными. Конечно можно углядеть ленивость и в монадах, но их суть как раз борьба с ленивостью в отдельных участках программы.
Ты по всей видимости перепутал термины "последовательные" и "с побочными эффектами".
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Ленивые языки - за и против
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.12.08 06:05
Оценка:
Здравствуйте, VoidEx, Вы писали:

VD>>Может быть. Только я таких не знаю. Идею применять монады для того чтобы сделать код последовательным нельзя не только назвать простой, но и здоровой. Это же надо так извращаться чтобы достичь то, что и так есть?

VE>А в чём ты углядел извращение? Там сложного ничего нет.

В том, что компьютер на котором выполняется программа и так может выполнить B после A. Так что не иметь возможности напрямую воспользоваться этой базовой возможностью просто глупо. А уж привлекать для решения этой "сверх задачи" функциональные абстракции просто юмористично. Это уже теория ради теории.

VE>Применение итераторов для достижения ленивости — это просто и здраво?


Они применяются чтобы написать 3-5 базовых функций. Далее ты можешь комбинировать их точно так же как в ленивом языке.

Собственно я не буду спорить с тем, что можно придумать и более удобные абстракции порождения ленивых списков. Но и этого достаточно.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Ленивые языки - за и против
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.12.08 06:28
Оценка:
Здравствуйте, thesz, Вы писали:

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


T>I believe it when I see it.


T>Как минимум для OCaml ты не прав.


T>Rewrite rules для OCaml нет. Более того, deforestation (которая склейка функций) для строгих языков может изменить семантику программы. Без этой оптимизации программа не будет работать, а с оптимизацией — будет. Поэтому такие преобразования никто для ML семейства не пишет (за исключением Lazy ML).


Нет нужны заниматься математическим онанизмом чтобы получить ленивый список или "склеить" ленивые функции. Как и нет нужны говорить об оптимизациях там где о них и речи не было. Так же не стоит думать, что оптимизации безуспешно применяемые в Хаскеле — это единственный верный путь.
Программа на не ленивом языке будет быстрее просто потому, что она прекрасно ложится на процессорную архитектуру и позволяет порождать эффективный код. Ленивости в ней с гульких хрен. Она не может фатально повлиять на производительность. А вот в обратном случае влияние видно не вооруженным взглядом.

L>>>3. Соответственно подобное разделение позволяет выписывать комбинаторы и использовать их отдельно. Повторное использование, что тоже показатель лаконичности.

VD>>Не видел подобных проблем в не ленивых языках.

T>Какие комбинаторы ты на них писал?


Разные. В прочем, я по возможности обхожусь без них.
Пример реализации Парсека на Немерле тебя устроит?

L>>>4. eDSL без макросов — следствие ленивости (одна из причин)!

VD>>Ой. Только не на до про ДСЛ-и. Ладно? Есть разные пути их создания.
VD>>Вообще, надо бы стравить Лиспаря и Хаскелиста... и поглядеть на получившийся флэйм.

T>Лисперы быстро обижаются и отваливаются. Проходили. Они же как дети.


Лисперы и хаскелисты — это два лагера которые друг-друга стоят. Каждый прет свою линию и не слушает аргументов оппонента. А я вот как человек со стороны (не лиспер и не хаскелист) позицию лисперов разделяю больше. В Лиспе ДСЛ-и на каждом шагу. Они там базовый строительный элемент. Хаскель этим похвастаться не может.

T>Лично для меня сейчас написание последовательного кода на Java является проблемой.


Пиши не последовательный. Про Functional Java слышал?

T>Там надо думать, что за чем идёт.


Ой-йой-йой! Ужас! Ну, думай о том, как связывать одно вычисление с другим по средствам монад. Functional Java и Callabe тебе в путь.

T>И переменные можно переписать, а значит, испортить.


Ужас то какой?
Скачай Scala и используй def.

T>О!

T>Я так и знал.
T>Всё сведётся к банальной оптимизации.

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

T>Тебе сперва проблему надо решить, а потом оптимизировать решение.


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

L>>>1. В цепочке map/filter/fold важно ленивы они или нет. Неленивые — неэффективны (или вообще невозможны для бесконечных списков). Поэтому так популярны итераторы.

VD>>Чушь полнейшая. Во-первых, только у теоретиков везде возникают бесконечные списки. У всех остальных есть списко и его надо обработать. 99% программистов их до сих пор for-ами на Cxx обрабатывают. Ну, и если вдруг появляется нужда в ленивых map/filter/fold, то нет проблем их использовать. Как, по-твоему, работают Select, Where, Aggregate в LINQ?

T>Это когда появилось-то? Год назад?


В C# — да, год. Итераторы на которых реализованы эти функции имеются в C# уже 5 лет. А базовые примитивы (итераторы) на которых можно было реализовать данные функции были в Яве с ее рождения. А это год эдак 95-ый.

T>А почему появилось-то?


Спасибо в том числе и Хаскелю. Но появилось же? Так что же теперь (в 2008-ом) использовать протухшие аргументы?

L>>>2. Про медленную ленивую обработку списков — это утверждение тоже требует доказательства

VD>>Скорее обратное доказательства. Если обработка не переписана в код аналогичный for, то ее скорость по любому оставляет желать лучшего. А добиться отложенности вычислений на современных процессорах без доп.затрат нельзя в принципе.

T>Вот, смотри: http://thesz.mskhug.ru/browser/hiersort/core/S.hs

T>Это ядро моей самопальной системы моделирования аппаратуры.
T>Оно пишется за 15 минут и сразу готово к использованию.
T>Такое же дело на сообщениях для Эрланга товарищ Gaperton продумывал в районе недели, не меньше.

Ну, я же не говорил, что Гапертон гений, а ты нет?

Какое это имеет отношение к делу?

T>Монады-то здесь причём?

T>Монады к strictness отношения не имеют.

Еще один. Ну, покажи как достичь ее без монад.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Ленивые языки - за и против
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.12.08 06:40
Оценка:
Здравствуйте, yumi, Вы писали:

L>>>Для начала классика: Why FP matters. Must read.

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

Y>Может наоборот, религия не позволяет прочитать? Или лень? Если второе, то да, ленивость по умолчанию это плохо


Религия позволяет — я атеист.
Поглядел... Ничего ровным счетом там нет. Как нет и слов о том, что язык обязан быть ленивым по умолчанию. Приводится два примера когда ленивые списки упрощают реализацию. Такие вещи пишутся с пол пинка.
http://rsdn.ru/forum/message/3219173.1.aspx
Автор: VladD2
Дата: 18.12.08


Y>И именно поэтому, это дает выигрыш, кумулятивный эффект видите ли.


В упор не вижу этого.

L>>>4. eDSL без макросов — следствие ленивости (одна из причин)!

VD>>Ой. Только не на до про ДСЛ-и. Ладно? Есть разные пути их создания.

Y>Я вижу два пути создания eDSL, это путь Лиспа (который кстати и использует Немерле) путем манипуляции АСТ. А есть второй путь, путь Хаскеля, он вообще я бы сказал ортогонален пути Лиспа. Можно конечно порассуждать на тему, плюсы и минусы обоих подходов, но что-то неохота


Я тебе больше скажу. Путь Хаскеля открыт для всех ФЯ в том числе и для Немерла с Окамлом. Реализацию Парсека на Немерле видел?

VD>>Вообще, надо бы стравить Лиспаря и Хаскелиста... и поглядеть на получившийся флэйм.


Y>Я бы поставил на Лиспаря, обычно от Хаскеллистов так и прет непонятным фанатизмом. В этом плане, Лисп все же более приземленный язык близкий к real-world.


фанатизмом прет от обоих. В прочем от Эрланговцев и Немерлистов тоже прет. Но от Хаскелисов и Лиспарей прет как-то особенно. С напором я бы сказал.
В прочем, я бы тоже поставил на Лиспаря. Для Лиспа ДСЛ-и — это строительный блок. Лисперы на них съели не только собак, но и другую живность.

VD>>А вот, то что код нельзя тупо превратить в машинные команды, а надо заниматься разными бета-редукциями — это проблема. Сколько слов сказано о том, что в Хаскеле все можно соптимизировать? И где эти оптимизации?


Y>Бедные Хаскеллисты, прям их жалко стало (пускаю скупую мужскую слезу) занимаются разными нехорошими и непонятными бета-редукциями А тем временем в деревне вилла-бадже дотнетисты и джависты не занимаются не понятными бета-редукциями, их код весело превращается сразу в машинные команды.




VD>>Чушь полнейшая. Во-первых, только у теоретиков везде возникают бесконечные списки. У всех остальных есть списко и его надо обработать. 99% программистов их до сих пор for-ами на Cxx обрабатывают. Ну, и если вдруг появляется нужда в ленивых map/filter/fold, то нет проблем их использовать. Как, по-твоему, работают Select, Where, Aggregate в LINQ?


Y>Бесконечный список, это абстракция. Она возникает не только у теоретиков, но и у практиков. Как и всякая любая абстракция, она призвана упростить понимание и использование такой сущности как список. В этом нет ничего плохого, как и в том, что 99% лет десять-двадцать назад писали на голом ассемблере без for-ов.


Я с этим и не спорю.

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


Y>Оргазмы лучше получать от других занятий


Дык. На том и стоим.

Y>Нет, я имею ввиду, что есть люди получающие оргазм от новых крутых, концептуально чистых вещей и есть люди получающие оргазм от успешно завершенного проекта. Правда оргазмы всякие разные полезны, и те и те, гораздо хуже вообще их не получать


Ну, дык мужик должен получать оргазм от общения с любимым дел... э... телом. А для представителей альтернативный полов придумали бета-реду... э... вибратор.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Ленивые языки - за и против
От: thesz Россия http://thesz.livejournal.com
Дата: 18.12.08 08:37
Оценка:
T>>Ленивость позволяет класть код так, как этого требует мысль, а не последовательность вычислений.
G>Функциональная чистота позволяет класть код так, как этого требует мысль, а не последовательность вычислений.

И да, и нет.

Напиши на функционально чистом подмножестве Эрланга вот такое:
f x y = z
  where
     z = g w
     w = m x y


И второе. Где у нас функциональная чистота чище всего? Правильно, в ленивых языках.

T>>Например, я часто применяю операции наподобие (head:tail) = someListThatMayBeEmpty и потом беру результаты этого опасного сравнения с образцом исходя из других критериев, когда, например, этот список точно не может быть пуст.

G>Какой смысл делать матчинг списка гарантированно до того, как ты будешь его использовать, и вне контекста его использования? Твоя мысль требует странного.

Потому, что 1) источник сравниваемого выражения вычисляется, 2) голова и хвост используются в нескольких выражениях.

Это только выглядит странно, а на самом деле очень удобно.

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

G>Я так понимаю, ты сторонник обфускации, потому что не любишь, когда чужие люби читают твои программы.

С чего бы это?

Сторонники обфускации все собрались в лагере JK.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[9]: Ленивые языки - за и против
От: thesz Россия http://thesz.livejournal.com
Дата: 18.12.08 09:06
Оценка:
VD>>>ОК, принимается. С оговоркой. Ленивые списки (или их аналоги) сейчас есть практически везде. И функции склеивать можно даже в C#. А уж для разных ОКамлов и Немерлов это самая, что ни на есть банальщина.
T>>I believe it when I see it.
T>>Как минимум для OCaml ты не прав.
T>>Rewrite rules для OCaml нет. Более того, deforestation (которая склейка функций) для строгих языков может изменить семантику программы. Без этой оптимизации программа не будет работать, а с оптимизацией — будет. Поэтому такие преобразования никто для ML семейства не пишет (за исключением Lazy ML).
VD>Нет нужны заниматься математическим онанизмом чтобы получить ленивый список или "склеить" ленивые функции. Как и нет нужны говорить об оптимизациях там где о них и речи не было. Так же не стоит думать, что оптимизации безуспешно применяемые в Хаскеле — это единственный верный путь.

"Безуспешно" — это ты со зла.

VD>Программа на не ленивом языке будет быстрее просто потому, что она прекрасно ложится на процессорную архитектуру и позволяет порождать эффективный код. Ленивости в ней с гульких хрен. Она не может фатально повлиять на производительность. А вот в обратном случае влияние видно не вооруженным взглядом.


Supero? Если уж говорить о производительности программ.

Я больше забочусь о производительности программиста.

Это его время сейчас ценнее всего.

После того, как он реализовал костяк идеи, можно озаботиться производительностью программы.

Это может занять много времени, но!

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

L>>>>3. Соответственно подобное разделение позволяет выписывать комбинаторы и использовать их отдельно. Повторное использование, что тоже показатель лаконичности.

VD>>>Не видел подобных проблем в не ленивых языках.
T>>Какие комбинаторы ты на них писал?
VD>Разные. В прочем, я по возможности обхожусь без них.
VD>Пример реализации Парсека на Немерле тебя устроит?

Почти.

Попробуй реализовать что-нибудь вроде Deterministic, error-correcting parser combinators.

В Парсеке всего одно место, где нужна ленивость.

К тому же, он являет собой пример не совсем хорошего дизайна, например, часть грамматики наподобие (char 'a' >> char 'b' >> char 'c' >> return ()) <|> return () может пропустить до двух символов по возвращению. Об этом надо помнить, и это напрягает.

T>>Лисперы быстро обижаются и отваливаются. Проходили. Они же как дети.

VD>Лисперы и хаскелисты — это два лагера которые друг-друга стоят. Каждый прет свою линию и не слушает аргументов оппонента. А я вот как человек со стороны (не лиспер и не хаскелист) позицию лисперов разделяю больше. В Лиспе ДСЛ-и на каждом шагу. Они там базовый строительный элемент. Хаскель этим похвастаться не может.

Я не фанат определённого ЯП или подхода.

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

Если выгоден DSEL — будет DSEL. Нужен императивный язык — будет императивный (но как можно меньше). И тп.

T>>Лично для меня сейчас написание последовательного кода на Java является проблемой.

VD>Пиши не последовательный. Про Functional Java слышал?

Не могу. Надо последовательный. Требования.

T>>Там надо думать, что за чем идёт.

VD>Ой-йой-йой! Ужас! Ну, думай о том, как связывать одно вычисление с другим по средствам монад. Functional Java и Callabe тебе в путь.

В монадах тоже надо думать о последовательности, поэтому у меня их немного.

T>>И переменные можно переписать, а значит, испортить.

VD>Ужас то какой?
VD>Скачай Scala и используй def.

Нельзя. Надо использовать Java.

T>>О!

T>>Я так и знал.
T>>Всё сведётся к банальной оптимизации.
VD>Я бы сказал к банальной жизни. Можно долго писать кипятком от ленивости, но когда приходят реальные дела, то кипятком сыт не будешь.

То есть, я делаю нереальные дела.

Это самый лучший комплимент за всю историю моего пребывания на RSDN.

Спасибо.

T>>Тебе сперва проблему надо решить, а потом оптимизировать решение.

VD>Мне принципиально не нужно недостаточно быстрое решение при реализации которого я к тому же буду вынужден ставить свой мозг раком.

Видимо, у тебя проблемы либо простые, либо уже тобой решённые неоднократно.

Это нормально, нечего этого стыдиться.

А я сейчас пишу преобразование VHDL в нетлист. И моделирование поведения оного нетлиста. Я никогда этого не делал. И никто из моих знакомых этого не делал.

VD>В C# — да, год. Итераторы на которых реализованы эти функции имеются в C# уже 5 лет. А базовые примитивы (итераторы) на которых можно было реализовать данные функции были в Яве с ее рождения. А это год эдак 95-ый.


Они были неполиморфны, посему практически непригодны.

T>>А почему появилось-то?

VD>Спасибо в том числе и Хаскелю. Но появилось же? Так что же теперь (в 2008-ом) использовать протухшие аргументы?

Действительно.

Я не понимаю, зачем ты используешь протухшие аргументы.

Если быть серьёзным, то 1) оные ленивые вычисления пришлёпнуты, иначе не назовешь, и их применение из-за этого ограничено, и 2) обширной практики использования их в языке нет.

Грубо говоря, вы не знаете, где и с чем столкнетесь при их использовании. Вдруг у вас память потечёт со страшной силой?

T>>Вот, смотри: http://thesz.mskhug.ru/browser/hiersort/core/S.hs

T>>Это ядро моей самопальной системы моделирования аппаратуры.
T>>Оно пишется за 15 минут и сразу готово к использованию.
T>>Такое же дело на сообщениях для Эрланга товарищ Gaperton продумывал в районе недели, не меньше.
VD>Ну, я же не говорил, что Гапертон гений, а ты нет?
VD>Какое это имеет отношение к делу?

Это простой пример, как ленивые списки вылезают в практических задачах.

T>>Монады-то здесь причём?

T>>Монады к strictness отношения не имеют.
VD>Еще один. Ну, покажи как достичь ее без монад.

Вот ты написал:
f :: Int -> Int -> Int
f a b = a + b

Выглядит лениво. Вместо результата будет замыкание ((+) a b), где и аргументы — замыкания.

Пишем так:
f :: Int -> Int -> Int
f 0 b = b
f a b = a+b

Здесь форсируется первый аргумент перед вычислением.

Всё равно мало.

Пишем вот этак:
f :: Int -> Int -> Int
f !a !b = let s = a + b in s `seq` s


Вуаля!

При вызове мы форсанём оба аргумента, да ещё и сумму.

Такие вещи надо расставлять только в определённых местах, многое выводит компилятор.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[7]: Ленивые языки - за и против
От: thesz Россия http://thesz.livejournal.com
Дата: 18.12.08 09:38
Оценка:
T>>Так что я не вижу причин, по которым надо это заминать.
G>Ну, если бы ты видел причины, то не заставил бы меня напоминать тебе, что:
G>1) ни одного коммерческого ПО, которое дошло бы до продакшн, и которому требуется поддержка, ты на Хаскеле не написал.

Ээээ. И?

(Найдешь контраргумент к своим собственным словам, или подсказать?)

G>2) Твой опыт исключается двумя темами, из которых одну вы с potan не доделали, а вторая — это архитектурные прототипы харда, который ты делал в одиночку на выброс.


Я совсем не понял этого предложения.

G>3) Ни одна из этих программ не работала на пределе возможностей оборудования, и не была интерактивной.


Ээээ. И?

T>>Видимо, то было лично, вне просторов RSDN, а это "не считается".

G>Видимо, сейчас ты просто придумываешь те события, которых не было.

Это было при свидетелях. При том же самом potan.

Действительно, всё, что вне просторов RSDN, в зачёт не идёт.

Запомню.

T>>И как ты просто обязан знать, "знать и применять" не означает "способен просто и доходчиво объяснить другим".

G>Ну да, это на самом деле так. Способность научить — третий, высший уровень понимания предмета. Первый — повторение, второй — умение применять.
G>Удивительно, как же у тебя тогда-то получилось мне все объяснить, буквально год назад, а сейчас ты почему-то даже не пытаешься, все больше взываешь у духу святого Вадлера и грозишь гневом монад.

Личное общение и общение через форум полностью эквивалентны?

T>>>>Как контролируются задержки в ленивом ФЯ, я уже рассказывал. Как и всё в таких ФЯ, они контролируются высокомодульно — есть генератор, есть потребитель. Потребитель потребляет создаваемое, пока не сочтёт, что упёрся или не завершится время на решение.

G>>>Я тебя просил привести пример. Пример будет?
T>>Я не смогу написать что-то, отличное от абзаца выше.
G>Ты не сможешь этим методом контроллировать задержку, вознкающую на накопившейся невычисленной цепочке. Ты не сможешь доказать отсутствия возможности накопления таких цепочек. Поэтому, ты никак не можешь контроллировать эти задержки, не поставив везде strictness.

Софт-рилтайм, о котором у нас шла речь, это когда я большую часть времени не вылезаю за временные границы, а иногда вылезаю. Это описывается так, AFAIR: "мы всегда работаем быстрее миллисекунды, но иногда тормозим, бывает, 20 минут".

Это не жёсткие гарантии, это наиболее вероятное поведение программы.

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

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

T>>Я повторю свой вопрос: О чем же мы тогда спорим?

T>>Какой тезис я доказываю, с твоей точки зрения?
G>Начал ты с того, что обвинил меня в преждевременной оптимизации.

Формально там обвинения нет.

Более того, история началась не там, она началась где-то ещё. AFAIR.

Добавлю, что формально ты прав, конечно. За исключением того, что это не ответ на вопрос о тезисе, это рассказ об исторических событиях.

G>Потом я сказал, что считаю lazy annotation более продуктивной, чем strictness annotation. Привел обоснование. И попросил тебя по правилам это опровергнуть.


Опять не о моём тезисе.

Кстати.

Тут рядом очень интересное (я умею учиться и на чужом опыте тоже):

Видишь ли, я для себя всегда сам решаю, что для меня перевешивает.
http://rsdn.ru/forum/message/3218948.1.aspx


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

То есть, никто никогда не сможет соответствовать твоим внутренним критериям, пока ты так не решишь.

Подобрать аргументы в таком случае не представляется возможным по объективным причинам.

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


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

Комментарии вредны для свободы слова

G>Примерно такая хронология событий. А-аставайтесь с нами.


Здесь я оказался "волею судеб".

Придётся.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[9]: Ленивые языки - за и против
От: thesz Россия http://thesz.livejournal.com
Дата: 18.12.08 09:40
Оценка:
G>>>Меня бесполезно агитировать. И я не считаю Хаскель оптимальным выбором для очень широкого круга задач. И в особенности — высоконагруженных серверов. Как я сказал — верования меня не интересуют, меня интересуют факты, и рассуждения.
A>>Вы, боюсь, недостаточно знаете Хаскелл, чтобы такие обсуждения имели смысл.

VD>А ты уверен, что надо быть курицей, чтобы рассуждать о вкусе яичницы?


Поваром — да.

Курица здесь "Хаскель".
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[9]: Ленивые языки - за и против
От: thesz Россия http://thesz.livejournal.com
Дата: 18.12.08 09:48
Оценка:
VD>Можно конечно возразить, что писать функции аналогичные Repeat проще на ленивом языке, но ёлы-палы, кто же будет их писать постоянно? Нам реально нужны Map и Fiter. Ну, на крайняк напишем еще пару более специализированных функций. А скажем функции вроде Fold вообще бессмысленно делать ленивыми. Нам же ведь нужен результат, а не процесс!

*Main> foldr (\x list -> x+1:1:list) [] [1,error "aaa!!!",2]
[2,1,*** Exception: aaa!!!
*Main> take 2 $ foldr (\x list -> x+1:1:list) [] [1,error "aaa!!!",2]
[2,1]


С ленивыми fold проще.

Меньше надо думать.

И результат нам может быть нужен разный.

Чаще всего — это просто работающая программа, пусть медленно.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[9]: Ленивые языки - за и против
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 18.12.08 10:59
Оценка:
Здравствуйте, Gaperton, Вы писали:

Отличие: ленивость не по умолчанию, к сожалению, не будет лаконичной.

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


Generating power of lazy semantics

G>Видишь ли, я для себя всегда сам решаю, что для меня перевешивает.


Не для тебя, а для задачи. Что то доказывать для тебя, сам понимаешь — бессмысленно.
Re[8]: Ленивые языки - за и против
От: Gaperton http://gaperton.livejournal.com
Дата: 18.12.08 11:00
Оценка:
Здравствуйте, awson, Вы писали:

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


По моему, пустые разговоры развели вы с thesz. Содержательно, проблема именно в семантике вычислений по умолчанию.

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

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

Есть языки, где ленивые вычисления делаются явно — как например, в Схеме (delay-force, или что-то в этом роде), или Alice ML (посредством фьючерсов).

А> В том же Хаскелле strictness annotation можно расставить отнюдь не везде и отнюдь не всякое вычисление сделать строгим. Я не знаю, что конкретно Вы имеете в виду (если вообще) под "строгостью по умолчанию с lazy annotation", но предполагаю, что с этим будет еще хуже.


Вы думаете ваши предположения о свойствах того, чего вы не знаете, имеют какую-то ценность? Для примера, что такое Lazy Annotation и как она внедряется в срогий язык — почитайте книгу Криса Окасаки "Purely Functional Data Structures", где он описывает lazy annotation для SML. Слышали о таком парне и этой его работе? Вот и посмотрите, что он имеет под этим в виду, если вообще имеет.

Меня всегда удивляло — что именно заставляет людей, не понимающих о чем речь, лезть в дискуссию, и превращать ее в флейм. Ведь не могут никак смолчать, не могут!

A>Вы, боюсь, недостаточно знаете Хаскелл, чтобы такие обсуждения имели смысл.


Вы, боюсь, недостаточно разбираетесь в языках программирования, чтобы вести осмысленное обсуждение. Только и всего.
Re[9]: Ленивые языки - за и против
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 18.12.08 11:06
Оценка:
Здравствуйте, D. Mon, Вы писали:

L>>б) А что на Камлах и Немерлях пишут — map f . map g . map h?


DM>Пишут, пишут! Просто не List.map (который создает новый список), а, например, Enum.map (который ленивый).


Ну ты из контекста не выдирай

Обрати внимание, VladD2 писал про неленивые map/fold/filter. Ещё обрати внимание — я писал про итераторы.
Re[11]: Ленивые языки - за и против
От: thesz Россия http://thesz.livejournal.com
Дата: 18.12.08 11:10
Оценка:
VD>>>А ты уверен, что надо быть курицей, чтобы рассуждать о вкусе яичницы?
T>>Поваром — да.
Q>Бред.
Хрен.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[9]: Ленивые языки - за и против
От: thesz Россия http://thesz.livejournal.com
Дата: 18.12.08 11:13
Оценка:
G>Вы думаете ваши предположения о свойствах того, чего вы не знаете, имеют какую-то ценность? Для примера, что такое Lazy Annotation и как она внедряется в срогий язык — почитайте книгу Криса Окасаки "Purely Functional Data Structures", где он описывает lazy annotation для SML. Слышали о таком парне и этой его работе? Вот и посмотрите, что он имеет под этим в виду, если вообще имеет.

SML с указаниями ленивости так и не стартовал. Вне зависимости от того, насколько хороша идея Окасаки.

Хорошо стартовали многие строгие языки, и один ленивый — Хаскель.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[12]: Ленивые языки - за и против
От: Qbit86 Кипр
Дата: 18.12.08 11:28
Оценка:
Здравствуйте, thesz, Вы писали:

VD>>>>А ты уверен, что надо быть курицей, чтобы рассуждать о вкусе яичницы?

T>>>Поваром — да.

Ну да, ну да. Сперва добейся того же, что и Сергей Зефиров, а потом берись критиковать Хаскель.
Глаза у меня добрые, но рубашка — смирительная!
Re[10]: Ленивые языки - за и против
От: geniepro http://geniepro.livejournal.com/
Дата: 18.12.08 12:04
Оценка:
Здравствуйте, thesz, Вы писали:

T>Пишем вот этак:

T>
T>f :: Int -> Int -> Int
T>f !a !b = let s = a + b in s `seq` s
T>


T>Вуаля!


T>При вызове мы форсанём оба аргумента, да ещё и сумму.


Такое решение можно обозвать двумя терминами -- "обфускация" и "индокод".

Кстати, а разве такой вариант не сделает то, что нужно?
f :: Int -> Int -> Int
f a b = id $! a + b
Re[9]: Ленивые языки - за и против
От: awson  
Дата: 18.12.08 12:15
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Есть, например, языки, где не ленивыми являются только конструкторы, а все остальное — строгое. Пример — Hoar, в котором нет озвученных проблем, не может там накопится невычисленная цепочка, при этом — можно вполне комфортно манипутировать бесконечными структурами данных.

G>Вы думаете ваши предположения о свойствах того, чего вы не знаете, имеют какую-то ценность? Для примера, что такое Lazy Annotation и как она внедряется в срогий язык — почитайте книгу Криса Окасаки "Purely Functional Data Structures", где он описывает lazy annotation для SML. Слышали о таком парне и этой его работе? Вот и посмотрите, что он имеет под этим в виду, если вообще имеет.
G>Есть языки, где ленивые вычисления делаются явно — как например, в Схеме (delay-force, или что-то в этом роде), или Alice ML (посредством фьючерсов).
Вот вы заявляете что я "не умею читать, что мне пишут", на что я специально обращаю Ваше внимание, что веду речь о делах "вполне прагматичных" и о *выборе из существующих инструментов*. Должен ли я теперь понимать, что вы всерьез предлагаете Схему, Alice ML, Hoar и книгу Окасаки вместе или по-отдельности как лучший выбор по сравнению с GHC platform?

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

G>Есть языки, полностью ленивые по умолчанию, но где абсолютно все можно сделать строгим, как например, в Clean.
Как я понял, Вы достаточно разбираетесь в языках программирования, чтобы делать подобные утверждения. В связи с этим задам вопрос — делает ли Clean редукцию дальше WHNF?
Re[9]: Ленивые языки - за и против
От: VoidEx  
Дата: 18.12.08 12:19
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Что же до ленивости монад, то как я их понимаю — это средство заставить вычисления быть последовательными. Конечно можно углядеть ленивость и в монадах, но их суть как раз борьба с ленивостью в отдельных участках программы.

VD>Ты по всей видимости перепутал термины "последовательные" и "с побочными эффектами".

Я с тобой во многом согласен про ленивость по умолчанию, но твои рассуждения про монады лучше опустить, серьёзно.
Re[9]: Ленивые языки - за и против
От: VoidEx  
Дата: 18.12.08 12:26
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>В том, что компьютер на котором выполняется программа и так может выполнить B после A. Так что не иметь возможности напрямую воспользоваться этой базовой возможностью просто глупо. А уж привлекать для решения этой "сверх задачи" функциональные абстракции просто юмористично. Это уже теория ради теории.


Ничего не понял. Пользуйся. Тебя смущает, что блок кода имеет тип "Вычисление-значения int" а не просто "int"? Или слово "монада"? Всё равно, что в Немерле блок кода имел бы тип "computation of int" вместо просто "int" (просто умолчание другое выбрано, вместо 'pure int' и 'int' сделано 'int' и 'compute int'). Это просто такой декларативный способ описать вычисление. Плохо, что с ним мало, что можно сделать, разве что прицепить к другому вычислению, но это уже другой вопрос.

VD>Они применяются чтобы написать 3-5 базовых функций

А в монаде 2 функции.
Re[13]: Ленивые языки - за и против
От: Gaperton http://gaperton.livejournal.com
Дата: 18.12.08 12:27
Оценка:
Здравствуйте, Qbit86, Вы писали:

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


VD>>>>>А ты уверен, что надо быть курицей, чтобы рассуждать о вкусе яичницы?

T>>>>Поваром — да.

Q>Ну да, ну да. Сперва добейся того же, что и Сергей Зефиров, а потом берись критиковать Хаскель.


Клевый сайт! Спасибо, ржал как сумасшедший!
Re[10]: Ленивые языки - за и против
От: geniepro http://geniepro.livejournal.com/
Дата: 18.12.08 12:35
Оценка:
Здравствуйте, thesz, Вы писали:

T>Хорошо стартовали многие строгие языки, и один ленивый — Хаскель.


До Хаскелла был весьма популярен Clean, а до него -- коммерческая Миранда...
Хаскел-то и разработали, что бы избавиться от гнёта Миранды... :о)
Re[9]: Ленивые языки - за и против
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 18.12.08 12:37
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Я и так прекрасно знаю где и как рулит ленивость. Вот только, то что она иногда рулит не является доказательством того, что она рулит всегда и везде, и того, что она должна быть по умолчанию.


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

VD>Возьмем пример из этой статьи.

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

VD>Можно конечно возразить, что писать функции аналогичные Repeat проще на ленивом языке, но ёлы-палы, кто же будет их писать постоянно? Нам реально нужны Map и Fiter. Ну, на крайняк напишем еще пару более специализированных функций. А скажем функции вроде Fold вообще бессмысленно делать ленивыми. Нам же ведь нужен результат, а не процесс!


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

L>>1. Да, но записываются они не так лаконично, как в ленивых. А мы же о лаконичности, как преимуществе ленивости, не так ли?


VD>На фи не нужна экономия 2 символов раз в пол года. В тома же Немерле мне нужно дописать lazy в паре мест, чтобы получить ленивую структуру. Но на практике я, написав на том же Немерле пару мег кода, не создал ни одной (!) ленивой структуры данных. Ну, не нужны они мне.


Так не в символах надо мерить. Так то APL всех победит
У тебя детали реализации указываются — "этот код ленив".

VD>Может быть конечно, что мой мозг так устроен. Но мне кажется дело в другом (о чем я уже говорл). Дело в том, что:

VD>1. Я могу получать ленивость и другими средствами.
VD>2. Ленивость реально полезна только для списков (деревья приравниваем к ним).
VD>3. Большинство реальных задач не требует ленивости и не страдает от того, что ее не использовали.

Все пункты верны. Но они никак не опровергают мой тезис о том, что ленивость по умолчанию лаконична
Кстати, насчёт второго пункта — я так легко с ним согласился потому, что все структуры данных это по сути деревья, если не углубляться в подробности (графы, то-сё). Ну а раз для всех структур данных ленивость реально полезна — то о чём тут говорить?

L>>Если да — разверни. Если нет — поясни, зачем ты это написал.


VD>Затем, что ленивость при вызове некоторой функции вообще не нужна. То есть полностью.

VD>А раз это нужно только изредка, то и не проблемой будет пометить нужные места чем надо или написать их с использованием подходящих средств (вроде итераторов пример использования которых я привел выше).

Можно, но это не будет так лаконично, как с ленивостью по умолчанию.

VD>Ну, а для обработки списков в ленивой манере можно сделать библиотеку содержащую набор ленивых функций. Вот тот же LINQ отличный пример такого подхода. Столь удобной библиотеки я не видел ни в одном самом ленивом языке. Хотя казалось бы Шарпу (на котором написаны библиотеки LINQ-а) до ФЯ как до Пекина раком.


Э? Монада?

L>>а) А если не списки?

VD>То и это редкость ради которой не стоит иметь тот геморрой и проблемы с производительностью которые появляются в ленивых языках.

Списки — фигня! Есть масса задач, где структуры данных удобно делать ленивыми. Не делают — потому что в неленивых языках это будет оверхед.

VD>Там пишут по разному. Есть к примеру оператор |> который теми же F#-щиками юзается на право и на лево.

VD>Результат получается аналогичным твоему примеру.

Ладно, проехали. Этот кусок идёт от твоего замечания о неленивых map/fold/filter и от моего о неэффективности цепочки этих функций. Для ленивых спорить не о чем, само собой.

VD>То что Парсек повторен на том же Немерле и реализация получилась вполне компактная не сильно заденет твое самолюбие?


Да мы как бы не меня обсуждаем, так что вряд ли тут что нибудь способно задеть моё самолюбие.
Насчёт парсека на Немерле — мне так и не дали код самого парсека, только его использование. Может дать посмотреть?
Код там такой же лаконичный как и на Хаскеле?

VD>В не ленивых тоже можно, если функции композицию которых мы делаем тоже ленивы.

VD>Ну, ёлы-палы, пойми — это тоже самое но вместо map нам надо будет взять map_lazy.

С этим не спорю.

L>>И теперь нам надо foo.goo.hoo. В неленивом языке придётся выписывать map (f.g.h). Ну и где переиспользование в неленивом языке?

VD>Да, пиши так же. Только используй foo_lazy.goo_lazy.hoo_lazy и вместо точки оператор >>.

ОК.

VD>Можно. А можно и на макросах. Причем то что скажем Лисп и Немерле имеют первоклассные макросы не отменяет возможности создавать и ДСЛ-и на базе комбинаторов. Пример с повторением Парсека на Немерле я тебе уже привел. Разве его существование не отрицается твоей теорией?


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

VD>Да согласная я! Согласная!!! При условии, что ты добавишь слово "иногда".

VD>Вот только я тебе устал повторять. Она (ленивость) есть в ленивых по умолчанию языках.

Только не такая лаконичная.

VD>Пойми, если бы ленивость действительно постоянно давала бы ощутимый выигрыш, то в Лиспе и Немерле давно бы сделали макрос:

VD>Вот только овчинка выделки не стоит.

Это не доказательство. Так получается — всё то, чего нет в Немерле не стоит выделки.
А если я тебе тоже самое только про строгость со стороны Хаскеля скажу?

VD>Я бы поддержал твою теорию если бы за ленивость не приходилось бы платить. Но за нее нужно платить и платить дорого. Я не хочу связываться с монадами только из-за того, что мне нужно получить вывод на экран или просто выполнить две функции одну за другой. Я уж лучше буду просто делать что хочу, а когда понадобится, то и ленивостью воспользуюсь. Но контролируемой.


Да, кстати, немного оффтопик — думаю, что ленивость не по умолчанию медленнее, чем по умолчанию из-за оптимизаций компилятора.

L>>А что в С# код прямо так превращается в машинные команды, безо всяких разных преобразований?

VD>С преобразованиями. Но преобразования эти просты и линейны, так как система одна и та же — Фоннэймоновская.

Так ЛИ ещё проще. И преобразования там тоже простые. Впрочем, это мы отвлеклись.

VD>Хочу узнать когда Хаскель порвет (ну или хотя бы приблизится) по скорости MS С++ (об Intel я вообще молчу) скажем на тесте альфа-блэнда пробегавшем у нас в Философии?


Не знаю. В чём там проблемы расскажи? Может это алгоритм строгий? Ну так, наверное, Хаскель для других задач. Ну или на Хаскеле надо писать строго, будет не так лаконично, конечно.

L>>Повторю свою мысль — цепочка неленивых map/filter/fold неэффективна. Обосную — в силу создания промежуточных структур.


VD>Вот это и есть чушь. Цепочка ЛЮБЫХ map/filter/fold неэффективна в сравнении с аналогичным императивным кодом в силу наличия лишних телодвижений и косвенности. Единственный верный путь оптимизации этих цепочек — это суровый инланинг и превращение их в банальные циклы. Тогда не будет не только промежуточных структур данных, но и вообще ничего лишнего. Будет только сам алгоритм приведенный к виду наиболее эффективно вычисляемому на современных процессорах.


VD>Произвести подобный инлайнинг можно и для ленивой версии и для не ленивой, но в общем случае заинлайнить не ленивую версию будет проще, так как вычисление не может быть передано черти куда.


Тогда вопрос. Заинлайнина ли неленивая версия сейчас? Или всё таки создаются промежуточные структуры. Ленивая — да, не будет порождать структуры + есть stream fusion для компиляции в аналогичный for (в ghc).

L>>И зачем ты мне про LINK написал я не понимаю. Я же тебе написал про итераторы, как ты хочешь моими же аргументами эти же аргументы опровергнуть?

VD>Твои аргументы за ленивый язык. А это пример ленивой обработки списков (притом весьма выразительной) в на сквозь императивном не ленивом языке. Понятно?

Нет, так как я оспаривал не это.

VD>Я смотрю на результат. А он плачевный. Компилируемый язык временами сливает скриптам. А на теоритические рассуждения пускай смотрят юноши бледные с взорами горящими.


Тут можно много говорить
1. Инструмент надо использовать для того, для чего он предназначен.
2. Компилируемый сливает скриптам на том же алгоритме? Можно пример?

VD>Мне надоело отвечать на одни и те же вопросы по сто раз. Отвечаю в последний раз. Увидел. Но не везде и не увидел зачем для этого иметь ленивый язык.


О "везде" я речь не вёл. И как можно увидеть преимущества лени по умолчанию и не увидеть, зачем для этого иметь ленивый язык?

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


Ну то есть всё таки такой бенефит иногда есть?

VD>Если рассуждать о Хаскеле, то мне в нем намного больше нравится его система типов поддерживающая классы типов. Вот это действительно интересное решение которое способно повлиять на лаконичность в масштабах всего приложения. А ленивость по умолчанию... Ну, короче ты понял.


Понял

L>>При чём здесь монады?


VD>Притом, что их повсеместное применение в Хаскле как раз вызвано его ленивостью. В обычных языках монады могут понадобиться раз в год. Скажем в F# вот сделали интересное решение для поддержки параллельных вычислений на их базе. Такое их применение я расцениваю как красивое решение. А выводить с их помощью значения на консоль — это, извините за грубость — маразм!


Надо делать отдельную тему.

L>>А стриктнесс в Хаскеле достигается совсем другими механизмами. Подавляющее большинство монад — ленивы. Я же говорю — не разобрался.


VD>Да, ну? Другими средствами? Ой как я сер! Просвети, плиз. Что за другие механизмы такие?


Паттерн матчинг, seq, ($!)

VD>Что же до ленивости монад, то как я их понимаю — это средство заставить вычисления быть последовательными. Конечно можно углядеть ленивость и в монадах, но их суть как раз борьба с ленивостью в отдельных участках программы.

VD>Ты по всей видимости перепутал термины "последовательные" и "с побочными эффектами".

Я ничего не перепутал. Ты неправильно понимаешь что такое монады. Монада IO — да, средство заставить вычисления быть последовательными. Другие — совсем необязательно. Монада — всего лишь интерфейс. Как это интерфейс может вычислять последовательно?
;
Re[7]: Ленивые языки - за и против
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 18.12.08 12:55
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>И какое из этих обоснований говорит в пользу того, что все должно быть по умолчанию ленивым, а не строгим?


Нет слов. Я говорил, что всё должно быть ленивым по умолчанию?
Нет, я говорил, что у ленивости по умолчанию тоже есть преимущества.

Как ты думаешь, если у просто ленивости есть свои преимущества, чего же не пишут с её использованием на неленивых языках? Потому что неудобно и неэффективно.
Re[11]: Ленивые языки - за и против
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 18.12.08 13:36
Оценка:
Здравствуйте, geniepro, Вы писали:

G>Кстати, а разве такой вариант не сделает то, что нужно?


Да вообще bang patterns достаточно, если мы везде их будем использовать.
Re[9]: Ленивые языки - за и против
От: thesz Россия http://thesz.livejournal.com
Дата: 18.12.08 16:13
Оценка:
G>Раз не можешь объяснить — значит не понимаешь. Это раз. На форуме ты в более выгодных условиях, чем в очном разговоре, так как не должен отвечать немедленно, и можешь как следует подумать. Это два. И третье — общение через форум — это публичная дискуссия, и поэтому ты должен трижды подумать, прежде чем перейти на личности. Компрене ву?

T>>>>Я повторю свой вопрос: О чем же мы тогда спорим?

T>>>>Какой тезис я доказываю, с твоей точки зрения?
G>>>Начал ты с того, что обвинил меня в преждевременной оптимизации.
T>>Формально там обвинения нет.
G>

G>Короче, ты сторонник преждевременной оптимизации.

G>Формально, я на это ответил не как на обвинение, а дал вежливое разъяснение своей позиции.
T>>Добавлю, что формально ты прав, конечно. За исключением того, что это не ответ на вопрос о тезисе, это рассказ об исторических событиях.
G>У моего тезиса не выросли ножки, он никуда не убежал, и до сих пор находится по тому же адресу. Если тебе что-то в нем непонятно, он кажется тебе размытым и неоднозначно сформулированным — готов его уточнить по любому из твоих вопросов.
G>http://rsdn.ru/forum/message/3215352.1.aspx
Автор: Gaperton
Дата: 15.12.08


Я чуть выше выделил жирным мой вопрос.

Я сейчас читаю твой ответ и ничего не понимаю.

Ладно, зайду с другой стороны.

В общем и целом, конкретно сейчас конкретно мой опыт говорит, что первый вариант практически любой программы, которую ты ещё не писал, быстрее всего получится написать на Хаскеле. В этом я поддерживаю awson (http://rsdn.ru/forum/message/3214147.1.aspx
Автор: awson
Дата: 15.12.08
)

Даже первый вариант высоконагруженного сервера.

Это утверждение условно, то есть имеет условия — например, знание Хаскеля. Малый опыт в предметной области — тоже условие.

Это утверждение может быть поддержано теоретическими аргументами (экстремальная простота ЛИ и максимальная мощность вычислимых термов при ленивых вычислениях).

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

Грубо говоря, надо успеть провернуть пару-тройку итераций прежде, чем конкуренты успеют сообразить хотя бы одну. При этом минимизируя затраты по всем фронтам. Значит, нам надо будет пару раз поменять техзадание и гарантировано надёжно распространить изменения по всему коду.

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

Что получается?

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

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

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

В общем и целом, фора у Хаскеля по одному или более параметров в случае программы, которую ты ещё не писал.

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

PS
http://thesz.livejournal.com/483191.html
PPS
Что подумалось.

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

А вот обратное не совсем верно.

Грубо говоря, если у тебя строгий map, то ты не можешь сделать его ленивым, просто пометив, если у тебя под рукой нет его текста. Форсировав чанк с отложенным map, ты обязательно вычислишь и голову, и хвост. Не уверен, что это хорошо. Точнее, уверен, что это плохо.

Whole program analysis, получается, нужен.

Получается, что аннотации ленивости дороги в сравнении.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[13]: Ленивые языки - за и против
От: thesz Россия http://thesz.livejournal.com
Дата: 18.12.08 16:15
Оценка:
VD>>>>>А ты уверен, что надо быть курицей, чтобы рассуждать о вкусе яичницы?
T>>>>Поваром — да.

Q>Ну да, ну да. Сперва добейся того же, что и Сергей Зефиров, а потом берись критиковать Хаскель.


Что это означает?
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[11]: Ленивые языки - за и против
От: thesz Россия http://thesz.livejournal.com
Дата: 18.12.08 16:25
Оценка:
T>>Хорошо стартовали многие строгие языки, и один ленивый — Хаскель.
G>До Хаскелла был весьма популярен Clean, а до него -- коммерческая Миранда...
G>Хаскел-то и разработали, что бы избавиться от гнёта Миранды... :о)

http://clean.cs.ru.nl/Recent_Latest_News/recent_latest_news.html

Первый релиз Clean 1994.

http://research.microsoft.com/en-us/um/people/simonpj/papers/history-of-haskell/history.pdf

hbc — 1990.

В то время было слишком много ФЯ.

Хаскель я начал использовать чуть более, чем игрушечно в 1999 году, а с Clean познакомился на год позже.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[11]: Ленивые языки - за и против
От: thesz Россия http://thesz.livejournal.com
Дата: 18.12.08 16:29
Оценка:
G>- А, я кажется понял, о ком ты говоришь. У него, кстати, — небрежно говорю я, — жим штанги 120, ты знаешь?

(делает деревянное лицо)

Да!

Я очень сильный!
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[10]: Ленивые языки - за и против
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 18.12.08 17:28
Оценка:
Здравствуйте, thesz, Вы писали:

T>В общем и целом, конкретно сейчас конкретно мой опыт говорит, что первый вариант практически любой программы, которую ты ещё не писал, быстрее всего получится написать на Хаскеле. В этом я поддерживаю awson (http://rsdn.ru/forum/message/3214147.1.aspx
Автор: awson
Дата: 15.12.08
)


Кстати, да, я активно использую Хаскель именно в прототипировании.
Re[12]: Ленивые языки - за и против
От: geniepro http://geniepro.livejournal.com/
Дата: 18.12.08 18:11
Оценка:
Здравствуйте, lomeo, Вы писали:

L>Да вообще bang patterns достаточно, если мы везде их будем использовать.


Две проблемы: нестандартность (Hugs98 не понимает) и невозможность использования в лямбдах...
Re[12]: Ленивые языки - за и против
От: geniepro http://geniepro.livejournal.com/
Дата: 18.12.08 18:12
Оценка:
Здравствуйте, thesz, Вы писали:

T>Первый релиз Clean 1994.


Надо же, я думал Клин старше...
Re[13]: Ленивые языки - за и против
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 18.12.08 18:26
Оценка:
Здравствуйте, geniepro, Вы писали:

L>>Да вообще bang patterns достаточно, если мы везде их будем использовать.


G>Две проблемы: нестандартность (Hugs98 не понимает) и невозможность использования в лямбдах...


Кто-то пользуется Hugs98??
Ну, а в лямбдах вообще много проблем — больше одного паттерна не напишешь, например. Но не bang patterns:

{-# LANGUAGE BangPatterns #-}
main = print ((\ !x !y -> x+y) (2+2) (4-1))


после \ только пробел оставляй или первый параметр в скобки бери первый параметр, а то будет думать, что это оператор такой (\!)
Re[13]: Ленивые языки - за и против
От: Курилка Россия http://kirya.narod.ru/
Дата: 18.12.08 18:27
Оценка:
Здравствуйте, geniepro, Вы писали:

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


T>>Первый релиз Clean 1994.


G>Надо же, я думал Клин старше...


Это именно первый публичный релиз по ходу дела, перый "внутренний" был ещё в 1987-м вроде как (здесь).
SPJ вроде не раз упоминал, что Плазмейер активно участвовал в работе над Хаскелем и по первости были идеи "слить" 2 языка.
Re[14]: Ленивые языки - за и против
От: Аноним  
Дата: 18.12.08 22:26
Оценка:
Здравствуйте, lomeo, Вы писали:

L>Кто-то пользуется Hugs98??


Да. Я, регулярно. Потому что на моём айподе ghc не завёлся, а геморроиться с портированием мне лень.
Re[10]: Ленивые языки - за и против
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.12.08 05:31
Оценка:
Здравствуйте, lomeo, Вы писали:

L>Обрати внимание, VladD2 писал про неленивые map/fold/filter. Ещё обрати внимание — я писал про итераторы.


Вообще-то я их не делил. И говорил тебе, что как раз таки есть линивые формы этих функций которые точно так же можно объеденять в комбинаторы.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Ленивые языки - за и против
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.12.08 05:43
Оценка:
Здравствуйте, lomeo, Вы писали:

VD>>Я и так прекрасно знаю где и как рулит ленивость. Вот только, то что она иногда рулит не является доказательством того, что она рулит всегда и везде, и того, что она должна быть по умолчанию.


L>Я не говорил о том, что она должна быть по умолчанию. Я говорил о том, что у ленивости по умолчанию есть свои преимущества.


А недостатков нет?

Мне надоело повторять одно и то же по сто раз.

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

Решение Хаскеля — это предпочтение чего-то и потери чего-то другого.

Несомненно, что есть люди которые считаю, что преимущества перевешивают недостатки. Но есть и другие.

Тормоза (притом не предсказуемые), необходимость использования монад на ровном месте, необходимость думать о коде как о ленивом для меня превышают преимущества которые можно из этого извлечь. Ибо извлекаются они изредка, а проблемы создают постоянно.

Собственно на этом я данную дискуссию закончил. Просьба не отвечать на мое сообщение если у вас не будет аргументов которые смогут зародить во мне сомнение в моей правоте, потому как повтор догм изрекаемых сторонниками Хаскеля уже порядком утомил.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Ленивые языки - за и против
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.12.08 05:49
Оценка:
Здравствуйте, VoidEx, Вы писали:

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


VD>>В том, что компьютер на котором выполняется программа и так может выполнить B после A. Так что не иметь возможности напрямую воспользоваться этой базовой возможностью просто глупо. А уж привлекать для решения этой "сверх задачи" функциональные абстракции просто юмористично. Это уже теория ради теории.


VE>Ничего не понял. Пользуйся. Тебя смущает, что блок кода имеет тип "Вычисление-значения int" а не просто "int"? Или слово "монада"?


Меня смущает высосанная из пальца необходимость использовать сущности (в данном случае монады) для элементарных вещей вроде последовательного исполнения. Я хочу чтобы была гарантия, что написав A(); B(); я получил бы последовательное их выполнение. И не хочу иметь геморрой.

VE>Всё равно, что в Немерле блок кода имел бы тип "computation of int" вместо просто "int"


А зачем?

VE>(просто умолчание другое выбрано, вместо 'pure int' и 'int' сделано 'int' и 'compute int').


Нет. Не просто. Вот А после Б — это просто. А связывание А и Б по средством функций и каких-то там промежуточных структур данных — блин, маразм полнейший. Причем вызванный пуританскими рассуждениями о чистоте.

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


Это просто такой мазохизм. Смысла нет, но очень красиво (для некоторых).

VD>>Они применяются чтобы написать 3-5 базовых функций

VE>А в монаде 2 функции.

И они лишние в 99% случаев.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[11]: Ленивые языки - за и против
От: deniok Россия  
Дата: 19.12.08 06:05
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Меня смущает высосанная из пальца необходимость использовать сущности (в данном случае монады) для элементарных вещей вроде последовательного исполнения. Я хочу чтобы была гарантия, что написав A(); B(); я получил бы последовательное их выполнение. И не хочу иметь геморрой.


А кстати, вот, насколько я помню, в C++ нет гарантии последовательного исполнения в конструкции f(A(),B()). Имеется в виду порядок вычисления аргументов. Дотнет и/или Немерле дают здесь какую-либо гарантию?
Re[11]: Ленивые языки - за и против
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 19.12.08 06:21
Оценка:
Здравствуйте, VladD2, Вы писали:

L>>Обрати внимание, VladD2 писал про неленивые map/fold/filter. Ещё обрати внимание — я писал про итераторы.


VD>Вообще-то я их не делил. И говорил тебе, что как раз таки есть линивые формы этих функций которые точно так же можно объеденять в комбинаторы.


VD>Так что для реальной жизни важно чтобы map, fold, filter, forall и т.п. не проигрывали по скорости аналогичным циклам в компилируемых языках. А ленивы он или нет дело десятое.


На что я тебе ответил

В цепочке map/filter/fold важно ленивы они или нет. Неленивые — неэффективны (или вообще невозможны для бесконечных списков). Поэтому так популярны итераторы.


И понеслась!..
Re[11]: Ленивые языки - за и против
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 19.12.08 06:31
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>>>Я и так прекрасно знаю где и как рулит ленивость. Вот только, то что она иногда рулит не является доказательством того, что она рулит всегда и везде, и того, что она должна быть по умолчанию.


L>>Я не говорил о том, что она должна быть по умолчанию. Я говорил о том, что у ленивости по умолчанию есть свои преимущества.


VD>А недостатков нет?


Есть.

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


Даже не знаю, что сказать.

VD>Решение Хаскеля — это предпочтение чего-то и потери чего-то другого.


Согласен.

VD>Несомненно, что есть люди которые считаю, что преимущества перевешивают недостатки. Но есть и другие.


При чём тут люди? Есть ситуации (задача, сроки, знание языка и т.д.), когда перевешивают. Есть другие.

VD>Тормоза (притом не предсказуемые), необходимость использования монад на ровном месте, необходимость думать о коде как о ленивом для меня превышают преимущества которые можно из этого извлечь. Ибо извлекаются они изредка, а проблемы создают постоянно.


То, что для тебя таких ситуаций (когда ленивость по умолчанию перевешивает) нет, не означает, что их нет вообще.

VD>Собственно на этом я данную дискуссию закончил. Просьба не отвечать на мое сообщение если у вас не будет аргументов которые смогут зародить во мне сомнение в моей правоте, потому как повтор догм изрекаемых сторонниками Хаскеля уже порядком утомил.


К сожалению, я не знаю, что способно зародить в тебе сомнение. Мало того, неприятия твоей точки зрения у меня не было. Я всего лишь отставивал своё мнение. У ленивости по умолчанию есть бенефиты — например, лаконичность. Наверное, стоило добавить — не везде, не всегда, не для всех, может быть и спора не было бы.
Re[15]: Ленивые языки - за и против
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 19.12.08 06:37
Оценка:
Здравствуйте, http://migmit.vox.com/, Вы писали:

L>>Кто-то пользуется Hugs98??


HMV>Да. Я, регулярно. Потому что на моём айподе ghc не завёлся, а геморроиться с портированием мне лень.


Да ты извращенец!
Re[11]: Ленивые языки - за и против
От: Mamut Швеция http://dmitriid.com
Дата: 19.12.08 07:37
Оценка:
M>>А что, Nemerle уже порвал?
VD>В некоторых случаях — да. В среднем, позволяет писать код близкий по скорости к С++-ному.

Я не про некоторые случаи

Хочу узнать когда Хаскель порвет (ну или хотя бы приблизится) по скорости MS С++ (об Intel я вообще молчу) скажем на тесте альфа-блэнда пробегавшем у нас в Философии?




dmitriid.comGitHubLinkedIn
Re[10]: Ленивые языки - за и против
От: Gaperton http://gaperton.livejournal.com
Дата: 19.12.08 08:42
Оценка:
Здравствуйте, thesz, Вы писали:

T>Я чуть выше выделил жирным мой вопрос.


Свои тезисы формулируй пожалуйста сам. Я тебе уже сказал, что единственное, что ты сформулировал четко — это то, что я ничего не понимаю в ФП. Догадываться, что ты еще хочешь сказать, не вижу смысла — скажи это прямо. Пока ты этого не сделаешь — спорить не буду. Времени жалко.

T>Я сейчас читаю твой ответ и ничего не понимаю.


Мне кажется, я простым русским языком пишу. Извини, лучше не смогу. Формулировка "ничего не понимаю" практически исключает возможность общения.

T>Ладно, зайду с другой стороны.


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

T>В общем и целом, конкретно сейчас конкретно мой опыт говорит, что первый вариант практически любой программы, которую ты ещё не писал, быстрее всего получится написать на Хаскеле. В этом я поддерживаю awson (http://rsdn.ru/forum/message/3214147.1.aspx
Автор: awson
Дата: 15.12.08
)


Первый вариант практически любой программы, которую ты еще не писал, быстрее всего получится написать на том языке, который ты знаешь лучше всего. Учитывая, что ты умеешь хорошо писать всего на трех языках — С, Хаскеле, и tcl (всякие Эпиграммы не считаем), меня не сильно удивляет, что именно говорит твой опыт.

Удивляет другое — что ты при этом претендуешь на вселенскую истину, думая, что твой субъективный опыт перечеркивает опыт всех остальных людей. Более того, я не совсем понимаю, почему я это от тебя выслушиваю — к теме ленивости и строгости по умолчанию это относится слабо.

T>Даже первый вариант высоконагруженного сервера.


На Хаскеле при этом ты писал не "практически любые программы", а консольные приложения, без активного ввода-вывода, без персистентных данных, без сетевого ввода вывода, без GUI, то есть — неинтерактивные, неограниченные по ресурсам, работающие в batch mode утилиты.

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

T>Что получается?


Получается, что у тебя недостаточно опыта, чтобы делать такие выводы, так как ты просто не знаком с нюансами. К сожалению, ты просто понятия не имеешь, о чем говоришь. Простой такой контрпример — складскую программу я сделаю на 1С примерно в 10 раз быстрее, чем ты на Хаскеле. Дальнейшее опускаю — у меня нет ни малейшего желания рассуждать на тему, насколько ленивые вычисления лучше чем строгие. Не интересно.

T>Что подумалось.


T>Из моего опыта следует, что аннотации строгости в общем не нарушают общего ленивого порядка вычислений.


Не понимаю, что такое "общий ленивый порядок вычислений".

T>Всего одна аннотация поможет убрать ленивость из значительного числа вычислений.


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

T>А вот обратное не совсем верно.


Совсем верно. Нет никакой фундаментальной разницы между аннотациями строгости и ленивости.

T>Грубо говоря, если у тебя строгий map, то ты не можешь сделать его ленивым, просто пометив, если у тебя под рукой нет его текста.


Строгий или ленивый map — это не совсем корректно сказать. Смотри.

map( [ H | T ], F ) -> [ F( H ) | map( T, F ) ];
map( [], _ ) -> [].

Здесь у тебя два момента. Первое — ленивый или не ленивый у тебя конструктор списка. Это — одно. Второе — ленивое или энергичное у тебя вычисление функции F. Допустим, я хочу сделать применение F энергичным (сама F внутри может быть при этом ленивой) — это я пишу в коде map, а тип конструктора списка — таким же как конструктор списка-аргумента. Второе я могу сделать, сохранив общее полиморфное описание алгоритма. Так сделано в Clean, например.

T> Форсировав чанк с отложенным map, ты обязательно вычислишь и голову, и хвост. Не уверен, что это хорошо. Точнее, уверен, что это плохо.


Если я напишу (назовем ленивое присваивание ?=) вот так

Res ?= map( Source, Fun )

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

T>Whole program analysis, получается, нужен.

T>Получается, что аннотации ленивости дороги в сравнении.

Не вижу, как это получается. Ты пример приводить будешь в качестве иллюстрации? Спрашиваю уже раз в пятый.
Re[11]: Ленивые языки - за и против
От: VoidEx  
Дата: 19.12.08 09:22
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Меня смущает высосанная из пальца необходимость использовать сущности (в данном случае монады) для элементарных вещей вроде последовательного исполнения. Я хочу чтобы была гарантия, что написав A(); B(); я получил бы последовательное их выполнение. И не хочу иметь геморрой.


Так и пишут. Вот прямо так do { A; B }, ну или A >> B. Тут, конечно, не точка с запятой, но неужто принципиально.

Всё-таки тебя пугает факт наличия страшной монады. Было бы ключевое слово "action of", наверняка бы не волновался. Типа как mutable для обозначения изменяемой переменной, так и action для обозначения нечистого блока кода.
Re[12]: Ленивые языки - за и против
От: VoidEx  
Дата: 19.12.08 09:25
Оценка:
Здравствуйте, Mamut, Вы писали:

M>Я не про некоторые случаи


M>

M>Хочу узнать когда Хаскель порвет (ну или хотя бы приблизится) по скорости MS С++ (об Intel я вообще молчу) скажем на тесте альфа-блэнда пробегавшем у нас в Философии?


M>)


Предполагаю, что Немерле достаточно (для некоторых) приблизился, иначе бы этой фразы в скобках не было бы
Re[12]: Ленивые языки - за и против
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.12.08 09:25
Оценка:
Здравствуйте, lomeo, Вы писали:

L>На что я тебе ответил


L>

L>В цепочке map/filter/fold важно ленивы они или нет. Неленивые — неэффективны (или вообще невозможны для бесконечных списков). Поэтому так популярны итераторы.


L>И понеслась!..


И как из этих слов ты вывел, что я говорил о не ленивых версиях этих функций? Как раз очевидно видно, что я говорил обо всех вариантах.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[12]: Ленивые языки - за и против
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.12.08 09:27
Оценка:
Здравствуйте, Mamut, Вы писали:

M>

M>Хочу узнать когда Хаскель порвет (ну или хотя бы приблизится) по скорости MS С++ (об Intel я вообще молчу) скажем на тесте альфа-блэнда пробегавшем у нас в Философии?


M>)


Ну, и? Где тест Хаскеля на этом примере?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[12]: Ленивые языки - за и против
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.12.08 09:30
Оценка:
Здравствуйте, deniok, Вы писали:

D>А кстати, вот, насколько я помню, в C++ нет гарантии последовательного исполнения в конструкции f(A(),B()). Имеется в виду порядок вычисления аргументов. Дотнет и/или Немерле дают здесь какую-либо гарантию?


Я не знаток стандартов. Посему не уверен, что твое первое утверждение верно. Но это чистой воды офтоп. Достаточно, что все перечисленные языки гарантируют выполнение A(); B().
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[13]: Ленивые языки - за и против
От: Mamut Швеция http://dmitriid.com
Дата: 19.12.08 14:03
Оценка:
M>>

M>>Хочу узнать когда Хаскель порвет (ну или хотя бы приблизится) по скорости MS С++ (об Intel я вообще молчу) скажем на тесте альфа-блэнда пробегавшем у нас в Философии?


M>>)


VD>Ну, и? Где тест Хаскеля на этом примере?


Ээээ.

L>Насчёт оптимизаций — давай без риторических вопросов, что ты хочешь узнать? В GHC есть оптимизации, могу показать много. Всё соптимизировать разумеется нельзя. Хотя бы в силу того, что уже соптимизированное соптимизировать трудно.

Хочу узнать когда Хаскель порвет (ну или хотя бы приблизится) по скорости MS С++ (об Intel я вообще молчу) скажем на тесте альфа-блэнда пробегавшем у нас в Философии?


Мне то же самое интересно про Немерле. Хаскелистам, наверное, тоже

Просто ответ хаскелистов вполне ожидаем — не преназначен для числодробения. Что докажет....Да ничего оно не докажет Как и аналогичный вопрос, примененный к Немерле.

Какие-нибудь Эрлангисты тоже могут встать в позу и попросить наваять на Немерле сервер, держащий пару десятков тысяч запросов в секунду


dmitriid.comGitHubLinkedIn
Re[12]: Ленивые языки - за и против
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.12.08 18:11
Оценка:
Здравствуйте, VoidEx, Вы писали:

VE>Так и пишут. Вот прямо так do { A; B }, ну или A >> B. Тут, конечно, не точка с запятой, но неужто принципиально.


Это слишком примитивный пример. Рельно пишут куда заковырестей.

VE>Всё-таки тебя пугает факт наличия страшной монады. Было бы ключевое слово "action of", наверняка бы не волновался. Типа как mutable для обозначения изменяемой переменной, так и action для обозначения нечистого блока кода.


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

Если бы все было просто и можно было просто сказать компилятору, вот этот блок пожалуйста выполни последовательно, а вот этот как захочешь, то и вопросов бы не было. Но в борьбе за чистоту возможность выполнить что-то последовательно просто отняли. И предлагают вместо этого связывать вычисления сентетическими кострукциями. А синтаксчис — это как раз мелочи...
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[11]: Ленивые языки - за и против
От: Gaperton http://gaperton.livejournal.com
Дата: 21.12.08 10:52
Оценка:
Здравствуйте, geniepro, Вы писали:

T>>Хорошо стартовали многие строгие языки, и один ленивый — Хаскель.


G>До Хаскелла был весьма популярен Clean, а до него -- коммерческая Миранда...

G>Хаскел-то и разработали, что бы избавиться от гнёта Миранды... :о)

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

Отличия clean — он задуман, чтобы быть практичным ленивым языком. Uniqueness typing и быстрые "чистые" массивы. Кроме того, clean дает программисту контроль над unboxing. Данные фичи позволяют чистому ленивому языку clean иметь производительность, сравнимую с С++, в том числе и на массивах. То есть, при желании можно проиграть С++ (в меру туповатому gcc) не боле чем процентов 15-30. Если нашпиговать программу под завязку аннотациями строгости и unboxing-ом (анализаторы строгости никогда не смогут найти всю строгость — эта задача NP-полная).

Несколько лет назад мы на RSDN делали несколько микротестов для определения, насколько функциональная парадигма сосет. Ее тогда представляли Clean, OCaml, и Haskell. В качестве задач были взяты довольно неприятные для ФЯ — alpha blending и решето Эратосфена. Программы на Clean писал я. Так вот, решето работало примерно с такой же скоростью, как программа на С++, если пользоваться не vector<bool> а vector<char>, — задача упирается в память, и упаковка 8 значений в байт сильно помогала С++ реализации, что компилятор Clean делать не умел.

Стоит заметить, пока я не подавил всю ленивость в программе, оставив ее только там, где она была реально нужна — а это ленивые хвосты списков, программа вылетала по переполнению памяти, и просто не могла выполнить Эратосфена на мало-мальски вменяемом массиве данных, проблемы начинались с 10 тысяч. Смех один.

Разговоры про "высоконагруженный сервер" тоже довольно забавны. Это был микротест, на большой программе, которая должна предсказуемо себя вести в условиях ограниченных ресурсов, можно будет стреляться. А если у программы нетривиальные use cases — то вешаться, или убиваться об стену, потому что поведение будет разным при разных тестовых воздействиях — ленивость по умолчанию есть отличный источник багов с высоким severity, которые трудно найти.

В клине еще хорошо, что есть memory profiler — можно найти цепочку, отжирающую память. Теоретически. Меня это быстро задолбало, и я везде расставил строгость руками, так проще. Этим и закончится трахотня с расходом памяти на программе, которая работает на ограниченных ресурсах на Хаскеле — другого внятного способа контроля над проблемой нет (теоретически, наверное, возможно заставить сборщик мусора форсировать вычисления для того, чтобы подобрать отложенные цепочки, но это судя по всему не очень хороший подход). Не забивать же голову алгоритмом работы анализатора строгости, в самом деле.

Насчет alpha-blend — было примерно то же самое. Я в результате оставил ленивость только там, где она хорошо смотрелась (и, кстати, не давала penalty по производительности) — это бесконечный список случайных чисел. Так как расставлять везде строгость мягко говоря задалбывает, как решение само собой напрашивается расстановка аннотаций ленивости. Сугубо для экономии количества знаков.

Такую нотацию сложно придумать за пять минут, чтобы она была лишена косяков, но на первый взгляд, вполне достаточно знака ?. С семантикой "все что справа на том же уровне- лениво". Как-то так:

вызов функции fun — ленивый, аргументы вычисляются энергично.
x = ? fun a1 ... an

Вызов функции строгий, все аргументы ленивы.
x = fun ? a1 ... an

Ленивый только первый аргумент.
x = fun ( ? a1 ) ... an

Для справки, реализация на Haskell работала втрое медленнее, чем С++-реализация. И выглядела хуже, чем реализация на Clean — никакой хваленой красоты и выразительности не наблюдалось.
Re[12]: Ленивые языки - за и против
От: VoidEx  
Дата: 21.12.08 11:45
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>(анализаторы строгости никогда не смогут найти всю строгость — эта задача NP-полная).


А и не надо, чтобы находили всю строгость, надо, чтобы лучше человека. Для человека эта задача тоже NP-полная и он тоже её решить не в состоянии.
Re[12]: Ленивые языки - за и против
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 21.12.08 12:36
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Несколько лет назад мы на RSDN делали несколько микротестов для определения, насколько функциональная парадигма сосет. Ее тогда представляли Clean, OCaml, и Haskell. В качестве задач были взяты довольно неприятные для ФЯ — alpha blending и решето Эратосфена.


Вывод — alpha blending не для ленивых языков. Ну, или так — задачи, неприятные для ленивых языков, не стоит решать на ленивых языках, верно?

G>Такую нотацию сложно придумать за пять минут, чтобы она была лишена косяков, но на первый взгляд, вполне достаточно знака ?. С семантикой "все что справа на том же уровне- лениво". Как-то так:


Дело не только в нотации. Даже если не говорить о производительности — нотация будет выглядеть так же печально, как и strictness annotations в ленивых языках.
Тут же дело в том, что ты считаешь, что ленивость по умолчанию не нужна, верно? Т.е. нет задач, где ленивые языки выручают.
Кстати, что насчёт моего примера, ты не ответил тогда.

Ещё подумал — я уже VladD2 говорил, что, возможно, дело в том, удобно ли программисту представлять задачу в ленивых структурах данных, когда то, что требуется, вычисляется on demand. Возможно, для тебя это неудобно, поэтому ты видишь использование ленивости только в ленивых списках (утрируя).

Ленивость же можно использовать гораздо шире, например, уже всем известные комбинаторы для контрактов. Модный сейчас functional reactive programming лучше всего ложиться на ленивую модель. Ну и не стоит забывать, что ленивая модель более декларативна
Re[13]: Ленивые языки - за и против
От: Gaperton http://gaperton.livejournal.com
Дата: 22.12.08 01:30
Оценка:
Здравствуйте, VoidEx, Вы писали:

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


G>>(анализаторы строгости никогда не смогут найти всю строгость — эта задача NP-полная).


VE>А и не надо, чтобы находили всю строгость, надо, чтобы лучше человека. Для человека эта задача тоже NP-полная и он тоже её решить не в состоянии.


Зачем ее решать, если задача указать ленивость при строгости по умолчанию — для человека тривиальна?
Re[15]: Ленивые языки - за и против
От: FR  
Дата: 22.12.08 06:30
Оценка:
Здравствуйте, Аноним, Вы писали:

А>4. Будьте добры в конце-концов уточнить, о каком применении ленивых языков вы думаете и о какой сфере применения. Да, на Си/С++ можно программить микро-контроллеры и писать ОСи. А на хаскеле нет :\ Всё, выкидываем его на помойку, да?


У меня пока складывается ощущение, и это обсуждение его усилило, что Haskell почему-то пригоден и реально используется только для прототипирования и написания небольших приложений.
Притом по результатам моего присматривания к нему, показалось что и с библиотеками и с FFI и с комьюнити, у него заметно лучше чем у Ocaml'а к примеру, но почему-то приложений на Ocaml'е при этом гораздо больше.
Хаскелисты можете объяснить почему?
Или я заблуждаюсь?
Re[15]: Ленивые языки - за и против
От: Qbit86 Кипр
Дата: 22.12.08 08:08
Оценка:
А>Серебрянной пули нет. Ну нет и всё.

Thesz утверждает обратное.

А>И как бы хорошо С++ не был на этих тестах, он обязательно сольёт в других тестах (например, на скорость реализации какого-нить нетривиального алгоритма и на отладке оного).


Source/binary trade-off, однако. Что важнее: качество бинарного кода в ущерб качеству исходного, или наоборот?
Глаза у меня добрые, но рубашка — смирительная!
Re[17]: Ленивые языки - за и против
От: FR  
Дата: 22.12.08 08:49
Оценка:
Здравствуйте, Аноним, Вы писали:


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

А>На Си ещё больше кода, чем на питоне и на окамле вместе взятых.

А>Плохого и хорошего тут нет, это только значит, что больше людей пишут/используют эти языки. Скорее всего, это происходит потому, что:


Угу, только вот мне показалось что OCaml знают и используют меньше (сейчас это меняется в связи с раскруткой F#) людей, но при этом используется он в работе гораздо чаще чем Haskell.

А>1. Освоить питон намного проще окамля, поэтому больше людей пишут на питоне, чем на окамле (большинтсво, почему-то, часто останавливается и перестаёт играться с новыми языками, так и не доходят до лиспа/окамля/хаскеля, либо просто вскоре забрасывают). Вина тут совсем не в ограниченности людей, сколько в начальном обучении, и, как ни печально, в отсутсвии мотивации. Т.е. человек спокойно выбираеть популярную область (PHP,C#,Java), и потихоньку пишет одно и тоже изо дня в день на одном и том же языке. Денег ему хватает, если он хочет больше — ему проще остаться на сверх-урочные либо подработать (занимаясь либо тем же самым, либо установкой/настройкой чего-либо), или уйти в другую такую же фирму, или "дослужиться до менеджера". Всё то же самое происходит при сравнении ocaml vs. haskell, только различие имх не столь значительно, как при python vs. ocaml.


Хорошо освоить питон не проще чем Ocaml
Вот кривая обучения да у Ocaml'а покруче, но у Хаскеля она по моему слишком крутая.

А>2. Квалификация программиста очень сильно влияет на используемые им языки (и наоборот). Конечно, это работает "в среднем", т.е. судить о том, что конктректный программист на PHP менее сообразительный конкретного программиста на хаскелле нельзя. Но в целом программирование на хаскелле/етц требует другого (функционального, например) подхода, который человек может не знать, плюс ещё заставляет человека иметь представление о теории категорий (или хотя бы понимать, что такое сильная монада, функтор, и т.р.). По моим наблюдениям, далеко не все могут (не могут = не имеют достаточной мотивации на перераспределение времени для изучения хаскеля/и т.п. и связанных с ним областей) освоить тот же ocaml, не говоря уже о хаскеле. Хотя, на мой взгляд, вреда абсолютно никакого не будет, только наоборот.


Вот мне и кажется многие как осваивают Хаскель, так про него и забывают.

А>3. Большие/небольшие приложения это довольно спорный вопрос. Вот, например, ghc — это большое приложение?


Для меня вполне большое. Вот только странно что ничего сопоставимого по размеру — сложности больше на Хаскеле и нету, или я плохо смотрел?

А>И тут ещё нужно правильно считать, т.е. не просто абсолютное количество приложений на том и на другом языках, а, скорее, относительное.


Ну так я про него и говорю. Есть множество маргинальных языков и технологий, тот же Ocaml, Lisp, Smalltalk и у всех у них с популярность / используемость по моему лучше чем у Хаскеля.

А>Ходят слухи, что хаскель активно применяется в финансовой индустрии, но лично я кода не видел и говорить ничего не могу. Потом, опять же, большинство приложений на хаскеле занимают ощутимо меньше строчек кода, чем аналогичное на Си/Си++.


Я слышал что Ocaml чаще применяется в тех же финансах.

А>4. Из-за малой распространённости хаскеля и малой популярности трудно найти специалистов. А 99% крупных (как коммерческих, так и нет) продуктов поддерживаются командами, и состав может часто меняться. Сформировать команду, как и искать новых программистов на хаскеле в случае движений в команде, очень и очень напряжно. Да и редко какой руководитель примет решение писать большой проект на хаскеле — слишком много рисков и неизвестности. Выходит, что реально люди готовы использовать этот язык либо там, где они могут позволить себе нанять дорогих специалистов (финансисты, где крутятся большие деньги, и где они могут потратить много денег на нового спеца, где прибыль покрывает всё и где нужна очень быстрая разработка и анализ, а на скорость кода можно коменсировать железом), либо там, где невилик риск, а это — прототипирование. Первая область проприетарная насквозь, вторая — напротив. Поэтому имеем такие результаты — видны прототипы и мелкие проекты.


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

А>Что использовать, стоит ли браться за хаскель? Конечно стоит. Но если нет должной подготовки, то можно посмотреть на ocaml, более-менее освоится с ним и двигаться дальше (не обязательно хаскель, можно посмотреть и пролог, и лисп/схему, или smalltalk/io). Использовать ли хаскель на работе при прототировании? Нет, если у вас нет опыта. В этом случае с хаскелем лучше стоит играться паралельно (в свободное время, либо просто для разгрузки).


С Ocaml все просто, перебарываешь неприязнь к синтаксису и общей корявости языка и на нем вполне можно писать
Я вот для пробы написал пару утилиток на нем и вполне уверен что он его можно использовать как рабочий инструмент.
После поверхностного изучения Хаскеля я вижу что также смогу на нем написать подобные утилитки, но чувствую что это будет очень коряво, и похоже на код упертого сишника на C++
Re[18]: Ленивые языки - за и против
От: Аноним  
Дата: 22.12.08 09:36
Оценка:
Здравствуйте, FR, Вы писали:

FR>Угу, только вот мне показалось что OCaml знают и используют меньше (сейчас это меняется в связи с раскруткой F#) людей, но при этом используется он в работе гораздо чаще чем Haskell.


Про первую часть не скажу, так как мне кажется всё ноборот. А вторая — да, верно. Я же и писал, что хаскель ещё более "маргинальнее" ocaml'я.

FR>Вот кривая обучения да у Ocaml'а покруче, но у Хаскеля она по моему слишком крутая.


Да, есть такое. Зато сколько удовольствия получаешь в процессе.

FR>Вот мне и кажется многие как осваивают Хаскель, так про него и забывают.


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

А>>3. Большие/небольшие приложения это довольно спорный вопрос. Вот, например, ghc — это большое приложение?


FR>Для меня вполне большое. Вот только странно что ничего сопоставимого по размеру — сложности больше на Хаскеле и нету, или я плохо смотрел?

Есть ещё JHC и т.п.

А>>И тут ещё нужно правильно считать, т.е. не просто абсолютное количество приложений на том и на другом языках, а, скорее, относительное.


FR>Ну так я про него и говорю. Есть множество маргинальных языков и технологий, тот же Ocaml, Lisp, Smalltalk и у всех у них с популярность / используемость по моему лучше чем у Хаскеля.


Лучше или нет не знаю, статиски у меня нет и говорить ничего конкретного не могу. Так, только ощущения. Для оценок использования хаскеля нужно брать все академические работы, и тогда она просто зашкалит

А>>Ходят слухи, что хаскель активно применяется в финансовой индустрии, но лично я кода не видел и говорить ничего не могу. Потом, опять же, большинство приложений на хаскеле занимают ощутимо меньше строчек кода, чем аналогичное на Си/Си++.


FR>Я слышал что Ocaml чаще применяется в тех же финансах.


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

FR>В случае же Хаскеля по моему есть парадокс, популярность достаточно высокая, но выхлоп в виде приложений низкий. Вот мне и интересно почему.


В качестве приложений выступают разные академичские работы, и мелкие прототипы (в первую очередь). Думаю, тут просто нужно попытаться поискать "success story" и прочие применения.


FR>С Ocaml все просто, перебарываешь неприязнь к синтаксису и общей корявости языка и на нем вполне можно писать


Да-да, я когда его увидел тоже не сразу понял его простоту.

FR>Я вот для пробы написал пару утилиток на нем и вполне уверен что он его можно использовать как рабочий инструмент.

FR>После поверхностного изучения Хаскеля я вижу что также смогу на нем написать подобные утилитки, но чувствую что это будет очень коряво, и похоже на код упертого сишника на C++

Ничего, напиши свой компилятор хаскеля-98 и на тебя 99.9% падёт озарение, и ты сможешь эффективно писать на нём
Re[19]: Ленивые языки - за и против
От: FR  
Дата: 22.12.08 09:58
Оценка:
Здравствуйте, Аноним, Вы писали:

FR>>Угу, только вот мне показалось что OCaml знают и используют меньше (сейчас это меняется в связи с раскруткой F#) людей, но при этом используется он в работе гораздо чаще чем Haskell.


А>Про первую часть не скажу, так как мне кажется всё ноборот. А вторая — да, верно. Я же и писал, что хаскель ещё более "маргинальнее" ocaml'я.


Шум вокруг Хаскеля точно больше, да и даже стандартные библиотеки полнее и качественей камловских. Так что тут еще кто маргинальней непонятно.

FR>>Вот кривая обучения да у Ocaml'а покруче, но у Хаскеля она по моему слишком крутая.


А>Да, есть такое. Зато сколько удовольствия получаешь в процессе.


Хотелось бы совместить приятное с полезным

FR>>Вот мне и кажется многие как осваивают Хаскель, так про него и забывают.


А>Я бы сказал, что многие пытаются освоить хаскель и вскоре забивают и забывают. Так как не доводят до конца, видимо, слишком велик информационный шок


Угу, вот я например

А>>>3. Большие/небольшие приложения это довольно спорный вопрос. Вот, например, ghc — это большое приложение?


FR>>Для меня вполне большое. Вот только странно что ничего сопоставимого по размеру — сложности больше на Хаскеле и нету, или я плохо смотрел?

А>Есть ещё JHC и т.п.

Угу "вы можете купить машину любого цвета при условии что это будет черный форд"

FR>>Ну так я про него и говорю. Есть множество маргинальных языков и технологий, тот же Ocaml, Lisp, Smalltalk и у всех у них с популярность / используемость по моему лучше чем у Хаскеля.


А>Лучше или нет не знаю, статиски у меня нет и говорить ничего конкретного не могу. Так, только ощущения. Для оценок использования хаскеля нужно брать все академические работы, и тогда она просто зашкалит


То есть все-таки хаскель узкоспециализирован?

А>>>Ходят слухи, что хаскель активно применяется в финансовой индустрии, но лично я кода не видел и говорить ничего не могу. Потом, опять же, большинство приложений на хаскеле занимают ощутимо меньше строчек кода, чем аналогичное на Си/Си++.


FR>>Я слышал что Ocaml чаще применяется в тех же финансах.


А>Все мы что-то слышали, жаль. Было бы хорошо найти адекватную статистику (ну, или хоть какую-нибудь без явной рекламы и перекосов).


Да неплохо бы.
По Хаскелею вообще хоть что-то бы, а то я кроме компиляторов, Булатовского архиватора и оконого менеджера для linux и не слышал больше ничего.

FR>>В случае же Хаскеля по моему есть парадокс, популярность достаточно высокая, но выхлоп в виде приложений низкий. Вот мне и интересно почему.


А>В качестве приложений выступают разные академичские работы, и мелкие прототипы (в первую очередь). Думаю, тут просто нужно попытаться поискать "success story" и прочие применения.


Вот и интересно почему нет обычных приложений. Что мешает их делать.

FR>>С Ocaml все просто, перебарываешь неприязнь к синтаксису и общей корявости языка и на нем вполне можно писать


А>Да-да, я когда его увидел тоже не сразу понял его простоту.


Правда я его объектную систему игнорировал, а все остальное просто.

FR>>Я вот для пробы написал пару утилиток на нем и вполне уверен что он его можно использовать как рабочий инструмент.

FR>>После поверхностного изучения Хаскеля я вижу что также смогу на нем написать подобные утилитки, но чувствую что это будет очень коряво, и похоже на код упертого сишника на C++

А>Ничего, напиши свой компилятор хаскеля-98 и на тебя 99.9% падёт озарение, и ты сможешь эффективно писать на нём


Что-то нет желания писать комилятор
Хотел для пробы близкое написать, анализатор-разборщик html, но не вижу что-то преимуществ перед Ocaml'ом, и та же проблема что и тут http://gzip.rsdn.ru/forum/message/3187769.1.aspx
Автор: dmz
Дата: 25.11.08
сразу всплывает.
Re[20]: Ленивые языки - за и против
От: Аноним  
Дата: 22.12.08 12:36
Оценка:
Здравствуйте, FR, Вы писали:


FR>Угу "вы можете купить машину любого цвета при условии что это будет черный форд"


"Покупатель может выбрать любой цвет, при условии, что этот цвет — черный". (C) Генри Форд. Кажется, как-то так

FR>>>Ну так я про него и говорю. Есть множество маргинальных языков и технологий, тот же Ocaml, Lisp, Smalltalk и у всех у них с популярность / используемость по моему лучше чем у Хаскеля.


А>>Лучше или нет не знаю, статиски у меня нет и говорить ничего конкретного не могу. Так, только ощущения. Для оценок использования хаскеля нужно брать все академические работы, и тогда она просто зашкалит


FR>То есть все-таки хаскель узкоспециализирован?


Нет, язык "продвинутый", т.е. покрывает широкую область — можно писать и компиляторы, и оконные менеджеры, 3д шутеры и архиваторы. Есть стандартизованный FFI, хотя он довольно странный (после питоновского как-то непривычно, в смысле отстутсвия привычных расширений в виде отдельных .so'шек. но обещают доделать поддержку с динамическими библиотеками, посмотрим, что у них получится).

Почему мало приложений на нём? Хз, могу предположить, что людям, адекватно им владеющим уже не хочется писать калькуляторы, блокноты и прочие свистелки. Ну и скорее всего для пользователей этого языка одно из основных занятий во время программирования — получать fun


FR>Вот и интересно почему нет обычных приложений. Что мешает их делать.


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

FR>>>С Ocaml все просто, перебарываешь неприязнь к синтаксису и общей корявости языка и на нем вполне можно писать


А>>Да-да, я когда его увидел тоже не сразу понял его простоту.


FR>Правда я его объектную систему игнорировал, а все остальное просто.


FR>>>Я вот для пробы написал пару утилиток на нем и вполне уверен что он его можно использовать как рабочий инструмент.

FR>>>После поверхностного изучения Хаскеля я вижу что также смогу на нем написать подобные утилитки, но чувствую что это будет очень коряво, и похоже на код упертого сишника на C++

А>>Ничего, напиши свой компилятор хаскеля-98 и на тебя 99.9% падёт озарение, и ты сможешь эффективно писать на нём


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

FR>Что-то нет желания писать комилятор

FR>Хотел для пробы близкое написать, анализатор-разборщик html, но не вижу что-то преимуществ перед Ocaml'ом, и та же проблема что и тут http://gzip.rsdn.ru/forum/message/3187769.1.aspx
Автор: dmz
Дата: 25.11.08
сразу всплывает.


Ммм, там проблема "никак не могу вкурить, как", т.е. не проблема вообще, а так, временная неприятность. Такие проблемы решаются практикой, чтением чужих исходников и документации. И дело тут не в языке. Выбрал окамль — занимайся, раз нравится. Польза-то всё равно будет.
Re[21]: Ленивые языки - за и против
От: geniepro http://geniepro.livejournal.com/
Дата: 22.12.08 12:47
Оценка:
Здравствуйте, Аноним, Вы писали:

А> ...но обещают доделать поддержку с динамическими библиотеками, посмотрим, что у них получится).


Под виндою dll вроде без особых проблем цепляются, единственно, что приходится обёртки для сишных функций делать, а так пойдёт...
Re[16]: Ленивые языки - за и против
От: Аноним  
Дата: 22.12.08 13:02
Оценка:
Здравствуйте, Qbit86, Вы писали:

А>>Серебрянной пули нет. Ну нет и всё.


Q>Thesz утверждает обратное.


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

А>>И как бы хорошо С++ не был на этих тестах, он обязательно сольёт в других тестах (например, на скорость реализации какого-нить нетривиального алгоритма и на отладке оного).


Q>Source/binary trade-off, однако. Что важнее: качество бинарного кода в ущерб качеству исходного, или наоборот?


Если бы всё было так просто, т.е. взял С++ — получился быстрый код, взял хаскель — получился медленный.

Тут есть ещё человек, который код будет писать. "Написать код, понятный компьютеру — может каждый. Написать код, понятный человеку — могут не многие" (С) не помню кто. И есть конкретные задачи, которые нужно решить. Задачи подразумевают разные сроки, разную численность команд, поддержку, отладку/тестирование, ограничения среды (время отклика/надёжность/потребление ресурсов/сроки разработки/легкость поддержки в поле и куча других)

Ещё раз, я считаю, что ленивость не подходит для части задач, только и всего (как не подходит PL/SQL для обработки 3д). Причём круг решаемых задач заметно перешивает. Да и прежде, чем говорить, что ленивость приносит "медленность", неплохо было бы закончить реализацию и померить. Компайлеры сейчас умные, и многое оптимизируют, а на остальное всегда есть человек (только не надо говорить, что профилирование и оптизация сложнее, чем в С++ или другом языке. Привычнее не значит проще).

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

На мой взгляд такой подхдо в корне не верен — проще взять другой инструмент с привычным для человека отсутсвием ленивости и других "подводных" камней, хотя это всего лишь дело опыта (которого, видимо, у человека и нет) и дело привычки/знаний о решении задач с помошью своего любимого неленивого языка. Как говорят, каждый кулик хвалит своё болото. И невозможность правильно выбрать инструмент/правильно и эффективно им пользовать вовсе не значит, что он плохой. Он просто другой.
Re[17]: Ленивые языки - за и против
От: dmz Россия  
Дата: 22.12.08 16:13
Оценка:
А>Плохого и хорошего тут нет, это только значит, что больше людей пишут/используют эти языки. Скорее всего, это происходит потому, что:

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


Ocaml меньше и проще питона. В нем тупо меньше сущностей. В Ocaml проще (как минимум, не сложнее) интерфейс с C. У окамля проблема, что его разработали и продвигают французы (и, видимо, математики). Мало документации, все невнятно, и везде напарываешься на язык кракозяблов. А вообще, это довольно простой и практичный ФЯ. По крайней мере, на нем можно сразу получать практические результаты, и по некоторым задачам он питон просто уделывает (в смысле простоты и количества кода).
Re[19]: Ленивые языки - за и против
От: dmz Россия  
Дата: 22.12.08 16:33
Оценка:
FR>>Я слышал что Ocaml чаще применяется в тех же финансах.
А>Все мы что-то слышали, жаль. Было бы хорошо найти адекватную статистику (ну, или хоть какую-нибудь без явной рекламы и перекосов).

А зачем на статистику смотреть? Надо ее делать. Если некий (немассовый) подход позволяет делать что-то на порядок быстрее, лучше, чем мейнстримовые — то это, как бы, конкурентное преимущество, которое можно использовать. Если окамл дает что-то, что не дают мейстримовые инструменты — то надо использовать?
Re[19]: Ленивые языки - за и против
От: dmz Россия  
Дата: 22.12.08 17:24
Оценка:
DM>2. Про использование в индустрии видел интересное мнение одного известного флеймера (Jon Harrop — автор нескольких книг по Окамлу и F#):

А с другой стороны, где нибудь есть success stories окамла?
Re[20]: Ленивые языки - за и против
От: EvilChild Ниоткуда  
Дата: 22.12.08 19:47
Оценка:
Здравствуйте, dmz, Вы писали:
DM>>2. Про использование в индустрии видел интересное мнение одного известного флеймера (Jon Harrop — автор нескольких книг по Окамлу и F#):

dmz>А с другой стороны, где нибудь есть success stories окамла?

Надо бы определиться, что считать success story.
Вот mldonkey достаточного размера проект, чтобы его засчитывать?
now playing: Harry Axt — 2 Voices
Re[2]: Ленивые языки - за и против
От: Gaperton http://gaperton.livejournal.com
Дата: 22.12.08 21:51
Оценка:
Здравствуйте, vshabanov, Вы писали:

G>>Короче, я сторонник контроля над оружием, тьфу, явного управления ленивостью, посредством фьючерсов и стримов (ленивых списков), и строгости по умолчанию.


V>Насчет строгости по-умолчанию. У меня, к примеру, есть небольшой DSL для описания конечных автоматов (типа FRP).


Зачет, первый человек ведет дискуссию по правилам.

V>На Хаскеле типичный код будет выглядеть так:

V>
V>-- | переключалка между несколькими сценами
V>scene = state1
V>    where state1 = switch scene1 [event1 --> state2,
V>                                  event2 --> state3]
V>          state2 = switch scene2 [event3 --> ...]
V>          ...
V>          stateN = ...

V>-- | тупой счетчик
V>counter n = switch (pure n) [tick --> counter (n+1)]
V>


V>Здесь state1..N/counter и т.д. -- это обычные ленивые хаскельные выражения. Спокойно взаиморекурсивно ссылаются друг на друга.


V>В кемле (и в любом eager языке) так сделать не получится. Не даст он запросто выражениям ссылаться друг на друга


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

V>
V>-- | переключалка между несколькими сценами
V>scene = state1
V>    where state1 = ? switch scene1 [event1 --> state2,
V>                                  event2 --> state3]
V>          state2 = ? switch scene2 [event3 --> ...]
V>          ...
V>          stateN = ? ...

Разница только в том, что места, где вы полагаетесь на ленивость, указаны явно. А не наоборот. И все. Насчет счетчика, я уверен, вы сами проставите ленивость, где надо. ? - говорит о том, что вычисления на том же уровне ленивы. Его scope ограничен скобками, например.

V>-- | тупой счетчик
V>counter n = switch (pure n) [tick --> counter (n+1)]
V>
Re[3]: Ленивые языки - за и против
От: vshabanov http://vshabanov-ru.blogspot.com
Дата: 23.12.08 12:36
Оценка:
Здравствуйте, Gaperton, Вы писали:

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


G>>>Короче, я сторонник контроля над оружием, тьфу, явного управления ленивостью, посредством фьючерсов и стримов (ленивых списков), и строгости по умолчанию.


V>>Насчет строгости по-умолчанию. У меня, к примеру, есть небольшой DSL для описания конечных автоматов (типа FRP).


G>Зачет, первый человек ведет дискуссию по правилам.


V>>На Хаскеле типичный код будет выглядеть так:

V>>
V>>-- | переключалка между несколькими сценами
V>>scene = state1
V>>    where state1 = switch scene1 [event1 --> state2,
V>>                                  event2 --> state3]
V>>          state2 = switch scene2 [event3 --> ...]
V>>          ...
V>>          stateN = ...

V>>-- | тупой счетчик
V>>counter n = switch (pure n) [tick --> counter (n+1)]
V>>


V>>Здесь state1..N/counter и т.д. -- это обычные ленивые хаскельные выражения. Спокойно взаиморекурсивно ссылаются друг на друга.


V>>В кемле (и в любом eager языке) так сделать не получится. Не даст он запросто выражениям ссылаться друг на друга


G>Отвечу кратко. Пример с серией выражений, ссылающихся на результаты друг друга, делается в строгом по умолчанию языке с опциональной аннотацией ленивости элементарно. Аналогичный код в "строгом Хаскеле", с предлагаемой (примерной) аннотацией ленивости.


Да собственно там, где в кемле появились ф-ии, возвращающие выражения, это и есть почти lazy annotation-ы (только не lazy, а просто ф-ии, т.к. вычисляются всегда строго один раз, многократно форсить не надо).

V>>
V>>-- | переключалка между несколькими сценами
V>>scene = state1
V>>    where state1 = ? switch scene1 [event1 --> state2,
V>>                                  event2 --> state3]
V>>          state2 = ? switch scene2 [event3 --> ...]
V>>          ...
V>>          stateN = ? ...
V>>


G>Разница только в том, что места, где вы полагаетесь на ленивость, указаны явно. А не наоборот. И все. Насчет счетчика, я уверен, вы сами проставите ленивость, где надо. ? — говорит о том, что вычисления на том же уровне ленивы. Его scope ограничен скобками, например.


Но фишка в том, что эти lazy annotation-ы надо еще думать, где вставлять. У меня например есть программист junior, который прогал только на Си и хаскеле. После хаскела ему тяжко объяснять, что тут из-за неленивости надо дополнительные фишки писать. При этом, когда он писал на хаскеле, единственной проблемой (неожиданностью), связанной с ленивостью, было закрытие файла до того, как он был обработан. Так что у всех разный опыт.

В общем я остаюсь при мнении, что ленивость позволяет писать уровнем выше (не говоря уж о том, что у Хаскелла в принципе уровень выше).

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

V>>
V>>-- | тупой счетчик
V>>counter n = switch (pure n) [tick --> counter (n+1)]
V>>
Re[4]: Ленивые языки - за и против
От: Аноним  
Дата: 24.12.08 00:59
Оценка:
Здравствуйте, vshabanov, Вы писали:

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


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


G>>>>Короче, я сторонник контроля над оружием, тьфу, явного управления ленивостью, посредством фьючерсов и стримов (ленивых списков), и строгости по умолчанию.


V>>>Насчет строгости по-умолчанию. У меня, к примеру, есть небольшой DSL для описания конечных автоматов (типа FRP).


G>>Зачет, первый человек ведет дискуссию по правилам.


G>>Разница только в том, что места, где вы полагаетесь на ленивость, указаны явно. А не наоборот. И все. Насчет счетчика, я уверен, вы сами проставите ленивость, где надо. ? — говорит о том, что вычисления на том же уровне ленивы. Его scope ограничен скобками, например.


V>Но фишка в том, что эти lazy annotation-ы надо еще думать, где вставлять. У меня например есть программист junior, который прогал только на Си и хаскеле. После хаскела ему тяжко объяснять, что тут из-за неленивости надо дополнительные фишки писать. При этом, когда он писал на хаскеле, единственной проблемой (неожиданностью), связанной с ленивостью, было закрытие файла до того, как он был обработан. Так что у всех разный опыт.


V>В общем я остаюсь при мнении, что ленивость позволяет писать уровнем выше (не говоря уж о том, что у Хаскелла в принципе уровень выше).


V>Если же нужна большая уверенность в отсутствии невычисленных цепочек, и она нужнее скорости разработки, то чтож, надо использовать strict языки.


Да, ты верно говоришь, что у хаскеля другой уровень и другая область применения. Никто не станет писать ray-tracer на erlang, и от того, что erlang медленнее хаскеля/clean/etc в какой-то области его никто не станет выбрасывать, так как он затачивался под другие задачи.

Но, к сожалению, всё дискусия построенна на том, что Gaperton тупо игнорирует вопросы о подразумеваемой им области применения в которых он считает, что ленивость по-умолчанию не нужна. Про интенсивные вычисления и реал-тайм понятно, но опять же, cpu-hungry код выносится в либы и используется через FFI, а всю логику и описание control flow можно писать уже на другом языке.

Именно поэтому что-то обьяснить ему не получится — так как всегда можно найти примеры, где ленивость не нужна (опять же, real-time приложения, интенсивные вычисления и т.п.). Вот так и получается, что раз "плоской" отвёрткой крутить шурупы с другим шлицом неудобно, то отвёртку нужно выбрость, потому что она больно не универсальная, и ещё нужно думать, какие отвёртки выбирать.
Re[5]: Ленивые языки - за и против
От: FR  
Дата: 24.12.08 04:28
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Да, ты верно говоришь, что у хаскеля другой уровень и другая область применения. Никто не станет писать ray-tracer на erlang, и от того, что erlang медленнее хаскеля/clean/etc в какой-то области его никто не станет выбрасывать, так как он затачивался под другие задачи.


Вот мне как раз интересна реальная область применения Хаскеля. И я пока вижу что она очень узка и в основном сводится к прототипированию и компиляторам.
Re[6]: Ленивые языки - за и против
От: Аноним  
Дата: 24.12.08 04:33
Оценка:
Здравствуйте, FR, Вы писали:

FR>Вот мне как раз интересна реальная область применения Хаскеля. И я пока вижу что она очень узка и в основном сводится к прототипированию и компиляторам.


Я тут дал ссылок: http://www.rsdn.ru/forum/message/3226635.1.aspx
Автор: z00n
Дата: 24.12.08

там найдется пара релевантных статей
Re[6]: Ленивые языки - за и против
От: Qbit86 Кипр
Дата: 24.12.08 10:23
Оценка:
G>В больших программах на Хаскеле встречаются трудноуловимые утечки памяти, независимо от области применения. Чтоб нам было на эти проблемы плевать, "область применения" в результате не может являться:
G>1) Долгоработающим приложением. Все сервера 24х7 идут лесом в колонну по два. Все настольные аппликухи, которые могут долго работать — за ними.
G>2) Интерактивным приложением с софт-рилтайм гарантиями. Телеком, сетевые приложения, трейдинг, задачи управления и контроля идут лесом.
G>3) Приложением, которые работает в условиях ограниченных ресурсов. Embedded-разработка, обработка больших объемов данных — все лесом.

А как обстоят дела у Хаскеля с созданием GUI-приложений? Есть ли поддержка со стороны среды, библиотеки, фреймворки? Каковы принципиальные трудности?
Глаза у меня добрые, но рубашка — смирительная!
Re[4]: Ленивые языки - за и против
От: Gaperton http://gaperton.livejournal.com
Дата: 24.12.08 10:25
Оценка:
Здравствуйте, vshabanov, Вы писали:

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


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


G>>>>Короче, я сторонник контроля над оружием, тьфу, явного управления ленивостью, посредством фьючерсов и стримов (ленивых списков), и строгости по умолчанию.


V>>>Насчет строгости по-умолчанию. У меня, к примеру, есть небольшой DSL для описания конечных автоматов (типа FRP).


G>>Зачет, первый человек ведет дискуссию по правилам.


V>>>На Хаскеле типичный код будет выглядеть так:

V>>>
V>>>-- | переключалка между несколькими сценами
V>>>scene = state1
V>>>    where state1 = switch scene1 [event1 --> state2,
V>>>                                  event2 --> state3]
V>>>          state2 = switch scene2 [event3 --> ...]
V>>>          ...
V>>>          stateN = ...

V>>>-- | тупой счетчик
V>>>counter n = switch (pure n) [tick --> counter (n+1)]
V>>>


V>>>Здесь state1..N/counter и т.д. -- это обычные ленивые хаскельные выражения. Спокойно взаиморекурсивно ссылаются друг на друга.


V>>>В кемле (и в любом eager языке) так сделать не получится. Не даст он запросто выражениям ссылаться друг на друга


G>>Отвечу кратко. Пример с серией выражений, ссылающихся на результаты друг друга, делается в строгом по умолчанию языке с опциональной аннотацией ленивости элементарно. Аналогичный код в "строгом Хаскеле", с предлагаемой (примерной) аннотацией ленивости.


V>Да собственно там, где в кемле появились ф-ии, возвращающие выражения, это и есть почти lazy annotation-ы (только не lazy, а просто ф-ии, т.к. вычисляются всегда строго один раз, многократно форсить не надо).


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

x = f1 a b y
y = f2 x a b

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

Ни, и верятно, у этих функций довольно странный и неприятный тип. Что должно быть неудобно. Доступ к ленивости должен быть очень простой.

G>>Разница только в том, что места, где вы полагаетесь на ленивость, указаны явно. А не наоборот. И все. Насчет счетчика, я уверен, вы сами проставите ленивость, где надо. ? — говорит о том, что вычисления на том же уровне ленивы. Его scope ограничен скобками, например.


V>Но фишка в том, что эти lazy annotation-ы надо еще думать, где вставлять.

Точно. Именно так.

V>У меня например есть программист junior, который прогал только на Си и хаскеле. После хаскела ему тяжко объяснять, что тут из-за неленивости надо дополнительные фишки писать. При этом, когда он писал на хаскеле, единственной проблемой (неожиданностью), связанной с ленивостью, было закрытие файла до того, как он был обработан. Так что у всех разный опыт.


А этот junior сможет найти и устранить невычисленную цепочку, когда она появится? А вы — сможете? Вот thesz в свое время не смог.
http://thesz.livejournal.com/484854.html

Время сборки мусора для копирующего сборщика (как в случае с ghc) пропорционально количеству живых данных. Если это количество все время растет (утечка), то время выполнения программы также начинает расти, причем квадратично — за время δT полезной работы мы добавляем δM байт к уже имевшимся ранее M байт и время работы сборщика становится t+δt. И в нашем случае так и было, причем формула зависимости времени работы для выполнения N команд процессора имела вид наподобие 0.0000001*N2+0.00016*N+0.7. Некоторое время на разогрев (ассемблирование и подготовка образа памяти), 6000 команд в секунду на старте и учет времени сборки утечки.

Большинство тестов укладывалось в 100000 тактов эмулируемого процессора (время ожидания более часа).

Где была утечка, я так и не нашел.


И наконец, разве junior-у не надо понимать, почему именно работает его программа? Если он это понимает, расстановка ленивости не вызовет у него проблем. И поможет потом читателю.

V>В общем я остаюсь при мнении, что ленивость позволяет писать уровнем выше (не говоря уж о том, что у Хаскелла в принципе уровень выше).


Да, позволяет. Я с этим и не спорю. А еще она дает прикольные лики, если лениво все подряд.

V>Если же нужна большая уверенность в отсутствии невычисленных цепочек, и она нужнее скорости разработки, то чтож, надо использовать strict языки.


Ну да. Желательно — с "родной" опциональной ленивостью на уровне языка. Или хотя бы фьючерами.
Re[6]: Ленивые языки - за и против
От: geniepro http://geniepro.livejournal.com/
Дата: 24.12.08 11:00
Оценка:
Здравствуйте, Gaperton, Вы писали:

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


Насколлько я понимаю, такой статистики, в общем-то, нет. Или у Вас она есть?
Re[7]: Ленивые языки - за и против
От: geniepro http://geniepro.livejournal.com/
Дата: 24.12.08 11:07
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>А как обстоят дела у Хаскеля с созданием GUI-приложений? Есть ли поддержка со стороны среды, библиотеки, фреймворки? Каковы принципиальные трудности?


Печально обстоят дела. Хаскелл ждёт своего вижуал-бейсика или дельфы...
Под линуксом ещё не так плохо, хотя биндинг к GTK+ постоянно запаздывает по сравнению с GHC.
Под виндою родной GUI-библиотеки нет, вручную на WinAPI делать неприятно и неудобно, да и не получилось у меня пока что-то дочтаточно заметное сделать...
Gtk2Hs требует GTK+, QtHaskell и wxHaskell как-то нетривиально устанавливаются, с полпинка у меня не получилось... Ужасно всё...
Re: Ленивые языки - за и против
От: mkizub Литва http://symade.tigris.org
Дата: 24.12.08 12:23
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Короче, я сторонник контроля над оружием, тьфу, явного управления ленивостью, посредством фьючерсов и стримов (ленивых списков), и строгости по умолчанию.


Каждый язык — это куча выборов (tradeoff) сделанных для удобства. И соответственно, удобнее эти языки применять там, где эти выборы подходят для решения задачи, и неудобно, где эти выборы не подходят.
Ленивость по умолчанию или явная — это то-же самое, что все остальные выборы.

ЗЫ Конечно SymADE Если ты можешь менять язык на котором программируешь — то конечно можно поменять и умолчания.
SOP & SymADE: http://symade.tigris.org , блог http://mkizub.livejournal.com
Re[5]: Ленивые языки - за и против
От: vshabanov http://vshabanov-ru.blogspot.com
Дата: 24.12.08 13:41
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>>>Отвечу кратко. Пример с серией выражений, ссылающихся на результаты друг друга, делается в строгом по умолчанию языке с опциональной аннотацией ленивости элементарно. Аналогичный код в "строгом Хаскеле", с предлагаемой (примерной) аннотацией ленивости.


V>>Да собственно там, где в кемле появились ф-ии, возвращающие выражения, это и есть почти lazy annotation-ы (только не lazy, а просто ф-ии, т.к. вычисляются всегда строго один раз, многократно форсить не надо).


G>Не совсем. С ними, например, не должно получится кольцевую ссылку устроить. Вот так:


G>x = f1 a b y

G>y = f2 x a b

G>Это довольно типовой код в случае, если мы побили систему на набор функций, которые связанны ленивыми списками. Данный код — задает "коммутацию" схемы из функций, простым и понятным образом.


У меня не списки, а FRP-шные "поведения". Это поведение по сути машина Мили. data B a = B (simulation -> (a, B a)). Т.е. один такт (кадр) -- один вход (все внешние данные в simulation), один выход (a и следующая машина). Модель синхронная. Если сделать бесконечно вложенный x(y(x(y(...)))), то оно тупо упадет по stack overflow пытаясь выдать результат на текущем кадре. Чтобы не висло, можно сделать через switch -- переключалку на другое поведение по событию, не происходящему на текущем кадре.

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

G>Ни, и верятно, у этих функций довольно странный и неприятный тип. Что должно быть неудобно. Доступ к ленивости должен быть очень простой.


f1 :: a -> b -> [y] -> [x]
f2 :: [x] -> a -> b -> [y]

Вроде не очень странный.

V>>У меня например есть программист junior, который прогал только на Си и хаскеле. После хаскела ему тяжко объяснять, что тут из-за неленивости надо дополнительные фишки писать. При этом, когда он писал на хаскеле, единственной проблемой (неожиданностью), связанной с ленивостью, было закрытие файла до того, как он был обработан. Так что у всех разный опыт.


G>А этот junior сможет найти и устранить невычисленную цепочку, когда она появится? А вы — сможете? Вот thesz в свое время не смог.

G>http://thesz.livejournal.com/484854.html
G>

G>Время сборки мусора для копирующего сборщика (как в случае с ghc) пропорционально количеству живых данных. Если это количество все время растет (утечка), то время выполнения программы также начинает расти, причем квадратично — за время δT полезной работы мы добавляем δM байт к уже имевшимся ранее M байт и время работы сборщика становится t+δt. И в нашем случае так и было, причем формула зависимости времени работы для выполнения N команд процессора имела вид наподобие 0.0000001*N2+0.00016*N+0.7. Некоторое время на разогрев (ассемблирование и подготовка образа памяти), 6000 команд в секунду на старте и учет времени сборки утечки.

G>Большинство тестов укладывалось в 100000 тактов эмулируемого процессора (время ожидания более часа).

G>Где была утечка, я так и не нашел.


А фиг знает. Junior вряд-ли. Я -- не знаю, может получилось бы может нет. Там утечки, как я понял, были где-то в модели памяти, которую было почему-то тяжело было пофорсить. Может путем какого-то переписывания что-нить и получилось бы, вопрос времени.

Но главное, что у Сергея была рабочая модель, на которой были получены необходимые результаты, а у других модель не работала вообще. Т.е. поставленная задача была решена. Если бы утечки были действительно архикритичны и не давали решить задачу (например пускать миллионы тактов), тогда да, пришлось бы с ними бороться.

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

G>И наконец, разве junior-у не надо понимать, почему именно работает его программа? Если он это понимает, расстановка ленивости не вызовет у него проблем. И поможет потом читателю.


Надо понимать. Только надо понимать больше. Attention to irrelevant, т.е. работа уровнем ниже и производительность труда тоже ниже.

V>>В общем я остаюсь при мнении, что ленивость позволяет писать уровнем выше (не говоря уж о том, что у Хаскелла в принципе уровень выше).


G>Да, позволяет. Я с этим и не спорю. А еще она дает прикольные лики, если лениво все подряд.


Чтож поделать. trade-off. А в эрланге (если ничего не путаю) можно долго заниматься унификацией на больших структурах данных, или забить рантайм новосгенеренными атомами, или криво перегрузить модуль, да и вообще тупо напороться на ошибку типов в рантайме. "Но есть нюанс", есть свои плюсы, в определенных ситуациях перевешивают.

Я, как static typing fan, вообще не понимаю, как можно писать на эрланге что-то надежное (всегда улыбает надежность сколько-то девяток, должно быть 1.0), однако есть определенные подходы (тот же let it crash), при которых падение части программы не страшно (и применять их можно не только в эрланге).

Также и с ленивостью -- trade-off, иногда перевешивает, и так же есть свои подходы, можно обойти невычисленные цепочки, иногда просто (в серваках, где внешний мир форсит), иногда сложно (долго надо искать, да и то не удивлюсь, если через какой-нить profiling их таки можно вычислить), но опять-же иногда перевешивает.

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

awson, кстати, вполне себе написал небольшой сервер на HAppS & HSP. Ничего, работает уже несколько месяцев, хлеба(памяти) не просит. Он конечно нифига не сильно нагруженный (заказчикам сейчас не до него), но прецедент есть. И я не вижу особых причин, почему он должен ликать.

V>>Если же нужна большая уверенность в отсутствии невычисленных цепочек, и она нужнее скорости разработки, то чтож, надо использовать strict языки.


G>Ну да. Желательно — с "родной" опциональной ленивостью на уровне языка. Или хотя бы фьючерами.


В кемле есть опциональная ленивость. В последнем кемле можно даже в pattern matching-е писать lazy, чтобы самому не форсить. Только в таком виде оно не так удобно, как по-умолчанию.
Re[6]: Ленивые языки - за и против
От: vshabanov http://vshabanov-ru.blogspot.com
Дата: 24.12.08 13:49
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Здравствуйте, Аноним, Вы писали:


А>>Но, к сожалению, всё дискусия построенна на том, что Gaperton тупо игнорирует вопросы о подразумеваемой им области применения в которых он считает, что ленивость по-умолчанию не нужна. Про интенсивные вычисления и реал-тайм понятно, но опять же, cpu-hungry код выносится в либы и используется через FFI, а всю логику и описание control flow можно писать уже на другом языке.


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


G>В больших программах на Хаскеле встречаются трудноуловимые утечки памяти, независимо от области применения. Чтоб нам было на эти проблемы плевать, "область применения" в результате не может являться:

G>1) Долгоработающим приложением. Все сервера 24х7 идут лесом в колонну по два. Все настольные аппликухи, которые могут долго работать — за ними.
G>2) Интерактивным приложением с софт-рилтайм гарантиями. Телеком, сетевые приложения, трейдинг, задачи управления и контроля идут лесом.
G>3) Приложением, которые работает в условиях ограниченных ресурсов. Embedded-разработка, обработка больших объемов данных — все лесом.

Не вижу тут ничего, что я бы не смог сделать на хаскеле. Возможно пришлось-бы потрахаться и поискать утечки, но результат был бы получен быстрее (по крайней мере мною), чем на Си (низкий уровень/неконтролируемый засер памяти) или erlang (динамическая типизация/низкий уровень, хотя говорят библиотеки с рантаймом хорошие).

G>Остаются быстро работающие консольные аппликухи, которые не ограниченны памятью, и не жуют обчень больших данных. Только в данном классе приложений нам данная проблема не доставит проблем. Офигенный "класс приложений". Рекомендую.


А>>Именно поэтому что-то обьяснить ему не получится — так как всегда можно найти примеры, где ленивость не нужна (опять же, real-time приложения, интенсивные вычисления и т.п.). Вот так и получается, что раз "плоской" отвёрткой крутить шурупы с другим шлицом неудобно, то отвёртку нужно выбрость, потому что она больно не универсальная, и ещё нужно думать, какие отвёртки выбирать.


G>Объяснить ничего не получается, если не понимаешь, о чем идет разговор. Сочувствую. Я нигде не говорил, что "ленивость не нужна". Я говорил, что у полной ленивости по умолчанию есть проблемы. Это очень сложно понять? Очень сложно, блин, не заметить разницы между этими двумя тезисами?


Есть проблемы. Но мне они не кажутся такими страшными, чтобы не делать ленивость по-умолчанию. Ленивости бояться -- на хаскеле не писать )
Re[7]: Ленивые языки - за и против
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.12.08 15:36
Оценка:
Здравствуйте, vshabanov, Вы писали:

V>Не вижу тут ничего, что я бы не смог сделать на хаскеле. Возможно пришлось-бы потрахаться и поискать утечки, но результат был бы получен быстрее (по крайней мере мною), чем на Си (низкий уровень/неконтролируемый засер памяти) или erlang (динамическая типизация/низкий уровень, хотя говорят библиотеки с рантаймом хорошие).


Замени в своих словах Хаскель на Немерле, выброси рассуждения о трахе по поиску утечек памяти и замени себя на меня и твои утверждения останутся вреными.

В общем, не надо спекулировать на том, что Хаскель на порядок более высокоуровневый язык чем С.
Эрлан, Немерле, Скала и даже ОКамл тоже весьма высокоуровневые языки со воими достоинствами.
Писать на них ни чуть не сложнее чем на Хаскеле. Конечно же везеде найдется с чем потрахаться, но результат будет зависеть в основном не от языка, а от программиста.

И уж ленивость по умолчанию точно не даст тут ощутимых преимуществ.

V>Есть проблемы. Но мне они не кажутся такими страшными, чтобы не делать ленивость по-умолчанию. Ленивости бояться -- на хаскеле не писать )


Ну, лично для меня подобные проблемы ставят крест на Хаскеле как на инструменте. Еще одна проблема — отсутствие прикладных библиотек. Скажем Скала, Немерле или F# изначально живут поверх огромной библиотеки дотена или явы, что делает их отличными кандидатами для разработки под данные плаформы. Кроме того они отлично интегрируются с язками базовой платформы (ну, за исключением F#-а, который не очень здорово интегрируется) и позволяют расширять уже имеющиеся проекты.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Ленивые языки - за и против
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.12.08 15:37
Оценка:
Здравствуйте, thesz, Вы писали:

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


T>В больших программах на K встречаются опечатки вне зависимости от области применения.

T>...В больших программах на C/C++/Фортране встречается сделанная на коленке, кривая и косая, медленная и полная багов половина реализации Common LISP, вне зависимости от области применения.

Ну, может тогда взять Common LISP?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Ленивые языки - за и против
От: dr.Chaos Россия Украшения HandMade
Дата: 24.12.08 15:59
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Еще одна проблема — отсутствие прикладных библиотек. Скажем Скала, Немерле или F# изначально живут поверх огромной библиотеки дотена или явы, что делает их отличными кандидатами для разработки под данные плаформы. Кроме того они отлично интегрируются с язками базовой платформы (ну, за исключением F#-а, который не очень здорово интегрируется) и позволяют расширять уже имеющиеся проекты.


[оффтоп]
У хаскела с библиотеками всё нормально, их выбор, конечно, не так богат как у платформ Java/.Net, но библиотек хватает и довольно качественных.
[/оффтоп]
Побеждающий других — силен,
Побеждающий себя — Могущественен.
Лао Цзы
Re[11]: Ленивые языки - за и против
От: thesz Россия http://thesz.livejournal.com
Дата: 24.12.08 16:52
Оценка:
T>>Грубо говоря, если у тебя строгий map, то ты не можешь сделать его ленивым, просто пометив, если у тебя под рукой нет его текста.
G>Строгий или ленивый map — это не совсем корректно сказать. Смотри.
G>map( [ H | T ], F ) -> [ F( H ) | map( T, F ) ];
G>map( [], _ ) -> [].
G>Здесь у тебя два момента. Первое — ленивый или не ленивый у тебя конструктор списка. Это — одно. Второе — ленивое или энергичное у тебя вычисление функции F.

"Ленивый или не ленивый у тебя конструктор списка" по какому из аргументов?

Если по голове, то строгость функции F не важна, важна строгость map. Если только по хвосту, то это совсем другое дело.

G>Допустим, я хочу сделать применение F энергичным (сама F внутри может быть при этом ленивой) — это я пишу в коде map, а тип конструктора списка — таким же как конструктор списка-аргумента.


В результате ты реализуешь ленивый язык в полном его объёме.

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

Я просто не вижу других путей реализации описываемого тобой механизма.

G>Второе я могу сделать, сохранив общее полиморфное описание алгоритма. Так сделано в Clean, например.


Опять же, мои знания о компиляции ФЯП говорят, что это чрезвычайно затруднено.

Итак, у тебя в одном модуле создаётся список. Ленивый ли он, или нет, нам неизвестно. В другом модуле ты пишешь функцию ZeFunc с применением map к этому списку.

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

Будет ли список после функции ZeFunc ленивым, или нет? Как это будет сделано?

Поясню.

На вход функции map приходит thunk, содержимое его неизвестно. Его надо форсировать (forced = eval thunk) и только тогда получится Cons (case forced of Cons x xs -> ... Nil -> ...).

Сам eval (условно) состоит из сравнения с образцом:

eval x = case x of
   -- Применения функций. Вызываем тела.
   ApplyF1 a1 a2 a3 a4 -> update x (bodyF1 a1 a2 a3 a4)
   ApplyMap f xs -> update x (bodyMap f xs)
   -- Уже форсированные значения. Вертаем взад.
   Cons _ _ -> x
   Nil _ -> x
   Int _ -> x


Но имея оный Cons мы ничего не знаем о том, какими были его аргументы — ленивыми или энергичными. Это тоже просто thunk-и, некоторые из которых уже значения, но они могли стать таковыми не при вычислении map или форсировании Cons.

Пример:
f a b = (x,x:[])
   where
      x = a+b


Если мы возьмём, да и проверим первый элемент пары на 0, то первый элемент списка тоже станет числом вместо (a+b). Стал ли наш Cons энергичным по голове?

T>> Форсировав чанк с отложенным map, ты обязательно вычислишь и голову, и хвост. Не уверен, что это хорошо. Точнее, уверен, что это плохо.

G>Если я напишу (назовем ленивое присваивание ?=) вот так
G>Res ?= map( Source, Fun )
G>И дам ему строгий список — то да. Если я дам ему аргументом ленивый список — то нет, даже если я выполню энергичное присваивание. Ты просто не задумываешься сейчас, в каких местах ленивость тебе действительно важна.

Мне достаточно того, что я не задумываюсь.

T>>Whole program analysis, получается, нужен.

T>>Получается, что аннотации ленивости дороги в сравнении.
G>Не вижу, как это получается. Ты пример приводить будешь в качестве иллюстрации? Спрашиваю уже раз в пятый.

Чуть выше ты привёл примеров на троих, вместе взятых. Хотя я добавил.

Вкратце: аннотация ленивости должна проходить через весь путь возможного прохождения ленивого значения.

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

Сравни: мне надо вставить аннотацию энергичности ровно в те места, где мне надо форсировать значения раньше времени.

Что мне надо сделать, чтобы map стал не ленивым по хвосту в нужном мне месте?
   strictList [] = []
   strictList (x:xs) = (x:) $! strictList xs
   map' f xs = strictList $ map f xs
-- *Main> take 3 $ map' (+1) ([1,2,3,error "bbb",5]++error "aaa")
-- Exception: aaa
-- Полностью ленивый map:
-- *Main> take 3 $ map (+1) ([1,2,3,error "bbb",5]++error "aaa")
-- [2,3,4]


По голове?
   strictList' [] = []
   strictList' (x:xs) = ((:) $! x) $ strictList' xs
   map'' f xs = strictList' $ map f xs
-- *Main> head $ drop 4 $ map'' (+1) ([1,2,3,error "bbb",5]++error "aaa")
-- *** Exception: bbb
-- Полностью ленивый map:
-- *Main> head $ drop 4 $ map (+1) ([1,2,3,error "bbb",5]++error "aaa")
-- 6


По хвосту и голове получается комбинированием.

Вуаля!

Такое форсирование надо провести только в местах скопления вычислений. Библиотечные функции править не надо.

Да и то, оно обычно вредит.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[8]: Ленивые языки - за и против
От: thesz Россия http://thesz.livejournal.com
Дата: 24.12.08 16:55
Оценка:
T>>...В больших программах на C/C++/Фортране встречается сделанная на коленке, кривая и косая, медленная и полная багов половина реализации Common LISP, вне зависимости от области применения.

VD>Ну, может тогда взять Common LISP?


Гринспуна ты, конечно, не читал.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[7]: Ленивые языки - за и против
От: Gaperton http://gaperton.livejournal.com
Дата: 24.12.08 22:19
Оценка:
Здравствуйте, thesz, Вы писали:

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


T>"Встречаются" — это просто песня.


T>Сейчас попробую развить...


T>Вот!


А ведь ты свой мемлик-то так и не нашел . Прикинь — а если б это не модель процессора МИПС была, а сервер, который должен работать месяцами? А? Лапками кверху?

Вот и выставляешь сейчас заслоны из теории и шуток. Заслон из практики — слабо? Научился бы ловить эти лики, блин. Так нет — шутишь.
Re[4]: Ленивые языки - за и против
От: Gaperton http://gaperton.livejournal.com
Дата: 25.12.08 01:12
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Вы замечательно придумали, на N+1 строчку N аннотаций ленивости. Спасибо, очень удобно.


Да, я замечательно придумал. Не за что.

А>А всё то, что будет использовать этот код, мне тоже помечать?


Нет, то что будет использовать этот код, помечать не нужно. Если включить мозг в положение ON, можно было бы и догадаться.

А>Получается, что аннотация расползается всё дальше и дальше, и на каком-то этапе проще забить на неё и сделать дефолтной.


Получается, что не будет. Кроме того, крайне любопытно, как вы будете искать лики, если вам проще сделать все дефолтной и не думать о строгости и ленивости. Полный strictness analyzis который расставляет строгость автоматически — NP-полная задача, что означает, что лики у вас будут.
Re[8]: Ленивые языки - за и против
От: Аноним  
Дата: 25.12.08 01:18
Оценка:
Здравствуйте, Gaperton, Вы писали:

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


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


G>А ведь ты свой мемлик-то так и не нашел . Прикинь — а если б это не модель процессора МИПС была, а сервер, который должен работать месяцами? А? Лапками кверху?


"В больших программах на <вставьте-что-угодно> встречаются трудноуловимые утечки памяти, независимо от области применения".

Вот тут вы сами сказали — "сервера, которые должны работать месяцами". Для решения таких задач есть erlang, он очень хорошо сюда вписывается. Да, гайки можно откручивать пассатижами, тут никто не спорит, но ключами всё-таки удобнее. Доказывать то, что такие задачи *физически выполнимы*
на хаскеле я не буду, это и так ясно. Вопрос только во времени и в ресурсах.

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

Вообще, я часто пишу утилиты "на выброс" с мемликами и кривой отчисткой ресурсов, так как по закрытию ОС сама всё почистит. А на работе требования к софту другие. Идиального софта нет, везде есть ошибки. И если сейчас всё устраивает заказчика, то всё ок.

Пример: эмулятор, который запускается 16 раз в день, каждый запуск — 15 секунд. Но у эмулятора есть проблема — через 2-3 часа непрерывной работы у него кончается хип. Так стоит ли в этом случае тратить время на поиск и исправление этой ошибки?

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

G>Вот и выставляешь сейчас заслоны из теории и шуток. Заслон из практики — слабо?


Тебе thesz привёл пример с исключением, можешь открыть ghci/hugs/etc и проверить. На "пальцах" показана ошибка, которая возникает из-за форсирования результатов. Что не так?
Re[8]: Ленивые языки - за и против
От: thesz Россия http://thesz.livejournal.com
Дата: 25.12.08 08:44
Оценка:
G>>>В больших программах на Хаскеле встречаются трудноуловимые утечки памяти, независимо от области применения.
T>>"Встречаются" — это просто песня.
T>>Сейчас попробую развить...

T>>Вот!


G>А ведь ты свой мемлик-то так и не нашел . Прикинь — а если б это не модель процессора МИПС была, а сервер, который должен работать месяцами? А? Лапками кверху?


Я бы немного по другому писал.

Или вообще написал бы на Хаскеле описание проблемы.

G>Вот и выставляешь сейчас заслоны из теории и шуток. Заслон из практики — слабо? Научился бы ловить эти лики, блин. Так нет — шутишь.


Просто у всех встречаются разные вещи.

Как, например, ловить опечатку в большой программе на K?
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[14]: Ленивые языки - за и против
От: thesz Россия http://thesz.livejournal.com
Дата: 25.12.08 13:40
Оценка:
T>>>Первый релиз Clean 1994.
G>>Надо же, я думал Клин старше...
К>Это именно первый публичный релиз по ходу дела, перый "внутренний" был ещё в 1987-м вроде как (здесь).
К>SPJ вроде не раз упоминал, что Плазмейер активно участвовал в работе над Хаскелем и по первости были идеи "слить" 2 языка.

Или наоборот:

[url=http://www.computerworld.com.au/index.php/id;1974033854;fp;2;fpid;4]Most of the researchers we approached said yes; I think at that stage probably the only one who said no was David Turner, who had a language called Miranda, and Rinus Plasmeijer, who had a language called Clean. He was initially in the committee but he then dropped out.[/url


Вот как-то так.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[15]: Ленивые языки - за и против
От: Курилка Россия http://kirya.narod.ru/
Дата: 25.12.08 14:09
Оценка:
Здравствуйте, thesz, Вы писали:

T>Или наоборот:

T>

Most of the researchers we approached said yes; I think at that stage probably the only one who said no was David Turner, who had a language called Miranda, and Rinus Plasmeijer, who had a language called Clean. He was initially in the committee but he then dropped out.


Вот именно факт про dropped out я и имел в виду.
Re[6]: Ленивые языки - за и против
От: Аноним  
Дата: 26.12.08 02:04
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Здравствуйте, Аноним, Вы писали:


А>>Да, ты верно говоришь, что у хаскеля другой уровень и другая область применения. Никто не станет писать ray-tracer на erlang, и от того, что erlang медленнее хаскеля/clean/etc в какой-то области его никто не станет выбрасывать, так как он затачивался под другие задачи.


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


Да, видимо не заметил. Если так — прощу прощения. Прочитал первое сообщение в теме и почему-то пропустил область применеия.

G>В больших программах на Хаскеле встречаются трудноуловимые утечки памяти, независимо от области применения


То же самое говорили разработчики Явы про С++ и С. Но ведь "трудноуловимость" зависит от квалификации программиста и от его мозга, не так ли? Если джуниор не может что-то понять и "уловить утечку" в своей второй/третьей программе на Хаскеле/<чём угодно>, то язык тут винить нужно в последнюю очередь. Имхо, конечно.

G>Остаются быстро работающие консольные аппликухи, которые не ограниченны памятью, и не жуют обчень больших данных. Только в данном классе приложений нам данная проблема не доставит проблем. Офигенный "класс приложений". Рекомендую.


Ага, спасибо за рекомендацию, чтоб я без неё делал! А какая проблема с обработкой "обчень больших данных"?

Бесконечные списки это недостаточно "большие данные"?

Вы же на С++ (или на любом другом языке) не будете реализовывать всё сами, а возьмёте либу (буст/что угодно) и напишите "обработку". Не вижу проблем. Или это опять намёк на "отстойность" хаскеля при реализации "альфа-блендера"?

А>>Именно поэтому что-то обьяснить ему не получится — так как всегда можно найти примеры, где ленивость не нужна (опять же, real-time приложения, интенсивные вычисления и т.п.). Вот так и получается, что раз "плоской" отвёрткой крутить шурупы с другим шлицом неудобно, то отвёртку нужно выбрость, потому что она больно не универсальная, и ещё нужно думать, какие отвёртки выбирать.


G>Объяснить ничего не получается, если не понимаешь, о чем идет разговор. Сочувствую. Я нигде не говорил, что "ленивость не нужна". Я говорил, что у полной ленивости по умолчанию есть проблемы. Это очень сложно понять? Очень сложно, блин, не заметить разницы между этими двумя тезисами?


У полной ленивости по умолчанию? Где вы такое говорили? Я почему прочитал как:

G> явного управления ленивостью, посредством фьючерсов и стримов (ленивых списков), и строгости по умолчанию.


Теперь я знаю, что это нужно читать как "у полной ленивости по умолчанию есть проблемы". Если переформулировать это выражение вот так:

"Есть задачи, где полная ленивость по умолчанию приносит много проблем" — то я буду полностью с вами согласен. Действительно, использовать "полную ленивость" смысла нет — слишком много проблем. Но ведь именно для их решения и придумали вещи для управления ленвостью, разве нет??

Так что можно форсировать вычисление некоторых частей, точно так как же, как и пометить остальные части "ленивыми" в случае ващего подхода. Что вам не нравится? Мне вот в вашем подходе не нравится вставлять в N/(N+1) строк кода аннотации ленвости, уж лучше я поставлю 1/(N+1) аннотацию строгости. Не люблю мартышкин труд.

P.S. Не могу удержаться и не намекнуть на наличие ленивых/не ленивых версий разных модулей в хаскеле "из коробоки",
и не намекнуть на то, что проблемы всё-таки не у ленивости, а у тех, кто криво её использует (ну, или пытается использовать).

Всё, что я хотел от вас — это услышать то, что вы написали после чуть ли не десятка страниц, а именно — что использование "полной дефолтной ленивости" в embedded приложениях (если это значит использование языка haskell), а так же написание 24/7 телеком/high reliability серверов на ленивом языке (зачем, есть же ерланг, который для этого и делался??) и разный софт-риал-тайм неоправданно, так как есть более подходящие инструменты. Про это я вам и говорил.

И ещё одно замечание, а если я вставлю явные аннотации строгости, то программа всё ещё будет попадать под категорию "полная ленивость по умолчанию"? Или это будет просто ленивость, а не "полная"? А если за заимпортирую неленивую реализацию какого-нить модуля, и напишу код с использованием этого модуля, то ленивость останется?

Простые вещи нужно делать просто. И одна из главных черт хорошего специалиста — это выбор правильного инструмента для решения задачи. Писать что-то на том, что плохо подходит — это можно делать либо ради интереса (aka fun), либо что-бы занять команду и обеспечить им много удовольствия от решения созданных проблем, либо чтоб развести заказчки на много денег и продлить радости общения (и получения прибыли) (j/k)

А про то, что остались только консольные приложения, которые хаскелл (в качестве примера ленивого языка) может "потянуть" — да, это самое очевидное, но это далеко не всё, не так ли?
Re[9]: Ленивые языки - за и против
От: Mamut Швеция http://dmitriid.com
Дата: 26.12.08 12:32
Оценка:
T>Как, например, ловить опечатку в большой программе на K?

Ну, например падением сптника на Венеру


dmitriid.comGitHubLinkedIn
Re[8]: Ленивые языки - за и против
От: Tonal- Россия www.promsoft.ru
Дата: 28.12.08 10:38
Оценка:
Здравствуйте, geniepro, Вы писали:
G>Gtk2Hs требует GTK+, QtHaskell и wxHaskell как-то нетривиально устанавливаются, с полпинка у меня не получилось... Ужасно всё...
С установкой QtHaskell на винде никаких проблем не заметил.
Правда пользоваться пока не пробовал.
... << RSDN@Home 1.2.0 alpha 4 rev. 0>>
Re[21]: Ленивые языки - за и против
От: FR  
Дата: 28.12.08 11:37
Оценка:
Здравствуйте, Курилка, Вы писали:

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


FR>>По Хаскелею вообще хоть что-то бы, а то я кроме компиляторов, Булатовского архиватора и оконого менеджера для linux и не слышал больше ничего.


К>Cryptol ?
Re[9]: Ленивые языки - за и против
От: geniepro http://geniepro.livejournal.com/
Дата: 28.12.08 13:18
Оценка:
Здравствуйте, Tonal-, Вы писали:

T>С установкой QtHaskell на винде никаких проблем не заметил.

T>Правда пользоваться пока не пробовал.

До установки QtHaskell я так и не дошёл, так как споткнулся на установке Qt. Вот все эти нетривиальности отбивают желание пользоваться неродными библиотеками ГУИ...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.