我尝试使用模式匹配在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)
上遇到编译时错误:
Type mismatch. Expecting a
'a -> 'b -> 'c
but given a
'c
The resulting type would be infinite when unifying ''a' and ''b -> 'c -> 'a'
我尝试指定类似的类型:
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)
上得到了不同的编译错误:
This value is not a function and cannot be applied
我仍然试图了解功能编程。我认为问题可能是我对第一种模式的实际含义缺乏了解。我希望它意味着当position参数为零时,它返回第二个参数term。
有人可以帮我解决这个问题,这显然是由于我的一些基本误解
答案 0 :(得分: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)
这是因为您正在使用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
您可以将function
视为单个参数函数的简写,后跟match
对该参数的简写。