Saturday, February 13, 2021
The focus of the talk is to emphasize the importance of algebraic thinking when designing pure functional domain models. The talk begins with the definition of an algebra as consisting of a carrier type, a set of operations/functions and a set of laws on those operations. Using examples from the standard library, the talk shows how thinking of abstractions in terms of its algebra is more intuitive than discussing its operational semantics. The talk also discusses the virtues of parametricity and compositionality in designing proper algebras. Algebras are compositional and help build larger algebras out of smaller ones. We start with base level types available in standard libraries and compose larger programs out of them. We take a real life use case for a domain model and illustrate how we can define the entire model using the power of algebraic composition of the various types. We talk about how to model side-effects as pure abstractions using algebraic effects. At no point we will talk about implementations. At the end of the talk we will have a working model built completely out of the underlying algebra of the domain language.
This talk will show a few simple and easy to implement tips writing models in Scala. It will answer questions like:
* how can I compare entities from DDD if case classes always compare all fields?
* do I have to give up on non-flat models if my persistence implementation doesn’t like them?
* do I have to pollute my models with annotations and implicits used by e.g. JSON serialization libraries?
* if I want to use things like Scala newtype or Refined, do I really have to several imports in every file that uses them?
* if I am dedicated used o Cats who uses import cats.implicits._ everywhere, do I really have to import it in every single file?
* does it always have to be so painful to update nested immutable model or to transform one object into another?
Some programmers take these for granted, while a lot of them still struggle with writing repetitive or needlessly complex code. This talk will help you go from the later to the former.