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

时间:2017-11-08 18:36:43

标签: f#

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

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

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

我如何使用更高阶函数将其更改为某些内容,例如foldBack

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)

我错过了什么?

2 个答案:

答案 0 :(得分:5)

您错过了元组函数<% for(var i = 0; i < quotes.length; i++) {%> <li class="quote"> <i class="fa fa-close fa-quote-close move hidden"></i> <i class="fa fa-heart hidden"></i> <span class="make-bold nhauthorValues" id="<%= quotes[i]._id %>" contenteditable="true"><%= quotes[i].author %></span> once said: "<span class="quoteValues" id="<%= quotes[i]._id %>" contenteditable="true"><%= quotes[i].quote %></span>" <span class="by"><%= quotes[i].submittedBy.username %></span> </li> <% } %> fst

snd

甚至更好,分解lambda的元组。我看到你刚刚发现它:

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

另请注意,由于操作是可交换的,因此您可以直接List.foldBack (fun x (s, m) -> (s + x, m * x)) [2;5] (0,1)

fold

效率更高。

答案 1 :(得分:2)

右键!当然它不应该是通过列表传递的相同累加器。在强烈盯着代码几分钟之后,我想出来了:

"require": {
    "composer/installers": "^1.0@dev",
    "me/my-wordpress-plugin": "dev-master"
},