Это бы ответ на то, что мол сигнатура выглядит чересчур страшно.
Возьмём пример:
saveFile :: Path -> Bytes -> IO Unit saveFile p f = do
log ("Saving file" ++ show (name p) ++ " to " ++ show (parentDir p))
r <- httpPost ("cloudfiles.fooservice.com/" ++ (show p)) f
if (httpOK r) then log ("Successfully saved file " ++ show p)
else let msg = "Failed to save file " ++ show p
in log msg *> throwException (error msg)
Этот код плох, потому что трудно читаемый, трудно тестируемый, содержит слишком много деталей (логирование, ошибки, логику) в одном месте, не говоря уже о других проблемах.
А правильный подход в данном случае -- взять подход с композабельными эффектами, (TF, FM, polysemy, трансформеры), выделить в отдельную алгебру весь REST, в отдельную -- весь логгинг, обернуть нужные алгебры в логгинг и бизнес логику сформулировать в терминах абстрактных операций.
Кстати, само то, что сигнатура какая-то большая не является проблемой сама по себе, а свидетельство неправильных абстракций. Если там просто много параметров, то это не проблема :-)