在与我之前的问题相同的场景中cycle,当我想出以下错误的函数时,我试图仅使用折叠来实现该函数¹ ,该函数试图将累加器与自身连接起来,以指数方式构建无限列表(是的,我知道这意味着如果想要生成take1025 个副本,它将生成 2048 个副本)
myCycle :: [a] -> [a]
myCycle s = foldr (\_ a -> a ++ a) s [1..]
Run Code Online (Sandbox Code Playgroud)
但是,使用它会抛出*** Exception: heap overflow.
相反,这个版本就像一个魅力
myCycle :: [a] -> [a]
myCycle s = foldr (\_ a -> s ++ a) s [1..]
Run Code Online (Sandbox Code Playgroud)
我的问题是,与后者相比,为什么前者会溢出?感觉理由比我还蠢……
[1] 我的意思是,cycle作为折叠实现,只有阶跃函数和种子作为自由度。
说我有这样的列表:
[4,5,6,7,1,2,3,4,5,6,1,2]
Run Code Online (Sandbox Code Playgroud)
我需要一个Haskell函数,它将此列表转换为列表列表,列表由原始列表的段组成,这些段按升序排列.所以结果应该是这样的:
[[4,5,6,7],[1,2,3,4,5,6],[1,2]]
Run Code Online (Sandbox Code Playgroud)
有什么建议?