2009-11-02

О Haskell

Обновление: обсуждение на habrahabr.ru Изучай Haskell ради... Haskell'а

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

Я понял, что Haskell-программисты — в основном, нужно сказать, хобби-программисты — это те, кто программирует не решение задачи, алгоритм, систему, а Haskell! [1] Посмотрите, какой простой алгоритм описан в заметке, а сколько вокруг него нагромождено языковых конструкций, объяснений и дискуссий. Чтоб доказать, что он очень простой, привожу пример кода на Lisp'е, который решает ту же задачу без никаких монадных трансформеров и т.п. (не обращайте внимание на большой docstring):
(defun test-bipartite (graph)
"Test for bipartiteness a GRAPH, that is given as a list of pairs
vertix - list of immediately connected vertices, like:

'((0 . (1)) (1 . (0 2 8))
(2 . (1 3)) (3 . (2 6))
(4 . (5 7)) (5 . (4))
(6 . (3)) (7 . (4 8))
(8 . (1 7)))
-- bipartite one

'((0 . (1 2)) (1 . (0 2 8))
(2 . (1 3)) (3 . (2 6))
(4 . (5 7)) (5 . (4))
(6 . (3)) (7 . (4 8))
(8 . (1 7)))
-- not bipartite one

'((0 . (1 2)) (1 . (0 2 8))
(2 . (1 3)) (3 . (2 6))
(4 . (5 7)) (5 . (4))
(6 . (3)) (7 . (4 8))
(8 . (1 7)) (9 . ()))
-- not connected one"

(let ((map (make-hash-table))
(visited '()))

(labels ((con1 (v)
"vertices immediately connected to V"
(tail (assoc v graph)))

(paint (v level)
"paint the graph from vertix V, return all
visited so far (in subsequent calls of PAINT) vertices"
(pushnew v visited)
(setf (gethash v map) level)
(mapc (lambda (v) (paint v (1+ level)))
(remove-if (lambda (v) (member v visited))
(con1 v)))
visited))

;; first we paint and check, that all vertices are visited
(unless (set-exclusive-or (paint 1 0)
(mapcar #'first graph))
(every (lambda (entry)
(every (lambda (v)
(oddp (+ (gethash (first entry) map)
(gethash v map))))
(tail entry)))
graph)))))


Мне хорошо знакомо это умонастроение — когда в погоне за максимальным использованием мощи языка забываешь о самой задаче,— поскольку в Lisp-мире оно тоже часто встречается: есть языки, которые способны действительно увлечь. И выражение "это взорвало мне мозг" часто звучат и по поводу Lisp'а, и по поводу Haskell'а. Но это же — фигня! Конечно, не может не радовать узнать что-то новое, но не нужно же радоваться этому, как ребенок новой игрушке. Хороший язык программирования должен быть максимально понятен и прост, должен давать человеку свободу самовыражения. Честно говоря, именно этому я обрадовался, когда открыл для себя Lisp: что нашел то, что искал. А не тому, что увидел какую-то конструкцию или изворот, который не доводилось встречать раньше.

Так что же, вывод: всем программировать на Lisp? Я, конечно, за, но вывод тут другой: Haskell — очень интересный язык, у которого есть как плюсы, так и минусы. Плюсы: это интересная семантика и сильная теоретическая база, хорошая скорость выполнения современных компиляторов. Минусы: ужасно нерегулярный синтаксис [2], искусственная ограниченность, которая приводит к необходимости задействовать сложные подоходы там, где отлично справятся и простые. И им просто обязательно стоит заниматься, если вас интересует тема языков программирования как таковых, их развития и исследований. Из Haskell берут многое другие более практичные языки: яркий пример тому Clojure. Но он не для написания больших систем и даже не для исследования алгоритмов в общем случае. У языков программирования кроме синтаксиса и семантики есть еще третий аспект, пожалуй даже важнейший, о котором часто забывают — прагматика. То, как язык используется, для чего он предназначается, чем живет сообщество его разработчиков и пользователей. Прагматика Haskell'а заключается в том, что он существует прежде всго для исследования... Haskell'а.

[1] Есть, конечно, исключительные, прекраснейшие Haskell-программисты, написавшие на нем много полезного кода для реального мира, но это, как говорится в нелюбимом мной афоризме, только подтверждает правило.

[2] Для современного языка нерегулярный синтаксис — это неуважение к своим пользователям. Ведь никто в современном мультиязыковом мире не программирует на одном языке, поэтому нельзя требовать от человека держать в голове идиосинкразии каждого. И этих общеупотребимых языков будет все больше и больше, а количество legacy кода уменьшаться не будет. Я сейчас имею дело с Lisp, Python, Php, C, JavaScript, Shell, Java. И это ведь не самый яркий пример.

35 comments:

archimag said...

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

Vsevolod Dyomkin said...

@archimag, а какой второй пост?

archimag said...

http://nponeccop.livejournal.com/156763.html

Vsevolod Dyomkin said...

а, спасибо.
Ну, это как раз такой оторванный от (программистской) реальности Haskell-программист (не в обиду будет сказано). Пишу так, поскольку удалось как-то послушать вживую его лекцию по основам ФП.

Anonymous said...

http://lionet.livejournal.com/44305.html?thread=953873#t953873

Вот Python:

def is_bipartite(graph): # graph is {id : [id], ...}
colors = {} # {id : bool, ...}
def paint(node, color):
current_color = colors.get(node, None)
if current_color is not None: return current_color == color
colors[node] = color
return all(paint(edge, not color) for edge in graph[node])

return all(paint(node, True) for node in graph if node not in colors)

Anonymous said...

По поводу практичности vs. академичности языков, я полмысли высказал во введении во второй номер http://fprog.ru/

Vsevolod Dyomkin said...

@lionet
Спасибо за Python-вариант. Я не сомневался, что с list-comprehensions он будет выглядеть совсем компактно

Vsevolod Dyomkin said...

@lionet
Прочитал ваше введение. В целом, вы, наверно, правы. Хотя есть несколько существенных ошибок.
* Во-первых, вы отождествляете функциональную парадигму с тем, что предлагается чисто-функциональными языками, а это только одно направление, есть как минимум динамические функциональные языки, у которых есть своя, не менее полноценная, концептуальная база (я про Scheme, Erlang, Clojure).
* Во-вторых, взаимозаменяете функциональное и декларативное программирование. Декларативный подход намного шире (см. http://en.wikipedia.org/wiki/Declarative_programming)
* В-третьих, поставили Lisp на последнее место по практичности, хотя всё наоборот (могу доказать аргументированно с примерами -- но это явно выходит за рамки формата комментария). Точнее, не совсем понятно, что вы понимаете под Lisp'ом. Сейчас этим словом обычно называют Lisp 1.5 McCarthy, а когда говорят о конкретных языках, все-таки принято отдельно выделять Common Lisp, Scheme, теперь еще Clojure (потому что разница тут не меньше, чем между Haskell и Ocaml) или же говорить семейство Lisp-языков. (Т.е. у меня сложилось мнение, что ваше представление о Lisp'е застряло как раз на уровне 80-х, о которых вы там пишите ;)

jkff said...

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

И они всяко не следуют из предшествующего контекста поста: то, что я для фана написал проверку двудольности, что Лев ее разобрал, а что многие, не зная хаскела, ее не поняли - вообще ничего не говорит о хаскеле как о языке для больших систем. Ибо рассматривалась отнюдь не большая система, а крохотная, и рассматривалась не с точки зрения критериев, важных для больших систем (например, поддержка модульности). В вашем посте, равно как и в комментариях к посту Льва, отсутствует аргументированная критика хаскела с точки зрения этих критериев.

С вашей стороны недальновидно "составлять окончательное мнение о хаскелле" на основе реализации на нем тривиального императивного алгоритма в несколько строк.

Vsevolod Dyomkin said...

@jkff
Конечно, совсем не следует. Пост, просто, стал "последней каплей". До этого я читал разные материалы, ходил смотреть на Хаскеллистов вживую.

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

PS. Окончательным это мнение тоже не назову. Все в мире меняется. Оно, просто, наконец сформировалось настолько, что его можно высказать, можно обоснововать в дискуссии.

archimag said...

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

Т.е. когда я читаю блог, в котором человек пишет о PHP, то я абсолютно уверен, что он реально постоянно пишет на PHP. Но когда я читаю блог о Haskell, то почти уверен, что автор пишет в основном на Java...

jkff said...

Всеволод, а Вы читали, например, книгу "Real World Haskell"? Она гораздо ближе к реальности.

Я Вам скажу "по секрету" - в блоги не пишут скучный код, потому что чего о нем писать-то. Пишут в основном о том, что будет интересно другим хаскеллистам - а им обычно интересно что-то новое.
Вот и создается впечатление, что весь хаскельный код - жесть (т.к. нормального кода Вы не видите). А если почитать настоящий код - hackage.haskell.org , например - то выяснится, что никто извращениями на самом деле не занимается; и пишут нормальный, читаемый, поддерживаемый код. Даже монадные трансформеры почти не используются :) Почитайте, например, исходники игрушки Monadius: http://hackage.haskell.org/package/Monadius - это один из самых читаемых исходников, что я когда-либо видел. Никакой лишней абстракции, но и никакого boilerplate - возможности хаскелла задействуются ровно настолько, насколько это нужно; обычный, красивый, чуть туповатый, понятный код.

Вот тут http://cufp.galois.com/2007/slides/ , http://cufp.galois.com/2008/slides/ , http://cufp.galois.com/2009/slides/ несколько experience reports о реальных программах на функциональных языках.

archimag said...

> Пишут в основном о том, что будет
> интересно другим хаскеллистам - а им
> обычно интересно что-то новое.

Ну а обычным людям, типа меня, интересно узнать не что-то новое, а вообще реально ли использовать его для написания обыкновенных программ? Кто из авторов русскоязыных блогов о haskell может привести ссылки на реальный код, который он написал? и который реально делает что-то полезно? Не кто-то там, а вот конкретный автор, который так любит рассказывать о haskell?

jkff said...

archimag: На здоровье. http://www.haskell.org/haskellwiki/Timeplot .

Vsevolod Dyomkin said...

@jkff
посмотрел слайды с 2009 года. Практические только по Erlang (3), Ocaml, Scala и VBA (!). Haskell: 3 презентации / 0 строк кода. (Я вовсе не критикую функциональный подход в целом: у него есть довольно широкая сфера применения и его очень даже стоит использовать в ее рамках)

Real World Haskell: не читал, надеюсь, когда-нибудь дойду :) Еще примеры? (про этот я слышал) Вы же не хотите, чтоб я снова сказал, что это "исключение, подтверждающее правило" ;)

jkff said...

> надеюсь, когда-нибудь дойду
Проглядите оглавление хотя бы: http://book.realworldhaskell.org/read

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

> Еще примеры?
Из лично моих - я еще как-то написал себе http://hackage.haskell.org/package/jarfind и неоднократно им пользовался. Больше ничего публичного и существенного я на хаскеле не выпускал.

Из менее универсального - Сергей Зефиров (thesz.livejournal.com) у себя в ЖЖ постил модели процессоров на хаскеле, схожие (или совпадающие) с теми, которые он делает на работе.

Михаил Митрофанов (migmit) что-то постил связанное с вебом.

Но, собственно, с какой целью интересуетесь? :) Вы хотите посмотреть на код или же интерпретировать мои вспомненные-навскидку знания о публичных хаскельных проектах, опубликованных моими знакомыми, как абсолютное знание о полезности хаскела?

archimag said...

> http://www.haskell.org/haskellwiki/Timeplot

Здорово! Но правда я не смог скачать архив, ибо "Proxy Error". Ну да не суть, там кажется менее 500 строк кода? И история разработки в 2 недели? Ну т.е. я не могу судить на основе данного кода, что вы с удовольствием и постоянно пишете на haskell. С другими авторами, насколько я понимаю, ситуация ещё хуже.

Меня не интересует статистика вообще (сколько проектов, сколько человек пишут), меня интересует конкретный человек - вот если ты рассказываешь постоянно и взахлёб о чем-то, то покажи, что же ты сделал на нём? Я вот лично делаю именно так, и если я пишу постоянно о Common Lisp, то вы можете легко зайти на http://github.com/archimag/ и убедиться, что я не просто так люблю поговорить, а реально пишу на нём код, и достаточно много.

Vsevolod Dyomkin said...

@jkff
Сам не люблю это выражение, поскольку используется к месту, и не к месту, но в нем есть доля мудрости.

Что касается мотивации: ну, во-первых, мы тут спорим, соответственно, нужно артикулировать свою позицию и приводить аргументы (это же не только между нами, а, в общем-то, публично доступный ресурс). Я, кстати, обычно из спора выхожу с мыслями: сколько всего интересного, о чем я не знал :) Надеюсь, что оппоненты выйдут с мыслям: да, нужно над этим задуматься и пересмотреть свое отношение. Там в слайдах О'Салливана в конце были картинки, что "мы не хотим быть как Боно, но и не стоит быть как те йоги". Я думаю, это в точку. Мне очень интересен Haskell. Я бы сам с удовольствием читал заметки, где сравниваются решения на нем с решениями на других языках, участвовал бы в технических дискуссиях. Но Haskell-комьюнити на этом не сфокусированно, скорее наоборот: об этом я и написал. Т.е., смотрите, это совет в первую очередь вам: меня то это, в общем-то, не сильно касается, поскольку я уже нашел то, что искал, и удовлетворен этим, а когда встают конкретные вопросы, могу найти нужные мне ответы там, где они есть: будь то Haskell, Python или Java...

jkff said...

На самом деле с учетом патчей к библиотеке chart там более 500 строк кода, а история разработки, если ее сконденсировать, значительно меньше двух недель.
Попробуйте отсюда скачать исходник тогда: http://hackage.haskell.org/package/timeplot

Чтобы сбилдить, конечно, придется организовать себе соответствующую инфраструктуру - cabal, в частности; если хотите, могу прислать бинарник по почте, а вообще когда-нибудь попробую дебиановским пакетом выложить.

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

archimag said...

> Чтобы сбилдить, конечно, придется
> организовать себе соответствующую
> инфраструктуру - cabal, в частности

Да, у меня есть, и ghc, и cabal, и darcs, у меня Gentoo, и со сборкой проблем нет :)

> Я рад за Вас, что Вам удается
> много писать на лиспе

Я вот не понимаю, регулярно можно наблюдать ожесточённые обсуждения Haskell, ФП и т.п., но при этом, обсуждается ... воздух. Одни слышали и одобряют, другие слышали и недобряют, третьи не слышали и не одобряют, но никто (!) реально много кода не писал. Да, я знаю, что есть люди, которые писали, но они кажется в этих спорах не участвуют. Мне не понятно, как вообще можно участвовать в подобных обсуждениях, не имея хотя бы 10 000 строк написанного (лично) кода за спиной?

> у меня, видимо, меньше идей :)
Могу предложить одну, сайт сообщества haskell-разработчиков написанный на haskell гы :) я думаю, это важно...

jkff said...

> никто (!) реально много кода не писал.
lionet писал, thesz писал, alexott писал... Блин, да см. второй номер fprog.ru.

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

archimag said...

> lionet писал, thesz писал, alexott писал...
> Блин, да см. второй номер fprog.ru.

Угу, я читал :) Впечатление так себе на само деле... Особенно от того, что это было когда-то (давно) и примера системы, которая бы функционировала прям сейчас там кажется нет, да и системы какие-то странные...

Кстати, lionet, кажется, постоянно с erlang дело имеет, ссылок на его проекты на Haskell я не видел. Аlexott - ну это вообще уже немного смешно выглядит, когда-то написал одну систему на scheme, но с тех пор пишет в основном на С++ (ещё переводы делает, вот за это ему спасибо, переводы хорошие) и видимо на фоне С++ ностальгирует по scheme - может и не так на самом деле, но выглядит именно так (и при чём тут вообще Haskell). Про thesz ничего не знаю, где можно посмотреть его проекты (на haskell)?

> Молчание в тряпочку до некоторого,
> определенного ad-hoc, уровня
> компетентности - неконструктивный
> совет, чреватый остановкой развития.

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

Vsevolod Dyomkin said...

@archimag
Alexott еще что-то пишет на Emacs Lisp'е (ceget)

Но, вообще, да, я бы не сбрасывал в одну кучу Haskell, Lisp и Erlang, например. Никто не оспаривает практичность последних двух -- это доказано практикой ;) Да и Haskell, наверно, вполне может быть практичным, если озаботиться этим (есть же как пример darcs, который, правда, уступил git'у с mercurial'ом, что говорит о том, что не так важен язык, как те, кто на нем пишут).

Anonymous said...

Вразнобой:

* Во-первых, вы отождествляете

Нет, не отождествляю. Я явно пишу про Эрланг, например.

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

Нет, не заменяю. Но не дифференцирую слишком сильно в статье "от редактора", ибо не претендую на анализ в этом формате.

* В-третьих, поставили Lisp на последнее место по практичности, хотя всё наоборот (могу доказать аргументированно с примерами -- но это явно выходит за рамки формата комментария).

А вот это очень интересно! Именно этой реакции я и добивался, поставив лисп после хаскеля. Мне и другим читателям было бы интересно увидеть статью от Вас в журнале fprog.ru на эту тему. Это возможно?

Другие вопросы:

a) где мой код:

мой (и моих коллег) код на хаскеле есть в Cisco (я ещё там работал, когда начал интересоваться FP), а также в js-kit на бэк-енде. К сожалению, показать не могу. Да и не все опен сорс успевают писать в свободное от работы время. Я раньше достаточно много писал (когда на C специализировался: google: asn1c, ipcad), но чем дальше, тем хуже, даже не C ничего нового не выкладываю. Думаю, что у многих коллег похожая ситуация, которая ограничивает количество проектов, о которых можно написать с примерами кода.

С другой стороны, мой (и коллег) хаскелевский код можно "пощупать" в работе, он сейчас в продакшне, 24/7. Как и окамловский, и эрланговский. Плюс, недавно удалось заручиться поддержкой совета директоров на открытие частей исходников, что поможет на их основе создать какие-то обучающие статьи.

и) где код других

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

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

P.S. моё понимание лиспа застряло примерно там же, где и пролога: в восьмидесятых. Я буду рад ошибиться, прочитав Вашу статью.

archimag said...

> мой (и моих коллег) код на
> хаскеле есть в Cisco

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

> Да и не все опен сорс успевают
> писать в свободное от работы время

Да, конечно, но... Когда вы говорите об Cisco, то я сразу представляю, что там была группа людей, которая считала, что нужно писать на C, была другая группа, которая считала, что надо писать на Java, и был какой-нибудь ведущий разработчик, который в тот момент времени интересовался Haskell и хотел писать на нём. В конце концов, я не сомневаюсь, что писать на Haskell интереснее, чем на C или Java. Вот так в протиборстве разных людей время от времени всплывают компоненты, разработанные на Haskell. О чём это говорит? Да только о том, что ведущий разработки в тот момент времени интересовался Haskell и его мнение оказалось решающим.

А вот когда я вижу, что человек писал open source проект (а значит, скорей всего в нерабочее время), и не один день (а лучше несколько лет), и при этом использовала язык XXX, то я понимаю, что наврное ему просто нравится писать на этом языке. Что можно долгое время писать, много раз всё переделывать и всё равно получать удовольствие от разработки на этом XXX.

Человек дома может выбрать любой язык, но "на работе" он такой возможности обычно лишён.

А в иных блогах, налюбдается постоянная война с сотнями комментариев, и я начинаю думать, что человеку больше нравится спорить об Haskell (и чувствовать "превосходство на толпой"), чем писать на нём реальный код.


> Мне и другим читателям было бы
> интересно увидеть статью от Вас в
> журнале fprog.ru на эту тему.
> Это возможно?

@Vsevolod, советую не вестись :) CL нуждается в дистанцировании от ФП, при чём,как можно дальше....

Anonymous said...

Да, конечно, но... [...] Да только о том, что ведущий разработки в тот момент времени интересовался Haskell и его мнение оказалось решающим.

Не вижу, как это отличается от того, что происходит в других языках, в том числе там, где появляются проекты на CL.

А вот когда я вижу, что человек писал open source

Приводились уже проекты опен сорсные и не очень: от jkff, от thesz. Вот мой проект на хаскеле, который доопенсорсился, по состоянию на минус два с половиной года: http://asn1c.svn.sourceforge.net/viewvc/asn1c/branches/haskell/asn2/ASN/

Но опен сорс не может являться определяющим. Я его гораздо меньше ценю, чем тот код, который уже сейчас у меня 24/7 в продакшне вертится. За него, между прочим, люди деньги получали и получают.

@Vsevolod, советую не вестись :) CL нуждается в дистанцировании от ФП, при чём,как можно дальше....

Состояние ФП сейчас таково, что смысла нет разделять фп-ориентированные языки, если имеется желание хоть как-то поддержать и популяризировать эту парадигму. А элитизм, типа "не дадим загрязнить свой любимый CL упоминанием его рядом с хаскелем" не сильно от тех снобистских высказываний иных хаскелистов отличается, о которых Вы пишете. Какая разница, на чём писать, лишь бы мозги развивало чуть-чуть больше, чем быдлокодинг на $language_of_the_day.

Vsevolod Dyomkin said...

@lionet
Написать статью, конечно, можно. Я бы даже сделал это с удовольствием. Единственное, что, поскольку Common Lisp является мультипарадигменным языком, то найти на нем какой-то проект только в рамках функциональной парадигмы -- нереально. (Да и, наверно, не стоит ставить себе такую цель, поскольку это будет искажение реального положения дел). С другой стороны, можно наоборот показать, как может сочетание нескольких парадигм давать свои преимущества.

В общем, идея для меня интересна, но нужно чуть-чуть точнее обсудить формат. Это можно сделать через почту (vlm@lionet.info - ?)

ADEpt said...

Так как сюда код фиг запостишь (не допускается тэг pre), кину только ссылку с дословным переложением кода на питоне, приведенном выше: http://lionet.livejournal.com/44305.html?thread=969745#t969745

Так что писать можно по-разному, не спешите делать далеко идущих выводов :)

Vsevolod Dyomkin said...

@ADEpt
в том-то и дело, что выводы не в спешке сделанные, а после долгого наблюдения за Haskell-сообществом :) (и касаются в первую очередь именно его)
А сам Haskell -- конечно, язык очень интересный и многогранный (об этом, наверно, и говорить не стоит). И вы как раз один из тех, кто показывает хороший пример и привлекает к нему

Skynin said...

Полностью присоединяюсь к автору поста. Сам с интересом наблюдаю за ФПтусовкой, но выводы все больше такие же. Изложил вчера в комментариях r eao197.blogspot.com/2009/11/compprogflame-java.html

Dema said...

"Есть мнение, что эта идиотская фраза первоначально звучала примерно так: "Исключение подтверждает, что это всего лишь правило, а не строгий закон". Дальше какие-то, извините, бараны, силясь доказать какие-то абсурдные мысли, стали использовать перевранный вариант. Естественно, другое доказательство абсурдной мысли придумать трудно, а желающих аргументировать свой бред - огромное количество, поэтому фраза стала настолько популярна." © otvety.google.com

Vsevolod Dyomkin said...

@Dema
О, спасибо: это супер!

Skynin said...

Пословицы и их смысл
http://gn.org.ua/proverbs
Исключение подтверждает правило
Фраза-чемпион по бездумному и бессмысленному употреблению.
Понятно, что нарушение правила никоим образом не подтверждает его, а только опровергает. Правило подтверждается не фактом нарушения, а актом объявления замеченного нарушения особым исключением -- при том, что во всех прочих специально не оговоренных случаях правило остаётся обязательным к исполнению.
...
... у одного латинянина звучало как "Исключение подкрепляет правило", обозначая красоту и полному описания правила, после которого приведен список исключений.

Vsevolod Dyomkin said...

еще по теме: http://rssh.livejournal.com/142551.html

Alexey Romanov said...

Случайно совпало: я вчера как раз написал, откуда эта фраза взялась.

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