tag:blogger.com,1999:blog-654279083390275842.post2876356904150402848..comments2024-03-19T12:22:43.654+03:00Comments on Размышлизмы eao197: [prog] Прочитал тут статью Аарона Минского “OCaml for the Masses”…eao197http://www.blogger.com/profile/17283739752119445290noreply@blogger.comBlogger16125tag:blogger.com,1999:blog-654279083390275842.post-8325548769340371422012-01-19T14:53:39.514+03:002012-01-19T14:53:39.514+03:00я не понимаю твой вопрос
лучше в данном случае эт...я не понимаю твой вопрос<br /><br />лучше в данном случае это "локально лучше", (естественно, это может требовать локального ухудшения -- например, излишней спецификации чего-то разработчиком, но здесь не такой случай)имяhttps://www.blogger.com/profile/17115793398497396330noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-23078180559694204602012-01-19T12:13:23.014+03:002012-01-19T12:13:23.014+03:00@имя
> если какая-то ошибка ловится языком А и ...@имя<br />> если какая-то ошибка ловится языком А и не ловится языком В, то (в этом случае/контексте) язык А лучше языка В<br /><br />Этому утверждению явно не хватает пары измеримых критериев :) Например что значит "лучше"?Anonymoushttps://www.blogger.com/profile/09209002940443714349noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-43462722761688590122012-01-19T12:05:55.845+03:002012-01-19T12:05:55.845+03:00@имя:
По основному пункту ответил здесь: http://e...@имя:<br /><br />По основному пункту ответил здесь: http://eao197.blogspot.com/2012/01/prog.htmleao197https://www.blogger.com/profile/17283739752119445290noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-61198913009263572802012-01-19T00:10:58.686+03:002012-01-19T00:10:58.686+03:00если какая-то ошибка ловится языком А и не ловится...если какая-то ошибка ловится языком А и не ловится языком В, то (в этом случае/контексте) язык А лучше языка В<br /><br />всякие твои отмазки типа "да оно более сложные ошибки все равно не поймает" (и значит пусть и эту не ловит? так?) никуда не годятся<br /><br />что же касается этого примера -- мне лично не нравится замена явного и ясного цикла на рекурсию<br /><br />мое понимание -- А. "пропустить все повторяющиеся элементы, кроме первого", либо В. "добавить элемент, если предыдущий был не равен этому"<br /><br />питоновский код выходит за границу, что выявит *любой* тест, не?<br /><br />да, и как насчет [1,1,1,2,2,2]? питон и окамл вроде по-разному ведут себя<br /><br />а вообще разбор случаев тут полезен, значит и паттерн-матчингимяhttps://www.blogger.com/profile/17115793398497396330noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-86648562682747021622012-01-18T12:32:27.934+03:002012-01-18T12:32:27.934+03:00Я намекал на то, что программистская смекалка скор...Я намекал на то, что программистская смекалка скорее сродни иконе, чем ремням :)Anonymoushttps://www.blogger.com/profile/09209002940443714349noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-43119904300745783402012-01-18T12:04:32.503+03:002012-01-18T12:04:32.503+03:00@Rustam:
>Сборка мусора да конечно плюс, но то...@Rustam:<br /><br /><i>>Сборка мусора да конечно плюс, но той же яве мало помогает.</i><br /><br />Ява по многословности вообще чемпион. Сложно найти из живых и широко применяющихся языков другой такой многословный.eao197https://www.blogger.com/profile/17283739752119445290noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-62970744728903189722012-01-18T11:27:47.409+03:002012-01-18T11:27:47.409+03:00@Евгений
Сборка мусора да конечно плюс, но той же...@Евгений<br /><br />Сборка мусора да конечно плюс, но той же яве мало помогает. Возможно C# себя получше покажет, но там уже функциональных фишек скоро будет больше чем в окамле :)Rustamhttps://www.blogger.com/profile/17746482246614094380noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-36122900303095777582012-01-18T11:25:24.427+03:002012-01-18T11:25:24.427+03:00@Евгений
Автор да, как и большинство камлистов яв...@Евгений<br /><br />Автор да, как и большинство камлистов явно ООП недолюбливает, хотя именно ОО система выделяет OCaml, такой больше ни у кого нет.Rustamhttps://www.blogger.com/profile/17746482246614094380noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-12176411988560732012012-01-18T11:21:22.403+03:002012-01-18T11:21:22.403+03:00@Rustam:
>Вместо грамматики можно любую деревя...@Rustam:<br /><br /><i>>Вместо грамматики можно любую деревянную структуру подставить, вот например из одной утилитки выдрано:</i><br /><br />Ну вот о чем я и говорю -- примеры плохие. Нет что бы что-то в таком духе в статье привести.<br /><br />PS. Кстати говоря, лаконичность OCaml и C++ не очень корректно сравнивать. В первую очерез за счет наличия сборки мусора в OCaml. Поскольку в плюсах ее нет, то много приседаний приходится именно на управление памятью.eao197https://www.blogger.com/profile/17283739752119445290noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-19560262510054797962012-01-18T11:17:57.488+03:002012-01-18T11:17:57.488+03:00@Rustam:
По поводу противопоставления OCaml и ОО....@Rustam:<br /><br />По поводу противопоставления OCaml и ОО. Это не я начал ;)<br />Мне показалось, что автор статьи этим занимается с самого начала :))eao197https://www.blogger.com/profile/17283739752119445290noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-17031897085773366862012-01-18T11:16:23.704+03:002012-01-18T11:16:23.704+03:00@Rustam:
По поводу 2 миллионов строк кода.
Допус...@Rustam:<br /><br />По поводу 2 миллионов строк кода.<br /><br />Допустим, у них 65 человек пишут по одной тысяче строк кода в месяц на каждого. Уже выйдет 65K в месяц, за год это уже будет 780K. Т.е. только за прошедший год они должны были половину своей кодовой базы написать. А OCaml там применяют уже 10 лет. И пусть сначала это были считаные люди, но все равно...<br /><br />У меня есть другое объяснение. Там занимаются не столько производством софта, сколько тюнингом уже существующего. Т.е. постоянной шлифовкой алгоритмов и пр. Фактически, дописывание нового функционала происходит реже, чем переписывание уже существующего.<br /><br />А это несколько другая ситуация, чем у компаний, которые занимаются производством софта (особенно под заказ). Где как раз мейнстримовые языки и имеют очень сильные позиции.eao197https://www.blogger.com/profile/17283739752119445290noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-66048372741245238832012-01-18T11:06:29.292+03:002012-01-18T11:06:29.292+03:00@Alexey Zlobin:
Да, есть что-то похожее :)
Но ещ...@Alexey Zlobin:<br /><br />Да, есть что-то похожее :)<br /><br />Но еще раз вернусь к примеру. Он мне напомнил, что некоторые C++ компиляторы в ряде случаев обнаруживают забытый return и выдают ошибку -- у Visual C++ она звучит как так "not all control paths return value". ИМХО, это в точности то же самое, что и было продемонстрировано в примере с паттерн-матчингом. Полагаться на такие способности компилятора почти то же самое, что на икону вместо ремней безопасности. Поскольку в более сложных случаях компилятор забытый return не заметит. Так и в случае, если в паттерн-матчинг какой-нибудь программист по ошибке засунет вариант _.<br /><br />Если уж автор хотел показать достоинства статической типизации в предотвращении багов, то нужно было что-то более существенное продемонстрировать. А не способность компилятора проверить полноту вариантов в паттерн-матчинге.eao197https://www.blogger.com/profile/17283739752119445290noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-28784460856491410992012-01-18T11:05:52.395+03:002012-01-18T11:05:52.395+03:00@Евгений
Иногда даже складывается впечатление, чт...@Евгений<br /><br /><i>Иногда даже складывается впечатление, что на ФЯ ничего кроме разбора грамматик и не делают</i><br /><br />Вместо грамматики можно любую деревянную структуру подставить, вот например из одной утилитки выдрано:<br /><br />type <br /> file_data = DirEnum.t<br />and<br /> file_root =<br /> {<br /> root_path : utf8;<br /> root_childs : file_tree list<br /> } <br />and<br /> file_folder =<br /> {<br /> folder_path : utf8;<br /> folder_data : file_data;<br /> folder_childs : file_tree list<br /> }<br />and <br /> file_tree =<br /> Root of file_root |<br /> Folder of file_folder |<br /> File of file_data<br /><br /><br />и примеры использования<br /><br />let print = iter <br /> (<br /> function<br /> | Root r -> printf p"root: %utf\n" r.root_path<br /> | Folder f -> printf p"[%utf]\n" f.folder_path<br /> | File f -> printf p" %utf\n" f.DirEnum.file_name<br /> )<br /><br /><br />let rec count_files = <br /> let aux a = function<br /> | Root r -> a <br /> | Folder f -> a <br /> | File data -> a + 1 <br /> in fold aux 0<br /><br />то же самое на C++ будет гораздо более громоздким, на питоне можно добиться похожего:<br /><br />def count_files(tree_el):<br /> <br /> case = FileTreeVisitor()<br /> <br /> @case(Root)<br /> def root(tree_el):<br /> return reduce(lambda a, b: a + count_files(b), tree_el.childs, 0)<br /> <br /> @case(Folder)<br /> def folder(tree_el):<br /> return reduce(lambda a, b: a + count_files(b), tree_el.childs, 0)<br /> <br /> @case(File)<br /> def file(tree_el):<br /> return 1<br /> <br /> return case.apply(tree_el)<br /><br />но все-равно кода больше и придется писать прилично дополнительного кода + тесты.Rustamhttps://www.blogger.com/profile/17746482246614094380noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-962330722497804982012-01-18T09:15:29.109+03:002012-01-18T09:15:29.109+03:00@Евгений
почему этим функциональным языком должен ...@Евгений<br /><i>почему этим функциональным языком должен быть OCaml</i><br /><br />Кстати хаскелисты на rsdn уже говорят что OCaml вовсе не кошерный, а императивный язык, по большому счету они правы.Rustamhttps://www.blogger.com/profile/17746482246614094380noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-47739166778221445552012-01-18T09:06:41.356+03:002012-01-18T09:06:41.356+03:00@Евгений
Почему только 2 миллиона за все это врем...@Евгений<br /><br />Почему только 2 миллиона за все это время, понятно если хоть немного пописал на окамле. Причины две: <br /><br />Код получается очень коротким даже например в сравнении с таким выразительным языком как питон, притом на коротких программках до сотни-другой строк на питоне часто получается короче, но чуть больше объем и окамл начинает выигрывать.<br /><br />На этот короткий код времени к сожалению тратится или столько или даже больше чем на длинный эквивалентный код на менее выразительных языках. Я думал это у меня чисто субъективно (слабоват я в ФЯ :) ) но у других также, даже автор этой статьи косвенно это подтверждает "Six months and 80,000 lines of code later"<br /><br />По статье да примеры слабоваты согласен, там и в комментариях критикуют. Но объективно сложно привести хорошие примеры, это как и с ООП на мелких примерах скорее увидишь недостатки, а крупные (в контексте окамла под 1000 строк) не воспримут.<br /><br /><i>Если для JaneStreet OCaml – это конкурентное преимущество, то лучше было молчать в тряпочку и никому не признаваться </i><br /><br />Насколько я понимаю им выгоднее все-таки расширить нишу, все равно достаточно высокий входной барьер отсеет конкурентов :)<br /><br /><i>В-третьих, если уж противопоставлять OCaml и функциональщину объектно-ориентированному виду</i><br /><br />Как раз <b>O</b>Caml противопоставлять ОО не стоит, как раз в ОО стиле он яву обыграет на раз :)Rustamhttps://www.blogger.com/profile/17746482246614094380noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-36034292921268012592012-01-17T21:14:29.912+03:002012-01-17T21:14:29.912+03:00> Но если речь идет о гипотетических тривиальны...> Но если речь идет о гипотетических тривиальных ошибках, то где гарантия, что OCaml будет их все ловить? Нет такой гарантии. А посему этот пример идет лесом, т.к. если гарантий нет, то все равно нужно будет делать тесты и тогда какая хрен разница, на Python-е написан код или на OCaml?<br /><br />Напомнило: "По результатам опроса Московских водителей возят с собой икону 92%, пользуются ремнями безопасности 12%".Anonymoushttps://www.blogger.com/profile/09209002940443714349noreply@blogger.com