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

Mar*_*tiz 1 haskell

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

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

period :: [a]->[a]
period p = p ++ period p
Run Code Online (Sandbox Code Playgroud)

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

dfe*_*uer 9

一般来说,查找列表函数的第一个地方是Data.List.在那里你会发现

cycle :: [a] -> [a]
Run Code Online (Sandbox Code Playgroud)

这正是你想要的.但是,它的定义略有不同,以便制作圆形链表而不是无限链表.就像是

cycle xs = ys where ys = xs ++ ys
Run Code Online (Sandbox Code Playgroud)

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

cycle xs = fix (xs ++)
Run Code Online (Sandbox Code Playgroud)

如果你喜欢过度概括,你可以Semigroup使用一般的定义

cycle xs = fix (xs <>)
Run Code Online (Sandbox Code Playgroud)

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

如果你是一个无点狂热者,你可以将其翻译成

cycle xs = fix ((<>) xs)
Run Code Online (Sandbox Code Playgroud)

然后你可以看到

cycle = fix . (<>)
Run Code Online (Sandbox Code Playgroud)

  • 修复之美.(<>)`让我的无畏狂热者在哭泣,但即使从务实的角度来看,这也非常简洁. (2认同)