我不确定标题中的“专有状态管理”内容,我尽我最大的努力试图简明扼要地提出问题。
我正在将我的一些 C# 代码移植到 F# 尝试尽可能地惯用它。我有一个实体从我的数据库中的序列中请求多个 ID,然后将这些 ID 分配给需要的任何人。一旦给出了一个 id,它就不应该再可供其他任何人使用。因此,必须有某种与该实体相关联的状态来跟踪剩余的 ID 数量。由于使用可变状态不是惯用的,我能做的就是写这样的东西:
let createIdManager =
let idToStartWith = 127
let allowed = 10
let givenOut = 0
(idToStartWith, allowed, givenOut)
-
let getNextAvailableId (idToStartWith, allowed, givenOut) =
if givenOut< allowed
then ((idToStartWith, allowed, givenOut+ 1), Some(idToStartWith + givenOut))
else ((idToStartWith, allowed, givenOut), None)
let (idManager, idOpt) = getNextAvailableId createIdManager()
match idOpt with
| Some(id) -> printf "Yay!"
| None -> reloadIdManager idManager |> getNextAvailableId
这种方法是惯用的(据我所知)但非常脆弱。有很多方法可以弄乱它。我最大的担忧是,一旦一个 id 升级并制作了一个新的 id manager 副本,没有任何力量可以阻止您使用旧副本并再次获得相同的 id。
那么我如何在 F# 中进行排他状态管理?