According to the GHC User’s Guide, explicitly bound implicit parameters are only propagated into recursive calls if the function has a type signature, and otherwise, the implicit parameters from the original call are used.
fu True = ?gn
fu False = let ?gn = not ?gn in fu True
br :: (?sp :: Bool) => Bool -> Bool
br True = ?sp
br False = let ?sp = not ?sp in br True
ghci> let ?gn = True in fu False
True
ghci> let ?sp = True in br False
False
However, what if I want to provide a type signature to fu while retaining its behaviour? Can I do that?