There has been a lot of criticism of clean code and inheritance in recent years, ranging from too many layers of abstraction, to performance issues. I've recently started programming in F# and they use a lot of Small types, Records, Discriminated unions etc. My understanding is this is common in all functional languages. I don't have enough experience with FP to say anything other than they seem nice. But by judiciously using them will I fall into the same traps as people do in a heavily Object Oriented code base?