我是Haskell的初学者,我正在尝试创建一个简单的程序,其中包含[-3,8]
列表并创建无限列表:[-3,8,-3,8,-3,8,...]
感谢Haskell的懒惰评估,我编写了一个非常简单的程序来计算它:
period :: [a]->[a]
period p = p ++ period p
我想知道是否存在使用高阶函数(迭代,映射......)的更简单的解决方案
答案 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 . (<>)