You could separate the concerns of validation and the rest of the model update like this:
-- rename your current Model to RawModel
type alias Model =
{ raw : RawModel
, validated : ValidationModel
}
update : Msg -> Model -> Model
update msg model =
let
newRaw = rawUpdate msg model.raw
in
{ raw = newRaw
, validationModel = validate newRaw
}
rawUpdate : Msg -> RawModel -> RawModel
rawUpdate msg model =
case msg of
NameChange name ->
{ model | name = name }
...
If that seems better to you, you might also want to consider modeling the validation result as something like Result String ValidatedModel or Result (List String) ValidatedModel (that will let you more easily compose functions are your model expands to have more validations).