[Haskell-beginners] Right-associating infix application operators

Daniel Fischer daniel.is.fischer at web.de
Tue Jul 6 08:31:29 EDT 2010


On Tuesday 06 July 2010 13:59:08, Tom Hobbs wrote:
> Right, a bit of playing around and I think understand.  Maybe.
>
> In your example;
>
> map ($ 3) functionList
>
> I'm assuming that this is Haskel's way of saying "Give the value 3 as an
> argument to each function in functionList".

Right. ($ 3) is a right-section of ($), and like (^3) n ~> n^3, 
($ 3) f ~> f $ 3 -- (= f 3).

> Playing in Hugs seems to
> suggest that this is the case;
>
> Hugs> map ($ 3) [(4 +), (5 +), (6 +)]
> [7,8,9]
>
> That makes sense.  The first arg to map is expecting a function, so we
> give it a function and a value which just returns the value.  I can see
> why that works.
>
> Rewriting using "flip id" has me stumped though.
>
> Hugs> map (flip id 3) [(4 +), (5 +), (6 +)]
> [7,8,9]
>
> So this is saying,
>
> Actually, I don't know.  Working it out in my head I would say "id 3"
> returns 3.  But "flip 3" causes an error in Hugs, so this code doesn't
> work - but clearly it does.

Wrong parentheses.

flip id 3 = (flip id) 3

so

(flip id) 3 f 
~> (id f) 3
~> f 3

See,

flip :: (a -> b -> c) -> b -> a -> c
id :: t -> t

to make flip id typecheck, only a subset of all possible types of id can be 
used here, namely, t must be a function type,

t ~ (u -> v)

then

id :: (u -> v) -> u -> v
---------a--------b----c

(remember that (->) associates to the right, so (u -> v) -> (u -> v) is the 
same as (u -> v) -> u -> v)

and

flip id :: u -> (u -> v) -> v

then

flip id 3 :: Num n => (n -> v) -> v

>
> Hugs> :t flip id 3
> flip id 3 :: Num a => (a -> b) -> b

You should have tried without the 3,

Prelude> :t flip id
flip id :: b -> (b -> c) -> c

I did mention that it's confusing for beginners, as you saw, it really is.
But I hope your thinking about it makes the explanation more effectful than 
if I had given it right away.

>
> Hugs> :t ($ 3)
> flip ($) 3 :: Num a => (a -> b) -> b
>
> Is presumably why it works, but I can't work out how to create the type
> signature of "flip id 3" from the sigs of flip and id.
>
> Help?
>
> Thanks.
>
> Tom
>

Cheers,
Daniel


More information about the Beginners mailing list