F# field-level input validation errors
F#
type Errors = Map<string, string list>
let validateUser (name: string) (email: string) (age: int) : Errors =
[ if String.IsNullOrWhiteSpace name then yield "name", "name is required"
if not (email.Contains "@") then yield "email", "must contain @"
if age < 18 then yield "age", "must be 18 or older"
if age > 130 then yield "age", "must be 130 or younger" ]
|> List.fold (fun acc (field, msg) ->
Map.add field (msg :: (Map.tryFind field acc |> Option.defaultValue [])) acc) Map.empty
let showErrors errors =
errors |> Map.iter (fun field msgs -> printfn "%s: %s" field (String.concat "; " msgs))
validateUser "" "ada" 15 |> showErrors