Здравствуйте, achmed, Вы писали: A>Изучаю монанду Cont. Везде упоминается, что с ее помощью можно создавать сопрограммы, но нигде нет примеров . A>Уважаемые гуру, не могли бы вы рассказать как это сделать?
Пример на scheme подойдет?
Здравствуйте, Mr.Cat, Вы писали:
MC>Здравствуйте, achmed, Вы писали: A>>Изучаю монанду Cont. Везде упоминается, что с ее помощью можно создавать сопрограммы, но нигде нет примеров . A>>Уважаемые гуру, не могли бы вы рассказать как это сделать? MC>Пример на scheme подойдет?
Здравствуйте, achmed, Вы писали:
A>Добрый день! A>Изучаю монанду Cont. Везде упоминается, что с ее помощью можно создавать сопрограммы, но нигде нет примеров . A>Уважаемые гуру, не могли бы вы рассказать как это сделать?
Рассказать не могу, могу показать:
import Control.Monad.Cont
data Coroutine r a = Done r | Yield a (() -> Coroutine r a)
yield x = Cont $ \k -> Yield x k
done r = Cont $ \_ -> Done r
coroutine m = runCont m (\_ -> Done "unexpected exit")
runCoroutine (Done r) = print r
runCoroutine (Yield a k) =
do print a
runCoroutine (k ())
interleave (Done r) c2 =
do print r
runCoroutine c2
interleave (Yield a k) c2 =
do print a
interleave c2 (k ())
thread1 = coroutine $ do
yield 1
yield 2
yield 3
done "exit thread1"
thread2 = coroutine $ do
yield 10
yield 20
yield 30
done "exit thread2"
main = interleave thread1 thread2
Здравствуйте, palm mute, Вы писали:
PM>Здравствуйте, achmed, Вы писали:
A>>Добрый день! A>>Изучаю монанду Cont. Везде упоминается, что с ее помощью можно создавать сопрограммы, но нигде нет примеров . A>>Уважаемые гуру, не могли бы вы рассказать как это сделать? PM>Рассказать не могу, могу показать: PM>[haskell] PM> ... PM>[/code]
Спасибо.
В примере сопрограммы только возвращают значение, т.е. это итераторы.
А как можно реализовать передачу параметров?
Здравствуйте, achmed, Вы писали:
A>В примере сопрограммы только возвращают значение, т.е. это итераторы. A>А как можно реализовать передачу параметров?
В примере ниже тип Coroutine r i o описывает сопрограммe, производящую промежуточные значения o, конечное значение r и потребляющую значения i.
import Control.Monad.Cont
import System.IO
data Coroutine r i o = Done r | Yield o (i -> Coroutine r i o)
yield x = Cont $ \k -> Yield x k
done r = Cont $ \_ -> Done r
coroutine m = runCont m (\_ -> Done "unexpected exit")
resume (Done r) x = Done r
resume (Yield a k) x = k x
example = coroutine $ do
a <- yield "input a"
b <- yield "input b"
done $ "a + b = " ++ show (a + b)
run (Done r) = putStrLn r
run (Yield prompt k) =
do putStr (prompt ++ ">")
x <- readIO =<< getLine
run (k x)
main =
do hSetBuffering stdout NoBuffering
run example
Здравствуйте, achmed, Вы писали: A>Попробую проецировать на Haskell .
Уже почти написал про питоноподобные генераторы, когда наткнулся на это за авторством угадай кого: http://palm-mute.livejournal.com/12291.html.
Придется про что-нить другое написать.
Здравствуйте, Mr.Cat, Вы писали:
MC>Уже почти написал про питоноподобные генераторы, когда наткнулся на это за авторством угадай кого: http://palm-mute.livejournal.com/12291.html. MC>Придется про что-нить другое написать.
Опубликуй, что написал. Работа не должна пропадать. Причем вряд ли тексты совпадают слово в слово.
Здравствуйте, Mr.Cat, Вы писали:
MC>Здравствуйте, achmed, Вы писали: A>>Попробую проецировать на Haskell . MC>Уже почти написал про питоноподобные генераторы, когда наткнулся на это за авторством угадай кого: http://palm-mute.livejournal.com/12291.html. MC>Придется про что-нить другое написать.
Кстати, про питоновские генераторы, которые в 2.6, тоже было бы интересно прочитать.
Насколько я знаю с их помощью успешно делаются веб-фреймворкм аля seaside.