Проверьте, пожалуйста, правильно ли я это понимаю. Сумма в стиле передачи продолжений, написанная как упражнение.
let rec sumK (xs: int list) (k: int -> int) =
match xs with
| [] -> k 0
| x :: rest -> sumK rest (fun s -> k (s + x))
let xs = List.replicate 1_000_000 1
printfn "%d" (sumK xs id)
dotnet run -c Release печатает 1000000. Обычный dotnet run, то есть Debug, падает с переполнением стека. Тот же исходник, та же машина. Подозреваю хвостовые вызовы, ведь все вызовы там в хвостовой позиции, но не знаю, какая часть сборки это решает. Может, честное решение - что-то включить для Debug, а может, код вообще не должен на это полагаться.