I'm wanting to model a family tree in the F# type system. The basic requirements:
- A family tree is made up of
family members
- A
family member
has a requiredancestor
- A
family member
has an optionalpartner
My struggle is what to do with the "root" family member. I thought about making it an option
:
type FamilyMember = { Name:string; Ancestor:FamilyMember option; ... }
but it seems all family members are required to come from somewhere.
So, that lead me to think an ancestor
union type, where either it is an empty root
or it is a descendant
. Is there a cleaner way?
Here's what I have:
type Person = string
type FamilyMember = {
Person: Person
Partner: Person option
Ancestor: Ancestor
}
and Ancestor =
| Root
| Descendent of FamilyMember
let joe = { Person = "joe"; Partner = Some("joyce"); Ancestor = Root; }
let steve = { Person = "steve"; Partner = Some("pat"); Ancestor = Descendent(joe) }
let megan = { Person = "megan"; Partner = None; Ancestor = Descendent(steve)}
megan