【发布时间】:2015-02-27 00:55:45
【问题描述】:
我试图了解延续是如何工作的,我在 Tomas Petricek 和 Jon Skeet 的 Real World Functional Programming 一书中遇到了这个例子。但这真的让我头晕目眩,所以我必须寻求一些详细的帮助..
type IntTree =
| Leaf of int
| Node of IntTree * IntTree
let rec sumTreeCont tree cont =
match tree with
| Leaf(n) -> cont(n)
| Node(left, right) ->
sumTreeCont left (fun leftSum ->
sumTreeCont right (fun rightSum ->
cont(leftSum + rightSum)))
好的,这就是我自己能够弄清楚的……在第二个分支中,我们首先处理节点的左侧并传递一个 lambda。这个 lambda 将实例化一个带有两个字段的闭包类,right: IntTree 和 cont: (int -> 'a) 将由基本案例调用。但似乎“内部 lambda”也捕获了leftSum,但我不太明白它们是如何组合在一起的,我不得不承认,当我试图弄清楚这一点时,我有点头晕。
【问题讨论】:
-
我强烈推荐阅读 Brian McNamara 的关于变质的博客系列(包括续延)lorgonblog.wordpress.com/?s=catamorphism
标签: lambda f# continuations