haskell中的无限列表使用预定义函数

时间:2016-06-18 16:38:02

标签: haskell

我是Haskell的初学者,我正在尝试创建一个简单的程序,其中包含[-3,8]列表并创建无限列表:[-3,8,-3,8,-3,8,...]

感谢Haskell的懒惰评估,我编写了一个非常简单的程序来计算它:

period :: [a]->[a]
period p = p ++ period p

我想知道是否存在使用高阶函数(迭代,映射......)的更简单的解决方案

1 个答案:

答案 0 :(得分:9)

首先查找列表函数的第一个地方是Data.List。在那里你会找到

cycle :: [a] -> [a]

完全符合您的要求。但是,它的定义略有不同,以便制作圆形链表而不是无限链表。像

这样的东西
cycle xs = ys where ys = xs ++ ys

这可以避免大量不必要的内存分配。您可以使用Data.Function.fix表达此定义:

cycle xs = fix (xs ++)

如果您喜欢过度概括,可以使用

为常规Semigroup定义此项
cycle xs = fix (xs <>)

虽然这对于大多数半群来说会有所不同。

如果你是一个无点的狂热分子,你可以将其翻译为

cycle xs = fix ((<>) xs)

你可以看到

cycle = fix . (<>)