Haskell. , , - , . .
data Stream a
= Done
| Skip (Stream a)
| Yield a (Stream a)
A Stream Yield , , Skip , Done, , .
a Stream, , , Yield, Stream.
eval :: Monad m => Stream (m a) -> m ()
eval Done = return ()
eval (Yield ma s) = ma >> eval s
eval (Skip s) = eval s
Stream ( ) "", , .
observe :: Monad m => (a -> Maybe (m b)) -> [a] -> m ()
observe f = eval . go
where go [] = Done
go (x:xs) = case f x of
Nothing -> Skip (go xs)
Just mb -> Yield mb (go xs)
( ), observe Foldable :
observe :: (Foldable f, Monad m) => (a -> Maybe (m b)) -> f a -> m ()
observe f = eval . foldr (maybe Skip Yield . f) Done
,
f :: Int -> Maybe (IO ())
f x | x `rem` 10 == 0 = Just (print x)
| otherwise = Nothing
main = observe f [0..100]
.