Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F#模式匹配与函数_F#_Pattern Matching - Fatal编程技术网

F#模式匹配与函数

F#模式匹配与函数,f#,pattern-matching,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 在这里,我希望fib的第一个参数能够跟踪我们在序列中的距离,接下来的两个参数是序列中的连续项 但是,我在fib(n-1)z(y+z)上得到一个编译时错误: 我尝试指定如下类型: let f

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

let fibonacci m=
    let rec fib = function
        | (0, _, z) -> z
        | (n, y, z) -> fib (n-1) z (y+z)
    fib m 0 1
在这里,我希望fib的第一个参数能够跟踪我们在序列中的距离,接下来的两个参数是序列中的连续项

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

我尝试指定如下类型:

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
然后我在
fib(n-1)
上得到一个不同的编译错误:

我仍在努力学习函数式编程。我认为问题可能是我对第一种模式的真正含义缺乏理解。我想它的意思是,当position参数为零时,它返回第二个参数项


有人能帮我解决这个问题吗?这个问题显然是由于我的一些基本误解造成的

问题是,您使用curry参数调用函数,而实际上定义为需要元组参数:

let fibonacci m =
    let rec fib = function
        | (0, _, z) -> z
        | (n, y, z) -> fib (n-1, z, y+z)
    fib (m, 0, 1)
这是因为您使用的是
函数
,在针对元组的情况下,哪个模式匹配单个参数。另一种方法是使用
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

你可以把
函数
看作是一个单参数函数的简写,然后在该参数上加上一个
匹配

对,这很有意义,我想你只能在单个实体上进行模式匹配,而不能在参数列表上进行模式匹配。查看更新和匹配的示例。。。具有
let fibonacci m =
    let rec fib = function
        | (0, _, z) -> z
        | (n, y, z) -> fib (n-1, z, y+z)
    fib (m, 0, 1)
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