Data.List
定义
unfoldr :: (b -> Maybe (a, b)) -> b -> [a]
unfoldr f b = case f b of
Just (a,new_b) -> a : unfoldr f new_b
Nothing -> []
Run Code Online (Sandbox Code Playgroud)
有许多功能几乎可以使用unfoldr
,但在列表的最后有问题.一个简单的"修复"是
unfoldr' :: (b -> Either (a,b) [a]) -> b -> [a]
unfoldr' f b = case f b of
Left (a, new_b) -> a : unfoldr' f new_b
Right r -> r
Run Code Online (Sandbox Code Playgroud)
这个功能有标准名称吗?它有不错的属性和良好的互动foldr
吗?
我必须使用map通过foldr实现inits.我得到了大部分内容,但是我在结果列表中缺少空列表元素.
inits :: [a] -> [[a]]
inits = foldr ( \ x y -> [x] : (map (x:) y) ) []
Run Code Online (Sandbox Code Playgroud)
调用时会导致:
*蓝图<inits [1,2,3]
[[1],[1,2],[1,2,3]]
我现在有点困惑,如果有人能指出我的错误的一般方向,我会很高兴.
提前致谢
解决了:
inits :: [a] -> [[a]]
inits = foldr ( \ x y -> [] : (map (x:) y) ) [[]]
Run Code Online (Sandbox Code Playgroud)