Sử dụng đơn nguyên tiếp tục sau:StackOverflow trong việc tiếp tục đơn nguyên
type ContinuationMonad() =
member this.Bind (m, f) = fun c -> m (fun a -> f a c)
member this.Return x = fun k -> k x
let cont = ContinuationMonad()
Tôi không thấy lý do tại sao những điều sau đây mang lại cho tôi một chồng tràn:
let map f xs =
let rec map xs =
cont {
match xs with
| [] -> return []
| x :: xs ->
let! xs = map xs
return f x :: xs
}
map xs id;;
let q = [1..100000] |> map ((+) 1)
Trong khi sau không:
let map f xs =
let rec map xs =
cont {
match xs with
| [] -> return []
| x :: xs ->
let! v = fun g -> g(f x)
let! xs = map xs
return v :: xs
}
map xs id;;
let q = [1..100000] |> map ((+) 1)
Lưu ý rằng tôi trên VS 2012 RC, nếu có ai có thể kiểm tra nó có cùng một hành vi trên bản phát hành hiện tại của VS2010. –
Có, và nó cũng có hành vi tương tự trong OCaml. Xem câu trả lời của tôi dưới đây. – t0yv0
FWIW, hành vi này vẫn có thể được quan sát với VS2015, F # 4.0, Update 3 (mặc dù câu trả lời cho biết nó không thể đổ lỗi cho trình biên dịch). – Abel