类似于Haskell循环的Ruby方法

类似于Haskell循环的Ruby方法,ruby,haskell,functional-programming,Ruby,Haskell,Functional Programming,有没有类似于Haskell循环的Ruby方法?Haskell循环获取一个列表并返回无限附加到自身的列表。它通常与take一起使用,take从数组顶部抓取一定数量的元素。是否有一个Ruby方法接受数组并返回附加到自身的数组n次?是的,它被调用。从文件中: Array.cycle (from ruby core) ------------------------------------------------------------------------------ ary.cycle(n=

有没有类似于Haskell循环的Ruby方法?Haskell循环获取一个列表并返回无限附加到自身的列表。它通常与take一起使用,take从数组顶部抓取一定数量的元素。是否有一个Ruby方法接受数组并返回附加到自身的数组n次?

是的,它被调用。从文件中:

Array.cycle (from ruby core) ------------------------------------------------------------------------------ ary.cycle(n=nil) {|obj| block } -> nil ary.cycle(n=nil) -> an_enumerator ------------------------------------------------------------------------------ Calls block for each element repeatedly n times or forever if none or nil is given. If a non-positive number is given or the array is empty, does nothing. Returns nil if the loop has finished without getting interrupted. If no block is given, an enumerator is returned instead. a = ["a", "b", "c"] a.cycle {|x| puts x } # print, a, b, c, a, b, c,.. forever. a.cycle(2) {|x| puts x } # print, a, b, c, a, b, c. 数组周期 (来自ruby core) ------------------------------------------------------------------------------ 元循环(n=nil){| obj | block}->nil ary.cycle(n=nil)->一个_枚举数 ------------------------------------------------------------------------------ 对每个元素重复调用块n次,如果没有,则永远调用 或给出零。如果给定了非正数或数组为空,则 没有什么。如果循环已完成而未被中断,则返回nil。 如果没有给出块,则返回枚举数。 a=[“a”、“b”、“c”] a、 循环{x{x}打印,a,b,c,a,b,c,。。永远。 a、 循环(2){| x | put x}#print,a,b,c,a,b,c。
编辑:

看起来块中的内容基本上是一个“Lambda”,据我所知,我无法在现有数组中的每个元素上创建Lambda concat

b=[1,2,3]
z=[]
b、 循环(2){i|z[1,2,3,1,2,3]

可以使用以下方法将数组乘以整数:

ari*int→ 新版本

[…]否则,返回通过连接
self
int
副本而构建的新数组

所以你可以这样做:

>> [1, 2] * 3
=> [1, 2, 1, 2, 1, 2]

有趣的是,当你阅读这本精美的手册时会发生什么,嗯?神奇的事情发生了;神秘的方法出现了,这是以前从未有过的。:-)我读过这本手册。这似乎不像哈斯克尔的循环那样。我对Ruby有点陌生,所以我真的不知道如何让循环做我想做的事情。看起来块内的东西基本上是一个“Lambda”,据我所知,我无法在现有数组上对每个元素进行lambda concat。@Josh:我怀疑
*
cycle
之间的区别将取决于您如何使用结果,如果您想立即使用或迭代生成数组,那么带有块的
cycle
将具有与
相同的效果(a*n).每个{…}
。除了
每个
,还有更多的迭代方法可用,像
每个_对象
注入
之类的东西可能会做你想做的事情。派对有点晚了,但是Ruby还有
获取
,所以你可以做
b.cycle.take(10)
+1,就我个人而言,我通常会这样做。
cycle
可能是“懒惰的”,或者至少不会生成像
*
will这样的中间数组。@theTinMan:我怀疑
cycle
是懒惰的,因为
a.cycle
a.cycle(n)
Enumerator
s。如果我知道需要多少,我会使用
*
,如果我不知道,我会使用
cycle
。仅供参考,cycle由以下公式给出:
cycle xs=xs'where xs'=xs++xs
>> [1, 2] * 3
=> [1, 2, 1, 2, 1, 2]