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

我一直在阅读文章
Origami Programming by Jeremy Gibbons,我很难弄清楚展开和展开函数如何为玫瑰树工作.

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

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

unfoldR和unfoldF函数是相互递归的,定义如下:

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)

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

最佳答案 他们不一定要终止!

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

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

然后我们将使用另一个递归函数h :: Rose – >来使用无限数据结构. γ

汇总一个未定义的例子:

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

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

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

虽然展开R f g x将导致无限结构,但h将仅搜索搜索空间的有限子集,因此可以评估结果.

注意:我们也可以定义f,g& x创建有限结构,它不一定是无限的

点赞