On Mar 21, 8:11 am, John Machin <sjmac...@lexicon.net> wrote: > On Mar 22, 1:55 am, grocery_stocker <cdal...@gmail.com> wrote: > > > > > Given the following.... > > > def double(val): > > return val.bind(lambda x: val.return_(x*2)) > > > I get "AttributeError: 'int' object has no attribute 'bind' " when I > > try to do the following > > > double(2) > > > Below is the output... > > > [cdal...@localhost ~]$ python > > Python 2.4.3 (#1, Oct 1 2006, 18:00:19) > > [GCC 4.1.1 20060928 (Red Hat 4.1.1-28)] on linux2 > > Type "help", "copyright", "credits" or "license" for more information.>>> > > def double(val): > > > ... return val.bind(lambda x: val.return_(x*2)) > > ...>>> double(2) > > > Traceback (most recent call last): > > File "<stdin>", line 1, in ? > > File "<stdin>", line 2, in double > > AttributeError: 'int' object has no attribute 'bind' > > How you call it is irrelevant; you already achieved that. > > The problem is that your double() function is weird. ... it fails > (quite justifiably) trying to execute 2.bind(). Just as well, because > the next problem would be 2.return_() ... int objects just don't have > such methods (as the error message pointed out). > > Presumably you are trying to achieve a goal that's a bit more useful > than > > def double(val): > return val * 2 > > so perhaps you could explain what that goal is and someone may be able > to help.
The function is taken from the article "Understanding Monads Via Python List Comprehensions" found at the following url http://lukeplant.me.uk/blog.php?id=1107301643 Near the bottom of the article, the author has "What is the <- in the do notation then? It is simply some syntactic sugar that allows you to define the right kind of functions easily and painlessly. It looks very much like 'unpack this data from the monad so I can use it', so it helps conceptually. In fact, together with the rest of the body of the 'do' block it forms an anonymous lambda function, and we could write our double function something pretty much like this in Python: def double(val): return val.bind(lambda x: val.return_(x*2)) (I've had to use return_ to avoid the clash with Python's 'return' keyword). Haskell's do notation eliminates the explicit call to bind, and the lambda, making it quite a bit easier to use. " I just have no idea how to call double(). -- http://mail.python.org/mailman/listinfo/python-list