Haskellãåå¼·ãã¦ãã¦ãããããã¢ããã®é°å²æ°ãããã£ã¦ããã®ã§ãMaybeã¢ããã®ãããªè¨ç®ãPythonã§ãã£ã¦ã¿ãã
#!/usr/bin/env python # -*- coding: utf-8 -*- # instance Monad Maybe where # return = Just # fail = Nothing def Maybe(x): return Just(x) if x else Nothing() class Just: def __init__(self, x): self.value = x def __repr__(self): return "Just(%r)" % self.value # (Just x) >>= f = f x def bind(self, f): return f(self.value) # '>>=' ã®ä»£ããã« '>>' ãbindæ¼ç®åã¨ãã¦å®ç¾©ãã¦ã¿ã def __rshift__(self, other): return self.bind(other) class Nothing: def __repr__(self): return "Nothing()" # Nothing >>= f = Nothing def bind(self, f): return self def __rshift__(self, other): return self.bind(other) nested_dict = {'a': {'b': {'c': 42}}} # ãããã¼ã§è¾æ¸ãå¼ãé¢æ°ãè¿ãé¢æ° def lookup(key): return lambda d: Maybe(d.get(key)) print Maybe(nested_dict).bind(lookup('a')).bind(lookup('b')).bind(lookup('c')) # => Just(42) print Maybe(nested_dict) >> lookup('a') >> lookup('b') >> lookup('c') # => Just(42) print Maybe(nested_dict).bind(lookup('a')).bind(lookup('X')).bind(lookup('c')) # => Nothing() print Maybe(nested_dict) >> lookup('a') >> lookup('X') >> lookup('c') # => Nothing()
returnãããªããã£ãå¤ãã¢ããã«å ¥ãã¦ãbindãã¢ããã®ä¸èº«ã«ä½ããã®å¦çããã¦æ°ããªã¢ãããä½ããdoè¨æ³ã¯bindã®ç¹°ãè¿ããè¦ãããæ¸ãããã®ç³è¡£æ§æãã¨ãããããã¾ã§ã¯æ´ãã¦ããã