А почему не рассматривать типы как дополнительную документацию к коду? Глядя на сигнатуру функции с аннотациями типов значительно проще понять что она делает
ну документовать можно через имя полей просто. И тайп хинты в кложе тоже есть, я пользуюсь активно как раз для доки.
У меня для документации к чистым функциям ещё и ассёрты рядом с ними лежат, которые исполняются при каждой перезагрузке неймспейса (dev time) и проверяют логику и форму данных.
А ко внешним эффектам – вызов функции в comment форме (comment (myfn [111 222])) И после каждого измения в логике его можно проверить мгновенно, без перезапуска программы :)