F#类型“ int列表”与类型“ int”不匹配

时间:2018-08-12 12:35:19

标签: types f#

我正在尝试构建一个包含斐波那契数列的列表,但是当我稍后再调用该函数时,它告诉我int列表与int不匹配,

let rec fibonacci x list =
    if List.head list > x then List.tail list
    else fibonacci x (List.append (List.head list + (List.head (List.tail list))) list)


let x = 10
let list = [1;2]
let fibonacciList = fibonacci x list
printf "%A" fibonacciList

表示编辑器在最后第二行的函数调用中。
我是F#的新手,我敢肯定这是一个基本的定义错误,但我无法弄清楚它是什么

1 个答案:

答案 0 :(得分:3)

当您删除对fibonacci函数的调用时,编译器实际上揭示了真正的错误:error FS0071: Type constraint mismatch when applying the default type ''a list' for a type inference variable. The types ''a' and ''a list' cannot be unified. Consider adding further type constraints

这很难理解,但基本上实现有问题。我认为问题是您使用List.append。它应该有两个列表,但是您要为其提供一个int和一个int list。您可以使用::运算符将一项添加到列表的前面:

let rec fibonacci x list =
    if List.head list > x then List.tail list
    else fibonacci x ((List.head list + (List.head (List.tail list))) :: list)

这是等效的实现,它使用模式匹配来简化代码:

let rec fibonacci x list =
    match list with
    | a :: b :: rest ->
        if a > x then b :: rest
        else fibonacci x (a + b :: list)

请注意,编译器会警告匹配项不完整。如果列表中的项目少于2个,则此函数将引发异常。

还要注意,这不能正常工作:它不会产生斐波那契数列。我将把它留给您修复。