我一直在阅读文章
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创建有限结构,它不一定是无限的