Я сравнивал для разных языков разные скорости для выполнения следующей программы: для я от 1 до 1000000 сумм продукта я * (sqrt i)
Одна из моих реализаций (не единственная) - это создание списка [1..1000000], а затем сворачивание с помощью определенной функции.
Программа работает отлично и быстро в Haskell (даже при использовании foldl, а не foldl), но переполнение стека в OCaml и F #.
Вот код Haskell:
test = foldl (\ a b -> a + b * (sqrt b)) 0
create 0 = []
create n = n:(create (n-1))
main = print (test (create 1000000))
И вот OCaml one:
let test = List.fold_left (fun a b -> a +. (float_of_int b) *. (sqrt (float_of_int b))) 0. ;;
let rec create = function
| 0 -> []
| n -> n::(create (n-1)) ;;
print_float (test (create 1000000));;
Почему происходит переполнение стека OCaml/F #?