F#: Setting properties like named parameters
One of the most frustrating things for me lately about interacting with C# libraries from F# has been setting up objects through the use of properties.
While I am against the use of setters to construct objects in the first place, that’s the way that a lot of libraries work so it’s a bit of a necessary evil!
In C# we would typically make use of the object initializer syntax to do this, but in F# I’ve been writing code like this to do the same thing:
type MessageBuilder(?message:string, ?user:string) =
let buildMessage message user =
let twitterStatusBuilder = new TwitterStatus()
twitterStatusBuilder.Text <- message
twitterStatusBuilder.User <-
let userBuilder = new TwitterUser()
userBuilder.ScreenName <- user
userBuilder
twitterStatusBuilder
member self.Build() =
buildMessage (if message.IsSome then message.Value else "") (if user.IsSome then user.Value else "")
This is more verbose than strictly necessary but I wanted to try and ensure all mutations to objects were being done within the function creating it rather than creating an object and then mutating it which feels strange to me in F# land.
I recently realised that it’s actually possible to call properties in the same way that we can create objects using named parameters.
We therefore end up with the following code:
type MessageBuilder(?message:string, ?user:string) =
let buildMessage message user = new TwitterStatus(Text = message, User = new TwitterUser(ScreenName = user))
member self.Build() =
buildMessage (if message.IsSome then message.Value else "") (if user.IsSome then user.Value else "")
Which is much more concise and does the same thing.
About the author
I'm currently working on short form content at ClickHouse. I publish short 5 minute videos showing how to solve data problems on YouTube @LearnDataWithMark. I previously worked on graph analytics at Neo4j, where I also co-authored the O'Reilly Graph Algorithms Book with Amy Hodler.