I just want to point out that this is question is not the reverse of
Best approach for designing F# libraries for use from both F# and C#
Here I'm not asking how to design a functional library written C# to be used in both worlds.
I'd like to know good practices on what design choices embrace or avoid to get a reasonable compromise for make this library usable from F#.
Practices like (for example):
keep object hierarchy as simple as possible
avoid mutating state of objects, but return new ones
etc...
Anyone that already done it, can share it's experience?
Side note
It's interesting note this OSS project, IronJS. Yes, it's written in F#, but the author expose two specialized host IronJS.Hosting.FSharp
and IronJS.Hosting.CSharp
.
Key Points of the Air Conditioning Design Process:Carry out a detailed site survey. Calculate the required heating and/or cooling load. Identify a range of suitable units with the required capacity. Discuss the options with our customer and make recommendations.
What sort of factors are there to consider when designing HVAC systems? Well, there's equipment sizing, ductwork installation, ventilation, design protocols and code compliance to name a few.
Air Con Design: Needs Every industrial and commercial setting will have different demands and challenges, so the air conditioning system will need to be designed differently. The air con system should offer all the features required and nothing more. It needs to be functional and efficient, but not overly expensive.
Imagine one day you would like to rewrite your C# library in F# for better usability. Here are the paths you are likely to take:
I focus on the path "Imperative C# --> Functional C# --> Functional F# --> Idiomatic F#". The more functional your C# library is, the more usable your library is in F#. Functional style helps increase composability and is closer to idiomatic F# code. Along these lines, you can:
readonly
first.The picture above is taken from F# for fun and profit's Porting from C# to F# series. They are very helpful; knowing how C# concepts are expressed in F# will improve usability of your library.
It's hard to avoid C#'s object-oriented features. Remember that F# type inference doesn't work very well with these features. Along the line of keeping object hierarchy simple, you should reduce number of member overloads. A big number of member overloads will easily confuse F# type checker. Moreover, it doesn't hurt to distribute a thin F# wrapper with your C# library. Certain things you need to do are turning some methods into module functions and creatingActive Patterns to decompose object hierarchy.
Interop with existing .NET libraries was a major design goal of F#, so there aren't any constraints on the libraries to be consumed.
That said, because of F#'s stricter typing, there are some patterns that result in slightly clunkier code. The builder pattern is one.
var bldr = new StringBuilder();
bldr.Append("abc"); //ignoring return value
vs.
bldr.Append("abc") |> ignore //must be explicitly ignored
But this is easily worked around using an extension method or let-bound function. Bottom line: interop is one of F#'s strengths and greatest achievements.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With