Я подумал, что могу добавить, что вы неправильно определяете рецидив Фибоначчи. Посмотрите здесь на ваш код:
let rec fib n =
match n with
| 1 -> 1
| 2 -> 2
| _ -> fib(n-1) + fib(n-2);;
Теперь давайте сопоставим эту функцию со списком:
[0 .. 8] |> List.map fib
Процесс завершен из-за StackOverflowException.
Обнаружено завершение сеанса.
Нажмите Enter, чтобы перезапустить.
Упс.
Даже если я настрою понимание списка так, чтобы оно не включало ноль:
[1 .. 8] |> List.map fib
val it: int list = [1; 2; 3; 5; 8; 13; 21; 34]
Мы получаем что-то похожее на последовательность Фибоначчи, но не на точную последовательность ... Вы можете не подумать, что это важно для изучения причин, по которым произошла ваша ошибка ...
Но посмотрите внимательно на это сейчас ... также обратите внимание, что я использую 'n' вместо '_':
let rec fib n =
match n with
| 0 -> 0
| 1 -> 1
| n -> fib(n-1) + fib(n-2);;
val fib: int -> int
[0 .. 8] |> List.map fib;;
val it: int list = [0; 1; 1; 2; 3; 5; 8; 13; 21]
Теперь это правильная последовательность.