相关疑难解决方法(0)

为什么使用 fold 生成指数增长的无限列表溢出?

在与我之前的问题相同的场景中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作为折叠实现,只有阶跃函数和种子作为自由度。

haskell fold

4
推荐指数
1
解决办法
93
查看次数

需要根据元素的升序(Haskell)将列表分区为列表

说我有这样的列表:

[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)

有什么建议?

haskell list partition

1
推荐指数
2
解决办法
1228
查看次数

标签 统计

haskell ×2

fold ×1

list ×1

partition ×1