gpt4 book ai didi

F#使用高阶函数递归调用的匹配结果

转载 作者:行者123 更新时间:2023-12-04 05:54:45 27 4
gpt4 key购买 nike

给定一个简单的函数,我们对递归调用的结果进行模式匹配,例如:

let rec sumProd = function
| [] -> (0,1)
| x::rest -> let (rSum,rProd) = sumProd rest
(x + rSum,x * rProd)

sumProd [2;5] //Expected (7, 10)

我将如何着手将其更改为使用高阶函数的东西,例如折叠?

let sumProdHigherOrder lst = 
List.foldBack (fun x acc -> (acc + x, acc * x)) lst (0,0)

上面的方法看起来差不多,但是调用它会给出错误:The type 'int' does not match the type 'int * int'

sumProdHigherOrder [2;5] //Expected (7, 10)

我错过了什么?

最佳答案

您缺少元组函数 fstsnd:

List.foldBack (fun x acc -> (fst acc + x, snd acc * x)) [2;5] (0,1)
// val it : int * int = (7, 10)

或者更好的是,在 lambda 处分解元组。我看到你刚找到它:

List.foldBack (fun x (s, m) -> (s + x, m * x)) [2;5] (0,1)

另请注意,由于操作是可交换的,因此您可以直接进行折叠:

List.fold (fun (s, m) x -> (s + x, m * x)) (0,1) [2;5] 

效率会更高。

关于F#使用高阶函数递归调用的匹配结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47187220/

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