Usando la siguiente mónada continuación:Stackoverflow en mónada continuació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()
no veo por qué el siguiente me da un desbordamiento de pila:
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)
Aunque la siguiente no:
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)
Tenga en cuenta que estoy en VS 2012 RC, si alguien puede probar que tiene el mismo comportamiento en la versión actual de VS2010. –
Sí, y también tiene el mismo comportamiento en OCaml. Ver mi respuesta a continuación. – t0yv0
FWIW, este comportamiento todavía se puede observar con VS2015, F # 4.0, Actualización 3 (aunque las respuestas indican que no se puede culpar al compilador). – Abel