When writing a compiler, one typically annotates the syntax tree in various phases. What the nodes are annotated with will vary over the course of the program; one might add type information during a type synthesis phase.
I stumbled across a comment by András Kovács on compiler performance, which brought up some of the difficulties writing adequate compilers in lower-level languages such as C++ or Rust.
I have seen "strict data structures, lazy functions" bandied about among Haskellers. This is bad advice. Preferable is "know what you are doing."
Streaming via a C API presents a conundrum in Haskell: on the one hand, the C code is side effecting, on the other, we would like to provide a lazy API.
Though there are diverse tools for Haskell development many are not widely advertised; here I collect those I use.next