Utilizzando il seguente prosecuzione monade:StackOverflow in continuazione 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()
non riesco a capire perché il seguente mi dà un overflow dello stack:
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)
Mentre il seguente non lo fa:
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)
Si noti che io sono in VS 2012 RC, se qualcuno potesse testarlo ha lo stesso comportamento sulla versione corrente di VS2010. –
Sì, e ha anche lo stesso comportamento in OCaml. Vedi la mia risposta qui sotto. – t0yv0
FWIW, questo comportamento può ancora essere osservato con VS2015, F # 4.0, Update 3 (anche se le risposte indicano che non può essere incolpato nel compilatore). – Abel