Я пытаюсь разобраться с определением конструктора с отслеживанием состояния и не могу обойти некоторые ошибки компилятора.
type Movement =
| Left of int
| Right of int
type MovementState = Movement list -> Movement list
type MovementBuilder () =
member x.Zero () : MovementState = id
member __.Return x : MovementState = id
member __.Bind(m: MovementState, f: MovementState ) = fun v -> f (m v)
[<CustomOperation("left", MaintainsVariableSpaceUsingBind = true)>]
member x.Left(ms, value) = x.Bind(ms, fun xs -> xs @ [Left value])
[<CustomOperation("right", MaintainsVariableSpaceUsingBind = true)>]
member x.Right(ms, value) = x.Bind(ms, fun xs -> xs @ [Right value])
let movement = MovementBuilder()
[]
|> movement {
left 10
right 20
}
|> printfn "list %A"
//prints [Left 10; Right 20]
Однако теперь я хочу ввести let!
или yield
, чтобы я мог добавлять дополнительные элементы, не проходя через определенные CustomOperations, чтобы, например, я мог сделать следующее
[]
|> movement {
left 10
let! _ = (fun xs -> xs @ [Right 99])
//I also tried naming the value
//let! x = (fun xs -> xs @ [Right 99])
//I also tried wrapping it into another function ...
//let! x = fun () -> (fun xs -> xs @ [Right 99])
right 20
}
|> printfn "list %A"
//Should print [Left 10; Right 99; Right 20]
Любая помощь приветствуется. Bonus Karma будет отправлена за объяснение того, как компилятор переписывает это в серию Bind
s
Спасибо
Movement list
(на самом деле вы не делаете больше) - просто комментирую, потому что я действительно не знаю, что вы пытаетесь сделать - person Random Dev   schedule 14.06.2017yield
вместоdo!
? - person robkuz   schedule 14.06.2017left
/right
в конструктор, а просто сделал бы их функциями - person Random Dev   schedule 15.06.2017