I have quite a lot of code lying around that is written in C# and going into a new project, the most natural is to start with C# as the core application. Now when I am exploring the functional paradigm with F#, I still want to be able to call all the F# code from C#. In other words, the most natural is to add new functionality to my existing applications using F# and not try to accomplish the 'everything shall be written in F#' utopia.
This post is part of a series:
Functional Adventures in F# - A simple planner
Functional Adventures in F# - Calling F# from C#
Functional Adventures in F# - Using Map Collections
Functional Adventures in F# - Application State
Functional Adventures in F# - Types with member functions
Functional Adventures in F# - Getting rid of loops
Functional Adventures in F# - Getting rid of temp variables
Functional Adventures in F# - The MailboxProcessor
Functional Adventures in F# - Persisting Application State
Functional Adventures in F# - Adding Snapshot Persisting
Functional Adventures in F# - Type-safe identifiers
Functional Adventures in F# - Event sourcing lessons learned
After that, calling the F# code from C# is easy. Lets use the code that we wrote in the last post with the Planner module.
We had 2 different types described in the module, the ScheduledAction that was a record type and the Schedule that was a list of ScheduledActions.
Lets look at some code:
using System; using Microsoft.FSharp.Collections; namespace app.Components { public class Main { private FSharpList<Planner.ScheduledAction> _schedule; public bool Shutdown { get; set; } public void MainLoop() { while (!Shutdown) { var executableActions = Planner.getExecutableActions(DateTime.UtcNow, _schedule); foreach (var action in executableActions) { Execute(action); _schedule = Planner.removeFromSchedule(action, _schedule); } } } private void Execute(Planner.ScheduledAction action) { // execute business logic here } } }
As you an see, the Schedule type did not follow through as I expected. It is exposed a FSharpList<ScheduledAction>, i.e. we need to write the whole thing instead of just using Schedule. Other then that there seems to be nothing strange here. Planner is identified by intellisense as a class.
If we try to modify the name of the ScheduledAction that we have received from the F# code, the code will not compile but instead show you the error
Property or indexer 'Planner.ScheduledAction.name' cannot be assigned to -- it is read only |
So that is that, it just reference the FSharp.Core and your F# project from your C# project and you are good to go.
All code provided as-is. This is copied from my own code-base, May need some additional programming to work. Use for whatever you want, how you want! If you find this helpful, please leave a comment, not required but appreciated! :)
Hope this helps someone out there!
No comments:
Post a Comment