Я как императивщик до мозга костей часто попадаю в следующую ситуацию. Есть какое-то сложное вычисление, которое можно представить как чистую функцию. Но так как оно сложно, то разбиваем его на подфункции. Например, эквивалентый полупсевдокод на импертивном языке и хаскелле:
def func(args):
a = subfunc1(args)
b = subfunc2(a)
return subfunc3(b)
func args = subfunc3 b where
b = subfunc2(a)
a = subfunc1(args)
Функции работают одинаково, плюс относительно хаскелловской функции я знаю что она не зависит от глобального состояния и прочий хаскелловский блёрб.
Но тут ВНЕЗАПНО я понял, что хотел бы логгировать все случаи, когда subfunc1 выдал какой-то определенный результат. В случае с императивным кодом все просто
def func(args):
a = subfunc(args)
if some_condition(a):
logger.warning('Some shit happened')
....
В хаскелле для такого надо фактически все с нуля переписывать через какую-то монаду.
Вопрос, как правильно писать на хаскеле чтоб в такой ситуации отделываться минимальными изменениями кода?