一次处理列表1..n个元素,而无需显式递归

|| 我发现自己经常使用一种模式,在该模式下,我使用一个使用列表中的1..n元素并从中产生一些结果的函数来转换列表。例如。
process :: [a] -> [b]
process [] = []
process xs = first : rest
    where (first, xs\') = consume xs
          rest         = process xs\'
其中“ 1”函数使用列表中可变数量的项目,并返回结果和其余列表项目。我可以在这里使用一些标准的高阶函数来代替显式递归吗?     
已邀请:
        您需要的功能类似于
unfoldr
。如果您将ѭ1转换为以下格式:
consume\' :: [a] -> Maybe (b,[a])
如果列表为空,则
consume\'
返回
Nothing
,否则返回
Just ...
。这是一个小包装,捕获了该模式:
wrap :: ([a] -> (b,[a])) -> [a] -> Maybe (b,[a])
wrap f [] = Nothing
wrap f xs = Just $ f xs
然后可以将
consume
unfoldr
一起使用,原始定义为
consume :: [a] -> (b,[a])
,如下所示:
unfoldr (wrap consume)
    
        您可以将
unfoldr
consume
周围的一些包装一起使用,但我希望在那里有一个更高阶的函数可以精确地显示您拥有的图案。我建议在ѭ15上加一个。我也经常使用它。     

要回复问题请先登录注册