F#模式匹配和功能

Mat*_*ury 1 f# pattern-matching

我尝试使用模式匹配在F#中实现斐波那契序列,如下所示:

let fibonacci m=
    let rec fib = function
        | (0, _, z) -> z
        | (n, y, z) -> fib (n-1) z (y+z)
    fib m 0 1
Run Code Online (Sandbox Code Playgroud)

在这里,我期望fib的第一个参数跟踪我们在序列中的距离,以及接下来的两个参数是序列中的连续项.

但是,我得到一个编译时错误fib (n-1) z (y+z):

Type mismatch. Expecting a
    'a -> 'b -> 'c    
but given a
    'c    
The resulting type would be infinite when unifying ''a' and ''b -> 'c -> 'a'
Run Code Online (Sandbox Code Playgroud)

我尝试指定类似的类型:

let fibonacci m=
    let rec fib = function
        | (0, _, z:int) -> z
        | (n:int, y:int, z:int) -> fib (n-1) z (y+z)
    fib m 0 1
Run Code Online (Sandbox Code Playgroud)

然后我得到一个不同的编译错误fib (n-1):

This value is not a function and cannot be applied
Run Code Online (Sandbox Code Playgroud)

我仍然试图了解功能编程.我认为问题可能是我对第一种模式的实际含义缺乏了解.我希望它意味着当position参数为零时,它返回第二个参数term.

有人可以帮我解决这个问题,这显然是由于我的一些基本误解

Gus*_*Gus 5

问题是你正在使用curried参数调用函数,而实际上它被定义为期望的tupled参数:

let fibonacci m =
    let rec fib = function
        | (0, _, z) -> z
        | (n, y, z) -> fib (n-1, z, y+z)
    fib (m, 0, 1)
Run Code Online (Sandbox Code Playgroud)

这是因为您使用function哪个模式匹配单个参数,在您的情况下与元组相对应.另一种方法是使用match

let fibonacci m =
    let rec fib a b c = 
        match (a, b, c) with
        | (0, _, z) -> z
        | (n, y, z) -> fib (n-1) z (y+z)
    fib m 0 1
Run Code Online (Sandbox Code Playgroud)

您可以将其function视为单个参数函数的简写,然后是match该参数.