【发布时间】:2021-02-17 14:53:41
【问题描述】:
我有这个代码:
fromList :: Int -> [Int] -> [[Int]]
fromList y = takeWhile (not.null) . map (take y) . iterate (drop y)
这样做的一个例子:
-> fromList 4 [1..19]
[[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16],[17,18,19]]
如何使用折叠来制作这段代码?
【问题讨论】:
-
提示:使用
[[a]]作为累加器的类型。 -
为什么?好点了吗?
-
这真的是
unfoldr的工作;为什么要使用foldr? -
虽然(我认为)任何一方都可以完成另一方的工作,但折叠适用于具有一般形式
[a] -> a的事物,而展开则适用于a -> [a]。 (a本身可以是列表类型,考虑到两个函数的重叠。) -
考虑
fromList n = unfoldr (\x -> if null x then Nothing else Just (take n x, drop n x))。
标签: list haskell fold chunks sublist