Re[2]: Есть ли вещи, которые вы прницпиально не понимаете...
От: a_g_99 США http://www.hooli.xyz/
Дата: 04.12.13 10:55
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Надо читать вменяемую литературу, типа Гарсиа-Молина et al. Там подробно разжёвывается, как работает оптимизатор, и из каких кусочков он собирает план исполнения запроса.

Петров-Водкин Гарсиа-Молина? Есть совет попроще — сходить в гитхаб и посмотреть на исходники PostgreSQL. А потом задать полагающиеся вопросы джентельменам на форуме.

S>На самом деле, самая крутая RDBMS — это DB2. Потом идёт MS SQL, потом Оракл, потом Postgres, а уж потом, с большим-большим отрывом, все остальные.

Как это вы "крутость" так опередили? Почему это MS SQL опередил oracle, а PostgreSQL отстает от оракла, а на вершине всего этого DB2 UDB?
Re[10]: Есть ли вещи, которые вы прницпиально не понимаете...
От: welltyped2  
Дата: 04.12.13 11:05
Оценка:
Здравствуйте, dimgel, Вы писали:

D>Здравствуйте, welltyped2, Вы писали:


W>>flatMap это только для списков. Если абстрагировать его на любой F[A] и добавить pure, то в итоге можно получить то что есть в scalaz


D>Прикольно, но опять возвращается вопрос: нафиг оно надо? Мне и flatMap-то раз в сто лет пригождается.

Оно нужено когда у вас для F[A] нужно использовать функцию А => F[B]
Если в сто лет нужен flatMap значит в сто лет у вас появляется функция вида A => List[B] применяемая к List[A]
Представте такую ситуация, есть три функции
getA:: Int => Option[A]
getB:: A => Option[B]
getC:: B => Option[C]
вам нужно получить C. Как вы запишите код с этими функциями?
Re[6]: Есть ли вещи, которые вы прницпиально не понимаете...
От: neFormal Россия  
Дата: 04.12.13 11:05
Оценка:
Здравствуйте, dimgel, Вы писали:

D>>>И что с ними носятся как с писаной торбой?

F>>потому что всё есть монада
D>Звучит в духе этого, который "я есмь сущий", с которым тоже все носятся.

именно так оно и происходит
...coding for chaos...
Re[11]: Есть ли вещи, которые вы прницпиально не понимаете...
От: dimgel Россия https://github.com/dimgel
Дата: 04.12.13 11:20
Оценка:
Здравствуйте, welltyped2, Вы писали:

W>Представте такую ситуация, есть три функции

W>getA:: Int => Option[A]
W>getB:: A => Option[B]
W>getC:: B => Option[C]
W>вам нужно получить C. Как вы запишите код с этими функциями?

в скале Option — тоже коллекция:

scala> class A; class B; class C
defined class A
defined class B
defined class C

scala> def getA(i: Int) = Some(new A)
getA: (i: Int)Some[A]

scala> def getB(a: A) = Some(new B)
getB: (a: A)Some[B]

scala> def getC(b: B) = Some(new C)
getC: (b: B)Some[C]

scala> def getA(i: Int): Option[A] = Some(new A)
getA: (i: Int)Option[A]

scala> def getB(a: A): Option[B] = Some(new B)
getB: (a: A)Option[B]

scala> def getC(b: B): Option[C] = Some(new C)
getC: (b: B)Option[C]

scala> getA(0).flatMap(a => getB(a).flatMap(b => getC(b)))
res0: Option[C] = Some(C@a87f680)
Re[12]: Есть ли вещи, которые вы прницпиально не понимаете...
От: welltyped2  
Дата: 04.12.13 11:29
Оценка: 4 (1)
Здравствуйте, dimgel, Вы писали:

D>Здравствуйте, welltyped2, Вы писали:


W>>Представте такую ситуация, есть три функции

W>>getA:: Int => Option[A]
W>>getB:: A => Option[B]
W>>getC:: B => Option[C]
W>>вам нужно получить C. Как вы запишите код с этими функциями?

D>в скале Option — тоже коллекция:


D>
scala>> class A; class B; class C
D>defined class A
D>defined class B
D>defined class C

scala>> def getA(i: Int) = Some(new A)
D>getA: (i: Int)Some[A]

scala>> def getB(a: A) = Some(new B)
D>getB: (a: A)Some[B]

scala>> def getC(b: B) = Some(new C)
D>getC: (b: B)Some[C]

scala>> def getA(i: Int): Option[A] = Some(new A)
D>getA: (i: Int)Option[A]

scala>> def getB(a: A): Option[B] = Some(new B)
D>getB: (a: A)Option[B]

scala>> def getC(b: B): Option[C] = Some(new C)
D>getC: (b: B)Option[C]

scala>> getA(0).flatMap(a => getB(a).flatMap(b => getC(b)))
D>res0: Option[C] = Some(C@a87f680)
D>

Вот за этим и нужен flatMap. Представте теперь что все функции возвращают не Option а Future, ваш код получения C при этом не измненится.
Re[2]: Есть ли вещи, которые вы прницпиально не понимаете...
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 04.12.13 11:31
Оценка: :)))
Здравствуйте, Нахлобуч, Вы писали:

Н>Не совсем программирование, но все же. Не могу понять, в чем такая прелесть vi/emacs (если пользователи не врут).

Всё просто. Они работают, а другие ИДЕ посто жрут процессорное время.
Sic luceat lux!
Re[13]: Есть ли вещи, которые вы прницпиально не понимаете...
От: dimgel Россия https://github.com/dimgel
Дата: 04.12.13 11:37
Оценка:
Здравствуйте, welltyped2, Вы писали:

W>Представте теперь что все функции возвращают не Option а Future, ваш код получения C при этом не измненится.


Future — тоже хороший пример. А ещё какой-нибудь есть?
Re[14]: Есть ли вещи, которые вы прницпиально не понимаете...
От: welltyped2  
Дата: 04.12.13 11:51
Оценка: 4 (1)
Здравствуйте, dimgel, Вы писали:

D>Здравствуйте, welltyped2, Вы писали:


W>>Представте теперь что все функции возвращают не Option а Future, ваш код получения C при этом не измненится.


D>Future — тоже хороший пример. А ещё какой-нибудь есть?

Например можно посмотреть какие монады есть в haskell. Логирование, побочные эффекты, парсеры и т.д.
Re[2]: Есть ли вещи, которые вы прницпиально не понимаете...
От: Кодт Россия  
Дата: 04.12.13 12:00
Оценка: 6 (1)
Здравствуйте, dimgel, Вы писали:

D>Монады. Несколько раз подкатывал, без толку.


А что там понимать... Абстрактная алгебра и немножко теоркат. (Тот самый моноид в эндофункторах).

Практические фичи для пользователя

1) Тип-обёртка — позволяет изолировать данные, чтобы случайно что-нибудь неправильное не сделать. Самый яркий пример — IO. Внутри всё сводится к unsafePerformIO, но это секрет!

2) Унифицированный контейнер — работа с содержимым выполняется через map и filter (foreach и if, говоря императивно).
2а) Не надо специально отслеживать пустые контейнеры; не надо придумывать сигнальные значения — достаточно вернуть пустой или единичный контейнер
2б) Некоторые алгоритмы выглядят одинаково для разных контейнеров (foreach же!)

3) Специфичные функции (чтение-запись состояния, например) укладываются в этот же синтаксис
3а) Это позволяет писать код в разном сахаре — set comprehension (в хаскелле — только list comprehension, а в гофре и идрисе и внезапно питоне — для любых типов), do-нотация, конвееры
3б) А также легко сочетать монады, применяя трансформеры
лунапарк — исходная монада
лбс = сБлекджеком(соШлюхами(лунапарк))
блекджек(лбс) — доступ к специфике верхнего уровня
шлюхи(безБлекджека(лбс)) — доступ к специфике внутреннего уровня
аттракцион <- лбс
аттракцион <- безБлекджека(лбс)
аттракцион <- безШлюх(безБлекджека(лбс))
аттракцион <- лунапарк

А моноиды и эндофункторы — это теоретический базис и гарантия того, что 0*X = X*0 = 0, 1*X = X*1 = 1, X*Y*Z = X*Y*Z (скобки расставьте по вкусу)
Перекуём баги на фичи!
Re[10]: Есть ли вещи, которые вы прницпиально не понимаете...
От: Кодт Россия  
Дата: 04.12.13 12:07
Оценка:
Здравствуйте, dimgel, Вы писали:

D>Прикольно, но опять возвращается вопрос: нафиг оно надо? Мне и flatMap-то раз в сто лет пригождается.


А не надо мыслить в терминах flatMap. Надо в терминах for each.
for x in xs :
  for y in foo(x) :
    for z in bar(y) :
      # вот тебе, бабушка, и флэтмап!
Перекуём баги на фичи!
Re[3]: Есть ли вещи, которые вы прницпиально не понимаете...
От: neFormal Россия  
Дата: 04.12.13 12:21
Оценка: :)
Здравствуйте, Кодт, Вы писали:

К>Самый яркий пример — IO. Внутри всё сводится к unsafePerformIO, но это секрет!


т.е. я порчу себе карму и даже не знаю об этом?!
...coding for chaos...
Re[3]: Есть ли вещи, которые вы прницпиально не понимаете...
От: Нахлобуч Великобритания https://hglabhq.com
Дата: 04.12.13 12:23
Оценка: +3
Здравствуйте, Kernan, Вы писали:

K>Всё просто. Они работают, а другие ИДЕ посто жрут процессорное время.


Я не представляю, как они там работают. Возможно, в этих ваших хипстерских Руби и Питонах вместо интеллисенса канает банальное автодополнение с выбором из списка всех идентификаторов в файле/проекте и скорость работы находится в прямой зависимости от умения виртуозно перемещать строки и писать макросы, но как-то меня гложут сомнения в том, что IDE может сколь-нибудь заметно влиять на скорость набора текста.
HgLab: Mercurial Server and Repository Management for Windows
Re[14]: Есть ли вещи, которые вы прницпиально не понимаете...
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 04.12.13 12:31
Оценка: 4 (1)
Здравствуйте, dimgel, Вы писали:

D>Здравствуйте, welltyped2, Вы писали:


W>>Представте теперь что все функции возвращают не Option а Future, ваш код получения C при этом не измненится.


D>Future — тоже хороший пример. А ещё какой-нибудь есть?


Option\Maybe
Lazy
Exception
List
Parser
Re[10]: Есть ли вещи, которые вы прницпиально не понимаете...
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 04.12.13 12:46
Оценка: 8 (2)
Здравствуйте, dimgel, Вы писали:

D>Прикольно, но опять возвращается вопрос: нафиг оно надо? Мне и flatMap-то раз в сто лет пригождается.


Просто посмотри, как сделаны всякие монадические сущности. Вот скажем промисы в js очень хорошо показывают, что к чему.

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

Вот задачи:
есть два числа который надо сложить
решение
c = a + b.

есть три числа, два есть сейчас и одно принесет резиновая Зина, их надо сложить
решение
d = a + b + c.

есть четыре числа, два есть сейчас, одно принесет резиновая Зина, одно может через год, а может быть, через два, может быть подскажет тётя Зина из магазина, их надо сложить
решение
r = a + b + c + d

есть пять чисел, два есть сейчас, одно принесет резиновая Зина, одно может через год, а может быть, через два, может быть подскажет тётя Зина из магазина, одно это сумма потерь какой нибудь разини, их надо сложить
решение
r = a + b + c + d

Если добавить типы, то окажется ,что в первом случае числа просто инты, во втором добавляется M<int>, в третьем M1<int>, в четвертом M2<int>

В с++ ты вспотеешь описывать классы и перегрузку операторов для всех возможных комбинаций типов. Если в лоб, то в императивной реализации надо будет понавыдумать целый вагон способов диспетчерзации для случаев " может через год, а может быть, через два, может быть".

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

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

Итого: "Monad — just works"


Т.е. экземпляр монадического типа это не само значение, а способ его получения.
Re[4]: Есть ли вещи, которые вы прницпиально не понимаете...
От: Кодт Россия  
Дата: 04.12.13 13:05
Оценка:
Здравствуйте, neFormal, Вы писали:

К>>Самый яркий пример — IO. Внутри всё сводится к unsafePerformIO, но это секрет!

F>т.е. я порчу себе карму и даже не знаю об этом?!

Ты не портишь себе карму, потому что операции ввода-вывода совершаются в должное время в должном месте в должном порядке.
За должный порядок отвечает реализация монады IO, не позволяющая компилятору ни пропускать, ни дублировать, ни перетасовывать операции.
Перекуём баги на фичи!
Re[3]: Есть ли вещи, которые вы прницпиально не понимаете...
От: include2h  
Дата: 04.12.13 19:25
Оценка:
Здравствуйте, Кодт, Вы писали:

D>>Монады. Несколько раз подкатывал, без толку.

К>А что там понимать... Абстрактная алгебра и немножко теоркат. (Тот самый моноид в эндофункторах).

Я вот тоже пытался их понять, читал разные статьи, но все равно не понимаю. С практической, низкоуровневой такой точки зрения... (что уж поделаешь, я начинал с Си и Ассемблера, и мышление заточено именно на то — а как оно в процессоре-то будет выполняться?)

Если говорить об ФП, то я понимаю что такое функция высшего порядка, это легко. Зачем нужно функцию передавать в другую функцию. Что такое частичное применение функций. Как работают замыкания. Как функция может возвратить другую функцию. Это простые концепции, с ними все ок, причем достаточно ясно как оно реализуется на низком уровне.

А монада — что она такое? (я даже не могу идентифицировать, это структура данных, управляющий оператор или что-то еще?)
Вот есть допустим язык Си (специально не С++). Мы можем (пусть даже слегка изменив синтаксис языка) внедрить туда монады, что это будет и какая от них будет польза?
Re[3]: Есть ли вещи, которые вы прницпиально не понимаете...
От: minorlogic Украина  
Дата: 04.12.13 20:08
Оценка:
СТО
... << RSDN@Home 1.2.0 alpha 5 rev. 1539>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[2]: Есть ли вещи, которые вы прницпиально не понимаете...
От: IT Россия linq2db.com
Дата: 05.12.13 01:54
Оценка: :))) :))
Здравствуйте, Sinclair, Вы писали:

S>На самом деле, самая крутая RDBMS — это DB2.


В этом её беда. Она прощает столько тупости и с успехом нивелирует самые кривые руки. Но в конце концов безнаказанная тупость и бесконечная кривизна берут своё.
Если нам не помогут, то мы тоже никого не пощадим.
Re[15]: Есть ли вещи, которые вы прницпиально не понимаете...
От: dimgel Россия https://github.com/dimgel
Дата: 05.12.13 02:13
Оценка:
Здравствуйте, welltyped2, Вы писали:

D>>Future — тоже хороший пример. А ещё какой-нибудь есть?

W>Например можно посмотреть какие монады есть в haskell. Логирование, побочные эффекты, парсеры и т.д.

Спасибо, вот теперь понял, зачем оно.
Re[5]: Есть ли вещи, которые вы прницпиально не понимаете...
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 05.12.13 02:53
Оценка:
Здравствуйте, Кодт, Вы писали:

К>>>Самый яркий пример — IO. Внутри всё сводится к unsafePerformIO, но это секрет!

F>>т.е. я порчу себе карму и даже не знаю об этом?!
К>Ты не портишь себе карму, потому что операции ввода-вывода совершаются в должное время в должном месте в должном порядке.

Т.е. это все же safePerformIO, а не unsafe.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.