3 ms·
Thats not how f# works normally. Normally you chain option operations with either binds, or you do a match(Which is exhaustive). Directly accessing the value
by UK-Al05 7y ago
Thats not how f# works normally.
Normally you chain option operations with either binds, or you do a match(Which is exhaustive).
Directly accessing the value is normally frowned upon.
This guy either needed to make the option type go away, or filter out the None and pass that into average. List.choose could be used for this
let average (customers : Customer list) =
match customers with
| [] -> Error "list was empty"
| _ ->
customers
|> List.choose(fun c -> c.Credit) # Would remove the option type. Any nones would be filtered out the list
|> List.average
|> Ok
This is the best I could think off without a computer
- vikestep 7y agoIn support of the article, your code would still throw an exception if all the customers in the list have missing credit. https://github.com/dotnet/fsharp/blob/master/src/fsharp/FSharp.Core/list.fs#L627 https://github.com/dotnet/fsharp/blob/master/src/fsharp/FSha... You could instead write it as the following to handle that. let average (customers : Customer list) = customers |> List.choose (fun c -> c.Credit) |> function | [] -> Error "no customers with credit" | xs -> Ok (List.average xs)
- UK-Al05 7y agoIndeed. I was remembering the behaviour of average off the top of my head.