Visual Studio F # Ошибка - PullRequest
       22

Visual Studio F # Ошибка

1 голос
/ 09 мая 2009

Я изучаю F #, и я обнаружил ошибку intellisense

let rec fib n = 
    match n with
    | 1 -> 1
    | 2 -> 2
    | _ -> fib(n-1) + fib(n-2)

fib 6 <-- This line says "This expression should have type 'unit', but has type 'int'

Кто-нибудь знает, как это исправить?

Ответы [ 2 ]

4 голосов
/ 09 мая 2009

Если вы вводите этот код в интерактивную консоль, вы ожидаете, что он напечатает ответ. Но в программе вам нужно написать строку кода, которая делает что-то со значением, возвращаемым вашей fib функцией. Либо дайте результату имя, либо запишите его в консоль (которая будет иметь тип unit, то есть «действие без возвращаемого значения»), или что-то в этом роде.

0 голосов
/ 09 мая 2009

Я подумал, что могу добавить, что вы неправильно определяете рецидив Фибоначчи. Посмотрите здесь на ваш код:

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]

Теперь это правильная последовательность.

...