Acquire a resource, use it, then release it back.
The bracket pattern is common in Haskell for getting a resource
ρ needed for a computation, preforming that computation, then
returning the resource back to the system. Common examples are when
making database connections and doing file or network operations,
where you need to make sure you "close" the connection afterward
before continuing the program so that scare resources like file
handles are released.
Typically you have an open and close action that return and take a
resource respectively, so you can use those directly, and use a lambda
in the third action to actally get at the resource and do something
with it when you need it:
bracket
(openConnection)
(closeConnection)
(c -> do
this
thatAndNow
theOtherThingThatNeeds c
)
Note that
bracket does
not catch the exception if one is
thrown! The finalizer will run, but then the exception will continue
to propogate its way out of your program's call stack. Note also that
the result of the cleanup action
γ is ignored (it can be
() or anythign else; it will be discarded).