Я пытаюсь создать решение с библиотекой более низкого уровня, которая будет знать, что ей нужно сохранять и загружать данные при вызове определенных команд, но реализация функций сохранения и загрузки будет предоставлена в платформенно-зависимом проекте. который ссылается на библиотеку более низкого уровня.
У меня есть несколько моделей, например:
type User = { UserID: UserID
Situations: SituationID list }
type Situation = { SituationID: SituationID }
И то, что я хочу сделать, это иметь возможность определять и вызывать такие функции, как:
do saveUser ()
let user = loadUser (UserID 57)
Есть ли способ четко определить это в функциональной идиоме, желательно, избегая изменяемого состояния (которое в любом случае не должно быть необходимым)?
Один из способов сделать это может выглядеть примерно так:
type IStorage = {
saveUser: User->unit;
loadUser: UserID->User }
module Storage =
// initialize save/load functions to "not yet implemented"
let mutable storage = {
saveUser = failwith "nyi";
loadUser = failwith "nyi" }
// ....elsewhere:
do Storage.storage = { a real implementation of IStorage }
do Storage.storage.saveUser ()
let user = Storage.storage.loadUser (UserID 57)
И на этот счет есть вариации, но все, что я могу придумать, связаны с каким-то неинициализированным состоянием. (В Xamarin также есть DependencyService, но я хотел бы избежать этой зависимости.)
Есть ли способ написать код, который вызывает функцию хранения, которая еще не реализована, а затем реализовать ее БЕЗ использования изменяемого состояния?
(Примечание: этот вопрос не о самом хранилище — это просто пример, который я использую. Он о том, как внедрять функции без использования ненужного изменяемого состояния.)