Visual Studio F#错误

时间:2009-05-09 07:17:15

标签: visual-studio f# intellisense

我正在学习F#,我遇到了一个智能感知错误

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 个答案:

答案 0 :(得分:4)

如果您在交互式控制台中输入该代码,您可能希望打印出答案。但是在程序中,您需要编写一行代码来执行fib函数返回的值。要么给结果命名,要么将其写入控制台(其类型为unit,即“没有返回值的动作”),或类似的东西。

答案 1 :(得分:0)

我想我可能会补充说你错误地定义了你的斐波那契复发。看看你的代码:

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 - &gt; INT

[0 .. 8] |> List.map fib;;

val it:int list = [0; 1; 1; 2; 3; 5; 8; 13; 21]

现在这是正确的顺序。