Интересно, как моделировать отношения в функциональном программировании.
Давайте возьмем сотрудников, например: сотрудники могут дружить с 0..n коллегами. Дружба всегда взаимна: если A друг B, то B друг A.
Как я могу смоделировать это? У меня было 3 идеи (перечислены ниже). У каждого из них есть свои недостатки.
Первая попытка:
type Employee =
{ name : string
friendships : Employee list
}
// My list is mutable because I want to be able to update employees.
// I suppose the same problems would occur with e. g. Elmish.
let mutable employees : Employee list = [ (* ... *) ]
(* Downsides:
Friendships are copies. Changes to an employee would have to be propagated manually.
*)
Вторая попытка:
type EmployeeId = int
type Employee =
{ id : EmployeeId
name : string
friendships : EmployeeId list
}
let mutable employees : Employee list = [ (* ... *) ]
(* Downsides:
Friendships are not modeled as mutual.
When the friendship of an employee changes,
the friend's friendships don't change accordingly.
*)
Третья попытка:
type EmployeeId = int
type Friendships = list<EmployeeId * EmployeeId>
type Employee =
{ id : EmployeeId
name : string
}
let mutable employees : Employee list = [ (* ... *) ]
(* Downsides:
After deleting an employee from the list,
employeeFriendships contain invalid "references"
to the deleted Employee.
*)
Может ли это быть сделано лучше? Спасибо.