Haskell的基本库包含几个函数,这些函数是各自数据类型的小写版本,如bool
,maybe
和either
。在Data.Bool.Extra的源代码中,bool
函数清楚地表示为数据类型的catamorphism:
bool = curry cata
现在,使用示例递归方案中定义的catamorphism,看起来上述基本库函数都是其数据类型的所有类似物,例如,对于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
函数在评论中仅作为"列表的非递归变换提及,例如' may'& #34;,但因为它与数据类型相比是非递归的,所以它显然不是列表的任何递归方案,或者是它?这就是为什么它没有在基础库中定义?该函数是否具有任何其他良好的理论属性?
答案 0 :(得分:5)
[]
的catamorphism是foldr
。
list
包中的extra
函数是对Scott编码的转换,就像catamorphism是对Church编码的转换一样。由于Scott编码是非递归的,因此它们无法真正对应任何递归方案。