но стек все равно остается, никуда от него мне кажется не убежать
просто тут мы используем хостовый стек (хаскельный) вместо ручного
go (Call f args) = (funs ! f) (go <$> args)
хоть в общем-то я не уверен, как ghc тут себя поведет, вроде бы тут не нужен стек