I'm new to F# and functional programming in general (coming from an object oriented background). I just wanted to get some criticism on an algorithm for assigning jobs to crew members. I want to be as functional as possible and avoid loops and mutable state. Here is what I've come up with.
let rec AssignJobs crewMembers jobs jobAssignments =
let AssignJob job crewMembers =
let bestCrewMember = crewMembers |> Seq.sortWith crewMemberComparison
|> Seq.head
{CrewMember = bestCrewMember; Job = job}
match jobs with
| job :: remainingJobs ->
let jobAssignment = AssignJob job crewMembers
let remainingCrewMembers = crewMembers |> Seq.filter ((<>)jobAssignment.CrewMember)
AssignJobs remainingCrewMembers remainingJobs (jobAssignments @ [jobAssignment])
| [] -> jobAssignments
Assume that crewMemberComparison
is working for this review. I'm more concerned about whether I have a good approach to managing the crewMembers
, jobs
and jobAssignments
sequences.
I don't like how I have to invoke this with an empty list i.e.
let assignedJobs = AssignJobs crewMembers jobs []
Is there another way? Is recursion the best solution at all (presuming I'm not allowed to loop)?
Thanks in advance!