Rose Tree如何展开工作(来自Origami Programming)

时间:2015-08-02 23:04:45

标签: haskell functional-programming

我一直在阅读文章Origami Programming by Jeremy Gibbons,但我无法弄清楚unfoldRunfoldF函数如何适用于Rose Trees

在论文中,Rose Tree类型定义为:

data Rose α = Node α (Forest α)
type Forest α = List (Rose α)

unfoldRunfoldF函数是相互递归的,定义为:

unfoldR :: (β → α) → (β → List β) → β → Rose α
unfoldR f g x = Node (f x) (unfoldF f g x)

unfoldF :: (β → α) → (β → List β) → β → Forest α
unfoldF f g x = mapL (unfoldR f g) (g x)

看起来,除了一些小边缘情况外,这些函数将无限递归。这两个相互递归的函数如何终止?

1 个答案:

答案 0 :(得分:2)

他们不一定要终止!

unfoldRunfoldF的定义分别在RoseForest类型上形成co-inductive函数。共感应是结构感应的双重性。共感函数旨在创建无限的数据结构,稍后将通过递归函数使用。

由于Haskell的惰性评估,我们可以通过应用函数RoseForest以及初始值来定义和创建无限的相互递归f :: (β → α)g :: (β → List β)数据结构。种子值“x :: βunfoldRunfoldF

然后我们将使用另一个递归函数h :: Rose -> γ

来使用无限数据结构

汇总一个未定义的例子:

f :: (β → α)
f = undefined
g :: (β → List β) 
g = undefined
x :: β
x = undefined
h :: Rose -> γ
h = undefined

result :: γ
result = h $ unfoldR f g x

这里result将是对无限结构的计算的评估。但如果它是一个无限的数据结构,h如何终止? 如何评估 result

虽然unfoldR f g x会产生无限结构,h只会搜索搜索空间的有限子集,因此可以评估result。< / p>

注意: 我们还可以定义fg&amp; x创建一个有限结构,它不一定是无限的