【问题标题】:F# Type 'int list' does not match the type 'int'F# 类型“int list”与类型“int”不匹配
【发布时间】:2018-08-12 12:35:19
【问题描述】:

我正在尝试构建一个包含斐波那契数列数字的列表,但是当我稍后尝试调用该函数时,它告诉我 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# 新手,我确定这是一个基本定义错误,但我不知道它是什么

【问题讨论】:

    标签: types f#


    【解决方案1】:

    当您删除对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 个项目,此函数将引发异常。

    另请注意,这不能正常工作:它不会产生斐波那契数列。我会把它留给你来解决这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-16
      • 2011-03-31
      • 1970-01-01
      • 1970-01-01
      • 2019-12-27
      • 2011-12-19
      相关资源
      最近更新 更多