Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <vector>
- template<typename A> struct maybe {
- bool nothing;
- A data;
- maybe(A a) : data(a), nothing(false) { }
- maybe() : nothing(true) { }
- template<typename B> maybe<B> bind (maybe<B> (f)(A)) {
- if (nothing) {
- return maybe();
- } else {
- return maybe(f(data));
- }
- }
- };
- template<typename A> struct list: std::vector<A> {
- list () : std::vector<A>() { }
- template<int len> list (const A (&a)[len]) : std::vector<A>(a, a + len) { }
- template<typename B> list<B> bind (list<B> (f)(A)) {
- list<B> out;
- for (auto& i : *this) {
- list<B> temp = f(i);
- out.insert(out.end(), temp.begin(), temp.end());
- }
- return out;
- }
- };
- maybe<int> mprint (int i)
- {
- printf("%i\n", i);
- return maybe<int>(i);
- }
- list<int> lprint (int i)
- {
- printf("%i\n", i);
- return list<int>((int[]){i});
- }
- int main ()
- {
- maybe<int> x;
- maybe<int> y = 23;
- x.bind(mprint);
- y.bind(mprint);
- list<int> z = (int[]){1, 2, 3};
- z.bind(lprint);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement