1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | class ListMonad(list): @staticmethod def return_(x): return ListMonad([x]) def bind(self, f): return ListMonad(x for it in self for x in f(it)) lst = [1, 2, 3, 4] # this: print ListMonad(lst).bind( lambda x: ListMonad.return_(x * 2).bind( lambda y: ListMonad.return_(y) if y % 3 else ListMonad())) # is the same as this: print filter(lambda y: y % 3, map(lambda x: x * 2, lst)) # But this can't be done with map: print ListMonad(lst).bind( lambda x: ListMonad(lst).bind( lambda y: ListMonad.return_(x * y))) # because if we use map, we get a list of lists: print map(lambda y: map(lambda x: x * y, lst), lst) input = ['first input', 'second input'] class IOMonad(): def __init__(self, x = None): self.x = x @staticmethod def return_(x): return IOMonad() def bind(self, f): return f(self.x) @staticmethod def readLn(): return IOMonad(input.pop(0)) # don't want actual interaction here @staticmethod def putStr(s): print s return IOMonad() # this performs side effects and returns an instance of IOMonad, as it should print IOMonad.readLn().bind( lambda s1: IOMonad.readLn().bind( lambda s2: IOMonad.putStr('you wrote: ' + s1 + ' and then ' + s2))) |
Y2xhc3MgTGlzdE1vbmFkKGxpc3QpOgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIHJldHVybl8oeCk6IHJldHVybiBMaXN0TW9uYWQoW3hdKQogICAgZGVmIGJpbmQoc2VsZiwgZik6IHJldHVybiBMaXN0TW9uYWQoeCBmb3IgaXQgaW4gc2VsZiBmb3IgeCBpbiBmKGl0KSkKCmxzdCA9IFsxLCAyLCAzLCA0XQoKIyB0aGlzOgpwcmludCBMaXN0TW9uYWQobHN0KS5iaW5kKAogICAgICAgIGxhbWJkYSB4OiBMaXN0TW9uYWQucmV0dXJuXyh4ICogMikuYmluZCgKICAgICAgICAgICAgICAgIGxhbWJkYSB5OiBMaXN0TW9uYWQucmV0dXJuXyh5KSBpZiB5ICUgMyBlbHNlIExpc3RNb25hZCgpKSkKCiMgaXMgdGhlIHNhbWUgYXMgdGhpczoKcHJpbnQgZmlsdGVyKGxhbWJkYSB5OiB5ICUgMywgbWFwKGxhbWJkYSB4OiB4ICogMiwgbHN0KSkgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgojIEJ1dCB0aGlzIGNhbid0IGJlIGRvbmUgd2l0aCBtYXA6CnByaW50IExpc3RNb25hZChsc3QpLmJpbmQoCiAgICAgICAgbGFtYmRhIHg6IExpc3RNb25hZChsc3QpLmJpbmQoCiAgICAgICAgICAgICAgICBsYW1iZGEgeTogTGlzdE1vbmFkLnJldHVybl8oeCAqIHkpKSkKCiMgYmVjYXVzZSBpZiB3ZSB1c2UgbWFwLCB3ZSBnZXQgYSBsaXN0IG9mIGxpc3RzOgpwcmludCBtYXAobGFtYmRhIHk6IG1hcChsYW1iZGEgeDogeCAqIHksIGxzdCksIGxzdCkKCgppbnB1dCA9IFsnZmlyc3QgaW5wdXQnLCAnc2Vjb25kIGlucHV0J10KY2xhc3MgSU9Nb25hZCgpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHggPSBOb25lKToKICAgICAgICBzZWxmLnggPSB4CiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgcmV0dXJuXyh4KTogcmV0dXJuIElPTW9uYWQoKQogICAgZGVmIGJpbmQoc2VsZiwgZik6IHJldHVybiBmKHNlbGYueCkKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiByZWFkTG4oKToKICAgICAgICByZXR1cm4gSU9Nb25hZChpbnB1dC5wb3AoMCkpICMgZG9uJ3Qgd2FudCBhY3R1YWwgaW50ZXJhY3Rpb24gaGVyZQogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIHB1dFN0cihzKToKICAgICAgICBwcmludCBzCiAgICAgICAgcmV0dXJuIElPTW9uYWQoKQoKIyB0aGlzIHBlcmZvcm1zIHNpZGUgZWZmZWN0cyBhbmQgcmV0dXJucyBhbiBpbnN0YW5jZSBvZiBJT01vbmFkLCBhcyBpdCBzaG91bGQKcHJpbnQgSU9Nb25hZC5yZWFkTG4oKS5iaW5kKAogICAgICAgIGxhbWJkYSBzMTogSU9Nb25hZC5yZWFkTG4oKS5iaW5kKAogICAgICAgICAgICAgICAgbGFtYmRhIHMyOiBJT01vbmFkLnB1dFN0cigneW91IHdyb3RlOiAnICsgczEgKyAnIGFuZCB0aGVuICcgKyBzMikpKSAKCg==
-
upload with new input
-
result: Success time: 0.02s memory: 4688 kB returned value: 0
[2, 4, 8] [2, 4, 8] [1, 2, 3, 4, 2, 4, 6, 8, 3, 6, 9, 12, 4, 8, 12, 16] [[1, 2, 3, 4], [2, 4, 6, 8], [3, 6, 9, 12], [4, 8, 12, 16]] you wrote: first input and then second input <__main__.IOMonad instance at 0xb74c2aac>


