Harri Kiiskinen wrote:
fmap (^4) [1,2,3] >>= \i -> shows i " "
let i = fmap (^4) [1,2,3] in shows i " "

Probably very simple, but there must be a delicate difference between
these two expressions. I just don't get it.

First, let's simplify these expressions using the following equation:

   fmap (^4) [1,2,3] == [1,16,81]

So, we have

x1 = [1,16,81] >>= \i -> shows i " "
x2 = let i = [1,16,81] in shows i " "

Let's examine the x2 first. We can substitute i, and obtain

   shows [1,16,81] " "

note that the whole list is passed to shows. shows then "prints" it to a string, using the notation for lists, and adds a trailing space. Note that shows is called here with type:

  shows :: [Integer] -> String -> String

Now, we consider x1. Here >>= is invoked for the list monad,
which extracts each member 1,16,81 from the
list and applies shows to them separately, and concatenates all the results. In other words, we can rewrite x1 as:

  shows 1 " " ++ shows 16 " " ++ shows 81 " "

Note that here we pass single elements to shows, and not the whole list. Indeed, here we are calling shows at a different type:

  shows :: Integer -> String -> String

But this is fine, since shows knows how to print Integers as well as lists of them.

Concluding: the monadic bind operator >>= is not function application.
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to