
Hello Miguel, Thursday, December 18, 2008, 1:42:21 PM, you wrote: ruby doesn't support coroutines, but only iterators (where control moved from caller to callee). usually control is on the caller side, and coroutines gives control to both (or many) sides coroutines are easily emulated in IO monad using multithreading, and i think that are easily emulated both in Ruby and Haskell using callCC
First thing I've tried when learning Ruby was something like that:
================ def a yield {puts 1} end
a {yield} ================
It didn't work. Can Coroutine.hs do something like that?
On 18 Dec 2008, at 13:26, Ryan Ingram wrote:
On Thu, Dec 18, 2008 at 2:00 AM, Nicolas Pouillard
wrote: I don't see why one would need session types, channels... to express that. I maybe need a more complicated coroutines (ruby) example that would require using this system.
OK, how would you type these routines in Haskell?
def simple yield "hello" yield 1 yield (lambda { |x| x + 1 }) end
def useSimple state = 0 result = nil simple { |x| if (state == 0) then result = x else if (state == 1) then result += (x * 4).toString else if (state == 2) then result += x.call(10).toString state = state + 1 } result end
I know it's a bit contrived, but you get the idea.
In Haskell using Control.Coroutine:
simple :: forall rest. Session (String :!: Int :!: (Int -> Int) :!: rest) rest () simple = do put "hello" put 1 put (\x -> x + 1)
useSimple :: forall rest. Session (String :?: Int :?: (Int -> Int) :?: rest) rest String useSimple = do string <- get int <- get func <- get return (string ++ show (int * 4) ++ show (func 10))
result :: String result = snd $ connects simple useSimple -- result = "hello411" _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
-- Best regards, Bulat mailto:Bulat.Ziganshin@gmail.com