[Haskell-cafe] Haskell Quiz Solution - Haskell Newbie Requesting Review

Dougal Stanton ithika at gmail.com
Fri Nov 10 13:31:15 EST 2006


Quoth Justin Bailey, nevermore,
> Above are all more examples of partial functions and function
> composition. I understand the first concept, but function composition
> escapes me somehow. What are the rules for partial functions getting
> arguments when they are eventually supplied? For example, in
> 'interpret_tests' I can see that the function (fromIntegral .
> interpret . compile) gets applied to the statement via 'checkResult',
> but it seems to me that fromIntegral should get teh argument (i.e.
> because I read it is '(fromIntegral (interpret (compile)))'). Clearly,
> I'm wrong. Do arguments get consumed by partially applied functions
> regardless of their "depth"?

The operators (.) and ($) are used to join functions together, but in
slightly different ways. Taking your example above, we would use ($) to
obtain nested functions:

> fromIntegral $ interpret $ compile ==
>                                 fromIntegral (interpret (compile))

As you noted that doesn't seem right --- how does compile capture its
input? Well, the (.) operator is slightly different. It captures
variables and passes them into the 'innermost' function, a bit like
this:

> f . g = \x -> f (g x)

In this respect you can treat 'f . g' as a single functional entity
which takes the same number and type of functions as 'g' and return
whatever type 'f' returns. As in the type signature:

> (.) :: (b -> c) -> (a -> b) -> a -> c

If it helps, think of something like 

> map (f . g . h) xs

as identical to the following (although obviously much more succinct and
orders of magnitude clearer)

> map (f') xs
>   where f' = \x -> f (g (h x))

Cheers,

D.

-- 
Dougal Stanton <ithika at gmail.com>
<http://brokenhut.livejournal.com>
Word attachments considered harmful.


More information about the Haskell-Cafe mailing list