Здравствуйте, lomeo, Вы писали:
DC>>Тут еще такое дело получается что если operator << () параметризовать функтором char->stream<char>, то его реализацию можно будет менять для всех типов. Т.е. это что-то типа перегрузки оператора последовательности.
DC>>Просто я в монады только въезжаю, но тут я вижу схожесть того что получаем с помощью монад с тем что сделано в STL. А вот является ли это монадой — .
L>Схожесть — да, наверное, есть. Но, мне кажется, это не монада.
Если бы ostream после вывода туда char становился бы ostream<char>, после вывода int — ostream<int>, а после вывода CSomeClass — ostream<CSomeClass> (т.е. если бы тип фозвращаемого результата определялся бы типом параметра последнего вызова) — то это была бы монада. А так мы имеем результат применения монады к char (не забудем, что монада — это
конструктор типов). Примерный эквивалент ostream на Хаскеле будет такой:
type Ostream a = WriterT [a] IO ()
а отнюдь не
type Ostream a = IO а
Приведенная первой конструкция вполне себе может использваться в Хаскелевских EDSL, и она
сделана на монадах — но она
не монада.