query about precedence: "$", the lazy function application operator

Arjan van IJzendoorn afie@cs.uu.nl
Thu, 30 May 2002 10:50:43 +0200


Hi Mark,

> Suppose I have functions
>
>      f :: Int -> Int
>      f x -> x * x

I suppose you mean: f x = x * x

>      g :: Int -> Int
>      g x -> x + 1
>
> The lazy application operator "$" allows me to do:
>
>      f $ g x
>
> instead of
>
>      f (g x)
>
> But I don't understand why it works this way!  Let me explain.

> f is a function, and application has highest precedence, so unless
> it sees a bracket, it should take the next thing it sees as an
> argument.

Yes, but "$" cannot be an argument. In the Haskell grammar for expressions
( http://www.haskell.org/onlinereport/exps.html ) an application (fexp)
consists of one or aexp's and an aexp cannot be an operator (at least not,
without parentheses around it).

A simpler way to see this is to write application as an explicit operator.
Let's call it @. Above expression then reads

    f $ g @ x

And @ binds stronger than $, alas   f $ (g @ x)

Arjan