Я в шоке.
Обсуждение одновременного выполнения и чтения двух SQL-запросов в одном коннекте и транзакции (или, упаси Б-г, двух транзакций в одном коннекте) свелось к тому, что НИКТО это не использует. Ну, б-г с ним, что нигде кроме Firebird этого нет, но я всегда считал что операция "ленивым образом перебрать 100500 проводок, параллельно так же ленивым образом вычитывая их детализацию" это самоочевидное действие, такое же как два вложенных цикла, с обработкой списка сущностей в внешнем и списка вложенных сущностей во внутреннем.
Нет, оказывается это не так. Мне предложили все виды извращенной любви с БД - загрузку датасета в память и затем выполнение второго запроса, выполнение джоина и свертку его результатов в граф объектов, и прочая и прочая.
А я тут в святом неведении Олега почитываю на тему fold-like обработки БД и пытаюсь обобщить это на случай доступа к БД из ADO.NET и обработки нескольких вложенных таблиц.
Неудивительно, что NoSQL внезапно оказался настолько популярен. Потому что в умах разработчиков и в большинстве RDBMS аналогов действию "получить сущность и ее подчиненные сущности" просто НЕТ.
Нет, оказывается это не так. Мне предложили все виды извращенной любви с БД - загрузку датасета в память и затем выполнение второго запроса, выполнение джоина и свертку его результатов в граф объектов, и прочая и прочая.
А я тут в святом неведении Олега почитываю на тему fold-like обработки БД и пытаюсь обобщить это на случай доступа к БД из ADO.NET и обработки нескольких вложенных таблиц.
Неудивительно, что NoSQL внезапно оказался настолько популярен. Потому что в умах разработчиков и в большинстве RDBMS аналогов действию "получить сущность и ее подчиненные сущности" просто НЕТ.
no subject
no subject
Но что уж точно, так это в чистом виде ленивые списки обширно применять я не порекомендую.
А если программка не должна долго работать (типа сервера), тогда пофигу, лишь бы отработала.
no subject
no subject
no subject
Индукция по начальной алгебре выдаёт стрелку (катаморфизм) к любой другой алгебре, и внутри работает, как обобщённые на любые алгебраические типы фолд.
Алгебра, это стрелка F a -> a, где a, это носитель алгебры, F - сигнатура.
Почему так? А просто.
Cамый распостранённый пример алгебры, это когда F является функтором каждого объекта категории в пары объектов этого же типа, и получим (a,a) -> a, то есть, отображение пар элементов типа a (ну или n-ок, в чуть более общем случае) в само a.
Вот только _начальная_алгебра_ для такого функтора, это уже бесконечное бинарное дерево, и оно нереализуемое, поскольку, в функторе мы не указали что-то типа a*a + 1, где *, это категорное произведение (пара-тупл), + это копроизведение (навроде вариантного типа), 1 - терминальный объект.
То есть, указывая +1, мы даём возможность экземплярам этого типа быть единицей или же далее деревом. В хацкеле это тип data Q = BinTree (Q,Q) | Leaf, а изначально было просто data Q = BinTree (Q,Q).
Но F может быть более сложным функтором, и даже, всего лишь, полиномиальные (это которые можно реализовать в хацкеле) уже могут дать любопытного.
Коалгебра, это стрелка a -> F a.
На том же примере получим a -> (a,a), и в этом случае, мы можем даже обойтись таким функтором, без всяких дополнений вроде + 1, поскольку для коиндукции это уже не требуется.
Что ж такое коиндукция. А это штука, даже немного более простая, чем индукция.
Если начальную алгебру можно сопоставить с наименьшей неподвижной точкой, то терминальную коалгебру с наибольшей. Это какбе "наибольшее", что можно построить по данной сигнатуре.
Стрелка (анаморфизм) от любой коалгебры к терминальной представляет из себя выбор конкретной коалгебры, которую содержит эта терминальная, то есть, по сути, твою функцию с сигнатурой a -> F a (коалгебру) превращает в значение типа _терминальной_ коалгебры, давая возможность обозвать все такие функции элементами одного типа терминальной коалгебры.
Можно даже сказать, что терминальная коалгебра, это интерфейс, а конкретные коалгебры с анаморфизмами (коиндукция) и есть реализации этого интерфейса. При этом, носитель коалгебры играет роль эдакого "состояния", и зачастую, не может быть показан тому, кто использует коалгебру, уже как экземпляр терминальной, и состояние может только участвовать в операциях.
Приведу пример.
Возьмём более сложный функтор F a = a*b + 1.
Возьмём коалгебры для этого функтора a -> a*b + 1.
То есть, все функции такого типa для любых a и b.
Анаморфизм (коиндукция) из такой функции делает некий экземпляр терминальной коалгебры с неким носителем, и мы получаем функцию term -> term*b + 1, причём, к term мы "прикасаться" не можем, а только использовать его, доставая "конец" в виде 1, нечто типа b и новое "состояние".
Резюмируя, получим, что в категории могут существовать для каких-то функторов (обычно, полиномиальных, то есть, состоящих из произведения, копроизведения и экспоненты, то есть, типов a->b).
Если они существуют, тогда у нас есть некая операция, которая для любого такого функтора даёт возможность построит стрелку от любой коалгебры (функция с сигнатурой a -> F a) до специального объекта-состояния, представляющего из себя все такие коалгебры для данного функтора. И после есть операция над этой терминальной коалгеброй, при которой мы не можем получить "состояние", а оно осталось в той коалгебре, от которой мы проводили стрелку, ну и всякой побочное, зависящее от функтора. То есть, терминальные коалгебры для фунтора F a = a*a, в обещем-то, штука бесполезная, так как, "состояние a" нам в явном виде не достать.
Есть ещё такое терминальные F,G-диалгебры, которые F zю -> G zю, в них уже можно напрямую и очень близко эмулировать обычные интерфейсы, (например) полагая F = (zю,a,b,c), G = (zю,d,e,f). Правда, именно такое можно и коалгебрами сделать, полагая отображение zю -> (a->b->c->(zю,d,e,f)).
Очень сумбурно объяснил, категорно было бы гораздо лучше, но сходу сделать понятным не получилось, поэтому, держи около-попсово-программистский стиль ;-(
Так же, с позором признаюсь, что не раскрыта тема монад и алгебр, комонад и коалгебр, "arrows" и диалгебр...
Как-нибудь, я соберусь сделать хорошее, годное объяснение...
no subject
no subject
Прочитать можно очень много, где.
Материалов дохрена, гуглится запросто.
Что-то рекомендовать даже и не стоит, проще читать и спрашивать.
Например, в category_theory. На моё взгляд, категории тут очень нужны.
Ну, таки можно порекомендовать тов. Varmo Vene, вот страничка с его работами ->
http://www.cs.ut.ee/~varmo/papers/index.html
И в частности, более-менее, неплохое объяснение с примерами на Haskell ->
Categorical programming with inductive and coinductive types
http://www.cs.ut.ee/~varmo/papers/thesis.pdf
Но вообще, для того, чтобы рекомендовать, надо знать уровень того, кому рекомендуешь.
Кому-то может и пары абзацев объяснений хватить, кому-то надо книжки читать.
Как более серьёзное, советую читать Фрейда, он довольно тонко разбирается в теме.
Далее, посмотреть всё подряд, что найдётся, про диалгебры (и Фрейдовые и F,G-диалгебры).
Про F,G-диалгебры есть книжка аж от 86 года от тов. Tatsuya Hagino
http://www.tom.sfc.keio.ac.jp/~hagino/index.html.en
Первая книжка, это попытка построение категорного языка.
Вторая, это построение немного необычной типизированной лямбды на этой идее.
Если и лямбда-подобное, где в качестве кирпичиков используются даже end/coend'ы.
Очень много всего.
no subject
no subject
Фрейда зовут Peter Freyd (чтобы было проще искать).