Здравствуйте, 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>>