| Let me address your criticism from Scala's point of view > they are very blunt I'm more blunt than the complier usually. I really want 'clever' programs to be rejected. In rare situations when I'm sure I know something the complier doesn't, there are escape hatches like type casting or @ignoreVariace annotation. > the problem of how to express your invariants within the type system The decision of where to stop to encode invariants using the type system totally depends on a programmer. Experience matters here. > Our program can't "pass through" this data from one end to an other It's a valid point, but can be addressed by passing data as tuple (parsedData, originalData). > What if there's a new Tag added? What if the Category tag adds a new field? If it doesn't require changes in your code, you've modelled your domain wrong - tags should be just a Map[String, String]. If it does, you have to refactor+redeploy anyway. > What about something like updating all updatable fields of an object I'm not sure what exactly you meant here, but if you want to transform object in a boilerplate-free way, macroses are the answer. There is even a library for this exact purpose: https://scalalandio.github.io/chimney/! C# and Java have to resort to reflection, unfortunately. |