我正在学习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'
有谁知道我如何解决这个问题?
答案 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]
现在这是正确的顺序。