This article was a pleasure to read, but as for a beginner I am it left some questions unanswered. I understand that this article is not an ultimate guide to haskell, but still I hope for some clarification on these cases.
Where data validation should be implemented? Does one provide smart constructors which return Validation type or it should be done in use cases layer and domain layer itself left only to work on valid data?
Some computations are better handled by the database engine. Say, we want to get all historical reservations by one person, maybe ordered by date or size of reservation. Of course this could be done purely, but database engines provide their capabilities for performing such actions and in some cases they may be more performant. Is this the price we pay for using this architecture or a there implementations for that? Also when database grows too big you probably don't want to load a whole table into memory, only a specific section of it. How does one implements data structure for such sectioning of data?
How to apply multiple interfaces to same use cases? Say, I want a REST API but also a WebSockets server running simultaneously and sharing the same state. But also additional interfaces should be completely optional and for an app to function at least one has to be provided.
While this may sound somewhat offtopic, I personally think these are general questions, answers to which may help build an understanding of whole idea and some intuition on applying it.
I'm wondering if we want to change the server to serverless, is it easy to do that? If we treat the server is an effect, can we just change the interpreter?