Utilisation de la monade de continuation suivante:StackOverflow dans le prolongement monade
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()
Je ne vois pas pourquoi ce qui suit me donne un débordement de pile:
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)
Bien que ce qui suit ne pas:
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)
Notez que je suis sur VS 2012 RC, si quelqu'un pouvait le tester a le même comportement sur la version actuelle de VS2010. –
Oui, et il a aussi le même comportement dans OCaml. Voir ma réponse ci-dessous. – t0yv0
FWIW, ce comportement peut encore être observé avec VS2015, F # 4.0, mise à jour 3 (bien que les réponses indiquent qu'il ne peut pas être attribué au compilateur). – Abel