metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2012-10-11 03:22 pm

Динамическая типизация, или статическая типизация для ленивых

Вчера [livejournal.com profile] ivan_gandhi сделал замечание что я, пользуясь динамически типизированной кложурью, при этом требую, чтобы в Java проверяли входные параметры на валидность. (Если что, проверка валидности в дотнете есть на каждом шагу, а объяснения вида "экономят циклы и не делаю проверки" в контексте жабы, тяжелого железа, JIT и прочего звучат крайне странно).
Собирался на эту тему устроить срач с утра, но [livejournal.com profile] 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

[identity profile] freiksenet.livejournal.com 2012-10-11 12:37 pm (UTC)(link)
"где вменяемый человек будет на одном цикле биндить к имени число, на втором строку, на третьем - список записей"

Ну никто же так не делает, причем тут вообще динамическая типизация? Формально даже статическая типизация не обязана этому мешать.

[identity profile] rssh.livejournal.com 2012-10-11 12:41 pm (UTC)(link)
кстати, case классы в скале как раз для этого предназначенны и нормально работают
(даже странно слышать что в C# ничего подобного нет)

[identity profile] metaclass.livejournal.com 2012-10-11 12:48 pm (UTC)(link)
В F# есть хитрожопые активные паттерны, но радости от них никакой - все равно много писанины.

[identity profile] mikkim08.livejournal.com 2012-10-11 01:10 pm (UTC)(link)
В скале с кейс классами вроде та же фигня:

- об'явить case class MyRecord(x:Int = 0, s:String = ""),
- сослаться на него везде, где надо,
- об'явить новый case class MyOtherRecord(x:Int = 0, s:String = "", y:Int),
- и как-то написать трансформацию из MyRecord в MyOtherRecord.

Выходит довольно многословно.
Edited 2012-10-11 13:41 (UTC)

(no subject)

[identity profile] golikov konstantine - 2012-10-11 16:02 (UTC) - Expand

(no subject)

[identity profile] mikkim08.livejournal.com - 2012-10-11 17:24 (UTC) - Expand

(no subject)

[identity profile] golikov konstantine - 2012-10-12 14:04 (UTC) - Expand

(no subject)

[identity profile] mikkim08.livejournal.com - 2012-10-12 21:59 (UTC) - Expand

[identity profile] volodymir-k.livejournal.com 2012-10-11 12:52 pm (UTC)(link)
> Если что, проверка валидности в дотнете есть на каждом шагу, а объяснения вида "экономят циклы и не делаю проверки" в контексте жабы

Сравните 3 кода:
public void execute(String sql) throws Exception {

a.
if(sql == null) throw IllegalArgumentException("sql must be not null");
b.
if(sql == null) throw NullPointerException("sql must be not null");
c.
sql = sql.toLowerCase();

а от б отличается только классом исключения, а от ц только сообщением. Вы видите полезную разницу? Я -- нет.
Зачем писать бесполезный код? Достаточно задокументировать, что @throws NullPointerException if sql is null

[identity profile] metaclass.livejournal.com 2012-10-11 01:02 pm (UTC)(link)
Полезная разница: в первом пункте я по сообщению об ошибке сразу узнаю, в чем причина, не занимаясь разгребанием стек-трейса. Кроме того, проверку нужно расположить в паблик-методе, сразу на входе, от чего оный стек трейс будет в два раза короче и понятнее:)

(no subject)

[identity profile] volodymir-k.livejournal.com - 2012-10-11 14:18 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-10-11 14:37 (UTC) - Expand

(no subject)

[identity profile] volodymir-k.livejournal.com - 2012-10-12 06:43 (UTC) - Expand

(no subject)

[identity profile] antilamer.livejournal.com - 2012-10-11 16:43 (UTC) - Expand

(no subject)

[identity profile] volodymir-k.livejournal.com - 2012-10-12 06:29 (UTC) - Expand

[identity profile] stdray.livejournal.com 2012-10-11 01:16 pm (UTC)(link)
>4) паттерн матчинг с декомпозицией вроде не работает с рекордами.
Работает же.

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

В любом случае, держать в уме, какой там тип был, во что он превратился после расширения сложно. То есть мне это чем-то point-free style напоминает.

[identity profile] metaclass.livejournal.com 2012-10-11 01:28 pm (UTC)(link)
Вот в clojure приходится держать в уме. В норме хотелось бы, чтобы про это думал компилятор.

(no subject)

[identity profile] stdray.livejournal.com - 2012-10-11 14:56 (UTC) - Expand

[identity profile] kosiakk.livejournal.com 2012-10-11 02:10 pm (UTC)(link)
Умные люди, которые пишут Котлин, решили не делать Tuples совсем.
Т.к. единственное их применение - возврат нескольких значений из функции, то и проблему нужно решать на корню.

Вместо кортежей нам предлагается использовать всё-таки именованные data class. Мол, если вам придётся всё-таки назвать это - заставит лишний раз подумать, нужно ли оно в принципе =)
http://blog.jetbrains.com/kotlin/2012/09/how-do-you-traverse-a-map/

[identity profile] golikov konstantine (from livejournal.com) 2012-10-11 04:06 pm (UTC)(link)
Чем это отличается от case class в Scala?

[identity profile] thesz.livejournal.com 2012-10-11 02:13 pm (UTC)(link)
Я затрудняюсь представить себе путь мысли и способы использования Хаскеля, чтобы получилась вот такая гротескная картина.

[identity profile] zamotivator.livejournal.com 2012-10-11 07:09 pm (UTC)(link)
по моим личным наблюдениям и ощущениям - адеватный взгляд.
Людям работать надо, а не на язык дрочить.

(no subject)

[identity profile] voidex.livejournal.com - 2012-10-11 19:16 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-11 19:17 (UTC) - Expand

(no subject)

[identity profile] voidex.livejournal.com - 2012-10-11 19:30 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-11 20:58 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-11 19:22 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-11 19:22 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-11 19:31 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-11 19:32 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-11 19:39 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-11 20:58 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-11 21:08 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-11 21:13 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-11 21:37 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-11 21:39 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-11 21:49 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-11 21:52 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-11 22:16 (UTC) - Expand

(no subject)

[identity profile] dinexi.livejournal.com - 2012-10-11 23:25 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-11 23:26 (UTC) - Expand

(no subject)

[identity profile] dinexi.livejournal.com - 2012-10-11 23:28 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-11 23:29 (UTC) - Expand

(no subject)

[identity profile] dinexi.livejournal.com - 2012-10-11 23:35 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-11 23:36 (UTC) - Expand

(no subject)

[identity profile] dinexi.livejournal.com - 2012-10-11 23:40 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-11 23:41 (UTC) - Expand

(no subject)

[identity profile] dinexi.livejournal.com - 2012-10-11 23:43 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-11 23:44 (UTC) - Expand

(no subject)

[identity profile] dinexi.livejournal.com - 2012-10-11 23:46 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-11 23:49 (UTC) - Expand

(no subject)

[identity profile] dinexi.livejournal.com - 2012-10-11 23:51 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-10-11 19:42 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-11 19:44 (UTC) - Expand

(no subject)

[identity profile] voidex.livejournal.com - 2012-10-11 19:47 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-11 19:48 (UTC) - Expand

(no subject)

[identity profile] voidex.livejournal.com - 2012-10-11 19:50 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-11 19:53 (UTC) - Expand

(no subject)

[identity profile] voidex.livejournal.com - 2012-10-11 20:42 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-11 20:44 (UTC) - Expand

(no subject)

[identity profile] voidex.livejournal.com - 2012-10-12 01:07 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-12 01:10 (UTC) - Expand

(no subject)

[identity profile] voidex.livejournal.com - 2012-10-12 01:43 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-10-12 05:27 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-14 11:06 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-12 06:38 (UTC) - Expand

(no subject)

[identity profile] voidex.livejournal.com - 2012-10-12 08:08 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-12 08:11 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-10-11 19:54 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-11 21:35 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-10-12 05:03 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-12 11:32 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-10-12 11:42 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-12 11:47 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-10-12 11:56 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-10-11 19:51 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-11 19:54 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-10-11 19:58 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-11 19:58 (UTC) - Expand

(no subject)

[identity profile] migmit.livejournal.com - 2012-10-15 07:26 (UTC) - Expand

(no subject)

[identity profile] voidex.livejournal.com - 2012-10-12 01:18 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-10-12 05:25 (UTC) - Expand

(no subject)

[identity profile] voidex.livejournal.com - 2012-10-12 06:39 (UTC) - Expand

(no subject)

(Anonymous) - 2012-10-11 20:40 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-10-12 04:55 (UTC) - Expand

(no subject)

[identity profile] zw0rk.blogspot.nl - 2012-10-11 20:45 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-11 20:46 (UTC) - Expand

(no subject)

[identity profile] zw0rk.blogspot.nl - 2012-10-11 20:48 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-11 20:57 (UTC) - Expand

(no subject)

[identity profile] zw0rk.blogspot.nl - 2012-10-11 20:59 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-11 21:00 (UTC) - Expand

(no subject)

[identity profile] zw0rk.blogspot.nl - 2012-10-11 21:03 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-11 21:04 (UTC) - Expand

(no subject)

[identity profile] zw0rk.blogspot.nl - 2012-10-11 21:06 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-11 21:13 (UTC) - Expand

(no subject)

[identity profile] zw0rk.blogspot.nl - 2012-10-11 21:18 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-11 21:21 (UTC) - Expand

(no subject)

[identity profile] zw0rk.blogspot.nl - 2012-10-11 21:23 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-11 21:27 (UTC) - Expand

(no subject)

[identity profile] zw0rk.blogspot.nl - 2012-10-11 22:25 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-11 22:29 (UTC) - Expand

(no subject)

[identity profile] zw0rk.blogspot.nl - 2012-10-11 22:31 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-11 22:34 (UTC) - Expand

(no subject)

[identity profile] zw0rk.blogspot.nl - 2012-10-11 22:36 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-11 22:40 (UTC) - Expand

(no subject)

[identity profile] zw0rk.blogspot.nl - 2012-10-11 22:45 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-11 22:50 (UTC) - Expand

(no subject)

[identity profile] zw0rk.blogspot.nl - 2012-10-11 22:56 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-11 23:08 (UTC) - Expand

(no subject)

[identity profile] zw0rk.blogspot.nl - 2012-10-11 23:11 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-11 23:12 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-11 23:13 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-10-12 05:16 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-11 22:52 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-11 22:53 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-11 22:55 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-11 23:01 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-11 23:10 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-11 23:17 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-11 23:20 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-11 23:24 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-11 23:50 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-11 23:55 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-12 00:03 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-12 00:08 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-12 00:17 (UTC) - Expand

...

[identity profile] zamotivator.livejournal.com - 2012-10-12 00:19 (UTC) - Expand

...

[identity profile] thesz.livejournal.com - 2012-10-12 00:22 (UTC) - Expand

...

[identity profile] zamotivator.livejournal.com - 2012-10-12 00:23 (UTC) - Expand

...

[identity profile] thesz.livejournal.com - 2012-10-12 00:29 (UTC) - Expand

...

[identity profile] berezovsky.livejournal.com - 2012-10-12 00:29 (UTC) - Expand

...

[identity profile] zamotivator.livejournal.com - 2012-10-12 00:29 (UTC) - Expand

...

[identity profile] berezovsky.livejournal.com - 2012-10-12 00:39 (UTC) - Expand

...

[identity profile] zamotivator.livejournal.com - 2012-10-12 00:40 (UTC) - Expand

...

[identity profile] thesz.livejournal.com - 2012-10-12 00:39 (UTC) - Expand

...

[identity profile] berezovsky.livejournal.com - 2012-10-12 00:40 (UTC) - Expand

...

[identity profile] thesz.livejournal.com - 2012-10-12 00:47 (UTC) - Expand

(no subject)

[identity profile] voidex.livejournal.com - 2012-10-12 09:21 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-10-12 05:23 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-12 11:41 (UTC) - Expand

(no subject)

(Anonymous) - 2012-10-13 15:19 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-15 01:07 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-15 01:10 (UTC) - Expand

...

(Anonymous) - 2012-10-15 14:07 (UTC) - Expand

...

[identity profile] thesz.livejournal.com - 2012-10-15 14:47 (UTC) - Expand

...

(Anonymous) - 2012-10-15 20:13 (UTC) - Expand

...

[identity profile] thesz.livejournal.com - 2012-10-15 21:06 (UTC) - Expand

...

(Anonymous) - 2012-10-15 22:04 (UTC) - Expand

...

[identity profile] thesz.livejournal.com - 2012-10-15 23:19 (UTC) - Expand

...

[identity profile] thesz.livejournal.com - 2012-10-15 23:20 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-11 23:54 (UTC) - Expand

(no subject)

[identity profile] migmit.livejournal.com - 2012-10-15 07:30 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-10-12 05:12 (UTC) - Expand

(no subject)

[identity profile] nivanych.livejournal.com - 2012-10-12 17:38 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-12 19:41 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-10-12 19:56 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-12 07:15 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-12 07:22 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-12 07:24 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-12 07:28 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-10-12 04:59 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-11 21:31 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-11 21:34 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-11 22:04 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-11 22:09 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-11 22:21 (UTC) - Expand

(no subject)

[identity profile] nivanych.livejournal.com - 2012-10-12 17:42 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-12 19:32 (UTC) - Expand

(no subject)

[identity profile] nivanych.livejournal.com - 2012-10-13 03:26 (UTC) - Expand

(no subject)

[identity profile] nealar.livejournal.com - 2012-10-16 09:21 (UTC) - Expand

(no subject)

[identity profile] zw0rk.blogspot.nl - 2012-10-11 22:22 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-11 22:33 (UTC) - Expand

(no subject)

[identity profile] zw0rk.blogspot.nl - 2012-10-11 22:40 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-11 22:44 (UTC) - Expand

(no subject)

[identity profile] zw0rk.blogspot.nl - 2012-10-11 22:48 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-11 22:52 (UTC) - Expand

(no subject)

[identity profile] zw0rk.blogspot.nl - 2012-10-11 23:00 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-11 23:12 (UTC) - Expand

(no subject)

[identity profile] zw0rk.blogspot.nl - 2012-10-11 23:16 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-11 23:18 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-10-12 05:20 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-10-12 05:06 (UTC) - Expand

(no subject)

[identity profile] nivanych.livejournal.com - 2012-10-12 17:46 (UTC) - Expand

(no subject)

[identity profile] miserakl.livejournal.com - 2012-10-13 12:33 (UTC) - Expand

(no subject)

[identity profile] nealar.livejournal.com - 2012-10-12 10:58 (UTC) - Expand

(no subject)

[identity profile] voidex.livejournal.com - 2012-10-12 01:20 (UTC) - Expand

(no subject)

[identity profile] berezovsky.livejournal.com - 2012-10-12 01:30 (UTC) - Expand

(no subject)

[identity profile] voidex.livejournal.com - 2012-10-12 01:56 (UTC) - Expand

(no subject)

[identity profile] kiryl.livejournal.com - 2012-10-11 21:00 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-11 21:01 (UTC) - Expand

(no subject)

[identity profile] migmit.livejournal.com - 2012-10-15 07:35 (UTC) - Expand

(no subject)

[identity profile] max630.livejournal.com - 2012-10-12 03:01 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-12 06:39 (UTC) - Expand

(no subject)

[identity profile] levgem.livejournal.com - 2012-10-12 18:29 (UTC) - Expand

(no subject)

(Anonymous) - 2012-10-11 20:37 (UTC) - Expand

(no subject)

[identity profile] vinslivins.livejournal.com - 2012-10-14 06:58 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-14 10:39 (UTC) - Expand

(no subject)

[identity profile] migmit.livejournal.com - 2012-10-15 07:37 (UTC) - Expand

[identity profile] bydl0coder.livejournal.com 2012-10-12 10:53 am (UTC)(link)
Да начиная с hello world. Первая и единственная попытка написать на Хаскеле что-то полезное закончилась стековерфлоу и переписыванием на руби.
У Хаскела очень высокий порог вхождения, который теоркат-гики не особо собираются снижать. Вероятность встретить статью о реализации какого-нибудь квазиморфизма гиперфункторов гораздо выше вероятность встретить статью про, не знаю там, чат-сервер на Comet.

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-12 11:36 (UTC) - Expand

(no subject)

[identity profile] bydl0coder.livejournal.com - 2012-10-12 11:54 (UTC) - Expand

(no subject)

[identity profile] zw0rk.blogspot.nl - 2012-10-12 13:40 (UTC) - Expand

(no subject)

[identity profile] bydl0coder.livejournal.com - 2012-10-12 13:50 (UTC) - Expand

(no subject)

[identity profile] zw0rk.blogspot.nl - 2012-10-12 13:53 (UTC) - Expand

(no subject)

[identity profile] bydl0coder.livejournal.com - 2012-10-12 13:56 (UTC) - Expand

(no subject)

[identity profile] iamjaph.livejournal.com - 2012-10-18 06:58 (UTC) - Expand

(no subject)

[identity profile] levgem.livejournal.com - 2012-10-12 18:37 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-12 19:39 (UTC) - Expand

(no subject)

[identity profile] bydl0coder.livejournal.com - 2012-10-12 19:41 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-12 19:51 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-10-12 19:57 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-12 20:19 (UTC) - Expand

(no subject)

[identity profile] bydl0coder.livejournal.com - 2012-10-12 22:38 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-12 22:48 (UTC) - Expand

(no subject)

[identity profile] bydl0coder.livejournal.com - 2012-10-12 23:16 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-13 00:26 (UTC) - Expand

(no subject)

[identity profile] bydl0coder.livejournal.com - 2012-10-13 01:33 (UTC) - Expand

(no subject)

[identity profile] bydl0coder.livejournal.com - 2012-10-12 19:50 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-12 19:53 (UTC) - Expand

(no subject)

[identity profile] inv2004.livejournal.com - 2012-10-12 20:22 (UTC) - Expand

(no subject)

[identity profile] dmytrish.livejournal.com - 2012-10-18 08:28 (UTC) - Expand

(no subject)

[identity profile] thesz.livejournal.com - 2012-10-18 11:04 (UTC) - Expand
wizzard: (фото)

[personal profile] wizzard 2012-10-11 02:16 pm (UTC)(link)
нужно такое себе IDE которое из динамических хинтов компилит модель системы, где можно посмотреть все выведенные статически типы, и при желании дохинтовать руками.

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

[identity profile] yurrrrr (meowth) (from livejournal.com) 2012-10-11 04:33 pm (UTC)(link)
1C же!

[identity profile] thedeemon.livejournal.com 2012-10-11 04:47 pm (UTC)(link)
Ребе, обычный C# и анонимные типы в нем спасут российскую белорусскую демократию что там у вас.
var v = new { Amount = 108, Message = "Hello" };
Или если угодно окамл и его объекты, которые можно создавать вообще без объявления класса, и все будет статически проверено. Короче, "нет языков" - не верю.
Edited 2012-10-11 16:49 (UTC)

[identity profile] metaclass.livejournal.com 2012-10-11 05:07 pm (UTC)(link)
Верните анонимный тип в C# из метода и я вам поверю:)

(no subject)

[identity profile] thedeemon.livejournal.com - 2012-10-11 17:23 (UTC) - Expand

(no subject)

[identity profile] funbuttrue.livejournal.com - 2012-10-11 18:06 (UTC) - Expand

(no subject)

[identity profile] funbuttrue.livejournal.com - 2012-10-11 18:18 (UTC) - Expand

[identity profile] antilamer.livejournal.com 2012-10-11 05:27 pm (UTC)(link)
Я думаю, что динамическая типизация таки нужна, и даже что, может, она победит. Нужна она, концептуально, в гетерогенных и динамических системах, где какие-то компоненты или внешние службы могут не очень предсказуемо менять контракт, а нам нужно при этом хоть как-то продолжать работать. Тривиальный пример - javascript в браузере :)

Впрочем, я не исключаю, что получится как с IO в хаскелле: внутри чистый костяк, а снаружи небольшая нечистая обертка. Будет внутри строго типизированный костяк, а на системном уровне - динамическая типизация, duck typing, protocol negotiation, обработка ошибок, fallback и пр.

(Anonymous) 2012-10-11 06:24 pm (UTC)(link)
Вот я вас всегда читаю и мне нравится ваш стиль мысли. И это первый пост который правильно обосновывает ПОЧЕМУ есть динамические языки.
Они есть просто потому, что без них надо вокруг каждого желания прыгать с бубном!. Я даже жду прагмы динамик он и динамик офф...

(no subject)

[identity profile] vinslivins.livejournal.com - 2012-10-14 07:08 (UTC) - Expand

[identity profile] vit-r.livejournal.com 2012-10-11 07:47 pm (UTC)(link)
Tcl/Tk
pack .w.f -anchor "w" -expand 1 -fill "x" -ipadx 2px -ipady 2px -side "left"

[identity profile] max630.livejournal.com 2012-10-11 08:07 pm (UTC)(link)
ocaml не подойдёт для кортежа с именованными полями?

ТОП: 11:30 MSK

[identity profile] magictop30.livejournal.com 2012-10-12 07:29 am (UTC)(link)
Вы попали в Т30P (http://www.t30p.ru) самых обсуждаемых тем в блогосфере.
Почитать текст со всеми комментариями по ссылке (http://tools.t30p.ru/?http%3a%2f%2fmetaclass.livejournal.com%2f735575.html).
Это Ваш 8-й ТОПовый пост в этом году.
Посмотреть статистику автора можно в карточке топблогера (http://rating.t30p.ru/?metaclass.livejournal.com&p=tops).Image

[identity profile] vshabanov.livejournal.com 2012-10-12 12:27 pm (UTC)(link)
Насчет записей посмотрите urweb. Там как раз можно их нигде не объявлять, добавлять/удалять поля (можно, к примеру, написать полиморфную ф-ю установки значения поля в записи), и все это типизировано. Ну и с SQL тоже скрещено (с выводом типов естественно, правда типы таблиц все-таки описывать надо).

> Хаскель сразу закапываем - там на каждый случай имеется 3-4 расширения и 10 пакетов в hackage различной степени недоделанности

Записи -- это такое общепризнанное слабое место в Хаскелле.

> идиоматический подход - писать в point-free style, чтобы коллеги не разобрались,

Идиоматичное применение point-free -- это последовательное применение нескольких ф-ий, т.е. вместо
f x = a $ b $ c $ d x
пишут
f = a . b . c . d
а вот когда начинаются ((.) . (.)) <=< flip (first >>> second), то это уже неидиоматично, т.к. затрудняет чтение.

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

Неправда ваша. Сырых библиотек хватает, но есть и очень качественные.

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

Так и не понял, что имеется ввиду.

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

А что потом делают с этими разделами? Действительно ли они настолько разные, что их никак нельзя описать?