Здравствуйте, dr.Chaos, Вы писали:
DC>Вобщем смотрю я на монады и думаю, что все это, что-то мне напоминает.
DC>Возьмем в С++ operator <<(). Он принимает basic_ostream и возвращает его только в обновленном состоянии, т.е. по сути это операция связывания, а вот действие которое связано спрятано в перегрузках оператора, т.е. по умолчанию это функция преобразования некоторого типа в поток байт. Есть там и действия которые передаются явно (манипуляторы потока). Можно кстати и вывод примерно так представить, но это будет выглядеть некрасиво
Прикольно. Но, мне кажется, это не так. Не буду сейчас говорить о том, что тип не совпадает для bind, но есть одно из отличительных свойств у монад. Это свойство вытекает из ТК-определения монады. Оно говорит о том, что у монады должен быть join.
(Вообще монада -- это функтор с двумя морфизмами — unit :: X -> M X, join :: M (M X) -> M X, где X — это любой объект категории С, над которой определён функтор M).
Так вот, если мы видим, что наш тип, являясь функтором, имеет join, значит, скорее всего это монада. Почему join, а не bind? Мне кажется, потому что его проще увидеть.
Так вот, в случае LINQ во первых — сразу видно, что это функтор (select prop from obj_list -- явный map). Во вторых, связка списков (таблиц, множеств) есть join, он даже в SQL так называется
Из объектов одного перечисления мы связкой получаем другие перечисления, а потом объединяем в одно: т.е. IEnumerable<IEnumerable<T>> -> IEnumerable<T>.
В случае ostream что есть join?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>