消除我通过like,monads和stuff传递的显式状态
我正在研究F#中的Land of Lisp一书(是的,我很奇怪)。对于他们的第一个示例文本冒险,他们使用全局变量变异,我想避免它。我的monad-fu很弱,所以现在我正在做这样丑陋的状态:
let pickUp player thing (objects: Map<Location, Thing list>) =
let objs = objects.[player.Location]
let attempt = objs |> List.partition (fun o -> o.Name = thing)
match attempt with
| [], _ -> "You cannot get that.", player, objs
| thing :: _, things ->
let player' = { player with Objects = thing :: player.Objects }
let msg = sprintf "You are now carrying %s %s" thing.Article thing.Name
msg, player', things
let player = { Location = Room; Objects = [] }
let objects =
[Room, [{ Name = "whiskey"; Article = "some" }; { Name = "bucket"; Article = "a" }];
Garden, [{ Name = "chain"; Article = "a length of" }]]
|> Map.ofList
let msg, p', o' = pickUp player "bucket" objects
// etc.
如何分析显式状态以使其更漂亮? (假设我有权访问State monad类型;如果有帮助的话我可以访问它;我知道F#中有示例代码。)
没有找到相关结果
已邀请:
2 个回复
究补闯
函数来线程化玩家的库存和世界状态,这里有一种方法:
傻零凰死授
类型:
使用monads隐藏可变状态在F#中并不常见。使用monads为您提供了基本相同的命令式编程模型。它隐藏了状态的传递,但它并没有改变编程模型 - 有一些可变状态使得无法并行化程序。 如果该示例使用变异,则可能是因为它是以命令方式设计的。您可以更改程序体系结构以使其更具功能性。例如,
函数可以返回表示选择项目的请求的某个对象,而不是选择项目(并修改播放器)。然后世界将有一些引擎来评估这些请求(从所有玩家收集)并计算世界的新状态。