Хотя вероятнее всего есть более эффективные способы решения вашей конкретной проблемы (см., например, ответ Дэниела Вагнера), вы всегда можете использовать let
для ввода нового имени в произвольной области. Вот, по общему признанию, бессмысленная демонстрация:
main = do
inFH <- return "inf"
outFH <- return "ouf"
let subAction = do
if length inFH > 2
then print "foo"
else subSubAction
subSubAction = case outFH of
[] -> print "bar"
_ -> print "baz"
forM [1..10] $ \ item -> do
print item
subAction