标签: lazy-evaluation

使用 nodejs 和 mongoDB 作为后端数据的延迟加载

我们的收藏有大约 1 亿份文件。我们使用 nodejs 和 expressjs 创建了一个简单的应用程序,在 mongo 查询中带有一个限制子句。对目前的用户来说已经足够了。与此同时,我们正在尝试实现延迟加载,以便初始页面加载返回很少的文档,而当用户滚动时,我们希望加载更多文档。苦苦挣扎从哪里开始以及如何实现它。感谢您的建议。我的 index.js 文件看起来像这样

router.get('/users', function(req, res) {
  var db = req.db; 
  var users = db.get('users'); 

  users.find(query, {limit: 10000}, function(e, docs){
    res.render('users', { 
      title: 'Users',
      'users': docs  
    });
  });
});
Run Code Online (Sandbox Code Playgroud)

我想取消限制并使用跳过来实现这一点。请发表您的建议

load lazy-evaluation mongodb node.js

3
推荐指数
1
解决办法
4768
查看次数

何时需要尾递归,在惰性求值的背景下?

我的理解(可能是不正确的或不完整的)是懒惰的评估可以提供尾递归的所有优点,并且做得更好.

如果是这样,是否意味着在惰性求值的上下文中不需要尾递归

UPDATE

具体来说,让我们看一下以下示例:

(define (foo f a)
  (if (number? a)
    (* a a)
    (lazy-map foo a)))
Run Code Online (Sandbox Code Playgroud)

该函数可以很容易地转换为尾递归函数.但是,如果是这样,我们将失去懒惰评估的优势.

实际上,当输入是一个非常大的列表(或无限)时,这个非尾递归函数是否需要消耗很多堆栈?我不这么认为.那么,是否有充分的理由使用尾递归而不是懒惰的评估

scheme haskell functional-programming clojure lazy-evaluation

3
推荐指数
1
解决办法
841
查看次数

Haskell/Frege会不会重新计算惰性列表的元素?

假设我有一个所有素数的列表,定义为

primes :: (Enum ?, Integral ?) => [?]
primes = sieve [2..]
  where sieve :: (Integral ?) => [?] -> [?]
        sieve []     = undefined
        sieve (x:xs) = x : (sieve $ filter ((/= 0) . (flip mod x)) xs)
Run Code Online (Sandbox Code Playgroud)

我想primes通过多种不同的功能提供信息,例如:

sumOfPrimesLessThan :: (Integral ?) => ? -> ?
sumOfPrimesLessThan n = sum $ takeWhile (< n) primes
Run Code Online (Sandbox Code Playgroud)

要么

productOfPrimesLessThan :: (Integral ?) => ? -> ?
productOfPrimesLessThan n = foldl (*) 1 $ takeWhile (< n) …
Run Code Online (Sandbox Code Playgroud)

caching haskell lazy-evaluation frege

3
推荐指数
1
解决办法
187
查看次数

函数生成的错误长度的顺序

当repl变量设置为false时,为什么以下函数返回不正确长度的序列?

open MathNet.Numerics.Distributions
open MathNet.Numerics.LinearAlgebra
let sample (data : seq<float>) (size : int) (repl : bool) =

    let n = data |> Seq.length

    // without replacement
    let rec generateIndex idx =
        let m = size - Seq.length(idx)
        match m > 0 with
        | true ->
            let newIdx = DiscreteUniform.Samples(0, n-1) |> Seq.take m 
            let idx = (Seq.append idx newIdx) |> Seq.distinct
            generateIndex idx
        | false -> 
            idx

    let sample =
        match repl with
        | true ->
            DiscreteUniform.Samples(0, n-1) 
            |> Seq.take …
Run Code Online (Sandbox Code Playgroud)

f# lazy-evaluation lazy-sequences

3
推荐指数
1
解决办法
192
查看次数

在 Scala 中传递惰性参数有什么帮助吗?

这听起来像是一个新手错误,但我做了很多。在将惰性求值块或值传递给函数时,如果我忘记以某种方式使该函数的相应参数变为惰性(按名称传递/调用),乍一看会引起一些混乱,因为它强制求值。

lazy val a = {println("a");1}
def myfunc(b:Int){println("hello")}
myfunc(a);
Run Code Online (Sandbox Code Playgroud)

输出:

a
Hello
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,这个问题是否有任何编译器帮助?(标志等)或者这是我应该处理的事情?

scala lazy-evaluation scalac

3
推荐指数
1
解决办法
913
查看次数

view :: c_str是否存在view :: split的问题?

特定

auto cstr = "quick brown fox";
Run Code Online (Sandbox Code Playgroud)

我们有一组适配器只是为了分割单词然后尝试将它们显示为格式化范围.

auto adaptors = ranges::view::split(' ') | ranges::view::all;
Run Code Online (Sandbox Code Playgroud)

如果source是string_view,那就是okey.

auto sv = std::string_view{cstr};
ranges::copy(sv | adaptors, ranges::ostream_iterator(std::cout,";") );
Run Code Online (Sandbox Code Playgroud)

输出:[wandbox]

[q,u,i,c,k];[b,r,o,w,n];[f,o,x];
Run Code Online (Sandbox Code Playgroud)

然后尝试使用view :: c_str

auto cstr_rng = ranges::view::c_str(cstr);
// Won't compile
// ranges::copy(cstr_rng | adaptors, ranges::ostream_iterator(std::cout,";") );
Run Code Online (Sandbox Code Playgroud)

错误:[CE]

/opt/compiler-explorer/libs/rangesv3/trunk/include/range/v3/view/split.hpp: In instantiation of 'ranges::v3::split_view<Rng, Fun>::cursor<IsConst>::cursor(ranges::v3::split_view<Rng, Fun>::cursor<IsConst>::fun_ref_t, ranges::v3::iterator_t<Rng>, ranges::v3::sentinel_t<Rng>) [with bool IsConst = true; Rng = ranges::v3::delimit_view<ranges::v3::iterator_range<const char*, ranges::v3::unreachable>, char>; Fun = ranges::v3::view::split_fn::element_pred<ranges::v3::delimit_view<ranges::v3::iterator_range<const char*, ranges::v3::unreachable>, char>&>; ranges::v3::split_view<Rng, Fun>::cursor<IsConst>::fun_ref_t = ranges::v3::view::split_fn::element_pred<ranges::v3::delimit_view<ranges::v3::iterator_range<const char*, ranges::v3::unreachable>, char>&>; ranges::v3::iterator_t<Rng> …
Run Code Online (Sandbox Code Playgroud)

c++ lazy-evaluation range-v3

3
推荐指数
1
解决办法
289
查看次数

使用 Lazy.jl 在 Julia 中生成惰性范围

在尝试扩展Lazy.jl 中的一个示例时,我遇到了评估不是惰性的问题。

README使用这个例子:

> esquares = @>> Lazy.range() map(x->x^2) filter(iseven);

> esquares[99]
39204
Run Code Online (Sandbox Code Playgroud)

我试图通过允许将过滤器指定为参数来使其动态化,但它最终评估了一个无限列表:

> squares(filt) = @lazy @>> Lazy.range() map(x->x^2) filter(filt); 

> squares(iseven)

(4 16 36 64 100 144 196 256 324 400 484 576 676  ...   # this keeps printing until interrupting...)
Run Code Online (Sandbox Code Playgroud)

我也试过:

> @lazy squares(iseven)  
(4 16 36 64 100 144 196 256 324 400 484 576 676  ...   # this also immediately returns the infinite list
Run Code Online (Sandbox Code Playgroud)

functional-programming lazy-evaluation julia

3
推荐指数
1
解决办法
177
查看次数

Haskell 如何进行延迟评估?

听说 Haskell 评估晚了。但是,无论我尝试做什么,它似乎都以与任何其他编程语言相同的方式对其进行评估;

考虑以下代码:

test :: Bool -> IO()
test n = do
  let y = 5
  print n

main = do
  let y = 8
  test (y == 8)
Run Code Online (Sandbox Code Playgroud)

此代码输出:

True
Run Code Online (Sandbox Code Playgroud)
  • 为什么这段代码会提前评估“y”?
  • 我可以举一个 Haskell 延迟评估的例子吗?

haskell lazy-evaluation

3
推荐指数
1
解决办法
153
查看次数

为什么将函数的返回值乘以零时不会短路?

考虑如下函数:

unsigned int fact(unsigned int i) {
    if (i <= 1) { return 1; }
    return i * fact(i-1);
}
Run Code Online (Sandbox Code Playgroud)

如果我要实例化一个新变量unsigned int f,那么f = 0 * fact(5)为什么它不会“短路”?

unsigned int fact(unsigned int i) {
    std::cout << "a";
    if (i <= 1) { return 1; }
    return i * fact(i-1);
}

int main() {
    unsigned int f = 0 * fact(5);
}
Run Code Online (Sandbox Code Playgroud)

这里的输出是aaaaa。如果f只能为零,为什么它会调用该函数,假设它知道返回类型?它不评估从左到右,看到0 * (unsigned int)并知道右值将是0

c++ return lazy-evaluation short-circuiting

3
推荐指数
1
解决办法
213
查看次数

从包含 m 行的文件中取出 n 行,必要时(懒惰地)重复该文件

我正在寻找一种方法来使用文本文件生成尽可能多的文本,只需根据需要重复几次即可。

在像 Haskell 这样的纯函数式语言中,解决方案似乎微不足道:这里我已经发布了用于审查的代码,它很短,尽管我很确定它可以改进。

但是在 C++ 中,我几乎不知道从哪里开始,除了我很确定 Boost Hana 提供了许多我设计解决方案所需的工具。

这是一个示例输入文件,

line 1
line 2
line 3
Run Code Online (Sandbox Code Playgroud)

并且,如果我要求 7 行,这就是我想放入一个变量中的内容(例如在一个std::string带有嵌入式'\n's的单个中),

line 1
line 2
line 3
line 1
line 2
line 3
line 1
Run Code Online (Sandbox Code Playgroud)

我猜这个函数可以有这样的声明:

std::string function(std::string s, int n);
Run Code Online (Sandbox Code Playgroud)

c++ boost functional-programming lazy-evaluation boost-hana

3
推荐指数
1
解决办法
84
查看次数