Значение или конструктор не определены
Я изучаю f# , и у меня есть довольно тривиальная проблема, которая, похоже, не имеет смысла. Я работаю над проблемой 2 проекта Эйлера, и у меня есть это:
let fib (x : BigInteger) (y : BigInteger) (max : BigInteger) = 
    let added = x + y
    if added > max then y
    else fib y (x + y) max
У меня есть ошибка при рекурсивном вызове fib:
значение или конструктор 'fib' не определен
и я не уверен, почему. Любой помочь?
3 ответов
В F#, Если вы хотите написать рекурсивную функцию, вы должны использовать на rec ключевое слово:
let rec fib (x : BigInteger) (y : BigInteger) (max : BigInteger) = 
    let added = x + y
    if added > max then y
    else fib y (x + y) max
это потому, что в F# при нормальных обстоятельствах, вы можете использовать идентификаторы, объявленные до текущий код, в отличие от C#.
говорить Задача Проекта Эйлера 2, вы можете рассмотреть вместо рекурсии происходит с Seq.unfold, что очень идиоматично и дает вам все числа Фибоначчи сразу:
let fibs = Seq.unfold (fun (current, next) ->
    Some(current, (next, current + next))) (1,2)
теперь fibs представляет ленивую последовательность чисел Фибоначчи:
>fibs;;
val it : seq<int> = seq[1; 2; 3; 5; ...]
и сделать его BigInteger просто заменить (1,2) by (1I,2I), хотя решение позволяет оставаться в рамках простых чисел.
