我一直在阅读文章Origami Programming by Jeremy Gibbons,但我无法弄清楚unfoldR
和unfoldF
函数如何适用于Rose Trees
。
在论文中,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)
看起来,除了一些小边缘情况外,这些函数将无限递归。这两个相互递归的函数如何终止?
答案 0 :(得分:2)
unfoldR
和unfoldF
的定义分别在Rose
和Forest
类型上形成co-inductive函数。共感应是结构感应的双重性。共感函数旨在创建无限的数据结构,稍后将通过递归函数使用。
由于Haskell的惰性评估,我们可以通过应用函数Rose
和Forest
以及初始值来定义和创建无限的相互递归f :: (β → α)
和g :: (β → List β)
数据结构。种子值“x :: β
到unfoldR
和unfoldF
。
然后我们将使用另一个递归函数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>
注意: 我们还可以定义f
,g
&amp; x
创建一个有限结构,它不一定是无限的