Entry tags:
Динамическая типизация, или статическая типизация для ленивых
Вчера
ivan_gandhi сделал замечание что я, пользуясь динамически типизированной кложурью, при этом требую, чтобы в Java проверяли входные параметры на валидность. (Если что, проверка валидности в дотнете есть на каждом шагу, а объяснения вида "экономят циклы и не делаю проверки" в контексте жабы, тяжелого железа, JIT и прочего звучат крайне странно).
Собирался на эту тему устроить срач с утра, но
thedeemon уже начал, так что я продолжу :)
Так вот, динамически типизированными языками мы пользуемся от бедности - нету статически типизированных языков, которые давали бы ту же функциональность.
Например, я хочу использовать кортеж с именованными полями (потому что позиционные кортежи нихера нечитабельны и их тип вида int*string*smallint*money*bool*Chervie ни о о чем не говорят). От входа в F# при этом нужно:
1) объявить этот чертов record где-то
2) сослаться на модуль с объявлением везде где он нужен
3) создавать экземпляры рекорда кривопачвярными конструкциями, причем оставить поля значениями по умолчанию нельзя.
4) паттерн матчинг с декомпозицией вроде не работает с рекордами.
Хаскель сразу закапываем - там на каждый случай имеется 3-4 расширения и 10 пакетов в hackage различной степени недоделанности, идиоматический подход - писать в point-free style, чтобы коллеги не разобрались, а работать в продакшене можно только с теми сторонними библиотеками, которые я могу сам починить.
При этом, у меня при работе с оперденями постоянно ситуации вида: есть запись с тремя полями, полученная из БД, мне нужно произвести обработку этой записи и добавить результат обработки в виде четвертого поля, получив новый тип записи.
Я НЕ хочу объявлять каждый раз такое руками и в Clojure это делается элементарно, добавлением нового ключа в map в функции-обработчике записей.
При этом РЕАЛЬНО динамическую типизацию я не использую. Она мне почти не нужна, потому что единственная ситуация, где вменяемый человек будет на одном цикле биндить к имени число, на втором строку, на третьем - список записей - это когда по условию задачи нужна, например, EAV-модель во все поля. И то - обычно EAV делается от безысходности, потому что пользователь не может нормально работать со схемой БД, а задача требует чего-нибудь вроде "добавить к части записей атрибут "фаза луны в которую производилась приемка товара"". В норме должны быть зависимые типы и миграции и пользователи бы пользовались той же системой типов что и разработчик.
Т.е. нормальный вывод типов - это когда программа берет типы из тут же описанного SQL-запроса, а рекорды расширяемые и объявлять их не нужно.
Второй use-case, где "вроде бы динамическая типизация" - это когда я делаю документы в виде кложурных структур данных, подгоняя комбинации списков-мапов-массивов-множеств под предметную область. В кложуре же это делается в лоб, а в хаскеле в один список не положишь три разных по структуре(типу) раздела документа. Но на самом деле, то что я делаю в кложури - это просто алгебраический тип данных "для бедных", без объявления заранее и без явно выделенных-именованных конструкторов данных. Если бы была возможность делать расширяемые и объявляемые по месту типы данных (чтобы каждый раз при разработке не переключаться между объявлением типа и конструированием данных по этому типу) - то было бы то же самое что в кложури - но статически типизированное.
PS: На ту же тему: http://justy-tylor.livejournal.com/190153.html
Собирался на эту тему устроить срач с утра, но
Так вот, динамически типизированными языками мы пользуемся от бедности - нету статически типизированных языков, которые давали бы ту же функциональность.
Например, я хочу использовать кортеж с именованными полями (потому что позиционные кортежи нихера нечитабельны и их тип вида int*string*smallint*money*bool*Chervie ни о о чем не говорят). От входа в F# при этом нужно:
1) объявить этот чертов record где-то
2) сослаться на модуль с объявлением везде где он нужен
3) создавать экземпляры рекорда кривопачвярными конструкциями, причем оставить поля значениями по умолчанию нельзя.
4) паттерн матчинг с декомпозицией вроде не работает с рекордами.
Хаскель сразу закапываем - там на каждый случай имеется 3-4 расширения и 10 пакетов в hackage различной степени недоделанности, идиоматический подход - писать в point-free style, чтобы коллеги не разобрались, а работать в продакшене можно только с теми сторонними библиотеками, которые я могу сам починить.
При этом, у меня при работе с оперденями постоянно ситуации вида: есть запись с тремя полями, полученная из БД, мне нужно произвести обработку этой записи и добавить результат обработки в виде четвертого поля, получив новый тип записи.
Я НЕ хочу объявлять каждый раз такое руками и в Clojure это делается элементарно, добавлением нового ключа в map в функции-обработчике записей.
При этом РЕАЛЬНО динамическую типизацию я не использую. Она мне почти не нужна, потому что единственная ситуация, где вменяемый человек будет на одном цикле биндить к имени число, на втором строку, на третьем - список записей - это когда по условию задачи нужна, например, EAV-модель во все поля. И то - обычно EAV делается от безысходности, потому что пользователь не может нормально работать со схемой БД, а задача требует чего-нибудь вроде "добавить к части записей атрибут "фаза луны в которую производилась приемка товара"". В норме должны быть зависимые типы и миграции и пользователи бы пользовались той же системой типов что и разработчик.
Т.е. нормальный вывод типов - это когда программа берет типы из тут же описанного SQL-запроса, а рекорды расширяемые и объявлять их не нужно.
Второй use-case, где "вроде бы динамическая типизация" - это когда я делаю документы в виде кложурных структур данных, подгоняя комбинации списков-мапов-массивов-множеств под предметную область. В кложуре же это делается в лоб, а в хаскеле в один список не положишь три разных по структуре(типу) раздела документа. Но на самом деле, то что я делаю в кложури - это просто алгебраический тип данных "для бедных", без объявления заранее и без явно выделенных-именованных конструкторов данных. Если бы была возможность делать расширяемые и объявляемые по месту типы данных (чтобы каждый раз при разработке не переключаться между объявлением типа и конструированием данных по этому типу) - то было бы то же самое что в кложури - но статически типизированное.
PS: На ту же тему: http://justy-tylor.livejournal.com/190153.html
no subject
А вот "не понимаю IO и $" - это то, что лично мне помешало оценить haskell более предметно.
Впрочем, судя по постам про Хаскелль что пробегают мимо в жуйке, там одних libcurl штук 15 разных, разной степени deprecated и с разными багами, написанные в разных стилях
no subject
Ну эдак мы возвращаемся к тому недавнему треду на жуйке про ivan-ghandi и аппликативные функторы и монады. То, что кому-то помешало оценить, не говорит, что кому-то другому тоже помешает оценить. Я тут некоторый максимализм вижу.
no subject
Денег дают раза в два-три больше, чем С. З. в своей вакансии Haskell в Москве предлагал, проекты - 90% унылы, остальные 10% бывают вполне так себе интересными.
Советуются с интересными проблемами, опять же.
haskell и эти все эндофункторы выглядят эмблемами некоторого клуба людей, которых я могу описать примерно так:
* про командную работу думают не часто, либо нашли/создали на работе отдел единомышленников
* про риски работодателя и проекта не задумываются
* вариант "выбрать язык под задачу" им часто даже в голову не приходит
* уязвлённоё удивление и обидчивое непонимание, когда им рассказывают, почему их любимый язык такой хреновый (или что эндофункторы в их проекте не нужны).
С моей точки зрения, если они успешно решают задачи на работе - то это благодаря тому, что они умные, а не блогадаря тому, что Haskell. А если бы больше думали про то, что нужно проекту, а не то, чего хочется лично им, были бы ещё умней и успешней, и денег получали бы соразмерно больше.
Я не говорю, что деньги критерий, но 70к в Москве получают пыхеры средней руки.
Есть такое пенальти между требуемыми интеллектуальными усилиями и сложностью проекта, а также зарплатой.
В этом смысле мне товарищи напоминают FreeBSD админов. Те часто идут на зарплату в полтора раза ниже рынка, и половину рабочего времени сидят и пилят свою FreeBSD, патчи отправляют, portage упаковывают и так далее.
no subject
> В этом смысле мне товарищи напоминают FreeBSD админов. Те часто идут на зарплату в полтора раза ниже рынка, и половину рабочего времени сидят и пилят свою FreeBSD
Кому-то нравится это делать. Все всегда ищут баланс между "интересно" и "сколько денег". Разные люди находят этот баланс в разных точках. Причем здесь хаскель и ваши психологические комплексы -- совершенно неясно.
no subject
Я не иду в веб-разработку не потому, что там нет интересных задач, а потом, что задачи интересные мне в веб-проектах нахер не нужны обычно. А если я заскучаю и начну их тащить - это будет прямой ущерб проекту и, пожалуй, даже саботаж.
Мне вот scala интересна. Сижу и прохожу coursera, книжки читаю, pet-project пилю.
Но на работу я scala не потащу. Потому что она там нахер не нужна.
И что-то мне подсказывает, что в 90% случаев притащенные эндофункторы и haskell не так уж и нужны были, и малой кровью можно было обойтись без них.
В итоге есть у нас эндофункторы и haskell в отдельных проектах - огромной гемморой для владельца кодовой базы в поддержке в будущем.
no subject
Про эндофункторы уже было в жуйке, нет смысла по новой заводить шарманку.
no subject
Ущерб работе в том, что половину рабочего времени админ решает не задачи работодателя (чтобы почта и прочее работало) а проблемы FreeBSD проекта.
При работе с linux такого сорта задач ощутимо меньше.
Вот и с Haskell также. Сначала один шибко умный притащил haskell. Потом ему надоел проект и он поменял работу. В итоге работодателю приходится искать на не шибко богатом рынке haskell программиста, который с такими же альтернативными взглядами, как ушедший разработчик и мучаться с ним дальше.
Это косяк менеджмента, но что это меняет?
no subject
Это меняет всё. Если такой менеджмент существует и выдерживает конкурентную борьбу, значит это не самый плохой из менеджментов.
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(Anonymous) - 2012-10-13 15:19 (UTC) - Expand(no subject)
(no subject)
(no subject)
(Anonymous) - 2012-10-15 14:07 (UTC) - Expand(no subject)
(no subject)
(Anonymous) - 2012-10-15 20:13 (UTC) - Expand(no subject)
(no subject)
(Anonymous) - 2012-10-15 22:04 (UTC) - Expand(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
no subject
no subject
Первая ссылка: http://hackage.haskell.org/package/curl
У меня получается ровно одна библиотека работы с libcurl.
Вас не затруднит перечислить посты в жуйке, где рассказывается про 15 разных версий libcurl? Чтобы мы могли совместно проверить мою версию про то, что вы живёте в интересном мире с 15 разными curl на hackage и где C++ нет альтернативы. Есть у меня подозрение, что вы не затрудняете себя проверкой выдвинутых гипотез, и я думаю что у многих сложилось такое впечатление. Это характерно для очень умных людей с IQ более 149.
no subject
Я говорил что 15 вариантов libcurl - библиотек для скачивания файлов по http.
Насчёт постов про проблемы c http библиотеками под haskell - идите, читайте мою ленту, ищите.
Если бы вы попросили меня вежливо - я бы сам нашёл и показал, но хамам я помогать не собираюсь.
И да, именно этого не хватает в вашем первом и последующем комментарии.
1) Фразы "Давайте поговорим, как так получается. Меня удивляет..."
2) Просьбы пояснить непонятные вам моменты.
Впрочем, хамство с вашей стороны при критике Haskell я вижу не в первый раз. Видимо, избыточная физическая сила притупляет чувство реальности и даёт права в хамской манере общаться с окружающими.
Но не со мной. Удачи.
no subject
Обычные проблемы при быстром развитии и версионности пакетов. Нет никаких особых проблем, с которыми бы не сталкивались другие системы подобного рода, даже Линуксы этим страдают.
(мои коллеги заводили старый libc на новом линуксе; вот уж страху натерпелись!)
И я всё же попросил бы вас перечитать эти посты и поспрашивать о проблемах. Очень часто это проблемы решаются простой командой cabal update.
Сам я в восторге от cabal. Многие считают его одной из положительнейших сторон Хаскеля, как платформы.
Насчёт хамства... Да ещё и при критике Хаскеля...
Моё наблюдение насчёт интересности вашего мира подтверждается наблюдениями других людей. Это вам говорили неоднократно, я не первый. Это раз. Если бы мне задали такой забавный вопрос, я бы смог перечислить все необходимые посты. Просто я зануден и у меня хорошая ассоциативная память. В конце концов, это просто бы доказало всем и сразу, что вы однозначно правы. Это два.
Вы же, вместо того, чтобы опровергнуть мою гипотезу тем или иным способом, использовали обвинение в хамстве. Да, я из простых людей, мои родители были рабочими. Но для того, чтобы называть меня хамом, вам надо показать своё высокое происхождение. В противном случае... А, придумаете сами. Вы достаточно умны для этого.
Да и никакой критики Хаскеля тут так и не прозвучало. "Червие и ад" и прочие гиперболы критикой не считаются. Как и ваши фантастические "15 версий".
no subject
Впрочем, в вашем мире вполне может быть, что всё хорошо. В моём мире с haskell всё плохо.
Будем надеяться, когда-нибудь эти миры пересекутся.
no subject
no subject
Ещё пару лет назад заводил, чтоб одна замечательная программка заработала, которая под старый RedHat была рассчитана. Таки да — натерпелся.
Но я тут не показатель. Вполне может быть, что я совершенно не умею это готовить. Однако, учиться этому что-то не хочется.
no subject
no subject
Но не всегда ;-)
no subject
no subject
А что, в плюсах, питоне или, прости господи, лиспе таких библиотек ровно одна?
no subject
Питоне - urllib
Насчёт лиспа не знаю.
И называются они предсказуемо - в их имени есть слов "url".
А вот http://hackage.haskell.org/packages/archive/http-enumerator/0.1.0/doc/html/Network-HTTP-Enumerator.html , вы уж простите, вообще непонятно что.
С другой стороны, может он и мощнее, мне сложно сравнивать.
И насколько я понял из дискуссий, он deprecated. Вместо него советуют либо httpconduct, либо ещё какие-то, не помню какие.
Сравните из интереса:
https://www.google.com/search?q=haskell+download+file+http&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:unofficial&client=firefox-a&channel=fflb#hl=en&client=firefox-a&hs=QZS&rls=org.mozilla:en-US%3Aunofficial&channel=fflb&sclient=psy-ab&q=python+download+file+http&oq=python+download+file+http&gs_l=serp.3..0i20j0i30l2j0i8i30.27394.28159.0.28334.6.6.0.0.0.1.138.651.3j3.6.0.les%3B..0.0...1c.1.j-CR_fXNZ5Q&pbx=1&bav=on.2,or.r_gc.r_pw.r_cp.r_qf.&fp=c8e7929c0333c67&bpcl=35243188&biw=1088&bih=622
В первых же ссылках - urilib
https://www.google.com/search?q=haskell+download+file+http&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:unofficial&client=firefox-a&channel=fflb#hl=en&client=firefox-a&hs=Nv7&rls=org.mozilla:en-US%3Aunofficial&channel=fflb&sclient=psy-ab&q=download+file+http+using+C&oq=download+file+http+using+C&gs_l=serp.3..0i10i30j0i30j0i8i30l2.7681.10236.5.10383.10.8.0.0.0.0.452.1215.4j3j4-1.8.0.les%3B..0.0...1c.1.8YZOn2a0Pks&pbx=1&bav=on.2,or.r_gc.r_pw.r_cp.r_qf.&fp=c8e7929c0333c67&bpcl=35243188&biw=1088&bih=622
тут я запрос немного поменял, потому что C - слишком популярный keyword
Теперь смотрим haskell:
https://www.google.com/search?q=haskell+download+file+http&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:unofficial&client=firefox-a&channel=fflb
https://www.google.com/search?q=download+http+file+using+haskell&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:unofficial&client=firefox-a&channel=fflb
Вываливается куча ссылок на абсолютно разные решения.
no subject
http://www.freebsd.org/cgi/cvsweb.cgi/src/lib/libfetch/
libghttp
libwww -- http://www.w3.org/Library/
neon -- http://www.webdav.org/neon/
тысячи их (http://curl.haxx.se/libcurl/competitors.html)
> Питоне - urllib
requests -- http://pypi.python.org/pypi/requests
httplib -- http://code.google.com/p/httplib2/
и т.п.
no subject
Вот первая ссылка выдачи:
http://stackoverflow.com/questions/1636333/download-file-using-libcurl-in-c-c
Всё понятно, что, откуда, зачем и почему
Первая ссылка для haskell:
http://hackage.haskell.org/package/download
Выглядит похожим на правду. Но что меня удивило (!) никто из haskell'истов про неё даже не упомянул.
Этот берёт Enumerator, этот httpconduct. Почему? Enumerator deprecated, а httpconduct работает.
Дальше ещё обсуждение подобных либ.
Я поудивлялся,и пошёл дальше писать на своём богомерзком C++ и boost, которые работают, и который по одной штуке, а не 15 разных версий.
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
no subject
Я специально взял этот енумератор для своего проекта, чтобы сделать как положено, разделив источники данных, парсеры и потребители результата, при этом не закопавшись в IO
Через месяц оказалось что разработчик Yesod решил что надо все переделать заново :)
no subject
Правда, почти уверен, что йесод на них ещё долго не перелезет.
А вот happstack8 будет уже на них.
Они хорошие. И проще (имхо).
(no subject)
no subject
срачеразведения радидля оживления дискуссии. А ты гонишь грубо и цинично, банальные ложные факты. А как докопаются, будешь утверждать, что их правда 15 версий.Network.Curl есть и работает, и даже уже ставится одной командой не только под этим вашим линуксом.