gpt4 book ai didi

F# 模式匹配和函数

转载 作者:行者123 更新时间:2023-12-02 21:22:32 24 4
gpt4 key购买 nike

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

我仍在尝试了解函数式编程。我认为问题可能是我对第一个模式的实际含义缺乏理解。我希望这意味着当位置参数为零时,它返回第二个参数项。

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

最佳答案

问题是您使用柯里化(Currying)参数调用函数,而实际上定义为期望元组参数:

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

关于F# 模式匹配和函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26590371/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com