So that is how I got interested in playing with this stuff. In order to actually learn it, and not just read about it, I've been finding and inventing little exercise problems and solving them in F#. F# is a multiparadigm language, but I've been focusing on the pure Functional portions of the language for now. I thought I'd share these problems and my solutions on the blog. The best thing that could come from this is if you, dear reader, would also solve these problems in the language of your choice and share back your solution. Or if you know F# but don't want to actually fully implement a solution to these, I'd love feedback on how you might have solved the problems differently.
The first problem I want to share is a Graph parsing problem:
Given a graph G, return a list of all the connected graphs in G: [G1, G2, ...].Here's an example input graph and the expected output:
And here's the code:
Some of things I really enjoy about this code:
- I love nesting simple little functions inside other functions to give names to boilerplate code (ex: isSeen and notSeenOnly)
- The recursive walk method is stunningly elegant
- "Map.ofList g" is a cool line of code. g is a Graph record, but it's defined as a list, and so can be treated like a list.
- List.collect combines all the returned lists into one list
- It's also cool that the map variable is in scope inside of the walk function because it's closed over from the findConnectedGraph method.
- The recursive list comprehension of findAllConnectedGraphsWorker totally blows my mind. Using yield as expected, but then calling itself with yield! is crazy!
I'm sure there is a lot about this code that could be improved. There are probably better algorithms too. I'd love to hear your ideas and read your implementations of this problem!