1

Haskell 的基础库包含几个函数,它们是它们各自数据类型的小写版本,比如bool,maybeeither. 在 Data.Bool.Extra 的源代码中,bool函数清楚地表示为数据类型的变态:

bool = curry cata

现在,使用Recursion Schemes by Example中定义的变态,似乎上述基本库函数都是其数据类型的变态,例如对于 Maybe:

-- base library definition
maybe n _ Nothing  = n
maybe _ f (Just x) = f x

-- definition with cata
newtype Fix f = Fix {unFix :: f (Fix f)}
cata :: Functor f => (f a -> a) -> Fix f -> a
cata alg = alg . fmap (cata alg) . unFix
maybe n f m = cata alg where
    alg Nothing = n
    alg (Just x) = f x

然而,Data.List.Extra 的list函数只是在评论中被提及为“对列表进行非递归转换,比如‘也许’”,但由于它与其数据类型相比是非递归的,因此显然不是列表的递归方案,或者是吗?这就是为什么它没有在基础库中定义的原因吗?该函数是否还有其他很好的理论性质?

4

1 回答 1

5

的变质[]foldr

包中的list函数extra是对 Scott 编码的转换,就像 catamorphism 是对 Church 编码的转换一样。由于 Scott 编码是非递归的,它们不能真正对应于任何递归方案。

于 2017-03-17T09:34:21.350 回答