История изменений
Исправление hateyoufeel, (текущая версия) :
Шёл 2020.
hateyoufeel всё ещё не умеет в корутины без магии компилятора :)
А какой практический смысл в том, чтобы это уметь без магии компилятора? Ну кроме бесконечного бессмысленного пердолева.
Кстати, на том же хацкелле корутины давно написали на самом хацкелле, обернули в библиотеку и всё ок.
-- | Suspending, resumable monadic computations.
newtype Coroutine s m r = Coroutine {
-- | Run the next step of a `Coroutine` computation. The result of the step execution will be either a suspension or
-- the final coroutine result.
resume :: m (Either (s (Coroutine s m r)) r)
}
type CoroutineStepResult s m r = Either (s (Coroutine s m r)) r
instance (Functor s, Functor m) => Functor (Coroutine s m) where
fmap f t = Coroutine (fmap (apply f) (resume t))
where apply fc (Right x) = Right (fc x)
apply fc (Left s) = Left (fmap (fmap fc) s)
instance (Functor s, Functor m, Monad m) => Applicative (Coroutine s m) where
pure = return
(<*>) = ap
instance (Functor s, Monad m) => Monad (Coroutine s m) where
return x = Coroutine (return (Right x))
t >>= f = Coroutine (resume t >>= apply f)
where apply fc (Right x) = resume (fc x)
apply fc (Left s) = return (Left (fmap (>>= fc) s))
t >> f = Coroutine (resume t >>= apply f)
where apply fc (Right _) = resume fc
apply fc (Left s) = return (Left (fmap (>> fc) s))
А в C так нельзя. В C надо долбиться в longjmp. Или можно?
Исходная версия hateyoufeel, :
Шёл 2020.
hateyoufeel всё ещё не умеет в корутины без магии компилятора :)
А какой практический смысл в том, чтобы это уметь без магии компилятора? Ну кроме бесконечного бессмысленного пердолева.
Кстати, на том же хацкелле корутины давно написали на самом хацкелле, обернули в библиотеку и всё ок.
-- | Suspending, resumable monadic computations.
newtype Coroutine s m r = Coroutine {
-- | Run the next step of a `Coroutine` computation. The result of the step execution will be either a suspension or
-- the final coroutine result.
resume :: m (Either (s (Coroutine s m r)) r)
}
type CoroutineStepResult s m r = Either (s (Coroutine s m r)) r
instance (Functor s, Functor m) => Functor (Coroutine s m) where
fmap f t = Coroutine (fmap (apply f) (resume t))
where apply fc (Right x) = Right (fc x)
apply fc (Left s) = Left (fmap (fmap fc) s)
instance (Functor s, Functor m, Monad m) => Applicative (Coroutine s m) where
pure = return
(<*>) = ap
instance (Functor s, Monad m) => Monad (Coroutine s m) where
return x = Coroutine (return (Right x))
t >>= f = Coroutine (resume t >>= apply f)
where apply fc (Right x) = resume (fc x)
apply fc (Left s) = return (Left (fmap (>>= fc) s))
t >> f = Coroutine (resume t >>= apply f)
where apply fc (Right _) = resume fc
apply fc (Left s) = return (Left (fmap (>> fc) s))
А в C так нельзя. В C надо долбиться longjmp. Или можно?