Rich domain models, inspired by imperative objective-oriented approaches, dominate our industry. But lean domain models are a compelling alternative. By separating behaviour and state, lean models offer an effective way to represent units of behaviour. This session will explore how to represent a lean domain model using a functional programming paradigm. You'll explore how types can be used as a natural way to represent business constraints alongside smart constructors and functional validation. You will also learn how type properties can be modelled with property based testing, how behaviour can be better composed, how to keep domain behaviour isolated from application state, and much more.