rub*_*ion 1 recursion haskell catamorphism
Haskell的基本库包含几个函数,它们各自的数据类型的小写版本,例如bool,maybe和either.在Data.Bool.Extra的源代码中,该bool函数清楚地表示为数据类型的catamorphism:
bool = curry cata
Run Code Online (Sandbox Code Playgroud)
现在,使用Recursion Schemes by Example中定义的catamorphism ,看起来上面提到的基本库函数都是它们数据类型的所有catamorphisms,例如对于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
Run Code Online (Sandbox Code Playgroud)
但是,Data.List.Extra的list函数在注释中只是作为"列表的非递归变换,如'可能'"而提到,但由于它与数据类型相比是非递归的,所以它显然不是任何列表的递归方案,或者是吗?这就是为什么它没有在基础库中定义?该函数是否具有任何其他良好的理论属性?
它的变形[]是foldr.
包中的list函数extra是转换为Scott编码,其方式是catamorphism是对Church编码的转换.由于Scott编码是非递归的,因此它们无法真正对应任何递归方案.
| 归档时间: |
|
| 查看次数: |
128 次 |
| 最近记录: |