【发布时间】:2022-02-10 16:55:17
【问题描述】:
各种递归方案归结为refold 的特定实例化
refold :: Functor s => (s b -> b) -> (a -> s a) -> a -> b
refold f g = go where go a = f (fmap go (g a))
refold 的有意义的解释是什么?
数据类型data Nu f = forall a. Nu (a -> f a) a 和newtype Mu f = Mu {unMu :: forall b. (f b -> b) -> b} 可以看作是余数和代数中遗忘函子的余限和极限,而refold 是它们之间的态射,但它是否阐明了refold?
refold\' :: forall s. Functor s => Nu s -> Mu s
refold\' (Nu g (a :: a)) = Mu mu where
mu :: forall b. (s b -> b) -> b
mu f = go a where
go :: a -> b
go a = f (fmap go (g a))
-
不终止可能在这里扮演一个棘手的角色。考虑
f a = Either () a。现在Mu f是(有限)自然数的类型,而Nu f还为自然数添加了“无穷大”值。然而,我们有 isoisoNu :: f (Nu f) -> Nu f和isoMu :: Mu f -> f (Mu f),它们给了我们refold isoNu isoMu :: Nu f -> Mu f。我相信这必须在“无穷大”值上有所不同。 -
@chi 另一个论点:让我们采用 s = 身份。类型表明它必须发散
标签: haskell functional-programming fold category-theory recursion-schemes