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