首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Haskell中创建无限重复的列表?

如何在Haskell中创建无限重复的列表?
EN

Stack Overflow用户
提问于 2010-01-10 07:48:25
回答 2查看 10.1K关注 0票数 16

我是一个C#的家伙,试图从Erik Meijer的Channel9网络广播中自学Haskell。我遇到了一个有趣的难题,它涉及到使用zip和mod跳过列表中的每个'n‘元素。

代码语言:javascript
运行
复制
every :: Int -> [a] -> [a]
every _ [] = []
every n xs = [x | (x,i) <- zip xs [1..], i `mod` n == 0]

我一直在想,如果我们能避免使用mod,它可能会更有效率(对于非常大的列表或流)。

我想懒惰地创建一个重复的整数列表,这样我们就可以简单地比较i和n的值。

代码语言:javascript
运行
复制
repeatInts :: Int -> [Int]

使得调用repeatInts 3会无限地返回[1,2,3,1,2,3,1,2,3,1,2,3,..] ad。

鉴于此,我们可以像这样重新定义every

代码语言:javascript
运行
复制
every :: Int -> [a] -> [a]
every _ [] = []
every n xs = [x | (x,i) <- zip xs (repeatInts n), i == n]

所以我的问题是:如何实现repeatInts

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-01-10 08:11:14

使用cycle

cycle ::a -> a cycle将一个有限列表绑定到一个循环列表中,或者等价地,将原始列表无限重复。它是无穷列表上的恒等式。

您可以用cycle来定义repeatInts

代码语言:javascript
运行
复制
*Main> let repeatInts n = cycle [1..n]
*Main> :t repeatInts
repeatInts :: (Num t, Enum t) => t -> [t]
*Main> take 10 $ repeatInts 3
[1,2,3,1,2,3,1,2,3,1]

好奇的是,GHC实现了cycle

代码语言:javascript
运行
复制
cycle [] = errorEmptyList "cycle"
cycle xs = xs' where xs' = xs ++ xs'

在纯函数的说法中,这种奇怪的技术称为结,它创建的是循环数据结构,而不是无限数据结构。

有关详情,请参阅

票数 26
EN

Stack Overflow用户

发布于 2014-05-10 20:38:38

回答晚了,但也可以这样写:

代码语言:javascript
运行
复制
repeatInts :: Int -> [Int]
repeatInts 0 = []
repeatInts a = [1..a] ++ repeatInts a
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2035432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档