Data.List.Extra的list函数是list的变质吗?
Is Data.List.Extra's list function the catamorphism of list?
Haskell 的基础库包含几个函数,它们是各自数据类型的小写版本,如 bool
、maybe
和 either
。在Data.Bool.Extra的源码中,bool
函数明确表示为数据类型的变质:
bool = curry cata
现在,使用Recursion Schemes by Example中定义的变质,上面提到的基本库函数似乎都是它们数据类型的变质,例如也许:
-- 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
函数只是在评论中作为 "Non-recursive transform over a list, like 'maybe'" 提到,但由于与其数据类型相比它是非递归的,显然也不是列表的任何递归方案,是吗?这就是为什么它没有在基础库中定义的原因吗?该函数还有其他不错的理论性质吗?
[]
的变形是 foldr
。
extra
包中的 list
函数是对 Scott 编码的转换,就像变形是对 Church 编码的转换一样。由于 Scott 编码是非递归的,因此它们不能真正对应于任何递归方案。
Haskell 的基础库包含几个函数,它们是各自数据类型的小写版本,如 bool
、maybe
和 either
。在Data.Bool.Extra的源码中,bool
函数明确表示为数据类型的变质:
bool = curry cata
现在,使用Recursion Schemes by Example中定义的变质,上面提到的基本库函数似乎都是它们数据类型的变质,例如也许:
-- 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
函数只是在评论中作为 "Non-recursive transform over a list, like 'maybe'" 提到,但由于与其数据类型相比它是非递归的,显然也不是列表的任何递归方案,是吗?这就是为什么它没有在基础库中定义的原因吗?该函数还有其他不错的理论性质吗?
[]
的变形是 foldr
。
extra
包中的 list
函数是对 Scott 编码的转换,就像变形是对 Church 编码的转换一样。由于 Scott 编码是非递归的,因此它们不能真正对应于任何递归方案。