给定一个简单的函数,我们在递归调用的结果上进行模式匹配,例如:
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)
我错过了什么?
答案 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"
},