标签: lazy-sequences

Kotlin的Iterable和Sequence看起来完全一样.为什么需要两种类型?

这两个接口都只定义了一种方法

public operator fun iterator(): Iterator<T>
Run Code Online (Sandbox Code Playgroud)

文档说Sequence是懒惰的.但是也不是Iterable懒惰(除非由a支持Collection)?

iterable lazy-sequences kotlin

71
推荐指数
2
解决办法
9329
查看次数

理解递归定义的列表(就zipWith而言)

我正在学习Haskell,并且遇到了以下代码:

fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
Run Code Online (Sandbox Code Playgroud)

就其工作方式而言,我在解析方面遇到了一些麻烦.它非常整洁,我知道不需要更多内容,但我想了解Haskell在写作时如何设法"填写"文件:

take 50 fibs
Run Code Online (Sandbox Code Playgroud)

有帮助吗?

谢谢!

haskell list fibonacci lazy-evaluation lazy-sequences

67
推荐指数
2
解决办法
7739
查看次数

递归函数导致堆栈溢出

我正在尝试编写一个简单的筛子函数来计算clojure中的素数.我已经看到了这个关于编写高效的筛分功能的问题,但我不是为了那点呢.现在我只想写一个非常简单(缓慢)的筛子.以下是我的想法:

(defn sieve [potentials primes]
  (if-let [p (first potentials)]
    (recur (filter #(not= (mod % p) 0) potentials) (conj primes p))
    primes))
Run Code Online (Sandbox Code Playgroud)

对于小范围,它工作正常,但导致堆栈溢出大范围:

user=> (sieve (range 2 30) [])
[2 3 5 7 11 13 17 19 23 29]
user=> (sieve (range 2 15000) [])
java.lang.StackOverflowError (NO_SOURCE_FILE:0)
Run Code Online (Sandbox Code Playgroud)

我认为通过使用recur这将是一个非堆栈消耗循环结构?我错过了什么?

recursion primes clojure lazy-evaluation lazy-sequences

38
推荐指数
1
解决办法
2161
查看次数

如何在Clojure中实现延迟序列?

我喜欢Clojure.困扰我的一个问题是我不知道如何实现懒惰的序列,或者它们是如何工作的.

我知道懒惰序列只评估序列中要求的项目.它是如何做到的?

  • 什么使得延迟序列如此高效以至于它们不会消耗太多堆栈?
  • 为什么你可以在延迟序列中包装递归调用,并且不再为大型计算获得堆栈溢出?
  • 懒惰序列消耗什么资源来做它做的事情?
  • 在什么情况下懒惰序列效率低下?
  • 在什么情况下懒惰序列最有效?

lisp clojure lazy-evaluation lazy-sequences

29
推荐指数
3
解决办法
3588
查看次数

什么是无限数据结构的引人注目的用例?

有些语言(Haskell,Clojure,Scheme等)有懒惰的评价.懒惰评估的"卖点"之一是无限数据结构.这有什么好处的?能够处理无限数据结构的情况的一些例子显然是有利的吗?

scheme haskell clojure lazy-sequences data-structures

24
推荐指数
4
解决办法
3952
查看次数

Prolog中的懒惰列表?

是否可以在Prolog中使用惰性列表?类似于以下内容:

ones([1 | Y]) :- ones(Y).
Run Code Online (Sandbox Code Playgroud)

虽然这显然不起作用.

list stream prolog lazy-evaluation lazy-sequences

24
推荐指数
3
解决办法
2647
查看次数

Rust中的延迟序列生成

如何创建其他语言称为惰性序列或"生成器"函数?

在Python中,我可以使用yield如下例子(来自Python的文档)来懒惰地生成一个可以以不使用中间列表的内存的方式迭代的序列:

# a generator that yields items instead of returning a list
def firstn(n):
    num = 0
    while num < n:
        yield num
        num += 1

sum_of_first_n = sum(firstn(1000000))
Run Code Online (Sandbox Code Playgroud)

我怎样才能在Rust中做类似的事情?

lazy-sequences rust

24
推荐指数
4
解决办法
1万
查看次数

用索引无限次地做一些事情

做项目euler#2的更多ruby方式中,部分代码是

while((v = fib(i)) < 4_000_000)
  s+=v if v%2==0
  i+=1
end
Run Code Online (Sandbox Code Playgroud)

有没有办法改变i += 1成更具功能性的编程风格结构?

我能想到的最好的是

Float::MAX.to_i.times do |i|
  v = fib(i)
  break unless v < 4_000_000
  s += v if v%2==0
end
Run Code Online (Sandbox Code Playgroud)

因为你不能调用.times浮点数.

ruby infinity lazy-sequences

16
推荐指数
3
解决办法
6603
查看次数

在Clojure中,懒惰的seqs总是变得笨拙吗?

我的印象是懒惰的seqs总是被分块.

=> (take 1 (map #(do (print \.) %) (range)))
(................................0)
Run Code Online (Sandbox Code Playgroud)

正如预期的那样打印32个点,因为返回的lazy seq range被分成32个元素块.但是,当range我用自己的函数尝试这个时get-rss-feeds,懒惰的seq不再是分块的:

=> (take 1 (map #(do (print \.) %) (get-rss-feeds r)))
(."http://wholehealthsource.blogspot.com/feeds/posts/default")
Run Code Online (Sandbox Code Playgroud)

只打印了一个点,所以我猜测返回的lazy-seq get-rss-feeds没有分块.确实:

=> (chunked-seq? (seq (range)))
true

=> (chunked-seq? (seq (get-rss-feeds r)))
false
Run Code Online (Sandbox Code Playgroud)

以下是来源get-rss-feeds:

(defn get-rss-feeds
  "returns a lazy seq of urls of all feeds; takes an html-resource from the enlive library"
  [hr]
  (map #(:href (:attrs %))
       (filter #(rss-feed? (:type (:attrs %))) (html/select hr [:link])))
Run Code Online (Sandbox Code Playgroud)

因此,看起来粗糙取决于懒惰的seq是如何产生的.我偷看了函数的来源,range …

clojure lazy-evaluation chunking lazy-sequences

15
推荐指数
3
解决办法
2182
查看次数

R中的延迟序列

在Clojure中,使用惰性序列构造函数很容易创建无限序列.例如,

(def N (iterate inc 0))
Run Code Online (Sandbox Code Playgroud)

返回一个N等价于无限序列的数据对象

(0 1 2 3 ...)
Run Code Online (Sandbox Code Playgroud)

评估该值会N导致无限循环.评估(take 20 N)返回前20个数字.由于序列是惰性的,因此inc只有在您要求时才会迭代该函数.由于Clojure是同质的,因此递归地存储惰性序列.

在R中,是否可以做类似的事情?你能提出一些样本R代码,它产生的数据对象N相当于完全无限的自然数序列吗?评估完整对象N应该会产生一个循环,但类似的东西head(N)应该只返回前导数字.

注意:我对懒惰序列而不是自然数本身更感兴趣.

编辑:以下是Clojure的来源lazy-seq:

(defmacro lazy-seq
"Takes a body of expressions that returns an ISeq or nil, and yields
a Seqable object that will invoke the body only the first time seq
is called, and will cache the result and return it on all subsequent
seq calls. See also …
Run Code Online (Sandbox Code Playgroud)

r clojure lazy-sequences

15
推荐指数
3
解决办法
787
查看次数