Re: Монады и STL
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 18.07.07 15:51
Оценка:
Здравствуйте, 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>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.