рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдорда рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рд╕реА ++ рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВред рд▓реЗрдХрд┐рди рдХреБрдЫ рднреА рдирд╣реАрдВ рд╕реА + + рдореЗрдВ рдордареЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд░реЛрдХрддрд╛ рд╣реИред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЙрдирдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рдм рдХреБрдЫ рд╣реИ:
- рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реИред
- рд▓реИрдореНрдмреНрдбрд╛ рдлрд╝рдВрдХреНрд╢рди - рд╣рд╛рдВ, C ++ 11 рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡реЗ рднрд┐рдХреНрд╖реБрдУрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рд╕рд╛рде, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЖрд╕рд╛рди рд╣реИред
- рдЯрд╛рдЗрдк рдХрдХреНрд╖рд╛рдПрдВ - рдирд╣реАрдВред рд╕реА ++ рдореЗрдВ рд╡реЗ рдЕрдкрдиреЗ рдПрдирд╛рд▓реЙрдЧ - рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ, рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рдЗрд╕реЗ рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рд╣реИред рд▓реЗрдХрд┐рди рдордареЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЗрдВ рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рдЖрдк рдмрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдордареЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпреЛрдВ рдпрд╛ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдЕрдзрд┐рднрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
- рдЕрдВрдХрдиред рд╕реА ++ рдореЗрдВ, рдпрд╣ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдордареЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдПрдирд╛рд▓реЙрдЧ рдХреЛ рдорд╛рдирдХ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдиреАрдЪреЗ рдЙрд╕ рдкрд░ рдФрд░ рдЕрдзрд┐рдХред
рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЗ рдореЛрдирд╛рдб рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
class Monad m where (>>= ) ::ma -> (a->mb)->mb (>> ) ::m a->m b->mb return ::a->ma fail::String->ma
рдкрд╣рд▓реЗ, рдЪрд▓реЛ рдХреБрдЫ рд╕рд╛рд░ рд╕рдВрдиреНрдпрд╛рд╕реА рд▓реЗрддреЗ рд╣реИрдВ, рднрд▓реЗ рд╣реА рд╕реА ++ рдореЗрдВ рдЗрд╕рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реЛ
Monad. , .
template<typename A, typename B> Monad<B> operator>>=(Monad<A> ma, function<Monad<B> (A)> f) { ... // }
ma, f f.
template<typename A, typename B> Monad<B> operator>>(Monad<A> ma, Monad<B> mb) { return Ma >>= [=](A){ return mb; }; }
>>= , . ( m >> k = m >>= \_ -> k
), Haskell C++.
template<typename A> Monad <A> mreturn(A a) { ... // }
return C++, mreturn. , a
.
fail
, .
, C++, - . - Maybe
, ., std::future
. C++11. future T
, . , , - , , , , . future
get
.
template<class T> class future { public: ... T get(); // get ... };
C++11 тАУ std::async
. , std::future
. : future<int> result = async(f); // - f int a = result.get(); // f .
mreturn
>>=
std::future
#include <future> using namespace std; template<typename A> future<A> mreturn(const A& a) { return async([=]{ return a; }); }
, future , . , .
template<typename A, typename B> future<B> operator>>=(future<A>& ma, const function<future<B> (A)>& f) { return async([&] () -> B { return f(ma.get()).get(); }); }
, , ma, f, f.
, . 3 , : Left identity : return a >>= f == fa Right identity: m >>= return == m Associativity: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
C++, :
(mreturn(a) >>= f) == f(a)
, :
async([&] () -> B { return f(mreturn(a).get()).get(); }) == f(a)
, mreturn(a).get()
,
. a
std::future
, . , :
async([&] () -> B { return f(a).get(); }) == f(a)
, , f
, . , f
, ( ).
: m >>= mreturn == m
, :
async([&] () -> B { return mreturn(m.get()).get(); }) == m
mreturn(x).get()
, :
async([&] () -> B { return m.get(); }) == m
, m. , m.
: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
, , . m f, , m. g, f. f g m.
. - : function<future<int> (int)> f = [](int a){ cout << a << '\n'; return mreturn(a + 6); }; int a = (mreturn(5) >>= f).get(); cout << a;
, 5 11.
C++11 mreturn >>=. : n3721
mreturn
make_ready_future
.
>>=
, std::future
then
. , A
, future. , , future , then
, .
unwrap
future<future> future. join
Control.Monad
.
then
: future<int> f(shared_ptr<stream> str) { shared_ptr<vector<char>> buf = ...; return str->read(512, buf).then([](future<int> op) { return op.get() + 11; }); } future<void> g() { shared_ptr<stream> s = ...; return f(s).then([s](future<int> op) { s->close(); }); }
, , . resumable : n3722 . : future<int> f(stream str) resumable { shared_ptr<vector<char>> buf = ...; int count = await str.read(512, buf); return count + 11; } future<void> g() resumable { stream s = ...; int pls11 = await f(s); s.close(); }
resumable
, , , . await
тАУ ( <-
) do
. , str.read
f
future, await
int
, .
? , , : resumable
, , Fibers Windows boost::coroutine
. , . resumable
- , await
. , await
then
, await
. resumable
std::future
, then
get
. C++, , , , . std::future
.
, resumable
. , resumable
.
Monad. , .
template<typename A, typename B> Monad<B> operator>>=(Monad<A> ma, function<Monad<B> (A)> f) { ... // }
ma, f f.
template<typename A, typename B> Monad<B> operator>>(Monad<A> ma, Monad<B> mb) { return Ma >>= [=](A){ return mb; }; }
>>= , . ( m >> k = m >>= \_ -> k
), Haskell C++.
template<typename A> Monad <A> mreturn(A a) { ... // }
return C++, mreturn. , a
.
fail
, .
, C++, - . - Maybe
, ., std::future
. C++11. future T
, . , , - , , , , . future
get
.
template<class T> class future { public: ... T get(); // get ... };
C++11 тАУ std::async
. , std::future
. : future<int> result = async(f); // - f int a = result.get(); // f .
mreturn
>>=
std::future
#include <future> using namespace std; template<typename A> future<A> mreturn(const A& a) { return async([=]{ return a; }); }
, future , . , .
template<typename A, typename B> future<B> operator>>=(future<A>& ma, const function<future<B> (A)>& f) { return async([&] () -> B { return f(ma.get()).get(); }); }
, , ma, f, f.
, . 3 , : Left identity : return a >>= f == fa Right identity: m >>= return == m Associativity: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
C++, :
(mreturn(a) >>= f) == f(a)
, :
async([&] () -> B { return f(mreturn(a).get()).get(); }) == f(a)
, mreturn(a).get()
,
. a
std::future
, . , :
async([&] () -> B { return f(a).get(); }) == f(a)
, , f
, . , f
, ( ).
: m >>= mreturn == m
, :
async([&] () -> B { return mreturn(m.get()).get(); }) == m
mreturn(x).get()
, :
async([&] () -> B { return m.get(); }) == m
, m. , m.
: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
, , . m f, , m. g, f. f g m.
. - : function<future<int> (int)> f = [](int a){ cout << a << '\n'; return mreturn(a + 6); }; int a = (mreturn(5) >>= f).get(); cout << a;
, 5 11.
C++11 mreturn >>=. : n3721
mreturn
make_ready_future
.
>>=
, std::future
then
. , A
, future. , , future , then
, .
unwrap
future<future> future. join
Control.Monad
.
then
: future<int> f(shared_ptr<stream> str) { shared_ptr<vector<char>> buf = ...; return str->read(512, buf).then([](future<int> op) { return op.get() + 11; }); } future<void> g() { shared_ptr<stream> s = ...; return f(s).then([s](future<int> op) { s->close(); }); }
, , . resumable : n3722 . : future<int> f(stream str) resumable { shared_ptr<vector<char>> buf = ...; int count = await str.read(512, buf); return count + 11; } future<void> g() resumable { stream s = ...; int pls11 = await f(s); s.close(); }
resumable
, , , . await
тАУ ( <-
) do
. , str.read
f
future, await
int
, .
? , , : resumable
, , Fibers Windows boost::coroutine
. , . resumable
- , await
. , await
then
, await
. resumable
std::future
, then
get
. C++, , , , . std::future
.
, resumable
. , resumable
.
Monad. , .
template<typename A, typename B> Monad<B> operator>>=(Monad<A> ma, function<Monad<B> (A)> f) { ... // }
ma, f f.
template<typename A, typename B> Monad<B> operator>>(Monad<A> ma, Monad<B> mb) { return Ma >>= [=](A){ return mb; }; }
>>= , . ( m >> k = m >>= \_ -> k
), Haskell C++.
template<typename A> Monad <A> mreturn(A a) { ... // }
return C++, mreturn. , a
.
fail
, .
, C++, - . - Maybe
, ., std::future
. C++11. future T
, . , , - , , , , . future
get
.
template<class T> class future { public: ... T get(); // get ... };
C++11 тАУ std::async
. , std::future
. : future<int> result = async(f); // - f int a = result.get(); // f .
mreturn
>>=
std::future
#include <future> using namespace std; template<typename A> future<A> mreturn(const A& a) { return async([=]{ return a; }); }
, future , . , .
template<typename A, typename B> future<B> operator>>=(future<A>& ma, const function<future<B> (A)>& f) { return async([&] () -> B { return f(ma.get()).get(); }); }
, , ma, f, f.
, . 3 , : Left identity : return a >>= f == fa Right identity: m >>= return == m Associativity: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
C++, :
(mreturn(a) >>= f) == f(a)
, :
async([&] () -> B { return f(mreturn(a).get()).get(); }) == f(a)
, mreturn(a).get()
,
. a
std::future
, . , :
async([&] () -> B { return f(a).get(); }) == f(a)
, , f
, . , f
, ( ).
: m >>= mreturn == m
, :
async([&] () -> B { return mreturn(m.get()).get(); }) == m
mreturn(x).get()
, :
async([&] () -> B { return m.get(); }) == m
, m. , m.
: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
, , . m f, , m. g, f. f g m.
. - : function<future<int> (int)> f = [](int a){ cout << a << '\n'; return mreturn(a + 6); }; int a = (mreturn(5) >>= f).get(); cout << a;
, 5 11.
C++11 mreturn >>=. : n3721
mreturn
make_ready_future
.
>>=
, std::future
then
. , A
, future. , , future , then
, .
unwrap
future<future> future. join
Control.Monad
.
then
: future<int> f(shared_ptr<stream> str) { shared_ptr<vector<char>> buf = ...; return str->read(512, buf).then([](future<int> op) { return op.get() + 11; }); } future<void> g() { shared_ptr<stream> s = ...; return f(s).then([s](future<int> op) { s->close(); }); }
, , . resumable : n3722 . : future<int> f(stream str) resumable { shared_ptr<vector<char>> buf = ...; int count = await str.read(512, buf); return count + 11; } future<void> g() resumable { stream s = ...; int pls11 = await f(s); s.close(); }
resumable
, , , . await
тАУ ( <-
) do
. , str.read
f
future, await
int
, .
? , , : resumable
, , Fibers Windows boost::coroutine
. , . resumable
- , await
. , await
then
, await
. resumable
std::future
, then
get
. C++, , , , . std::future
.
, resumable
. , resumable
.
Monad. , .
template<typename A, typename B> Monad<B> operator>>=(Monad<A> ma, function<Monad<B> (A)> f) { ... // }
ma, f f.
template<typename A, typename B> Monad<B> operator>>(Monad<A> ma, Monad<B> mb) { return Ma >>= [=](A){ return mb; }; }
>>= , . ( m >> k = m >>= \_ -> k
), Haskell C++.
template<typename A> Monad <A> mreturn(A a) { ... // }
return C++, mreturn. , a
.
fail
, .
, C++, - . - Maybe
, ., std::future
. C++11. future T
, . , , - , , , , . future
get
.
template<class T> class future { public: ... T get(); // get ... };
C++11 тАУ std::async
. , std::future
. : future<int> result = async(f); // - f int a = result.get(); // f .
mreturn
>>=
std::future
#include <future> using namespace std; template<typename A> future<A> mreturn(const A& a) { return async([=]{ return a; }); }
, future , . , .
template<typename A, typename B> future<B> operator>>=(future<A>& ma, const function<future<B> (A)>& f) { return async([&] () -> B { return f(ma.get()).get(); }); }
, , ma, f, f.
, . 3 , : Left identity : return a >>= f == fa Right identity: m >>= return == m Associativity: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
C++, :
(mreturn(a) >>= f) == f(a)
, :
async([&] () -> B { return f(mreturn(a).get()).get(); }) == f(a)
, mreturn(a).get()
,
. a
std::future
, . , :
async([&] () -> B { return f(a).get(); }) == f(a)
, , f
, . , f
, ( ).
: m >>= mreturn == m
, :
async([&] () -> B { return mreturn(m.get()).get(); }) == m
mreturn(x).get()
, :
async([&] () -> B { return m.get(); }) == m
, m. , m.
: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
, , . m f, , m. g, f. f g m.
. - : function<future<int> (int)> f = [](int a){ cout << a << '\n'; return mreturn(a + 6); }; int a = (mreturn(5) >>= f).get(); cout << a;
, 5 11.
C++11 mreturn >>=. : n3721
mreturn
make_ready_future
.
>>=
, std::future
then
. , A
, future. , , future , then
, .
unwrap
future<future> future. join
Control.Monad
.
then
: future<int> f(shared_ptr<stream> str) { shared_ptr<vector<char>> buf = ...; return str->read(512, buf).then([](future<int> op) { return op.get() + 11; }); } future<void> g() { shared_ptr<stream> s = ...; return f(s).then([s](future<int> op) { s->close(); }); }
, , . resumable : n3722 . : future<int> f(stream str) resumable { shared_ptr<vector<char>> buf = ...; int count = await str.read(512, buf); return count + 11; } future<void> g() resumable { stream s = ...; int pls11 = await f(s); s.close(); }
resumable
, , , . await
тАУ ( <-
) do
. , str.read
f
future, await
int
, .
? , , : resumable
, , Fibers Windows boost::coroutine
. , . resumable
- , await
. , await
then
, await
. resumable
std::future
, then
get
. C++, , , , . std::future
.
, resumable
. , resumable
.
Monad. , .
template<typename A, typename B> Monad<B> operator>>=(Monad<A> ma, function<Monad<B> (A)> f) { ... // }
ma, f f.
template<typename A, typename B> Monad<B> operator>>(Monad<A> ma, Monad<B> mb) { return Ma >>= [=](A){ return mb; }; }
>>= , . ( m >> k = m >>= \_ -> k
), Haskell C++.
template<typename A> Monad <A> mreturn(A a) { ... // }
return C++, mreturn. , a
.
fail
, .
, C++, - . - Maybe
, ., std::future
. C++11. future T
, . , , - , , , , . future
get
.
template<class T> class future { public: ... T get(); // get ... };
C++11 тАУ std::async
. , std::future
. : future<int> result = async(f); // - f int a = result.get(); // f .
mreturn
>>=
std::future
#include <future> using namespace std; template<typename A> future<A> mreturn(const A& a) { return async([=]{ return a; }); }
, future , . , .
template<typename A, typename B> future<B> operator>>=(future<A>& ma, const function<future<B> (A)>& f) { return async([&] () -> B { return f(ma.get()).get(); }); }
, , ma, f, f.
, . 3 , : Left identity : return a >>= f == fa Right identity: m >>= return == m Associativity: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
C++, :
(mreturn(a) >>= f) == f(a)
, :
async([&] () -> B { return f(mreturn(a).get()).get(); }) == f(a)
, mreturn(a).get()
,
. a
std::future
, . , :
async([&] () -> B { return f(a).get(); }) == f(a)
, , f
, . , f
, ( ).
: m >>= mreturn == m
, :
async([&] () -> B { return mreturn(m.get()).get(); }) == m
mreturn(x).get()
, :
async([&] () -> B { return m.get(); }) == m
, m. , m.
: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
, , . m f, , m. g, f. f g m.
. - : function<future<int> (int)> f = [](int a){ cout << a << '\n'; return mreturn(a + 6); }; int a = (mreturn(5) >>= f).get(); cout << a;
, 5 11.
C++11 mreturn >>=. : n3721
mreturn
make_ready_future
.
>>=
, std::future
then
. , A
, future. , , future , then
, .
unwrap
future<future> future. join
Control.Monad
.
then
: future<int> f(shared_ptr<stream> str) { shared_ptr<vector<char>> buf = ...; return str->read(512, buf).then([](future<int> op) { return op.get() + 11; }); } future<void> g() { shared_ptr<stream> s = ...; return f(s).then([s](future<int> op) { s->close(); }); }
, , . resumable : n3722 . : future<int> f(stream str) resumable { shared_ptr<vector<char>> buf = ...; int count = await str.read(512, buf); return count + 11; } future<void> g() resumable { stream s = ...; int pls11 = await f(s); s.close(); }
resumable
, , , . await
тАУ ( <-
) do
. , str.read
f
future, await
int
, .
? , , : resumable
, , Fibers Windows boost::coroutine
. , . resumable
- , await
. , await
then
, await
. resumable
std::future
, then
get
. C++, , , , . std::future
.
, resumable
. , resumable
.
Monad. , .
template<typename A, typename B> Monad<B> operator>>=(Monad<A> ma, function<Monad<B> (A)> f) { ... // }
ma, f f.
template<typename A, typename B> Monad<B> operator>>(Monad<A> ma, Monad<B> mb) { return Ma >>= [=](A){ return mb; }; }
>>= , . ( m >> k = m >>= \_ -> k
), Haskell C++.
template<typename A> Monad <A> mreturn(A a) { ... // }
return C++, mreturn. , a
.
fail
, .
, C++, - . - Maybe
, ., std::future
. C++11. future T
, . , , - , , , , . future
get
.
template<class T> class future { public: ... T get(); // get ... };
C++11 тАУ std::async
. , std::future
. : future<int> result = async(f); // - f int a = result.get(); // f .
mreturn
>>=
std::future
#include <future> using namespace std; template<typename A> future<A> mreturn(const A& a) { return async([=]{ return a; }); }
, future , . , .
template<typename A, typename B> future<B> operator>>=(future<A>& ma, const function<future<B> (A)>& f) { return async([&] () -> B { return f(ma.get()).get(); }); }
, , ma, f, f.
, . 3 , : Left identity : return a >>= f == fa Right identity: m >>= return == m Associativity: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
C++, :
(mreturn(a) >>= f) == f(a)
, :
async([&] () -> B { return f(mreturn(a).get()).get(); }) == f(a)
, mreturn(a).get()
,
. a
std::future
, . , :
async([&] () -> B { return f(a).get(); }) == f(a)
, , f
, . , f
, ( ).
: m >>= mreturn == m
, :
async([&] () -> B { return mreturn(m.get()).get(); }) == m
mreturn(x).get()
, :
async([&] () -> B { return m.get(); }) == m
, m. , m.
: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
, , . m f, , m. g, f. f g m.
. - : function<future<int> (int)> f = [](int a){ cout << a << '\n'; return mreturn(a + 6); }; int a = (mreturn(5) >>= f).get(); cout << a;
, 5 11.
C++11 mreturn >>=. : n3721
mreturn
make_ready_future
.
>>=
, std::future
then
. , A
, future. , , future , then
, .
unwrap
future<future> future. join
Control.Monad
.
then
: future<int> f(shared_ptr<stream> str) { shared_ptr<vector<char>> buf = ...; return str->read(512, buf).then([](future<int> op) { return op.get() + 11; }); } future<void> g() { shared_ptr<stream> s = ...; return f(s).then([s](future<int> op) { s->close(); }); }
, , . resumable : n3722 . : future<int> f(stream str) resumable { shared_ptr<vector<char>> buf = ...; int count = await str.read(512, buf); return count + 11; } future<void> g() resumable { stream s = ...; int pls11 = await f(s); s.close(); }
resumable
, , , . await
тАУ ( <-
) do
. , str.read
f
future, await
int
, .
? , , : resumable
, , Fibers Windows boost::coroutine
. , . resumable
- , await
. , await
then
, await
. resumable
std::future
, then
get
. C++, , , , . std::future
.
, resumable
. , resumable
.
Monad. , .
template<typename A, typename B> Monad<B> operator>>=(Monad<A> ma, function<Monad<B> (A)> f) { ... // }
ma, f f.
template<typename A, typename B> Monad<B> operator>>(Monad<A> ma, Monad<B> mb) { return Ma >>= [=](A){ return mb; }; }
>>= , . ( m >> k = m >>= \_ -> k
), Haskell C++.
template<typename A> Monad <A> mreturn(A a) { ... // }
return C++, mreturn. , a
.
fail
, .
, C++, - . - Maybe
, ., std::future
. C++11. future T
, . , , - , , , , . future
get
.
template<class T> class future { public: ... T get(); // get ... };
C++11 тАУ std::async
. , std::future
. : future<int> result = async(f); // - f int a = result.get(); // f .
mreturn
>>=
std::future
#include <future> using namespace std; template<typename A> future<A> mreturn(const A& a) { return async([=]{ return a; }); }
, future , . , .
template<typename A, typename B> future<B> operator>>=(future<A>& ma, const function<future<B> (A)>& f) { return async([&] () -> B { return f(ma.get()).get(); }); }
, , ma, f, f.
, . 3 , : Left identity : return a >>= f == fa Right identity: m >>= return == m Associativity: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
C++, :
(mreturn(a) >>= f) == f(a)
, :
async([&] () -> B { return f(mreturn(a).get()).get(); }) == f(a)
, mreturn(a).get()
,
. a
std::future
, . , :
async([&] () -> B { return f(a).get(); }) == f(a)
, , f
, . , f
, ( ).
: m >>= mreturn == m
, :
async([&] () -> B { return mreturn(m.get()).get(); }) == m
mreturn(x).get()
, :
async([&] () -> B { return m.get(); }) == m
, m. , m.
: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
, , . m f, , m. g, f. f g m.
. - : function<future<int> (int)> f = [](int a){ cout << a << '\n'; return mreturn(a + 6); }; int a = (mreturn(5) >>= f).get(); cout << a;
, 5 11.
C++11 mreturn >>=. : n3721
mreturn
make_ready_future
.
>>=
, std::future
then
. , A
, future. , , future , then
, .
unwrap
future<future> future. join
Control.Monad
.
then
: future<int> f(shared_ptr<stream> str) { shared_ptr<vector<char>> buf = ...; return str->read(512, buf).then([](future<int> op) { return op.get() + 11; }); } future<void> g() { shared_ptr<stream> s = ...; return f(s).then([s](future<int> op) { s->close(); }); }
, , . resumable : n3722 . : future<int> f(stream str) resumable { shared_ptr<vector<char>> buf = ...; int count = await str.read(512, buf); return count + 11; } future<void> g() resumable { stream s = ...; int pls11 = await f(s); s.close(); }
resumable
, , , . await
тАУ ( <-
) do
. , str.read
f
future, await
int
, .
? , , : resumable
, , Fibers Windows boost::coroutine
. , . resumable
- , await
. , await
then
, await
. resumable
std::future
, then
get
. C++, , , , . std::future
.
, resumable
. , resumable
.
Monad. , .
template<typename A, typename B> Monad<B> operator>>=(Monad<A> ma, function<Monad<B> (A)> f) { ... // }
ma, f f.
template<typename A, typename B> Monad<B> operator>>(Monad<A> ma, Monad<B> mb) { return Ma >>= [=](A){ return mb; }; }
>>= , . ( m >> k = m >>= \_ -> k
), Haskell C++.
template<typename A> Monad <A> mreturn(A a) { ... // }
return C++, mreturn. , a
.
fail
, .
, C++, - . - Maybe
, ., std::future
. C++11. future T
, . , , - , , , , . future
get
.
template<class T> class future { public: ... T get(); // get ... };
C++11 тАУ std::async
. , std::future
. : future<int> result = async(f); // - f int a = result.get(); // f .
mreturn
>>=
std::future
#include <future> using namespace std; template<typename A> future<A> mreturn(const A& a) { return async([=]{ return a; }); }
, future , . , .
template<typename A, typename B> future<B> operator>>=(future<A>& ma, const function<future<B> (A)>& f) { return async([&] () -> B { return f(ma.get()).get(); }); }
, , ma, f, f.
, . 3 , : Left identity : return a >>= f == fa Right identity: m >>= return == m Associativity: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
C++, :
(mreturn(a) >>= f) == f(a)
, :
async([&] () -> B { return f(mreturn(a).get()).get(); }) == f(a)
, mreturn(a).get()
,
. a
std::future
, . , :
async([&] () -> B { return f(a).get(); }) == f(a)
, , f
, . , f
, ( ).
: m >>= mreturn == m
, :
async([&] () -> B { return mreturn(m.get()).get(); }) == m
mreturn(x).get()
, :
async([&] () -> B { return m.get(); }) == m
, m. , m.
: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
, , . m f, , m. g, f. f g m.
. - : function<future<int> (int)> f = [](int a){ cout << a << '\n'; return mreturn(a + 6); }; int a = (mreturn(5) >>= f).get(); cout << a;
, 5 11.
C++11 mreturn >>=. : n3721
mreturn
make_ready_future
.
>>=
, std::future
then
. , A
, future. , , future , then
, .
unwrap
future<future> future. join
Control.Monad
.
then
: future<int> f(shared_ptr<stream> str) { shared_ptr<vector<char>> buf = ...; return str->read(512, buf).then([](future<int> op) { return op.get() + 11; }); } future<void> g() { shared_ptr<stream> s = ...; return f(s).then([s](future<int> op) { s->close(); }); }
, , . resumable : n3722 . : future<int> f(stream str) resumable { shared_ptr<vector<char>> buf = ...; int count = await str.read(512, buf); return count + 11; } future<void> g() resumable { stream s = ...; int pls11 = await f(s); s.close(); }
resumable
, , , . await
тАУ ( <-
) do
. , str.read
f
future, await
int
, .
? , , : resumable
, , Fibers Windows boost::coroutine
. , . resumable
- , await
. , await
then
, await
. resumable
std::future
, then
get
. C++, , , , . std::future
.
, resumable
. , resumable
.
Monad. , .
template<typename A, typename B> Monad<B> operator>>=(Monad<A> ma, function<Monad<B> (A)> f) { ... // }
ma, f f.
template<typename A, typename B> Monad<B> operator>>(Monad<A> ma, Monad<B> mb) { return Ma >>= [=](A){ return mb; }; }
>>= , . ( m >> k = m >>= \_ -> k
), Haskell C++.
template<typename A> Monad <A> mreturn(A a) { ... // }
return C++, mreturn. , a
.
fail
, .
, C++, - . - Maybe
, ., std::future
. C++11. future T
, . , , - , , , , . future
get
.
template<class T> class future { public: ... T get(); // get ... };
C++11 тАУ std::async
. , std::future
. : future<int> result = async(f); // - f int a = result.get(); // f .
mreturn
>>=
std::future
#include <future> using namespace std; template<typename A> future<A> mreturn(const A& a) { return async([=]{ return a; }); }
, future , . , .
template<typename A, typename B> future<B> operator>>=(future<A>& ma, const function<future<B> (A)>& f) { return async([&] () -> B { return f(ma.get()).get(); }); }
, , ma, f, f.
, . 3 , : Left identity : return a >>= f == fa Right identity: m >>= return == m Associativity: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
C++, :
(mreturn(a) >>= f) == f(a)
, :
async([&] () -> B { return f(mreturn(a).get()).get(); }) == f(a)
, mreturn(a).get()
,
. a
std::future
, . , :
async([&] () -> B { return f(a).get(); }) == f(a)
, , f
, . , f
, ( ).
: m >>= mreturn == m
, :
async([&] () -> B { return mreturn(m.get()).get(); }) == m
mreturn(x).get()
, :
async([&] () -> B { return m.get(); }) == m
, m. , m.
: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
, , . m f, , m. g, f. f g m.
. - : function<future<int> (int)> f = [](int a){ cout << a << '\n'; return mreturn(a + 6); }; int a = (mreturn(5) >>= f).get(); cout << a;
, 5 11.
C++11 mreturn >>=. : n3721
mreturn
make_ready_future
.
>>=
, std::future
then
. , A
, future. , , future , then
, .
unwrap
future<future> future. join
Control.Monad
.
then
: future<int> f(shared_ptr<stream> str) { shared_ptr<vector<char>> buf = ...; return str->read(512, buf).then([](future<int> op) { return op.get() + 11; }); } future<void> g() { shared_ptr<stream> s = ...; return f(s).then([s](future<int> op) { s->close(); }); }
, , . resumable : n3722 . : future<int> f(stream str) resumable { shared_ptr<vector<char>> buf = ...; int count = await str.read(512, buf); return count + 11; } future<void> g() resumable { stream s = ...; int pls11 = await f(s); s.close(); }
resumable
, , , . await
тАУ ( <-
) do
. , str.read
f
future, await
int
, .
? , , : resumable
, , Fibers Windows boost::coroutine
. , . resumable
- , await
. , await
then
, await
. resumable
std::future
, then
get
. C++, , , , . std::future
.
, resumable
. , resumable
.
Monad. , .
template<typename A, typename B> Monad<B> operator>>=(Monad<A> ma, function<Monad<B> (A)> f) { ... // }
ma, f f.
template<typename A, typename B> Monad<B> operator>>(Monad<A> ma, Monad<B> mb) { return Ma >>= [=](A){ return mb; }; }
>>= , . ( m >> k = m >>= \_ -> k
), Haskell C++.
template<typename A> Monad <A> mreturn(A a) { ... // }
return C++, mreturn. , a
.
fail
, .
, C++, - . - Maybe
, ., std::future
. C++11. future T
, . , , - , , , , . future
get
.
template<class T> class future { public: ... T get(); // get ... };
C++11 тАУ std::async
. , std::future
. : future<int> result = async(f); // - f int a = result.get(); // f .
mreturn
>>=
std::future
#include <future> using namespace std; template<typename A> future<A> mreturn(const A& a) { return async([=]{ return a; }); }
, future , . , .
template<typename A, typename B> future<B> operator>>=(future<A>& ma, const function<future<B> (A)>& f) { return async([&] () -> B { return f(ma.get()).get(); }); }
, , ma, f, f.
, . 3 , : Left identity : return a >>= f == fa Right identity: m >>= return == m Associativity: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
C++, :
(mreturn(a) >>= f) == f(a)
, :
async([&] () -> B { return f(mreturn(a).get()).get(); }) == f(a)
, mreturn(a).get()
,
. a
std::future
, . , :
async([&] () -> B { return f(a).get(); }) == f(a)
, , f
, . , f
, ( ).
: m >>= mreturn == m
, :
async([&] () -> B { return mreturn(m.get()).get(); }) == m
mreturn(x).get()
, :
async([&] () -> B { return m.get(); }) == m
, m. , m.
: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
, , . m f, , m. g, f. f g m.
. - : function<future<int> (int)> f = [](int a){ cout << a << '\n'; return mreturn(a + 6); }; int a = (mreturn(5) >>= f).get(); cout << a;
, 5 11.
C++11 mreturn >>=. : n3721
mreturn
make_ready_future
.
>>=
, std::future
then
. , A
, future. , , future , then
, .
unwrap
future<future> future. join
Control.Monad
.
then
: future<int> f(shared_ptr<stream> str) { shared_ptr<vector<char>> buf = ...; return str->read(512, buf).then([](future<int> op) { return op.get() + 11; }); } future<void> g() { shared_ptr<stream> s = ...; return f(s).then([s](future<int> op) { s->close(); }); }
, , . resumable : n3722 . : future<int> f(stream str) resumable { shared_ptr<vector<char>> buf = ...; int count = await str.read(512, buf); return count + 11; } future<void> g() resumable { stream s = ...; int pls11 = await f(s); s.close(); }
resumable
, , , . await
тАУ ( <-
) do
. , str.read
f
future, await
int
, .
? , , : resumable
, , Fibers Windows boost::coroutine
. , . resumable
- , await
. , await
then
, await
. resumable
std::future
, then
get
. C++, , , , . std::future
.
, resumable
. , resumable
.
Monad. , .
template<typename A, typename B> Monad<B> operator>>=(Monad<A> ma, function<Monad<B> (A)> f) { ... // }
ma, f f.
template<typename A, typename B> Monad<B> operator>>(Monad<A> ma, Monad<B> mb) { return Ma >>= [=](A){ return mb; }; }
>>= , . ( m >> k = m >>= \_ -> k
), Haskell C++.
template<typename A> Monad <A> mreturn(A a) { ... // }
return C++, mreturn. , a
.
fail
, .
, C++, - . - Maybe
, ., std::future
. C++11. future T
, . , , - , , , , . future
get
.
template<class T> class future { public: ... T get(); // get ... };
C++11 тАУ std::async
. , std::future
. : future<int> result = async(f); // - f int a = result.get(); // f .
mreturn
>>=
std::future
#include <future> using namespace std; template<typename A> future<A> mreturn(const A& a) { return async([=]{ return a; }); }
, future , . , .
template<typename A, typename B> future<B> operator>>=(future<A>& ma, const function<future<B> (A)>& f) { return async([&] () -> B { return f(ma.get()).get(); }); }
, , ma, f, f.
, . 3 , : Left identity : return a >>= f == fa Right identity: m >>= return == m Associativity: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
C++, :
(mreturn(a) >>= f) == f(a)
, :
async([&] () -> B { return f(mreturn(a).get()).get(); }) == f(a)
, mreturn(a).get()
,
. a
std::future
, . , :
async([&] () -> B { return f(a).get(); }) == f(a)
, , f
, . , f
, ( ).
: m >>= mreturn == m
, :
async([&] () -> B { return mreturn(m.get()).get(); }) == m
mreturn(x).get()
, :
async([&] () -> B { return m.get(); }) == m
, m. , m.
: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
, , . m f, , m. g, f. f g m.
. - : function<future<int> (int)> f = [](int a){ cout << a << '\n'; return mreturn(a + 6); }; int a = (mreturn(5) >>= f).get(); cout << a;
, 5 11.
C++11 mreturn >>=. : n3721
mreturn
make_ready_future
.
>>=
, std::future
then
. , A
, future. , , future , then
, .
unwrap
future<future> future. join
Control.Monad
.
then
: future<int> f(shared_ptr<stream> str) { shared_ptr<vector<char>> buf = ...; return str->read(512, buf).then([](future<int> op) { return op.get() + 11; }); } future<void> g() { shared_ptr<stream> s = ...; return f(s).then([s](future<int> op) { s->close(); }); }
, , . resumable : n3722 . : future<int> f(stream str) resumable { shared_ptr<vector<char>> buf = ...; int count = await str.read(512, buf); return count + 11; } future<void> g() resumable { stream s = ...; int pls11 = await f(s); s.close(); }
resumable
, , , . await
тАУ ( <-
) do
. , str.read
f
future, await
int
, .
? , , : resumable
, , Fibers Windows boost::coroutine
. , . resumable
- , await
. , await
then
, await
. resumable
std::future
, then
get
. C++, , , , . std::future
.
, resumable
. , resumable
.
Monad. , .
template<typename A, typename B> Monad<B> operator>>=(Monad<A> ma, function<Monad<B> (A)> f) { ... // }
ma, f f.
template<typename A, typename B> Monad<B> operator>>(Monad<A> ma, Monad<B> mb) { return Ma >>= [=](A){ return mb; }; }
>>= , . ( m >> k = m >>= \_ -> k
), Haskell C++.
template<typename A> Monad <A> mreturn(A a) { ... // }
return C++, mreturn. , a
.
fail
, .
, C++, - . - Maybe
, ., std::future
. C++11. future T
, . , , - , , , , . future
get
.
template<class T> class future { public: ... T get(); // get ... };
C++11 тАУ std::async
. , std::future
. : future<int> result = async(f); // - f int a = result.get(); // f .
mreturn
>>=
std::future
#include <future> using namespace std; template<typename A> future<A> mreturn(const A& a) { return async([=]{ return a; }); }
, future , . , .
template<typename A, typename B> future<B> operator>>=(future<A>& ma, const function<future<B> (A)>& f) { return async([&] () -> B { return f(ma.get()).get(); }); }
, , ma, f, f.
, . 3 , : Left identity : return a >>= f == fa Right identity: m >>= return == m Associativity: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
C++, :
(mreturn(a) >>= f) == f(a)
, :
async([&] () -> B { return f(mreturn(a).get()).get(); }) == f(a)
, mreturn(a).get()
,
. a
std::future
, . , :
async([&] () -> B { return f(a).get(); }) == f(a)
, , f
, . , f
, ( ).
: m >>= mreturn == m
, :
async([&] () -> B { return mreturn(m.get()).get(); }) == m
mreturn(x).get()
, :
async([&] () -> B { return m.get(); }) == m
, m. , m.
: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
, , . m f, , m. g, f. f g m.
. - : function<future<int> (int)> f = [](int a){ cout << a << '\n'; return mreturn(a + 6); }; int a = (mreturn(5) >>= f).get(); cout << a;
, 5 11.
C++11 mreturn >>=. : n3721
mreturn
make_ready_future
.
>>=
, std::future
then
. , A
, future. , , future , then
, .
unwrap
future<future> future. join
Control.Monad
.
then
: future<int> f(shared_ptr<stream> str) { shared_ptr<vector<char>> buf = ...; return str->read(512, buf).then([](future<int> op) { return op.get() + 11; }); } future<void> g() { shared_ptr<stream> s = ...; return f(s).then([s](future<int> op) { s->close(); }); }
, , . resumable : n3722 . : future<int> f(stream str) resumable { shared_ptr<vector<char>> buf = ...; int count = await str.read(512, buf); return count + 11; } future<void> g() resumable { stream s = ...; int pls11 = await f(s); s.close(); }
resumable
, , , . await
тАУ ( <-
) do
. , str.read
f
future, await
int
, .
? , , : resumable
, , Fibers Windows boost::coroutine
. , . resumable
- , await
. , await
then
, await
. resumable
std::future
, then
get
. C++, , , , . std::future
.
, resumable
. , resumable
.
Monad. , .
template<typename A, typename B> Monad<B> operator>>=(Monad<A> ma, function<Monad<B> (A)> f) { ... // }
ma, f f.
template<typename A, typename B> Monad<B> operator>>(Monad<A> ma, Monad<B> mb) { return Ma >>= [=](A){ return mb; }; }
>>= , . ( m >> k = m >>= \_ -> k
), Haskell C++.
template<typename A> Monad <A> mreturn(A a) { ... // }
return C++, mreturn. , a
.
fail
, .
, C++, - . - Maybe
, ., std::future
. C++11. future T
, . , , - , , , , . future
get
.
template<class T> class future { public: ... T get(); // get ... };
C++11 тАУ std::async
. , std::future
. : future<int> result = async(f); // - f int a = result.get(); // f .
mreturn
>>=
std::future
#include <future> using namespace std; template<typename A> future<A> mreturn(const A& a) { return async([=]{ return a; }); }
, future , . , .
template<typename A, typename B> future<B> operator>>=(future<A>& ma, const function<future<B> (A)>& f) { return async([&] () -> B { return f(ma.get()).get(); }); }
, , ma, f, f.
, . 3 , : Left identity : return a >>= f == fa Right identity: m >>= return == m Associativity: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
C++, :
(mreturn(a) >>= f) == f(a)
, :
async([&] () -> B { return f(mreturn(a).get()).get(); }) == f(a)
, mreturn(a).get()
,
. a
std::future
, . , :
async([&] () -> B { return f(a).get(); }) == f(a)
, , f
, . , f
, ( ).
: m >>= mreturn == m
, :
async([&] () -> B { return mreturn(m.get()).get(); }) == m
mreturn(x).get()
, :
async([&] () -> B { return m.get(); }) == m
, m. , m.
: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
, , . m f, , m. g, f. f g m.
. - : function<future<int> (int)> f = [](int a){ cout << a << '\n'; return mreturn(a + 6); }; int a = (mreturn(5) >>= f).get(); cout << a;
, 5 11.
C++11 mreturn >>=. : n3721
mreturn
make_ready_future
.
>>=
, std::future
then
. , A
, future. , , future , then
, .
unwrap
future<future> future. join
Control.Monad
.
then
: future<int> f(shared_ptr<stream> str) { shared_ptr<vector<char>> buf = ...; return str->read(512, buf).then([](future<int> op) { return op.get() + 11; }); } future<void> g() { shared_ptr<stream> s = ...; return f(s).then([s](future<int> op) { s->close(); }); }
, , . resumable : n3722 . : future<int> f(stream str) resumable { shared_ptr<vector<char>> buf = ...; int count = await str.read(512, buf); return count + 11; } future<void> g() resumable { stream s = ...; int pls11 = await f(s); s.close(); }
resumable
, , , . await
тАУ ( <-
) do
. , str.read
f
future, await
int
, .
? , , : resumable
, , Fibers Windows boost::coroutine
. , . resumable
- , await
. , await
then
, await
. resumable
std::future
, then
get
. C++, , , , . std::future
.
, resumable
. , resumable
.
Monad. , .
template<typename A, typename B> Monad<B> operator>>=(Monad<A> ma, function<Monad<B> (A)> f) { ... // }
ma, f f.
template<typename A, typename B> Monad<B> operator>>(Monad<A> ma, Monad<B> mb) { return Ma >>= [=](A){ return mb; }; }
>>= , . ( m >> k = m >>= \_ -> k
), Haskell C++.
template<typename A> Monad <A> mreturn(A a) { ... // }
return C++, mreturn. , a
.
fail
, .
, C++, - . - Maybe
, ., std::future
. C++11. future T
, . , , - , , , , . future
get
.
template<class T> class future { public: ... T get(); // get ... };
C++11 тАУ std::async
. , std::future
. : future<int> result = async(f); // - f int a = result.get(); // f .
mreturn
>>=
std::future
#include <future> using namespace std; template<typename A> future<A> mreturn(const A& a) { return async([=]{ return a; }); }
, future , . , .
template<typename A, typename B> future<B> operator>>=(future<A>& ma, const function<future<B> (A)>& f) { return async([&] () -> B { return f(ma.get()).get(); }); }
, , ma, f, f.
, . 3 , : Left identity : return a >>= f == fa Right identity: m >>= return == m Associativity: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
C++, :
(mreturn(a) >>= f) == f(a)
, :
async([&] () -> B { return f(mreturn(a).get()).get(); }) == f(a)
, mreturn(a).get()
,
. a
std::future
, . , :
async([&] () -> B { return f(a).get(); }) == f(a)
, , f
, . , f
, ( ).
: m >>= mreturn == m
, :
async([&] () -> B { return mreturn(m.get()).get(); }) == m
mreturn(x).get()
, :
async([&] () -> B { return m.get(); }) == m
, m. , m.
: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
, , . m f, , m. g, f. f g m.
. - : function<future<int> (int)> f = [](int a){ cout << a << '\n'; return mreturn(a + 6); }; int a = (mreturn(5) >>= f).get(); cout << a;
, 5 11.
C++11 mreturn >>=. : n3721
mreturn
make_ready_future
.
>>=
, std::future
then
. , A
, future. , , future , then
, .
unwrap
future<future> future. join
Control.Monad
.
then
: future<int> f(shared_ptr<stream> str) { shared_ptr<vector<char>> buf = ...; return str->read(512, buf).then([](future<int> op) { return op.get() + 11; }); } future<void> g() { shared_ptr<stream> s = ...; return f(s).then([s](future<int> op) { s->close(); }); }
, , . resumable : n3722 . : future<int> f(stream str) resumable { shared_ptr<vector<char>> buf = ...; int count = await str.read(512, buf); return count + 11; } future<void> g() resumable { stream s = ...; int pls11 = await f(s); s.close(); }
resumable
, , , . await
тАУ ( <-
) do
. , str.read
f
future, await
int
, .
? , , : resumable
, , Fibers Windows boost::coroutine
. , . resumable
- , await
. , await
then
, await
. resumable
std::future
, then
get
. C++, , , , . std::future
.
, resumable
. , resumable
.
Monad. , .
template<typename A, typename B> Monad<B> operator>>=(Monad<A> ma, function<Monad<B> (A)> f) { ... // }
ma, f f.
template<typename A, typename B> Monad<B> operator>>(Monad<A> ma, Monad<B> mb) { return Ma >>= [=](A){ return mb; }; }
>>= , . ( m >> k = m >>= \_ -> k
), Haskell C++.
template<typename A> Monad <A> mreturn(A a) { ... // }
return C++, mreturn. , a
.
fail
, .
, C++, - . - Maybe
, ., std::future
. C++11. future T
, . , , - , , , , . future
get
.
template<class T> class future { public: ... T get(); // get ... };
C++11 тАУ std::async
. , std::future
. : future<int> result = async(f); // - f int a = result.get(); // f .
mreturn
>>=
std::future
#include <future> using namespace std; template<typename A> future<A> mreturn(const A& a) { return async([=]{ return a; }); }
, future , . , .
template<typename A, typename B> future<B> operator>>=(future<A>& ma, const function<future<B> (A)>& f) { return async([&] () -> B { return f(ma.get()).get(); }); }
, , ma, f, f.
, . 3 , : Left identity : return a >>= f == fa Right identity: m >>= return == m Associativity: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
C++, :
(mreturn(a) >>= f) == f(a)
, :
async([&] () -> B { return f(mreturn(a).get()).get(); }) == f(a)
, mreturn(a).get()
,
. a
std::future
, . , :
async([&] () -> B { return f(a).get(); }) == f(a)
, , f
, . , f
, ( ).
: m >>= mreturn == m
, :
async([&] () -> B { return mreturn(m.get()).get(); }) == m
mreturn(x).get()
, :
async([&] () -> B { return m.get(); }) == m
, m. , m.
: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
, , . m f, , m. g, f. f g m.
. - : function<future<int> (int)> f = [](int a){ cout << a << '\n'; return mreturn(a + 6); }; int a = (mreturn(5) >>= f).get(); cout << a;
, 5 11.
C++11 mreturn >>=. : n3721
mreturn
make_ready_future
.
>>=
, std::future
then
. , A
, future. , , future , then
, .
unwrap
future<future> future. join
Control.Monad
.
then
: future<int> f(shared_ptr<stream> str) { shared_ptr<vector<char>> buf = ...; return str->read(512, buf).then([](future<int> op) { return op.get() + 11; }); } future<void> g() { shared_ptr<stream> s = ...; return f(s).then([s](future<int> op) { s->close(); }); }
, , . resumable : n3722 . : future<int> f(stream str) resumable { shared_ptr<vector<char>> buf = ...; int count = await str.read(512, buf); return count + 11; } future<void> g() resumable { stream s = ...; int pls11 = await f(s); s.close(); }
resumable
, , , . await
тАУ ( <-
) do
. , str.read
f
future, await
int
, .
? , , : resumable
, , Fibers Windows boost::coroutine
. , . resumable
- , await
. , await
then
, await
. resumable
std::future
, then
get
. C++, , , , . std::future
.
, resumable
. , resumable
.
Monad. , .
template<typename A, typename B> Monad<B> operator>>=(Monad<A> ma, function<Monad<B> (A)> f) { ... // }
ma, f f.
template<typename A, typename B> Monad<B> operator>>(Monad<A> ma, Monad<B> mb) { return Ma >>= [=](A){ return mb; }; }
>>= , . ( m >> k = m >>= \_ -> k
), Haskell C++.
template<typename A> Monad <A> mreturn(A a) { ... // }
return C++, mreturn. , a
.
fail
, .
, C++, - . - Maybe
, ., std::future
. C++11. future T
, . , , - , , , , . future
get
.
template<class T> class future { public: ... T get(); // get ... };
C++11 тАУ std::async
. , std::future
. : future<int> result = async(f); // - f int a = result.get(); // f .
mreturn
>>=
std::future
#include <future> using namespace std; template<typename A> future<A> mreturn(const A& a) { return async([=]{ return a; }); }
, future , . , .
template<typename A, typename B> future<B> operator>>=(future<A>& ma, const function<future<B> (A)>& f) { return async([&] () -> B { return f(ma.get()).get(); }); }
, , ma, f, f.
, . 3 , : Left identity : return a >>= f == fa Right identity: m >>= return == m Associativity: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
C++, :
(mreturn(a) >>= f) == f(a)
, :
async([&] () -> B { return f(mreturn(a).get()).get(); }) == f(a)
, mreturn(a).get()
,
. a
std::future
, . , :
async([&] () -> B { return f(a).get(); }) == f(a)
, , f
, . , f
, ( ).
: m >>= mreturn == m
, :
async([&] () -> B { return mreturn(m.get()).get(); }) == m
mreturn(x).get()
, :
async([&] () -> B { return m.get(); }) == m
, m. , m.
: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
, , . m f, , m. g, f. f g m.
. - : function<future<int> (int)> f = [](int a){ cout << a << '\n'; return mreturn(a + 6); }; int a = (mreturn(5) >>= f).get(); cout << a;
, 5 11.
C++11 mreturn >>=. : n3721
mreturn
make_ready_future
.
>>=
, std::future
then
. , A
, future. , , future , then
, .
unwrap
future<future> future. join
Control.Monad
.
then
: future<int> f(shared_ptr<stream> str) { shared_ptr<vector<char>> buf = ...; return str->read(512, buf).then([](future<int> op) { return op.get() + 11; }); } future<void> g() { shared_ptr<stream> s = ...; return f(s).then([s](future<int> op) { s->close(); }); }
, , . resumable : n3722 . : future<int> f(stream str) resumable { shared_ptr<vector<char>> buf = ...; int count = await str.read(512, buf); return count + 11; } future<void> g() resumable { stream s = ...; int pls11 = await f(s); s.close(); }
resumable
, , , . await
тАУ ( <-
) do
. , str.read
f
future, await
int
, .
? , , : resumable
, , Fibers Windows boost::coroutine
. , . resumable
- , await
. , await
then
, await
. resumable
std::future
, then
get
. C++, , , , . std::future
.
, resumable
. , resumable
.
Monad. , .
template<typename A, typename B> Monad<B> operator>>=(Monad<A> ma, function<Monad<B> (A)> f) { ... // }
ma, f f.
template<typename A, typename B> Monad<B> operator>>(Monad<A> ma, Monad<B> mb) { return Ma >>= [=](A){ return mb; }; }
>>= , . ( m >> k = m >>= \_ -> k
), Haskell C++.
template<typename A> Monad <A> mreturn(A a) { ... // }
return C++, mreturn. , a
.
fail
, .
, C++, - . - Maybe
, ., std::future
. C++11. future T
, . , , - , , , , . future
get
.
template<class T> class future { public: ... T get(); // get ... };
C++11 тАУ std::async
. , std::future
. : future<int> result = async(f); // - f int a = result.get(); // f .
mreturn
>>=
std::future
#include <future> using namespace std; template<typename A> future<A> mreturn(const A& a) { return async([=]{ return a; }); }
, future , . , .
template<typename A, typename B> future<B> operator>>=(future<A>& ma, const function<future<B> (A)>& f) { return async([&] () -> B { return f(ma.get()).get(); }); }
, , ma, f, f.
, . 3 , : Left identity : return a >>= f == fa Right identity: m >>= return == m Associativity: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
C++, :
(mreturn(a) >>= f) == f(a) , :
async([&] () -> B { return f(mreturn(a).get()).get(); }) == f(a)
, mreturn(a).get()
,
. a
std::future
, . , :
async([&] () -> B { return f(a).get(); }) == f(a)
, , f
, . , f
, ( ).
: m >>= mreturn == m
, :
async([&] () -> B { return mreturn(m.get()).get(); }) == m
mreturn(x).get()
, :
async([&] () -> B { return m.get(); }) == m
, m. , m.
: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
, , . m f, , m. g, f. f g m.
. - : function<future<int> (int)> f = [](int a){ cout << a << '\n'; return mreturn(a + 6); }; int a = (mreturn(5) >>= f).get(); cout << a;
, 5 11.
C++11 mreturn >>=. : n3721
mreturn
make_ready_future
.
>>=
, std::future
then
. , A
, future. , , future , then
, .
unwrap
future<future> future. join
Control.Monad
.
then
: future<int> f(shared_ptr<stream> str) { shared_ptr<vector<char>> buf = ...; return str->read(512, buf).then([](future<int> op) { return op.get() + 11; }); } future<void> g() { shared_ptr<stream> s = ...; return f(s).then([s](future<int> op) { s->close(); }); }
, , . resumable : n3722 . : future<int> f(stream str) resumable { shared_ptr<vector<char>> buf = ...; int count = await str.read(512, buf); return count + 11; } future<void> g() resumable { stream s = ...; int pls11 = await f(s); s.close(); }
resumable
, , , . await
тАУ ( <-
) do
. , str.read
f
future, await
int
, .
? , , : resumable
, , Fibers Windows boost::coroutine
. , . resumable
- , await
. , await
then
, await
. resumable
std::future
, then
get
. C++, , , , . std::future
.
, resumable
. , resumable
.
Monad. , .
template<typename A, typename B> Monad<B> operator>>=(Monad<A> ma, function<Monad<B> (A)> f) { ... // }
ma, f f.
template<typename A, typename B> Monad<B> operator>>(Monad<A> ma, Monad<B> mb) { return Ma >>= [=](A){ return mb; }; }
>>= , . ( m >> k = m >>= \_ -> k
), Haskell C++.
template<typename A> Monad <A> mreturn(A a) { ... // }
return C++, mreturn. , a
.
fail
, .
, C++, - . - Maybe
, ., std::future
. C++11. future T
, . , , - , , , , . future
get
.
template<class T> class future { public: ... T get(); // get ... };
C++11 тАУ std::async
. , std::future
. : future<int> result = async(f); // - f int a = result.get(); // f .
mreturn
>>=
std::future
#include <future> using namespace std; template<typename A> future<A> mreturn(const A& a) { return async([=]{ return a; }); }
, future , . , .
template<typename A, typename B> future<B> operator>>=(future<A>& ma, const function<future<B> (A)>& f) { return async([&] () -> B { return f(ma.get()).get(); }); }
, , ma, f, f.
, . 3 , : Left identity : return a >>= f == fa Right identity: m >>= return == m Associativity: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
C++, :
(mreturn(a) >>= f) == f(a)
, :
async([&] () -> B { return f(mreturn(a).get()).get(); }) == f(a)
, mreturn(a).get()
,
. a
std::future
, . , :
async([&] () -> B { return f(a).get(); }) == f(a)
, , f
, . , f
, ( ).
: m >>= mreturn == m
, :
async([&] () -> B { return mreturn(m.get()).get(); }) == m
mreturn(x).get()
, :
async([&] () -> B { return m.get(); }) == m
, m. , m.
: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
, , . m f, , m. g, f. f g m.
. - : function<future<int> (int)> f = [](int a){ cout << a << '\n'; return mreturn(a + 6); }; int a = (mreturn(5) >>= f).get(); cout << a;
, 5 11.
C++11 mreturn >>=. : n3721
mreturn
make_ready_future
.
>>=
, std::future
then
. , A
, future. , , future , then
, .
unwrap
future<future> future. join
Control.Monad
.
then
: future<int> f(shared_ptr<stream> str) { shared_ptr<vector<char>> buf = ...; return str->read(512, buf).then([](future<int> op) { return op.get() + 11; }); } future<void> g() { shared_ptr<stream> s = ...; return f(s).then([s](future<int> op) { s->close(); }); }
, , . resumable : n3722 . : future<int> f(stream str) resumable { shared_ptr<vector<char>> buf = ...; int count = await str.read(512, buf); return count + 11; } future<void> g() resumable { stream s = ...; int pls11 = await f(s); s.close(); }
resumable
, , , . await
тАУ ( <-
) do
. , str.read
f
future, await
int
, .
? , , : resumable
, , Fibers Windows boost::coroutine
. , . resumable
- , await
. , await
then
, await
. resumable
std::future
, then
get
. C++, , , , . std::future
.
, resumable
. , resumable
.
Monad. , .
template<typename A, typename B> Monad<B> operator>>=(Monad<A> ma, function<Monad<B> (A)> f) { ... // }
ma, f f.
template<typename A, typename B> Monad<B> operator>>(Monad<A> ma, Monad<B> mb) { return Ma >>= [=](A){ return mb; }; }
>>= , . ( m >> k = m >>= \_ -> k
), Haskell C++.
template<typename A> Monad <A> mreturn(A a) { ... // }
return C++, mreturn. , a
.
fail
, .
, C++, - . - Maybe
, ., std::future
. C++11. future T
, . , , - , , , , . future
get
.
template<class T> class future { public: ... T get(); // get ... };
C++11 тАУ std::async
. , std::future
. : future<int> result = async(f); // - f int a = result.get(); // f .
mreturn
>>=
std::future
#include <future> using namespace std; template<typename A> future<A> mreturn(const A& a) { return async([=]{ return a; }); }
, future , . , .
template<typename A, typename B> future<B> operator>>=(future<A>& ma, const function<future<B> (A)>& f) { return async([&] () -> B { return f(ma.get()).get(); }); }
, , ma, f, f.
, . 3 , : Left identity : return a >>= f == fa Right identity: m >>= return == m Associativity: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
C++, :
(mreturn(a) >>= f) == f(a)
, :
async([&] () -> B { return f(mreturn(a).get()).get(); }) == f(a) , mreturn(a).get()
,
. a
std::future
, . , :
async([&] () -> B { return f(a).get(); }) == f(a)
, , f
, . , f
, ( ).
: m >>= mreturn == m
, :
async([&] () -> B { return mreturn(m.get()).get(); }) == m
mreturn(x).get()
, :
async([&] () -> B { return m.get(); }) == m
, m. , m.
: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
, , . m f, , m. g, f. f g m.
. - : function<future<int> (int)> f = [](int a){ cout << a << '\n'; return mreturn(a + 6); }; int a = (mreturn(5) >>= f).get(); cout << a;
, 5 11.
C++11 mreturn >>=. : n3721
mreturn
make_ready_future
.
>>=
, std::future
then
. , A
, future. , , future , then
, .
unwrap
future<future> future. join
Control.Monad
.
then
: future<int> f(shared_ptr<stream> str) { shared_ptr<vector<char>> buf = ...; return str->read(512, buf).then([](future<int> op) { return op.get() + 11; }); } future<void> g() { shared_ptr<stream> s = ...; return f(s).then([s](future<int> op) { s->close(); }); }
, , . resumable : n3722 . : future<int> f(stream str) resumable { shared_ptr<vector<char>> buf = ...; int count = await str.read(512, buf); return count + 11; } future<void> g() resumable { stream s = ...; int pls11 = await f(s); s.close(); }
resumable
, , , . await
тАУ ( <-
) do
. , str.read
f
future, await
int
, .
? , , : resumable
, , Fibers Windows boost::coroutine
. , . resumable
- , await
. , await
then
, await
. resumable
std::future
, then
get
. C++, , , , . std::future
.
, resumable
. , resumable
.
Monad. , .
template<typename A, typename B> Monad<B> operator>>=(Monad<A> ma, function<Monad<B> (A)> f) { ... // }
ma, f f.
template<typename A, typename B> Monad<B> operator>>(Monad<A> ma, Monad<B> mb) { return Ma >>= [=](A){ return mb; }; }
>>= , . ( m >> k = m >>= \_ -> k
), Haskell C++.
template<typename A> Monad <A> mreturn(A a) { ... // }
return C++, mreturn. , a
.
fail
, .
, C++, - . - Maybe
, ., std::future
. C++11. future T
, . , , - , , , , . future
get
.
template<class T> class future { public: ... T get(); // get ... };
C++11 тАУ std::async
. , std::future
. : future<int> result = async(f); // - f int a = result.get(); // f .
mreturn
>>=
std::future
#include <future> using namespace std; template<typename A> future<A> mreturn(const A& a) { return async([=]{ return a; }); }
, future , . , .
template<typename A, typename B> future<B> operator>>=(future<A>& ma, const function<future<B> (A)>& f) { return async([&] () -> B { return f(ma.get()).get(); }); }
, , ma, f, f.
, . 3 , : Left identity : return a >>= f == fa Right identity: m >>= return == m Associativity: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
C++, :
(mreturn(a) >>= f) == f(a)
, :
async([&] () -> B { return f(mreturn(a).get()).get(); }) == f(a)
, mreturn(a).get()
,
. a
std::future
, . , :
async([&] () -> B { return f(a).get(); }) == f(a)
, , f
, . , f
, ( ).
: m >>= mreturn == m
, :
async([&] () -> B { return mreturn(m.get()).get(); }) == m
mreturn(x).get()
, :
async([&] () -> B { return m.get(); }) == m
, m. , m.
: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
, , . m f, , m. g, f. f g m.
. - : function<future<int> (int)> f = [](int a){ cout << a << '\n'; return mreturn(a + 6); }; int a = (mreturn(5) >>= f).get(); cout << a;
, 5 11.
C++11 mreturn >>=. : n3721
mreturn
make_ready_future
.
>>=
, std::future
then
. , A
, future. , , future , then
, .
unwrap
future<future> future. join
Control.Monad
.
then
: future<int> f(shared_ptr<stream> str) { shared_ptr<vector<char>> buf = ...; return str->read(512, buf).then([](future<int> op) { return op.get() + 11; }); } future<void> g() { shared_ptr<stream> s = ...; return f(s).then([s](future<int> op) { s->close(); }); }
, , . resumable : n3722 . : future<int> f(stream str) resumable { shared_ptr<vector<char>> buf = ...; int count = await str.read(512, buf); return count + 11; } future<void> g() resumable { stream s = ...; int pls11 = await f(s); s.close(); }
resumable
, , , . await
тАУ ( <-
) do
. , str.read
f
future, await
int
, .
? , , : resumable
, , Fibers Windows boost::coroutine
. , . resumable
- , await
. , await
then
, await
. resumable
std::future
, then
get
. C++, , , , . std::future
.
, resumable
. , resumable
.
Monad. , .
template<typename A, typename B> Monad<B> operator>>=(Monad<A> ma, function<Monad<B> (A)> f) { ... // }
ma, f f.
template<typename A, typename B> Monad<B> operator>>(Monad<A> ma, Monad<B> mb) { return Ma >>= [=](A){ return mb; }; }
>>= , . ( m >> k = m >>= \_ -> k
), Haskell C++.
template<typename A> Monad <A> mreturn(A a) { ... // }
return C++, mreturn. , a
.
fail
, .
, C++, - . - Maybe
, ., std::future
. C++11. future T
, . , , - , , , , . future
get
.
template<class T> class future { public: ... T get(); // get ... };
C++11 тАУ std::async
. , std::future
. : future<int> result = async(f); // - f int a = result.get(); // f .
mreturn
>>=
std::future
#include <future> using namespace std; template<typename A> future<A> mreturn(const A& a) { return async([=]{ return a; }); }
, future , . , .
template<typename A, typename B> future<B> operator>>=(future<A>& ma, const function<future<B> (A)>& f) { return async([&] () -> B { return f(ma.get()).get(); }); }
, , ma, f, f.
, . 3 , : Left identity : return a >>= f == fa Right identity: m >>= return == m Associativity: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
C++, :
(mreturn(a) >>= f) == f(a)
, :
async([&] () -> B { return f(mreturn(a).get()).get(); }) == f(a)
, mreturn(a).get()
,
. a
std::future
, . , :
async([&] () -> B { return f(a).get(); }) == f(a) , , f
, . , f
, ( ).
: m >>= mreturn == m
, :
async([&] () -> B { return mreturn(m.get()).get(); }) == m
mreturn(x).get()
, :
async([&] () -> B { return m.get(); }) == m
, m. , m.
: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
, , . m f, , m. g, f. f g m.
. - : function<future<int> (int)> f = [](int a){ cout << a << '\n'; return mreturn(a + 6); }; int a = (mreturn(5) >>= f).get(); cout << a;
, 5 11.
C++11 mreturn >>=. : n3721
mreturn
make_ready_future
.
>>=
, std::future
then
. , A
, future. , , future , then
, .
unwrap
future<future> future. join
Control.Monad
.
then
: future<int> f(shared_ptr<stream> str) { shared_ptr<vector<char>> buf = ...; return str->read(512, buf).then([](future<int> op) { return op.get() + 11; }); } future<void> g() { shared_ptr<stream> s = ...; return f(s).then([s](future<int> op) { s->close(); }); }
, , . resumable : n3722 . : future<int> f(stream str) resumable { shared_ptr<vector<char>> buf = ...; int count = await str.read(512, buf); return count + 11; } future<void> g() resumable { stream s = ...; int pls11 = await f(s); s.close(); }
resumable
, , , . await
тАУ ( <-
) do
. , str.read
f
future, await
int
, .
? , , : resumable
, , Fibers Windows boost::coroutine
. , . resumable
- , await
. , await
then
, await
. resumable
std::future
, then
get
. C++, , , , . std::future
.
, resumable
. , resumable
.
Monad. , .
template<typename A, typename B> Monad<B> operator>>=(Monad<A> ma, function<Monad<B> (A)> f) { ... // }
ma, f f.
template<typename A, typename B> Monad<B> operator>>(Monad<A> ma, Monad<B> mb) { return Ma >>= [=](A){ return mb; }; }
>>= , . ( m >> k = m >>= \_ -> k
), Haskell C++.
template<typename A> Monad <A> mreturn(A a) { ... // }
return C++, mreturn. , a
.
fail
, .
, C++, - . - Maybe
, ., std::future
. C++11. future T
, . , , - , , , , . future
get
.
template<class T> class future { public: ... T get(); // get ... };
C++11 тАУ std::async
. , std::future
. : future<int> result = async(f); // - f int a = result.get(); // f .
mreturn
>>=
std::future
#include <future> using namespace std; template<typename A> future<A> mreturn(const A& a) { return async([=]{ return a; }); }
, future , . , .
template<typename A, typename B> future<B> operator>>=(future<A>& ma, const function<future<B> (A)>& f) { return async([&] () -> B { return f(ma.get()).get(); }); }
, , ma, f, f.
, . 3 , : Left identity : return a >>= f == fa Right identity: m >>= return == m Associativity: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
C++, :
(mreturn(a) >>= f) == f(a)
, :
async([&] () -> B { return f(mreturn(a).get()).get(); }) == f(a)
, mreturn(a).get()
,
. a
std::future
, . , :
async([&] () -> B { return f(a).get(); }) == f(a)
, , f
, . , f
, ( ).
: m >>= mreturn == m
, :
async([&] () -> B { return mreturn(m.get()).get(); }) == m
mreturn(x).get()
, :
async([&] () -> B { return m.get(); }) == m
, m. , m.
: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
, , . m f, , m. g, f. f g m.
. - : function<future<int> (int)> f = [](int a){ cout << a << '\n'; return mreturn(a + 6); }; int a = (mreturn(5) >>= f).get(); cout << a;
, 5 11.
C++11 mreturn >>=. : n3721
mreturn
make_ready_future
.
>>=
, std::future
then
. , A
, future. , , future , then
, .
unwrap
future<future> future. join
Control.Monad
.
then
: future<int> f(shared_ptr<stream> str) { shared_ptr<vector<char>> buf = ...; return str->read(512, buf).then([](future<int> op) { return op.get() + 11; }); } future<void> g() { shared_ptr<stream> s = ...; return f(s).then([s](future<int> op) { s->close(); }); }
, , . resumable : n3722 . : future<int> f(stream str) resumable { shared_ptr<vector<char>> buf = ...; int count = await str.read(512, buf); return count + 11; } future<void> g() resumable { stream s = ...; int pls11 = await f(s); s.close(); }
resumable
, , , . await
тАУ ( <-
) do
. , str.read
f
future, await
int
, .
? , , : resumable
, , Fibers Windows boost::coroutine
. , . resumable
- , await
. , await
then
, await
. resumable
std::future
, then
get
. C++, , , , . std::future
.
, resumable
. , resumable
.
Monad. , .
template<typename A, typename B> Monad<B> operator>>=(Monad<A> ma, function<Monad<B> (A)> f) { ... // }
ma, f f.
template<typename A, typename B> Monad<B> operator>>(Monad<A> ma, Monad<B> mb) { return Ma >>= [=](A){ return mb; }; }
>>= , . ( m >> k = m >>= \_ -> k
), Haskell C++.
template<typename A> Monad <A> mreturn(A a) { ... // }
return C++, mreturn. , a
.
fail
, .
, C++, - . - Maybe
, ., std::future
. C++11. future T
, . , , - , , , , . future
get
.
template<class T> class future { public: ... T get(); // get ... };
C++11 тАУ std::async
. , std::future
. : future<int> result = async(f); // - f int a = result.get(); // f .
mreturn
>>=
std::future
#include <future> using namespace std; template<typename A> future<A> mreturn(const A& a) { return async([=]{ return a; }); }
, future , . , .
template<typename A, typename B> future<B> operator>>=(future<A>& ma, const function<future<B> (A)>& f) { return async([&] () -> B { return f(ma.get()).get(); }); }
, , ma, f, f.
, . 3 , : Left identity : return a >>= f == fa Right identity: m >>= return == m Associativity: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
C++, :
(mreturn(a) >>= f) == f(a)
, :
async([&] () -> B { return f(mreturn(a).get()).get(); }) == f(a)
, mreturn(a).get()
,
. a
std::future
, . , :
async([&] () -> B { return f(a).get(); }) == f(a)
, , f
, . , f
, ( ).
: m >>= mreturn == m , :
async([&] () -> B { return mreturn(m.get()).get(); }) == m
mreturn(x).get()
, :
async([&] () -> B { return m.get(); }) == m
, m. , m.
: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
, , . m f, , m. g, f. f g m.
. - : function<future<int> (int)> f = [](int a){ cout << a << '\n'; return mreturn(a + 6); }; int a = (mreturn(5) >>= f).get(); cout << a;
, 5 11.
C++11 mreturn >>=. : n3721
mreturn
make_ready_future
.
>>=
, std::future
then
. , A
, future. , , future , then
, .
unwrap
future<future> future. join
Control.Monad
.
then
: future<int> f(shared_ptr<stream> str) { shared_ptr<vector<char>> buf = ...; return str->read(512, buf).then([](future<int> op) { return op.get() + 11; }); } future<void> g() { shared_ptr<stream> s = ...; return f(s).then([s](future<int> op) { s->close(); }); }
, , . resumable : n3722 . : future<int> f(stream str) resumable { shared_ptr<vector<char>> buf = ...; int count = await str.read(512, buf); return count + 11; } future<void> g() resumable { stream s = ...; int pls11 = await f(s); s.close(); }
resumable
, , , . await
тАУ ( <-
) do
. , str.read
f
future, await
int
, .
? , , : resumable
, , Fibers Windows boost::coroutine
. , . resumable
- , await
. , await
then
, await
. resumable
std::future
, then
get
. C++, , , , . std::future
.
, resumable
. , resumable
.
Monad. , .
template<typename A, typename B> Monad<B> operator>>=(Monad<A> ma, function<Monad<B> (A)> f) { ... // }
ma, f f.
template<typename A, typename B> Monad<B> operator>>(Monad<A> ma, Monad<B> mb) { return Ma >>= [=](A){ return mb; }; }
>>= , . ( m >> k = m >>= \_ -> k
), Haskell C++.
template<typename A> Monad <A> mreturn(A a) { ... // }
return C++, mreturn. , a
.
fail
, .
, C++, - . - Maybe
, ., std::future
. C++11. future T
, . , , - , , , , . future
get
.
template<class T> class future { public: ... T get(); // get ... };
C++11 тАУ std::async
. , std::future
. : future<int> result = async(f); // - f int a = result.get(); // f .
mreturn
>>=
std::future
#include <future> using namespace std; template<typename A> future<A> mreturn(const A& a) { return async([=]{ return a; }); }
, future , . , .
template<typename A, typename B> future<B> operator>>=(future<A>& ma, const function<future<B> (A)>& f) { return async([&] () -> B { return f(ma.get()).get(); }); }
, , ma, f, f.
, . 3 , : Left identity : return a >>= f == fa Right identity: m >>= return == m Associativity: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
C++, :
(mreturn(a) >>= f) == f(a)
, :
async([&] () -> B { return f(mreturn(a).get()).get(); }) == f(a)
, mreturn(a).get()
,
. a
std::future
, . , :
async([&] () -> B { return f(a).get(); }) == f(a)
, , f
, . , f
, ( ).
: m >>= mreturn == m
, :
async([&] () -> B { return mreturn(m.get()).get(); }) == m
mreturn(x).get()
, :
async([&] () -> B { return m.get(); }) == m
, m. , m.
: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
, , . m f, , m. g, f. f g m.
. - : function<future<int> (int)> f = [](int a){ cout << a << '\n'; return mreturn(a + 6); }; int a = (mreturn(5) >>= f).get(); cout << a;
, 5 11.
C++11 mreturn >>=. : n3721
mreturn
make_ready_future
.
>>=
, std::future
then
. , A
, future. , , future , then
, .
unwrap
future<future> future. join
Control.Monad
.
then
: future<int> f(shared_ptr<stream> str) { shared_ptr<vector<char>> buf = ...; return str->read(512, buf).then([](future<int> op) { return op.get() + 11; }); } future<void> g() { shared_ptr<stream> s = ...; return f(s).then([s](future<int> op) { s->close(); }); }
, , . resumable : n3722 . : future<int> f(stream str) resumable { shared_ptr<vector<char>> buf = ...; int count = await str.read(512, buf); return count + 11; } future<void> g() resumable { stream s = ...; int pls11 = await f(s); s.close(); }
resumable
, , , . await
тАУ ( <-
) do
. , str.read
f
future, await
int
, .
? , , : resumable
, , Fibers Windows boost::coroutine
. , . resumable
- , await
. , await
then
, await
. resumable
std::future
, then
get
. C++, , , , . std::future
.
, resumable
. , resumable
.
Monad. , .
template<typename A, typename B> Monad<B> operator>>=(Monad<A> ma, function<Monad<B> (A)> f) { ... // }
ma, f f.
template<typename A, typename B> Monad<B> operator>>(Monad<A> ma, Monad<B> mb) { return Ma >>= [=](A){ return mb; }; }
>>= , . ( m >> k = m >>= \_ -> k
), Haskell C++.
template<typename A> Monad <A> mreturn(A a) { ... // }
return C++, mreturn. , a
.
fail
, .
, C++, - . - Maybe
, ., std::future
. C++11. future T
, . , , - , , , , . future
get
.
template<class T> class future { public: ... T get(); // get ... };
C++11 тАУ std::async
. , std::future
. : future<int> result = async(f); // - f int a = result.get(); // f .
mreturn
>>=
std::future
#include <future> using namespace std; template<typename A> future<A> mreturn(const A& a) { return async([=]{ return a; }); }
, future , . , .
template<typename A, typename B> future<B> operator>>=(future<A>& ma, const function<future<B> (A)>& f) { return async([&] () -> B { return f(ma.get()).get(); }); }
, , ma, f, f.
, . 3 , : Left identity : return a >>= f == fa Right identity: m >>= return == m Associativity: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
C++, :
(mreturn(a) >>= f) == f(a)
, :
async([&] () -> B { return f(mreturn(a).get()).get(); }) == f(a)
, mreturn(a).get()
,
. a
std::future
, . , :
async([&] () -> B { return f(a).get(); }) == f(a)
, , f
, . , f
, ( ).
: m >>= mreturn == m
, :
async([&] () -> B { return mreturn(m.get()).get(); }) == m mreturn(x).get()
, :
async([&] () -> B { return m.get(); }) == m
, m. , m.
: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
, , . m f, , m. g, f. f g m.
. - : function<future<int> (int)> f = [](int a){ cout << a << '\n'; return mreturn(a + 6); }; int a = (mreturn(5) >>= f).get(); cout << a;
, 5 11.
C++11 mreturn >>=. : n3721
mreturn
make_ready_future
.
>>=
, std::future
then
. , A
, future. , , future , then
, .
unwrap
future<future> future. join
Control.Monad
.
then
: future<int> f(shared_ptr<stream> str) { shared_ptr<vector<char>> buf = ...; return str->read(512, buf).then([](future<int> op) { return op.get() + 11; }); } future<void> g() { shared_ptr<stream> s = ...; return f(s).then([s](future<int> op) { s->close(); }); }
, , . resumable : n3722 . : future<int> f(stream str) resumable { shared_ptr<vector<char>> buf = ...; int count = await str.read(512, buf); return count + 11; } future<void> g() resumable { stream s = ...; int pls11 = await f(s); s.close(); }
resumable
, , , . await
тАУ ( <-
) do
. , str.read
f
future, await
int
, .
? , , : resumable
, , Fibers Windows boost::coroutine
. , . resumable
- , await
. , await
then
, await
. resumable
std::future
, then
get
. C++, , , , . std::future
.
, resumable
. , resumable
.
Monad. , .
template<typename A, typename B> Monad<B> operator>>=(Monad<A> ma, function<Monad<B> (A)> f) { ... // }
ma, f f.
template<typename A, typename B> Monad<B> operator>>(Monad<A> ma, Monad<B> mb) { return Ma >>= [=](A){ return mb; }; }
>>= , . ( m >> k = m >>= \_ -> k
), Haskell C++.
template<typename A> Monad <A> mreturn(A a) { ... // }
return C++, mreturn. , a
.
fail
, .
, C++, - . - Maybe
, ., std::future
. C++11. future T
, . , , - , , , , . future
get
.
template<class T> class future { public: ... T get(); // get ... };
C++11 тАУ std::async
. , std::future
. : future<int> result = async(f); // - f int a = result.get(); // f .
mreturn
>>=
std::future
#include <future> using namespace std; template<typename A> future<A> mreturn(const A& a) { return async([=]{ return a; }); }
, future , . , .
template<typename A, typename B> future<B> operator>>=(future<A>& ma, const function<future<B> (A)>& f) { return async([&] () -> B { return f(ma.get()).get(); }); }
, , ma, f, f.
, . 3 , : Left identity : return a >>= f == fa Right identity: m >>= return == m Associativity: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
C++, :
(mreturn(a) >>= f) == f(a)
, :
async([&] () -> B { return f(mreturn(a).get()).get(); }) == f(a)
, mreturn(a).get()
,
. a
std::future
, . , :
async([&] () -> B { return f(a).get(); }) == f(a)
, , f
, . , f
, ( ).
: m >>= mreturn == m
, :
async([&] () -> B { return mreturn(m.get()).get(); }) == m
mreturn(x).get()
, :
async([&] () -> B { return m.get(); }) == m
, m. , m.
: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
, , . m f, , m. g, f. f g m.
. - : function<future<int> (int)> f = [](int a){ cout << a << '\n'; return mreturn(a + 6); }; int a = (mreturn(5) >>= f).get(); cout << a;
, 5 11.
C++11 mreturn >>=. : n3721
mreturn
make_ready_future
.
>>=
, std::future
then
. , A
, future. , , future , then
, .
unwrap
future<future> future. join
Control.Monad
.
then
: future<int> f(shared_ptr<stream> str) { shared_ptr<vector<char>> buf = ...; return str->read(512, buf).then([](future<int> op) { return op.get() + 11; }); } future<void> g() { shared_ptr<stream> s = ...; return f(s).then([s](future<int> op) { s->close(); }); }
, , . resumable : n3722 . : future<int> f(stream str) resumable { shared_ptr<vector<char>> buf = ...; int count = await str.read(512, buf); return count + 11; } future<void> g() resumable { stream s = ...; int pls11 = await f(s); s.close(); }
resumable
, , , . await
тАУ ( <-
) do
. , str.read
f
future, await
int
, .
? , , : resumable
, , Fibers Windows boost::coroutine
. , . resumable
- , await
. , await
then
, await
. resumable
std::future
, then
get
. C++, , , , . std::future
.
, resumable
. , resumable
.
Monad. , .
template<typename A, typename B> Monad<B> operator>>=(Monad<A> ma, function<Monad<B> (A)> f) { ... // }
ma, f f.
template<typename A, typename B> Monad<B> operator>>(Monad<A> ma, Monad<B> mb) { return Ma >>= [=](A){ return mb; }; }
>>= , . ( m >> k = m >>= \_ -> k
), Haskell C++.
template<typename A> Monad <A> mreturn(A a) { ... // }
return C++, mreturn. , a
.
fail
, .
, C++, - . - Maybe
, ., std::future
. C++11. future T
, . , , - , , , , . future
get
.
template<class T> class future { public: ... T get(); // get ... };
C++11 тАУ std::async
. , std::future
. : future<int> result = async(f); // - f int a = result.get(); // f .
mreturn
>>=
std::future
#include <future> using namespace std; template<typename A> future<A> mreturn(const A& a) { return async([=]{ return a; }); }
, future , . , .
template<typename A, typename B> future<B> operator>>=(future<A>& ma, const function<future<B> (A)>& f) { return async([&] () -> B { return f(ma.get()).get(); }); }
, , ma, f, f.
, . 3 , : Left identity : return a >>= f == fa Right identity: m >>= return == m Associativity: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
C++, :
(mreturn(a) >>= f) == f(a)
, :
async([&] () -> B { return f(mreturn(a).get()).get(); }) == f(a)
, mreturn(a).get()
,
. a
std::future
, . , :
async([&] () -> B { return f(a).get(); }) == f(a)
, , f
, . , f
, ( ).
: m >>= mreturn == m
, :
async([&] () -> B { return mreturn(m.get()).get(); }) == m
mreturn(x).get()
, :
async([&] () -> B { return m.get(); }) == m , m. , m.
: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
, , . m f, , m. g, f. f g m.
. - : function<future<int> (int)> f = [](int a){ cout << a << '\n'; return mreturn(a + 6); }; int a = (mreturn(5) >>= f).get(); cout << a;
, 5 11.
C++11 mreturn >>=. : n3721
mreturn
make_ready_future
.
>>=
, std::future
then
. , A
, future. , , future , then
, .
unwrap
future<future> future. join
Control.Monad
.
then
: future<int> f(shared_ptr<stream> str) { shared_ptr<vector<char>> buf = ...; return str->read(512, buf).then([](future<int> op) { return op.get() + 11; }); } future<void> g() { shared_ptr<stream> s = ...; return f(s).then([s](future<int> op) { s->close(); }); }
, , . resumable : n3722 . : future<int> f(stream str) resumable { shared_ptr<vector<char>> buf = ...; int count = await str.read(512, buf); return count + 11; } future<void> g() resumable { stream s = ...; int pls11 = await f(s); s.close(); }
resumable
, , , . await
тАУ ( <-
) do
. , str.read
f
future, await
int
, .
? , , : resumable
, , Fibers Windows boost::coroutine
. , . resumable
- , await
. , await
then
, await
. resumable
std::future
, then
get
. C++, , , , . std::future
.
, resumable
. , resumable
.
Monad. , .
template<typename A, typename B> Monad<B> operator>>=(Monad<A> ma, function<Monad<B> (A)> f) { ... // }
ma, f f.
template<typename A, typename B> Monad<B> operator>>(Monad<A> ma, Monad<B> mb) { return Ma >>= [=](A){ return mb; }; }
>>= , . ( m >> k = m >>= \_ -> k
), Haskell C++.
template<typename A> Monad <A> mreturn(A a) { ... // }
return C++, mreturn. , a
.
fail
, .
, C++, - . - Maybe
, ., std::future
. C++11. future T
, . , , - , , , , . future
get
.
template<class T> class future { public: ... T get(); // get ... };
C++11 тАУ std::async
. , std::future
. : future<int> result = async(f); // - f int a = result.get(); // f .
mreturn
>>=
std::future
#include <future> using namespace std; template<typename A> future<A> mreturn(const A& a) { return async([=]{ return a; }); }
, future , . , .
template<typename A, typename B> future<B> operator>>=(future<A>& ma, const function<future<B> (A)>& f) { return async([&] () -> B { return f(ma.get()).get(); }); }
, , ma, f, f.
, . 3 , : Left identity : return a >>= f == fa Right identity: m >>= return == m Associativity: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
C++, :
(mreturn(a) >>= f) == f(a)
, :
async([&] () -> B { return f(mreturn(a).get()).get(); }) == f(a)
, mreturn(a).get()
,
. a
std::future
, . , :
async([&] () -> B { return f(a).get(); }) == f(a)
, , f
, . , f
, ( ).
: m >>= mreturn == m
, :
async([&] () -> B { return mreturn(m.get()).get(); }) == m
mreturn(x).get()
, :
async([&] () -> B { return m.get(); }) == m
, m. , m.
: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
, , . m f, , m. g, f. f g m.
. - : function<future<int> (int)> f = [](int a){ cout << a << '\n'; return mreturn(a + 6); }; int a = (mreturn(5) >>= f).get(); cout << a;
, 5 11.
C++11 mreturn >>=. : n3721
mreturn
make_ready_future
.
>>=
, std::future
then
. , A
, future. , , future , then
, .
unwrap
future<future> future. join
Control.Monad
.
then
: future<int> f(shared_ptr<stream> str) { shared_ptr<vector<char>> buf = ...; return str->read(512, buf).then([](future<int> op) { return op.get() + 11; }); } future<void> g() { shared_ptr<stream> s = ...; return f(s).then([s](future<int> op) { s->close(); }); }
, , . resumable : n3722 . : future<int> f(stream str) resumable { shared_ptr<vector<char>> buf = ...; int count = await str.read(512, buf); return count + 11; } future<void> g() resumable { stream s = ...; int pls11 = await f(s); s.close(); }
resumable
, , , . await
тАУ ( <-
) do
. , str.read
f
future, await
int
, .
? , , : resumable
, , Fibers Windows boost::coroutine
. , . resumable
- , await
. , await
then
, await
. resumable
std::future
, then
get
. C++, , , , . std::future
.
, resumable
. , resumable
.
Monad. , .
template<typename A, typename B> Monad<B> operator>>=(Monad<A> ma, function<Monad<B> (A)> f) { ... // }
ma, f f.
template<typename A, typename B> Monad<B> operator>>(Monad<A> ma, Monad<B> mb) { return Ma >>= [=](A){ return mb; }; }
>>= , . ( m >> k = m >>= \_ -> k
), Haskell C++.
template<typename A> Monad <A> mreturn(A a) { ... // }
return C++, mreturn. , a
.
fail
, .
, C++, - . - Maybe
, ., std::future
. C++11. future T
, . , , - , , , , . future
get
.
template<class T> class future { public: ... T get(); // get ... };
C++11 тАУ std::async
. , std::future
. : future<int> result = async(f); // - f int a = result.get(); // f .
mreturn
>>=
std::future
#include <future> using namespace std; template<typename A> future<A> mreturn(const A& a) { return async([=]{ return a; }); }
, future , . , .
template<typename A, typename B> future<B> operator>>=(future<A>& ma, const function<future<B> (A)>& f) { return async([&] () -> B { return f(ma.get()).get(); }); }
, , ma, f, f.
, . 3 , : Left identity : return a >>= f == fa Right identity: m >>= return == m Associativity: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
C++, :
(mreturn(a) >>= f) == f(a)
, :
async([&] () -> B { return f(mreturn(a).get()).get(); }) == f(a)
, mreturn(a).get()
,
. a
std::future
, . , :
async([&] () -> B { return f(a).get(); }) == f(a)
, , f
, . , f
, ( ).
: m >>= mreturn == m
, :
async([&] () -> B { return mreturn(m.get()).get(); }) == m
mreturn(x).get()
, :
async([&] () -> B { return m.get(); }) == m
, m. , m.
: (m >>= f) >>= g == m >>= (\x -> fx >>= g) , , . m f, , m. g, f. f g m.
. - : function<future<int> (int)> f = [](int a){ cout << a << '\n'; return mreturn(a + 6); }; int a = (mreturn(5) >>= f).get(); cout << a;
, 5 11.
C++11 mreturn >>=. : n3721
mreturn
make_ready_future
.
>>=
, std::future
then
. , A
, future. , , future , then
, .
unwrap
future<future> future. join
Control.Monad
.
then
: future<int> f(shared_ptr<stream> str) { shared_ptr<vector<char>> buf = ...; return str->read(512, buf).then([](future<int> op) { return op.get() + 11; }); } future<void> g() { shared_ptr<stream> s = ...; return f(s).then([s](future<int> op) { s->close(); }); }
, , . resumable : n3722 . : future<int> f(stream str) resumable { shared_ptr<vector<char>> buf = ...; int count = await str.read(512, buf); return count + 11; } future<void> g() resumable { stream s = ...; int pls11 = await f(s); s.close(); }
resumable
, , , . await
тАУ ( <-
) do
. , str.read
f
future, await
int
, .
? , , : resumable
, , Fibers Windows boost::coroutine
. , . resumable
- , await
. , await
then
, await
. resumable
std::future
, then
get
. C++, , , , . std::future
.
, resumable
. , resumable
.
Monad. , .
template<typename A, typename B> Monad<B> operator>>=(Monad<A> ma, function<Monad<B> (A)> f) { ... // }
ma, f f.
template<typename A, typename B> Monad<B> operator>>(Monad<A> ma, Monad<B> mb) { return Ma >>= [=](A){ return mb; }; }
>>= , . ( m >> k = m >>= \_ -> k
), Haskell C++.
template<typename A> Monad <A> mreturn(A a) { ... // }
return C++, mreturn. , a
.
fail
, .
, C++, - . - Maybe
, ., std::future
. C++11. future T
, . , , - , , , , . future
get
.
template<class T> class future { public: ... T get(); // get ... };
C++11 тАУ std::async
. , std::future
. : future<int> result = async(f); // - f int a = result.get(); // f .
mreturn
>>=
std::future
#include <future> using namespace std; template<typename A> future<A> mreturn(const A& a) { return async([=]{ return a; }); }
, future , . , .
template<typename A, typename B> future<B> operator>>=(future<A>& ma, const function<future<B> (A)>& f) { return async([&] () -> B { return f(ma.get()).get(); }); }
, , ma, f, f.
, . 3 , : Left identity : return a >>= f == fa Right identity: m >>= return == m Associativity: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
C++, :
(mreturn(a) >>= f) == f(a)
, :
async([&] () -> B { return f(mreturn(a).get()).get(); }) == f(a)
, mreturn(a).get()
,
. a
std::future
, . , :
async([&] () -> B { return f(a).get(); }) == f(a)
, , f
, . , f
, ( ).
: m >>= mreturn == m
, :
async([&] () -> B { return mreturn(m.get()).get(); }) == m
mreturn(x).get()
, :
async([&] () -> B { return m.get(); }) == m
, m. , m.
: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
, , . m f, , m. g, f. f g m.
. - : function<future<int> (int)> f = [](int a){ cout << a << '\n'; return mreturn(a + 6); }; int a = (mreturn(5) >>= f).get(); cout << a;
, 5 11.
C++11 mreturn >>=. : n3721
mreturn
make_ready_future
.
>>=
, std::future
then
. , A
, future. , , future , then
, .
unwrap
future<future> future. join
Control.Monad
.
then
: future<int> f(shared_ptr<stream> str) { shared_ptr<vector<char>> buf = ...; return str->read(512, buf).then([](future<int> op) { return op.get() + 11; }); } future<void> g() { shared_ptr<stream> s = ...; return f(s).then([s](future<int> op) { s->close(); }); }
, , . resumable : n3722 . : future<int> f(stream str) resumable { shared_ptr<vector<char>> buf = ...; int count = await str.read(512, buf); return count + 11; } future<void> g() resumable { stream s = ...; int pls11 = await f(s); s.close(); }
resumable
, , , . await
тАУ ( <-
) do
. , str.read
f
future, await
int
, .
? , , : resumable
, , Fibers Windows boost::coroutine
. , . resumable
- , await
. , await
then
, await
. resumable
std::future
, then
get
. C++, , , , . std::future
.
, resumable
. , resumable
.
Monad. , .
template<typename A, typename B> Monad<B> operator>>=(Monad<A> ma, function<Monad<B> (A)> f) { ... // }
ma, f f.
template<typename A, typename B> Monad<B> operator>>(Monad<A> ma, Monad<B> mb) { return Ma >>= [=](A){ return mb; }; }
>>= , . ( m >> k = m >>= \_ -> k
), Haskell C++.
template<typename A> Monad <A> mreturn(A a) { ... // }
return C++, mreturn. , a
.
fail
, .
, C++, - . - Maybe
, ., std::future
. C++11. future T
, . , , - , , , , . future
get
.
template<class T> class future { public: ... T get(); // get ... };
C++11 тАУ std::async
. , std::future
. : future<int> result = async(f); // - f int a = result.get(); // f .
mreturn
>>=
std::future
#include <future> using namespace std; template<typename A> future<A> mreturn(const A& a) { return async([=]{ return a; }); }
, future , . , .
template<typename A, typename B> future<B> operator>>=(future<A>& ma, const function<future<B> (A)>& f) { return async([&] () -> B { return f(ma.get()).get(); }); }
, , ma, f, f.
, . 3 , : Left identity : return a >>= f == fa Right identity: m >>= return == m Associativity: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
C++, :
(mreturn(a) >>= f) == f(a)
, :
async([&] () -> B { return f(mreturn(a).get()).get(); }) == f(a)
, mreturn(a).get()
,
. a
std::future
, . , :
async([&] () -> B { return f(a).get(); }) == f(a)
, , f
, . , f
, ( ).
: m >>= mreturn == m
, :
async([&] () -> B { return mreturn(m.get()).get(); }) == m
mreturn(x).get()
, :
async([&] () -> B { return m.get(); }) == m
, m. , m.
: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
, , . m f, , m. g, f. f g m.
. - : function<future<int> (int)> f = [](int a){ cout << a << '\n'; return mreturn(a + 6); }; int a = (mreturn(5) >>= f).get(); cout << a;
, 5 11.
C++11 mreturn >>=. : n3721
mreturn
make_ready_future
.
>>=
, std::future
then
. , A
, future. , , future , then
, .
unwrap
future<future> future. join
Control.Monad
.
then
: future<int> f(shared_ptr<stream> str) { shared_ptr<vector<char>> buf = ...; return str->read(512, buf).then([](future<int> op) { return op.get() + 11; }); } future<void> g() { shared_ptr<stream> s = ...; return f(s).then([s](future<int> op) { s->close(); }); }
, , . resumable : n3722 . : future<int> f(stream str) resumable { shared_ptr<vector<char>> buf = ...; int count = await str.read(512, buf); return count + 11; } future<void> g() resumable { stream s = ...; int pls11 = await f(s); s.close(); }
resumable
, , , . await
тАУ ( <-
) do
. , str.read
f
future, await
int
, .
? , , : resumable
, , Fibers Windows boost::coroutine
. , . resumable
- , await
. , await
then
, await
. resumable
std::future
, then
get
. C++, , , , . std::future
.
, resumable
. , resumable
.
Monad. , .
template<typename A, typename B> Monad<B> operator>>=(Monad<A> ma, function<Monad<B> (A)> f) { ... // }
ma, f f.
template<typename A, typename B> Monad<B> operator>>(Monad<A> ma, Monad<B> mb) { return Ma >>= [=](A){ return mb; }; }
>>= , . ( m >> k = m >>= \_ -> k
), Haskell C++.
template<typename A> Monad <A> mreturn(A a) { ... // }
return C++, mreturn. , a
.
fail
, .
, C++, - . - Maybe
, ., std::future
. C++11. future T
, . , , - , , , , . future
get
.
template<class T> class future { public: ... T get(); // get ... };
C++11 тАУ std::async
. , std::future
. : future<int> result = async(f); // - f int a = result.get(); // f .
mreturn
>>=
std::future
#include <future> using namespace std; template<typename A> future<A> mreturn(const A& a) { return async([=]{ return a; }); }
, future , . , .
template<typename A, typename B> future<B> operator>>=(future<A>& ma, const function<future<B> (A)>& f) { return async([&] () -> B { return f(ma.get()).get(); }); }
, , ma, f, f.
, . 3 , : Left identity : return a >>= f == fa Right identity: m >>= return == m Associativity: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
C++, :
(mreturn(a) >>= f) == f(a)
, :
async([&] () -> B { return f(mreturn(a).get()).get(); }) == f(a)
, mreturn(a).get()
,
. a
std::future
, . , :
async([&] () -> B { return f(a).get(); }) == f(a)
, , f
, . , f
, ( ).
: m >>= mreturn == m
, :
async([&] () -> B { return mreturn(m.get()).get(); }) == m
mreturn(x).get()
, :
async([&] () -> B { return m.get(); }) == m
, m. , m.
: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
, , . m f, , m. g, f. f g m.
. - : function<future<int> (int)> f = [](int a){ cout << a << '\n'; return mreturn(a + 6); }; int a = (mreturn(5) >>= f).get(); cout << a;
, 5 11.
C++11 mreturn >>=. : n3721
mreturn
make_ready_future
.
>>=
, std::future
then
. , A
, future. , , future , then
, .
unwrap
future<future> future. join
Control.Monad
.
then
: future<int> f(shared_ptr<stream> str) { shared_ptr<vector<char>> buf = ...; return str->read(512, buf).then([](future<int> op) { return op.get() + 11; }); } future<void> g() { shared_ptr<stream> s = ...; return f(s).then([s](future<int> op) { s->close(); }); }
, , . resumable : n3722 . : future<int> f(stream str) resumable { shared_ptr<vector<char>> buf = ...; int count = await str.read(512, buf); return count + 11; } future<void> g() resumable { stream s = ...; int pls11 = await f(s); s.close(); }
resumable
, , , . await
тАУ ( <-
) do
. , str.read
f
future, await
int
, .
? , , : resumable
, , Fibers Windows boost::coroutine
. , . resumable
- , await
. , await
then
, await
. resumable
std::future
, then
get
. C++, , , , . std::future
.
, resumable
. , resumable
.
Monad. , .
template<typename A, typename B> Monad<B> operator>>=(Monad<A> ma, function<Monad<B> (A)> f) { ... // }
ma, f f.
template<typename A, typename B> Monad<B> operator>>(Monad<A> ma, Monad<B> mb) { return Ma >>= [=](A){ return mb; }; }
>>= , . ( m >> k = m >>= \_ -> k
), Haskell C++.
template<typename A> Monad <A> mreturn(A a) { ... // }
return C++, mreturn. , a
.
fail
, .
, C++, - . - Maybe
, ., std::future
. C++11. future T
, . , , - , , , , . future
get
.
template<class T> class future { public: ... T get(); // get ... };
C++11 тАУ std::async
. , std::future
. : future<int> result = async(f); // - f int a = result.get(); // f .
mreturn
>>=
std::future
#include <future> using namespace std; template<typename A> future<A> mreturn(const A& a) { return async([=]{ return a; }); }
, future , . , .
template<typename A, typename B> future<B> operator>>=(future<A>& ma, const function<future<B> (A)>& f) { return async([&] () -> B { return f(ma.get()).get(); }); }
, , ma, f, f.
, . 3 , : Left identity : return a >>= f == fa Right identity: m >>= return == m Associativity: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
C++, :
(mreturn(a) >>= f) == f(a)
, :
async([&] () -> B { return f(mreturn(a).get()).get(); }) == f(a)
, mreturn(a).get()
,
. a
std::future
, . , :
async([&] () -> B { return f(a).get(); }) == f(a)
, , f
, . , f
, ( ).
: m >>= mreturn == m
, :
async([&] () -> B { return mreturn(m.get()).get(); }) == m
mreturn(x).get()
, :
async([&] () -> B { return m.get(); }) == m
, m. , m.
: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
, , . m f, , m. g, f. f g m.
. - : function<future<int> (int)> f = [](int a){ cout << a << '\n'; return mreturn(a + 6); }; int a = (mreturn(5) >>= f).get(); cout << a;
, 5 11.
C++11 mreturn >>=. : n3721
mreturn
make_ready_future
.
>>=
, std::future
then
. , A
, future. , , future , then
, .
unwrap
future<future> future. join
Control.Monad
.
then
: future<int> f(shared_ptr<stream> str) { shared_ptr<vector<char>> buf = ...; return str->read(512, buf).then([](future<int> op) { return op.get() + 11; }); } future<void> g() { shared_ptr<stream> s = ...; return f(s).then([s](future<int> op) { s->close(); }); }
, , . resumable : n3722 . : future<int> f(stream str) resumable { shared_ptr<vector<char>> buf = ...; int count = await str.read(512, buf); return count + 11; } future<void> g() resumable { stream s = ...; int pls11 = await f(s); s.close(); }
resumable
, , , . await
тАУ ( <-
) do
. , str.read
f
future, await
int
, .
? , , : resumable
, , Fibers Windows boost::coroutine
. , . resumable
- , await
. , await
then
, await
. resumable
std::future
, then
get
. C++, , , , . std::future
.
, resumable
. , resumable
.
Monad. , .
template<typename A, typename B> Monad<B> operator>>=(Monad<A> ma, function<Monad<B> (A)> f) { ... // }
ma, f f.
template<typename A, typename B> Monad<B> operator>>(Monad<A> ma, Monad<B> mb) { return Ma >>= [=](A){ return mb; }; }
>>= , . ( m >> k = m >>= \_ -> k
), Haskell C++.
template<typename A> Monad <A> mreturn(A a) { ... // }
return C++, mreturn. , a
.
fail
, .
, C++, - . - Maybe
, ., std::future
. C++11. future T
, . , , - , , , , . future
get
.
template<class T> class future { public: ... T get(); // get ... };
C++11 тАУ std::async
. , std::future
. : future<int> result = async(f); // - f int a = result.get(); // f .
mreturn
>>=
std::future
#include <future> using namespace std; template<typename A> future<A> mreturn(const A& a) { return async([=]{ return a; }); }
, future , . , .
template<typename A, typename B> future<B> operator>>=(future<A>& ma, const function<future<B> (A)>& f) { return async([&] () -> B { return f(ma.get()).get(); }); }
, , ma, f, f.
, . 3 , : Left identity : return a >>= f == fa Right identity: m >>= return == m Associativity: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
C++, :
(mreturn(a) >>= f) == f(a)
, :
async([&] () -> B { return f(mreturn(a).get()).get(); }) == f(a)
, mreturn(a).get()
,
. a
std::future
, . , :
async([&] () -> B { return f(a).get(); }) == f(a)
, , f
, . , f
, ( ).
: m >>= mreturn == m
, :
async([&] () -> B { return mreturn(m.get()).get(); }) == m
mreturn(x).get()
, :
async([&] () -> B { return m.get(); }) == m
, m. , m.
: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
, , . m f, , m. g, f. f g m.
. - : function<future<int> (int)> f = [](int a){ cout << a << '\n'; return mreturn(a + 6); }; int a = (mreturn(5) >>= f).get(); cout << a;
, 5 11.
C++11 mreturn >>=. : n3721
mreturn
make_ready_future
.
>>=
, std::future
then
. , A
, future. , , future , then
, .
unwrap
future<future> future. join
Control.Monad
.
then
: future<int> f(shared_ptr<stream> str) { shared_ptr<vector<char>> buf = ...; return str->read(512, buf).then([](future<int> op) { return op.get() + 11; }); } future<void> g() { shared_ptr<stream> s = ...; return f(s).then([s](future<int> op) { s->close(); }); }
, , . resumable : n3722 . : future<int> f(stream str) resumable { shared_ptr<vector<char>> buf = ...; int count = await str.read(512, buf); return count + 11; } future<void> g() resumable { stream s = ...; int pls11 = await f(s); s.close(); }
resumable
, , , . await
тАУ ( <-
) do
. , str.read
f
future, await
int
, .
? , , : resumable
, , Fibers Windows boost::coroutine
. , . resumable
- , await
. , await
then
, await
. resumable
std::future
, then
get
. C++, , , , . std::future
.
, resumable
. , resumable
.
Monad. , .
template<typename A, typename B> Monad<B> operator>>=(Monad<A> ma, function<Monad<B> (A)> f) { ... // }
ma, f f.
template<typename A, typename B> Monad<B> operator>>(Monad<A> ma, Monad<B> mb) { return Ma >>= [=](A){ return mb; }; }
>>= , . ( m >> k = m >>= \_ -> k
), Haskell C++.
template<typename A> Monad <A> mreturn(A a) { ... // }
return C++, mreturn. , a
.
fail
, .
, C++, - . - Maybe
, ., std::future
. C++11. future T
, . , , - , , , , . future
get
.
template<class T> class future { public: ... T get(); // get ... };
C++11 тАУ std::async
. , std::future
. : future<int> result = async(f); // - f int a = result.get(); // f .
mreturn
>>=
std::future
#include <future> using namespace std; template<typename A> future<A> mreturn(const A& a) { return async([=]{ return a; }); }
, future , . , .
template<typename A, typename B> future<B> operator>>=(future<A>& ma, const function<future<B> (A)>& f) { return async([&] () -> B { return f(ma.get()).get(); }); }
, , ma, f, f.
, . 3 , : Left identity : return a >>= f == fa Right identity: m >>= return == m Associativity: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
C++, :
(mreturn(a) >>= f) == f(a)
, :
async([&] () -> B { return f(mreturn(a).get()).get(); }) == f(a)
, mreturn(a).get()
,
. a
std::future
, . , :
async([&] () -> B { return f(a).get(); }) == f(a)
, , f
, . , f
, ( ).
: m >>= mreturn == m
, :
async([&] () -> B { return mreturn(m.get()).get(); }) == m
mreturn(x).get()
, :
async([&] () -> B { return m.get(); }) == m
, m. , m.
: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
, , . m f, , m. g, f. f g m.
. - : function<future<int> (int)> f = [](int a){ cout << a << '\n'; return mreturn(a + 6); }; int a = (mreturn(5) >>= f).get(); cout << a;
, 5 11.
C++11 mreturn >>=. : n3721
mreturn
make_ready_future
.
>>=
, std::future
then
. , A
, future. , , future , then
, .
unwrap
future<future> future. join
Control.Monad
.
then
: future<int> f(shared_ptr<stream> str) { shared_ptr<vector<char>> buf = ...; return str->read(512, buf).then([](future<int> op) { return op.get() + 11; }); } future<void> g() { shared_ptr<stream> s = ...; return f(s).then([s](future<int> op) { s->close(); }); }
, , . resumable : n3722 . : future<int> f(stream str) resumable { shared_ptr<vector<char>> buf = ...; int count = await str.read(512, buf); return count + 11; } future<void> g() resumable { stream s = ...; int pls11 = await f(s); s.close(); }
resumable
, , , . await
тАУ ( <-
) do
. , str.read
f
future, await
int
, .
? , , : resumable
, , Fibers Windows boost::coroutine
. , . resumable
- , await
. , await
then
, await
. resumable
std::future
, then
get
. C++, , , , . std::future
.
, resumable
. , resumable
.
Monad. , .
template<typename A, typename B> Monad<B> operator>>=(Monad<A> ma, function<Monad<B> (A)> f) { ... // }
ma, f f.
template<typename A, typename B> Monad<B> operator>>(Monad<A> ma, Monad<B> mb) { return Ma >>= [=](A){ return mb; }; }
>>= , . ( m >> k = m >>= \_ -> k
), Haskell C++.
template<typename A> Monad <A> mreturn(A a) { ... // }
return C++, mreturn. , a
.
fail
, .
, C++, - . - Maybe
, ., std::future
. C++11. future T
, . , , - , , , , . future
get
.
template<class T> class future { public: ... T get(); // get ... };
C++11 тАУ std::async
. , std::future
. : future<int> result = async(f); // - f int a = result.get(); // f .
mreturn
>>=
std::future
#include <future> using namespace std; template<typename A> future<A> mreturn(const A& a) { return async([=]{ return a; }); }
, future , . , .
template<typename A, typename B> future<B> operator>>=(future<A>& ma, const function<future<B> (A)>& f) { return async([&] () -> B { return f(ma.get()).get(); }); }
, , ma, f, f.
, . 3 , : Left identity : return a >>= f == fa Right identity: m >>= return == m Associativity: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
C++, :
(mreturn(a) >>= f) == f(a)
, :
async([&] () -> B { return f(mreturn(a).get()).get(); }) == f(a)
, mreturn(a).get()
,
. a
std::future
, . , :
async([&] () -> B { return f(a).get(); }) == f(a)
, , f
, . , f
, ( ).
: m >>= mreturn == m
, :
async([&] () -> B { return mreturn(m.get()).get(); }) == m
mreturn(x).get()
, :
async([&] () -> B { return m.get(); }) == m
, m. , m.
: (m >>= f) >>= g == m >>= (\x -> fx >>= g)
, , . m f, , m. g, f. f g m.
. - : function<future<int> (int)> f = [](int a){ cout << a << '\n'; return mreturn(a + 6); }; int a = (mreturn(5) >>= f).get(); cout << a;
, 5 11.
C++11 mreturn >>=. : n3721
mreturn
make_ready_future
.
>>=
, std::future
then
. , A
, future. , , future , then
, .
unwrap
future<future> future. join
Control.Monad
.
then
: future<int> f(shared_ptr<stream> str) { shared_ptr<vector<char>> buf = ...; return str->read(512, buf).then([](future<int> op) { return op.get() + 11; }); } future<void> g() { shared_ptr<stream> s = ...; return f(s).then([s](future<int> op) { s->close(); }); }
, , . resumable : n3722 . : future<int> f(stream str) resumable { shared_ptr<vector<char>> buf = ...; int count = await str.read(512, buf); return count + 11; } future<void> g() resumable { stream s = ...; int pls11 = await f(s); s.close(); }
resumable
, , , . await
тАУ ( <-
) do
. , str.read
f
future, await
int
, .
? , , : resumable
, , Fibers Windows boost::coroutine
. , . resumable
- , await
. , await
then
, await
. resumable
std::future
, then
get
. C++, , , , . std::future
.
, resumable
. , resumable
.