【发布时间】:2020-10-10 22:47:54
【问题描述】:
对自然数使用以下变态,我可以实现各种算术算法,而无需处理递归:
cataNat :: b -> (b -> b) -> Natural -> b
cataNat zero succ = go
where
go n = if (n <= 0) then zero else succ (go (n - 1))
fib :: Natural -> Natural
fib = fst . cataNat (0, 1) (\(a, b) -> (b, a + b))
cataNat 在我看来类似于原始递归。无论提供zero 和succ 的哪个组合,至少它的每个应用程序似乎都会终止。在每次迭代中,整个问题都被最小/最简单的问题实例分解。因此,即使它在技术上不是原始递归,它似乎也具有同样的表现力。如果这是真的,则意味着变态不足以表达一般递归。我们可能需要一个hylomorphism。我的推理是否正确,即是否对任何类型的变态都成立,而不仅仅是自然数?
【问题讨论】:
-
comonad.com/reader/2009/recursion-schemes 将超态性(它本身就是 a more convient formulation of a catamorphsim)描述为“使用原始递归分解结构”。
标签: haskell recursion functional-programming fold catamorphism