
рдпрд╣ рдкрд╣рд▓реЗ рд╣реА рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
рдХрд┐ рд╕реА ++ рдореЗрдВ рдордареЛрдВ рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА
рдкреНрд░рдХрд╛рд░ рдХреА рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП ред рдореИрдВ рдпрд╣ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдордареЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдХрдХреНрд╖рд╛рдПрдВ рд▓рд╛рдЧреВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВред
рдЗрд╕ рддрдХрдиреАрдХ рдХрд╛ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рд╕реНрдХрд╛рд▓рд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ C ++ рдореЗрдВ рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░реВрдк
рд╕реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдПрдХреАрдХреГрдд рд╡рд░реНрдгрди рдХреА рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдЕрдм рдореИрдВ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░реВрдВрдЧрд╛ред
рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдкреНрд░рдХрд╛рд░ рдХреА рдХрдХреНрд╖рд╛рдПрдВ рди рдХреЗрд╡рд▓ рд╣рд╛рд╕реНрдХреЗрд▓ рдФрд░ рдорд░реНрдХрд░реА рдЬреИрд╕реА рдШреЛрд╖рдгрд╛рддреНрдордХ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдХрд╛рдлреА рдХреНрд▓рд╛рд╕рд┐рдХ рдЧреЛ рдФрд░ рдЬрдВрдЧ рдореЗрдВ рдкрд░рд┐рд▓рдХреНрд╖рд┐рдд рд╣реЛрддреА рд╣реИрдВред
рдпрд╣ рддрдХрдиреАрдХ рдХреЙрдорди рд▓рд┐рд╕реНрдк рдФрд░ рдХреНрд▓реЛрдЬрд░ рд╕реЗ рдорд▓реНрдЯреАрдорд┐рдереЛрдб рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдЙрдкрдпреБрдХреНрдд рд╣реИред
рдореИрдВрдиреЗ рдЕрднреА рдЫрд╣ рд╕рд╛рд▓ рддрдХ C ++ рдирд╣реАрдВ рдЙрдард╛рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреЛрдб рд╡рд┐рдЪрд╛рд░рдзрд╛рд░рд╛рддреНрдордХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдирдИ (рдЙрдкрдпреЛрдЧреА) рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдореЗрдореЛрд░реА рдореИрдиреЗрдЬрдореЗрдВрдЯ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░ рджреЗрддрд╛ рд╣реВрдВ - рд╕реА ++ рдкреНрд░реИрдХреНрдЯрд┐рд╢рдирд░реНрд╕ рдореБрдЭрд╕реЗ рдмреЗрд╣рддрд░ рдпрд╣ рдХрд░реЗрдВрдЧреЗред
рдХреЛрдб 4.7.3 рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдкреНрд░рдХрд╛рд░ рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдореВрд▓ рд╡рд┐рдЪрд╛рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рд╕реЗ рдЕрд▓рдЧ рдХрд░рдирд╛ рд╣реИред рдПрдХ рд╣реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреЛ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЛ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рдореЛрдиреИрдбреНрд╕ рдХреЗ рд╕рд╛рде, рдпрд╣ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдПрдХ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдЬреЗрдиреЗрд░рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╣реАрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдХрдХреНрд╖рд╛рдПрдВ рд╣реИрдВ:
#include <stddef.h> template <template<typename _> class M> class monadVTBL { public: template<typename v, typename x> static M<v> bind(M<x>, M<v>(*)(x)); template<typename v> static M<v> mreturn(v); }; template<template<typename _> class M, typename v, typename x> M<v> bind(M<x> i, M<v>(*f)(x), monadVTBL<M> *tbl = NULL) { return monadVTBL<M>::bind(i, f); } template<template<typename _> class M, typename v> M<v> mreturn(vi, monadVTBL<M> *tbl = NULL) { return monadVTBL<M>::mreturn(i); }
рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЗ рд╕рд╛рде рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╣рдореЗрд╢рд╛ рд╢реВрдиреНрдп рд╣реИ), рдФрд░ рд╣рдо рдЗрд╕реЗ рдПрдХ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рдЪреАрд▓рд╛рдкрди рдорд┐рд▓рддрд╛ рд╣реИ, рдЬреЛ рдХреБрдЫ рдкреНрд░рдпрд╛рд╕ рдХреЗ рд╕рд╛рде, рддрд╛рддреНрдХрд╛рд▓рд┐рдХ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдХреЛ рдмрдЪрд╛рдПрдЧрд╛ (рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдЫрд┐рдкрд╛рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рд╢реВрдиреНрдп * рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛рддреЗ рд╣реИрдВ) рдФрд░ рдорд▓реНрдЯреАрдорд┐рдереЛрдбреНрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред
template <template<typename _> class M> M<char> inc(char c) { return mreturn<M,char>(c+1); }
рдПрдХ рд╕рд╛рдзреБ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рдХрд╛рдлреА рд╕рд░рд▓ рдХрд╛рд░реНрдпред
рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ, рд╡рд╣ рдмрд╛рд╣рд░ рджрд┐рдЦреЗрдЧреА
inc :: (Monad m) => Char -> m Char inc c = return (succ c)
рдпрд╣рд╛рдВ рд▓реМрдЯрдиреЗ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ C ++ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреБрдЫ рдЕрд▓рдЧ рд╣реИред
рдЕрдм рдЖрдЗрдУ рдореЛрдирд╛рдб рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЬрд┐рди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдореЛрдирд╛рдб рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд╡реЗ рд╣реИрдВ I / O рд╕рдВрдЪрд╛рд▓рдиред рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ, рдпреЗ рд╕рд╛рдорд╛рдиреНрдп рдореВрд▓реНрдп рд╣реИрдВ, рд╕реА ++ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдХрдХреНрд╖рд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдореЙрдбрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
#include<stdio.h> template<typename v> class IOop { public: virtual v run() = 0; }; template<typename v> class IOm { public: IOop<v> *op; IOm(IOop<v> *o) { op = o; } v run() { op->run(); } };
рд░рди рд╡рд┐рдзрд┐ рдЗрд╕ рдСрдкрд░реЗрд╢рди рдХреЛ рдХрд░рддреА рд╣реИ (рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ, рдЗрд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореБрдЦреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рд░рдирдЯрд╛рдЗрдо рд╕рд┐рд╕реНрдЯрдо рджреНрд╡рд╛рд░рд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ)ред
IOm рдХрдВрдЯреЗрдирд░ рд╡рд░реНрдЧ рдХреЛ рдСрдкрд░реЗрд╢рди рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдЖрдХрд╛рд░ рдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ, рдЗрди рд╡рд░реНрдЧреЛрдВ рдХрд╛ рднрд┐рдХреНрд╖реБрдУрдВ рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╡реЗ рднрд┐рдХреНрд╖реБрдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВред рдпрд╣ рдирд┐рдпрдорд┐рдд рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдЯрд╛рдЗрдк рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рд╛рдн рд╣реИ рдЬреЛ рдЙрдирдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
class getChar: public IOop<char> { public: getChar() {} virtual char run() { return getchar(); } } _getChar[1]; IOm<char> getChar(_getChar); typedef class unit { } unit; unit Unit; class _putChar: public IOop<unit> { char v; public: _putChar(char c) { v = c; } virtual unit run() { putchar(v); return Unit; } }; class IOm<unit> putChar(char c) { IOm<unit> o(new _putChar(c)); return o; };
рд▓реЗрдХрд┐рди рджреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ I / O рд╕рдВрдЪрд╛рд▓рди рдорд╛рдирдХ рдЗрдирдкреБрдЯ рд╕реЗ рдПрдХ рдЪрд░рд┐рддреНрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рдорд╛рдирдХ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдЪрд░рд┐рддреНрд░ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдВред рдФрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рднреА рд╣реИ рдЬреЛ рдПрдХ рдЪрд░рд┐рддреНрд░ рдХреЛ рдПрдХ рдСрдкрд░реЗрд╢рди рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддрд╛ рд╣реИред
template<typename v> class mconst: public IOop<v> { vr; public: mconst(vx) { r=x; } virtual v run() { return r; } };
рдпрд╣ рд╡рд░реНрдЧ рдореЛрдиреИрдбрд┐рдХ рдСрдкрд░реЗрд╢рди "рд░рд┐рдЯрд░реНрди" рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рдЗрдирдкреБрдЯ-рдЖрдЙрдЯрдкреБрдЯ рдСрдкрд░реЗрд╢рди рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рд╣рдореЗрд╢рд╛ рдПрдХ "рдкрд░рд┐рдЪрдп" рджреЗрддрд╛ рд╣реИред
template<typename v, typename i> class mbind: public IOop<v> { IOop<i> *s; IOm<v> (*f)(i); public: v run() { return (*f)(s->run()).run(); } mbind(IOop<i> *x, IOm<v> (*g)(i)) { s=x; f=g; } };
рдФрд░ рдпрд╣ рдСрдкрд░реЗрд╢рди ">> =", рдЬреЛ рдирдП рдореЛрдирд╛рдж рдХреЗ рдЬрдирд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдорда рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред
template<> class monadVTBL<IOm> { public: template<typename v, typename i> static IOm<v> bind(IOm<i> x, IOm<v>(*f)(i)) { IOm<v> b(new mbind<v,i>(x.op,f)); return b; } template<typename v> static IOm<v> mreturn(vx) { IOm<v> r(new mconst<v>(x)); return r; } };
рдФрд░ рдпрд╣рд╛рдВ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдЖрдИрдУ рдХреЗ рд▓рд┐рдП рдорда рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд╣реИред
template<typename i> IOm<unit> ignNL(iv) { return bind<IOm,unit,char>(mreturn<IOm,char>('\n'),putChar); }
рдпрд╣ рдПрдХ IO рдЬрдирд░реЗрдЯрд░ рд╣реИ рдЬреЛ рдкрд┐рдЫрд▓реЗ рдореЛрдирдб рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ '\ n' рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИред
ign :: a -> IO () ign _ = putChar '\n'
IO (рдФрд░ рдХреБрдЫ рдЕрдиреНрдп рдореЛрдирдбрд░реНрд╕, рдЬреИрд╕реЗ рдкрд░реНрд╕рд░реНрд╕) рдХреЗ рд▓рд┐рдП, рдкрд┐рдЫрд▓реЗ рдореЛрдирдб рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рдПрдХ рдХрд╛рдлреА рд▓реЛрдХрдкреНрд░рд┐рдп рдСрдкрд░реЗрд╢рди рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ:
(>>) :: (Monad m) => ma -> mb -> mb a >> b = a >>= \_ -> b
рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
bind<IOm,unit,unit>(bind<IOm,unit,char>(bind<IOm,char,char>(getChar,inc),putChar),ignNL<unit>).run();
рд╣рдо рдорд╛рдирдХ рдЗрдирдкреБрдЯ рд╕реЗ рдПрдХ рдЪрд░рд┐рддреНрд░ рдкрдврд╝рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдмрдврд╝рд╛рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдкреНрд░рд┐рдВрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд▓рд╛рдЗрди рдлрд╝реАрдб рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рддреЗ рд╣реИрдВред
рдФрд░ рдЕрдм рд╣рдо рдПрдХ рдЕрдиреНрдп рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдореЛрдирдб рдЗрдВрдЯрд░рдлреЗрд╕ рд▓рд╛рдЧреВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдХрд┐ рдореЛрдирдбреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рдХрдо рдЬрд╛рдирддрд╛ рд╣реИред
#include<vector> template<typename v> class myvector: public std::vector<v> { };
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдПрд╕рдЯреАрдбреА :: рд╡реЗрдХреНрдЯрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рджреЛ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ (рджреВрд╕рд░рд╛ рдЖрд╡рдВрдЯрди рдиреАрддрд┐ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред рдЖрдзреБрдирд┐рдХ рдЬреАрд╕реАрд╕реА рдЗрд╕реЗ рдПрдХ рдРрд╕реЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ (рдпрджрд┐ рдореЗрдореЛрд░реА рдореБрдЭреЗ рд╕рд╣реА рдХрд╛рдо рдХрд░рддреА рд╣реИ, рддреЛ рдкрд╣рд▓реЗ рдРрд╕реА рдХреЛрдИ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдирд╣реАрдВ рдереАрдВ)ред рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЖрд╡рд░рдг рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред
template<> class monadVTBL<myvector> { public: template<typename v, typename i> static myvector<v> bind(myvector<i> x, myvector<v>(*f)(i)){ myvector<v> e; for(typename myvector<i>::iterator it = x.begin(); it != x.end(); ++it) { myvector<v> c = f(*it); for(typename myvector<v>::iterator i = c.begin(); i != c.end(); ++i) { e.push_back(*i); } } return e; } template<typename v> static myvector<v> mreturn(vx) { myvector<v> e; e.push_back(x); return e; } };
рдПрд╕рдЯреАрдбреА рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ :: рд╡реЗрдХреНрдЯрд░ рдореЛрдирд╛рдб рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рд▓рд┐рд╕реНрдЯ рдореЛрдирд╛рдб рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд╕рдорд╛рди рд╣реИред
рд╣рдо рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
myvector<char> x; x.push_back('q'); x.push_back('w'); x.push_back('e'); myvector<char> z = bind<myvector,char,char>(x,inc); for(typename myvector<char>::iterator i = z.begin(); i != z.end(); ++i) { std::cout << *i; }
рдРрд╕реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП, рдлрд╝рдирдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдПрдХ рд╡рд░реНрдЧ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдЖрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред