F#模式匹配与函数
我尝试使用如下模式匹配在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
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