Como a depuração é alcançada em uma linguagem de programação funcional preguiçosa?

Eu gostaria de saber como a depuração é obtida em uma linguagem funcional preguiçosa.
Você pode usar pontos de interrupção, instruções de impressão e técnicas tradicionais? Isso é mesmo uma boa ideia?
Entendo que a programação funcional pura não permite efeitos colaterais, com exceção das mônadas.
A ordem de execução também não é garantida.
Você teria que programar uma mônada para cada seção do código que você quer testar? Eu gostaria de algumas dicas sobre essa questão de alguém mais experiente nessa área.