This table illustrates how free sections interact with all the different Haskell98 Exp primitives. These translations are actual output of the FreeSect preprocessor (≥v0.6), not hypothetical rewrites. They correspond to test file S25.hs in the distro. Note they all use default contexts; the explicitly bracketed versions are in S24.hs. Of course complex (even nested) free sections can be built up from these primitives.

__ + 2   =   \ _0 -> _0 + 2
f __   =   \ _0 -> f _0
__ x   =   \ _0 -> _0 x
-__   =   \ _0 -> -_0
\ x -> __ x   =   \ _0 -> \ x -> _0 x
let x = 2 in __ x   =   \ _0 -> let x = 2 in _0 x
if __ then __ else __   =   \ _0 _1 _2 -> if _0 then _1 else _2
case __ of _ -> 2   =   \ _0 -> case _0 of _ -> 2
(__, 2, __, 4, 5, __, 7)   =   \ _0 _1 _2 -> (_0, 2, _1, 4, 5, _2, 7)
[__, 2, __, 4, 5, __, 7]   =   \ _0 _1 _2 -> [_0, 2, _1, 4, 5, _2, 7]
a _[ __ c __ ]_ e   =   a (\ _0 _1 -> _0 c _1) e
(__)   =   \ _0 -> _0
(__ b __)   =   \ _0 _1 -> _0 b _1
(__ +)   =   \ _0 -> (_0 +)
(+ __)   =   \ _0 -> (+ _0)
(__{f3 = 2}) Ctor   =   (\ _0 -> (_0{f3 = 2})) Ctor
__{f3 = 2} $ Ctor   =   (\ _0 -> _0{f3 = 2}) $ Ctor
(Ctor{f3 = __}) 2   =   (\ _0 -> (Ctor{f3 = _0})) 2
Ctor{f3 = __} $ 2   =   (\ _0 -> Ctor{f3 = _0}) $ 2
[__ ..]   =   \ _0 -> [_0 ..]
[__ ..] 3   =   (\ _0 -> [_0 ..]) 3
[__ .. __] 3 5   =   (\ _0 _1 -> [_0 .. _1]) 3 5
[__, __ ..] 3 5   =   (\ _0 _1 -> [_0, _1 ..]) 3 5
[__, __ .. __] 3 5 8   =   (\ _0 _1 _2 -> [_0, _1 .. _2]) 3 5 8
[f __ x | x <- [1 .. 3]] 2   =   (\ _0 -> [f _0 x | x <- [1 .. 3]]) 2
(__ :: Int -> Int) 2   =   (\ _0 -> _0 :: Int -> Int) 2