exercism / fsharp

Exercism exercises in F#.
https://exercism.org/tracks/fsharp
MIT License
109 stars 97 forks source link

Extending the learning syllabus: a tentative plan #1247

Open colinleach opened 2 months ago

colinleach commented 2 months ago

Concept tree for F# learning mode

Live exercises and concepts

Solid green means both are merged and the exercise is available to students.

Some that are already in progress or planned

This is a very fluid plan and will doubtless continue to change frequently!

Boxes with green borders have the exercise + concept PRs submitted.

Progress tracking

For anyone interested in the boring details, there is a tracking sheet.

graph TD

start(("Start")) --basics--> basics["lasagna"]
style basics fill:#0f0

basics --booleans--> booleans["annalyns-infiltration"]
style booleans fill:#0f0

booleans --if-then-else--> if-then-else["cars-assemble"]
style if-then-else fill:#0f0

strings --numbers--> numbers["cars-assemble"]
style numbers fill:#0f0

strings -.chars.-> chars["squeaky-clean"]
style chars fill:#0f0

if-then-else -.chars.-> chars["squeaky-clean"]
style chars fill:#0f0

 if-then-else -..- numbers

if-then-else --pattern-matching--> pattern-matching["guessing-game"]
style pattern-matching fill:#0f0

numbers --pattern-matching--> pattern-matching["guessing-game"]
style pattern-matching stroke:#f00

numbers --datetimes--> datetimes["booking-up-for-beauty"]
style datetimes fill:#0f0

numbers --floating-point-numbers--> floating-point-numbers["interest-is-interesting"]
style floating-point-numbers fill:#0f0

numbers -.integral-numbers.-> integral-numbers["hyper-optimized-telemetry"]
style integral-numbers stroke:#f00

pattern-matching -.expressions.-> expressions["??"]
style expressions stroke:#f00

basics --strings--> strings["log-levels"]
style strings fill:#0f0

basics -.modules??.-> modules["??"]
style modules stroke:#f00

pattern-matching --tuples--> tuples["tisbury-treasure-hunt"]
style tuples fill:#0f0

pattern-matching --arrays--> arrays["bird-watcher"]
style arrays fill:#0f0

pattern-matching --recursion--> recursion["pizza-pricing"]
style recursion fill:#0f0

pattern-matching --lists--> lists["tracks-on-tracks-on-tracks"]
style lists fill:#0f0

lists -.higher-order-functions.-> higher-order-functions["secret-agent ?"]
style higher-order-functions stroke:#f00

higher-order-functions -.function-composition.-> function-composition["??"]
style function-composition stroke:#f00

pattern-matching --records--> records["bandwagoner"]
style records fill:#0f0

records -.generic-types.-> generic-types["??"]
style generic-types stroke:#f00

generic-types -.maps.-> maps["international-calling-connoisseur ?"]
style maps stroke:#f00

generic-types -.sets.-> sets["face-id2"]
style sets stroke:#f00

generic-types -.mutation.-> mutation["??"]
style mutation stroke:#f00

mutation -.fields.-> fields["??"]
style fields stroke:#f00

records -.classes.-> classes["elons-toys"]
style classes stroke:#f00

pattern-matching -.exceptions.-> exceptions["calculator-conundrum"]
style exceptions stroke:#f00

exceptions -.overflows.-> overflows["hyperinflation-hits-hyperia"]
style overflows stroke:#f00

options -..-> error-handling["??"]
style error-handling stroke:#f00

exceptions -.error-handling.-> error-handling["??"]
style error-handling stroke:#f00

classes -..-> inheritance["wizard-and-warriors"]
style inheritance stroke:#f00

basics --discriminated-unions--> discriminated-unions["valentines-day"]
style discriminated-unions fill:#0f0

discriminated-unions -.inheritance.-> inheritance["wizards-and-warriors"]
style inheritance stroke:#f00

inheritance -.string-formatting.-> string-formatting["high-school-sweethearts"]
style string-formatting stroke:#f00

discriminated-unions -.options.-> options["??"]
style options stroke:#f00

options -.results.-> results["??"]
style results stroke:#f00

classes -.method-overloading.-> method-overloading["wizards-and-warriors-2"]
style method-overloading stroke:#f00

method-overloading -.constructors.-> constructors["need-for-speed"]
style constructors stroke:#f00

inheritance -.attributes.-> attributes["attack-of-the-trolls"]
style attributes stroke:#f00

classes -.properties.-> properties["weighing-machine"]
style properties stroke:#f00

properties -.static-members.-> static-members["??"]
style static-members stroke:#f00

static-members -.operator-overloading.-> operator-overloading["??"]
style operator-overloading stroke:#f00

Other stuff to add:

graph TD

TODO -.memory-allocation.-> memory-allocation["??"]
style memory-allocation stroke:#f00

TODO -.type-inference.-> type-inference["??"]
style type-inference stroke:#f00

TODO -.continuations.-> continuations["??"]
style continuations stroke:#f00

TODO -.structs.-> structs["land-grab-in-space ?"]
style structs stroke:#f00

What do we do about these?

ErikSchierboom commented 2 months ago

What do we do about these?

LINQ Regex

I think it's fine to ignore LINQ, as it seems to be not used a lot and has a ton of disadvantages over using the built-in functions (like no partial application).

Regex is definitely something we should be teaching, at least how to use it in F# (we don't have to make it a full regex course).

ErikSchierboom commented 2 months ago

Thanks for putting this together! It's really useful to see what the status is. One remark is that before we port any C# exercise, we should carefully consider if that exercise is good enough. Some of the later C# exercises are not entirely up to the standard we have for the first exercises. Porting from Elixir is also a good option, as they have an excellent syllabus.

colinleach commented 2 months ago

Porting from Elixir is also a good option, as they have an excellent syllabus.

Good tip. I also like their style of writing the introduction.md, where C# sometimes leans towards terseness.