Can’t say that I understand this concept, but just laying down the snippet any way:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{-# LANGUAGE Rank2Types #-}

concrete_type :: (forall a. a -> a) -> (Int, Bool)
concrete_type f =
let
x = f 1
y = f True
in (x, y)

var_type :: (forall t. t -> t) -> a -> b -> (a, b)
var_type f a b =
let
x = f a
y = f b
in (x, y)

main :: IO ()
main = do
return ()

Reference