Re[5]: Монады и STL
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 19.07.07 08:03
Оценка:
Здравствуйте, Dusty, Вы писали:

D>Если бы ostream после вывода туда char становился бы ostream<char>, после вывода int — ostream<int>, а после вывода CSomeClass — ostream<CSomeClass> (т.е. если бы тип фозвращаемого результата определялся бы типом параметра последнего вызова) — то это была бы монада. А так мы имеем результат применения монады к char (не забудем, что монада — это конструктор типов).


Что такое "применение монады к char"?

D>Примерный эквивалент ostream на Хаскеле будет такой:

D>
D>  type Ostream a = WriterT [a] IO ()
D>


Почему?

D>Приведенная первой конструкция вполне себе может использваться в Хаскелевских EDSL, и она сделана на монадах — но она не монада.


Почему не монада? Это же полный аналог IO [a] и значит можно

newtype Ostream a = Ostream { runOstream :: IO [a] }

instance Functor Ostream where
    fmap f (Ostream io) = Ostream $
        do xs <- io
           return (fmap f xs)

instance Monad Ostream where
    return x = Ostream (return [x])
    (Ostream io) >>= f = Ostream $
        do xs <- io
           liftM concat $ runOstream $ mapM f xs


Законы соблюдаются.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.