Haskell 的基础库包含几个函数,它们是它们各自数据类型的小写版本,比如bool
,maybe
和either
. 在 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
函数只是在评论中被提及为“对列表进行非递归转换,比如‘也许’”,但由于它与其数据类型相比是非递归的,因此显然不是列表的递归方案,或者是吗?这就是为什么它没有在基础库中定义的原因吗?该函数是否还有其他很好的理论性质?