Устранение моего явного состояния, проходящего через подобные, монады и прочее

Я работаю над книгой Land of Lisp на F # (да, странно, я знаю). В своем первом примере текстового приключения они используют мутацию глобальной переменной, и я бы хотел ее избежать. Моя монада-фу слабая, поэтому прямо сейчас я делаю некрасивую передачу состояния следующим образом:

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, если это помогает; я знаю, что для него есть пример кода на F #. )

10
задан Joshua Taylor 17 February 2015 в 17:52
поделиться