Re: [Haskell] монада Cont и сопрограммы
От: palm mute  
Дата: 17.06.09 08:04
Оценка: 100 (6) +1
Здравствуйте, 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

Выхлоп:
1
10
2
20
3
30
"exit thread1"
"exit thread2"
Re[4]: [Haskell] монада Cont и сопрограммы
От: palm mute  
Дата: 18.06.09 21:00
Оценка: +3
Здравствуйте, Mr.Cat, Вы писали:

MC>Уже почти написал про питоноподобные генераторы, когда наткнулся на это за авторством угадай кого: http://palm-mute.livejournal.com/12291.html.

MC>Придется про что-нить другое написать.

Опубликуй, что написал. Работа не должна пропадать. Причем вряд ли тексты совпадают слово в слово.
Re[3]: [Haskell] монада Cont и сопрограммы
От: palm mute  
Дата: 17.06.09 10:03
Оценка: 13 (2)
Здравствуйте, 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
Re[3]: [Haskell] монада Cont и сопрограммы
От: Mr.Cat  
Дата: 18.06.09 16:36
Оценка: :)
Здравствуйте, achmed, Вы писали:
A>Попробую проецировать на Haskell .
Уже почти написал про питоноподобные генераторы, когда наткнулся на это за авторством угадай кого: http://palm-mute.livejournal.com/12291.html.
Придется про что-нить другое написать.
[Haskell] монада Cont и сопрограммы
От: achmed Удмуртия https://www.linkedin.com/in/nail-achmedzhanov-9907188/
Дата: 17.06.09 06:53
Оценка:
Добрый день!

Изучаю монанду Cont. Везде упоминается, что с ее помощью можно создавать сопрограммы, но нигде нет примеров .

Уважаемые гуру, не могли бы вы рассказать как это сделать?
Re: [Haskell] монада Cont и сопрограммы
От: Mr.Cat  
Дата: 17.06.09 07:12
Оценка:
Здравствуйте, achmed, Вы писали:
A>Изучаю монанду Cont. Везде упоминается, что с ее помощью можно создавать сопрограммы, но нигде нет примеров .
A>Уважаемые гуру, не могли бы вы рассказать как это сделать?
Пример на scheme подойдет?
Re[2]: [Haskell] монада Cont и сопрограммы
От: achmed Удмуртия https://www.linkedin.com/in/nail-achmedzhanov-9907188/
Дата: 17.06.09 07:17
Оценка:
Здравствуйте, Mr.Cat, Вы писали:

MC>Здравствуйте, achmed, Вы писали:

A>>Изучаю монанду Cont. Везде упоминается, что с ее помощью можно создавать сопрограммы, но нигде нет примеров .
A>>Уважаемые гуру, не могли бы вы рассказать как это сделать?
MC>Пример на scheme подойдет?

Попробую проецировать на Haskell .
Re[2]: [Haskell] монада Cont и сопрограммы
От: achmed Удмуртия https://www.linkedin.com/in/nail-achmedzhanov-9907188/
Дата: 17.06.09 09:20
Оценка:
Здравствуйте, palm mute, Вы писали:

PM>Здравствуйте, achmed, Вы писали:


A>>Добрый день!

A>>Изучаю монанду Cont. Везде упоминается, что с ее помощью можно создавать сопрограммы, но нигде нет примеров .
A>>Уважаемые гуру, не могли бы вы рассказать как это сделать?
PM>Рассказать не могу, могу показать:
PM>[haskell]
PM> ...
PM>[/code]

Спасибо.

В примере сопрограммы только возвращают значение, т.е. это итераторы.
А как можно реализовать передачу параметров?
Re[3]: [Haskell] монада Cont и сопрограммы
От: Mr.Cat  
Дата: 17.06.09 10:07
Оценка:
Здравствуйте, achmed, Вы писали:
A>Попробую проецировать на Haskell .

Ок. У меня тут в голове крутится несколько вариантов поведения корутин, нужно время, чтобы обдумать и зафиксировать на бумаге.
Re[4]: [Haskell] монада Cont и сопрограммы
От: achmed Удмуртия https://www.linkedin.com/in/nail-achmedzhanov-9907188/
Дата: 19.06.09 20:36
Оценка:
Здравствуйте, Mr.Cat, Вы писали:

MC>Здравствуйте, achmed, Вы писали:

A>>Попробую проецировать на Haskell .
MC>Уже почти написал про питоноподобные генераторы, когда наткнулся на это за авторством угадай кого: http://palm-mute.livejournal.com/12291.html.
MC>Придется про что-нить другое написать.

Кстати, про питоновские генераторы, которые в 2.6, тоже было бы интересно прочитать.
Насколько я знаю с их помощью успешно делаются веб-фреймворкм аля seaside.
Re[5]: [Haskell] монада Cont и сопрограммы
От: Mr.Cat  
Дата: 22.06.09 18:11
Оценка:
Уф. Мыслей много, а времени сформулировать их в виде букв — катастрофически не хватает.
http://rsdn.ru/forum/decl/3438254.1.aspx
Автор: Mr.Cat
Дата: 22.06.09
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.