f :: forall a . (a -> a) -> Bool
f a = True

g :: (forall a . (a -> a)) -> Bool
g a = True

どちらの関数も、第一引数に関数を受け取り、Bool値を返す関数。
ただし、第一引数の解釈が異なる。

f の場合は、「どのような型の関数を渡しても良い」という意味。
それは (Bool -> Bool) でも (Int -> Int) でも。
だから f not は動く。 (なぜなら f は、「どのような型の関数でも受け取れる」、という定義だから)

一方 g の場合は、「”どのような関数でも受け取れる関数”、しか受け取りません」という意味。
「どのような関数でも受け取れる関数」とは、すなわち ∀ a => a -> a のみ。
それ以外の (Integral a => a -> a) や (Floating a => a -> a) などでは要求に合わない。
だから g not は動かない。 (なぜなら g は、「”どのような関数でも受け取れる関数”しか受け取れない」、という定義だから)

g not は動かないが、 g (\x -> x) ならば動く。
なぜなら (\x -> x) は、「どのような型も受け取れる関数」という型だから。 g が求めてる型に合致してる。
このラムダ関数に型を付けてしまうと、 g (\x -> x :: Int) 動かない。 「Int型しか受け取れない関数」を渡すことになってしまうので。

f の場合は、「どのうような型の関数でも受け取れる」という意味なので、 f not でも f (\x -> x) でも受け取ってくれる。
これが f と g の動作の違い。これが何に役立つかは知りません。