我正在四处寻找stackoverflow 非平凡的懒惰评估 ,这导致了我Keegan McAllister的介绍: 为什么学习Haskell 。 在幻灯片8中,他显示了最小函数,定义如下: minimum = head . sort 并指出它的复杂性是O(n)。 我不明白为什么复杂性被说成是线性的,如果通过replacesorting是O(nlog n)。 文章中提到的sorting不能是线性的,因为它不会假设数据,因为线性sorting方法(比如计数sorting)会要求sorting。 懒惰的评价在这里扮演着一个神秘的angular色吗? 如果是的话,背后的解释是什么?
有一个更简洁的方法,从数据库后端的tbl(即数据框/表不能直接子集)获得一列dplyr tbl作为一个向量吗? require(dplyr) db <- src_sqlite(tempfile(), create = TRUE) iris2 <- copy_to(db, iris) iris2$Species # NULL 那太容易了,所以 collect(select(iris2, Species))[, 1] # [1] "setosa" "setosa" "setosa" "setosa" etc. 但似乎有点笨拙。
我们都知道(或者应该知道)Haskell默认是懒惰的。 评估之前,没有任何评估。 那么什么时候必须进行评估? 有几点Haskell必须严格。 我称之为“严格点”,虽然这个特定的术语并不像我想象的那样广泛。 据我所知: Haskell中的减less(或评估) 只发生在严格点上。 所以问题是: Haskell的严格性究竟是什么? 我的直觉说main seq / bang模式,模式匹配,以及通过main执行的任何IO动作都是主要的严格点,但是我不知道为什么我知道这一点。 (另外,如果他们不被称为“严格点”,他们叫什么?) 我想象一个好的答案将包括一些关于WHNF的讨论等等。 我也想象它可能会触及lambda演算。 编辑:关于这个问题的其他想法。 正如我在这个问题上所反映的那样,我认为在严格点的定义中增加一些内容会更清楚些。 严格点可以有不同的背景和不同的深度 (或严格性)。 回到我的定义:“减lessHaskell只发生在严格点上”,让我们在这个定义中增加这样一个条款:“一个严格点只有当它的周围环境被评估或减less时才会触发”。 所以,让我试着让你开始我想要的答案。 main是一个严格点。 它被特别指定为其上下文的主要严格点:程序。 当程序( main的上下文)被评估时,main的严格点被激活。 主要的深度是最大的:它必须充分评估。 主要通常由IO操作组成,这些操作也是严格点,其上下文是main 。 现在您尝试:以这些术语讨论seq和模式匹配。 解释function应用的细微差别:它是如何严格的? 它怎么样? 那么deepseq呢? let和case陈述? unsafePerformIO ? Debug.Trace ? 顶级定义? 严格的数据types? 爆炸模式? 等等这些项目中有多less可以用seq或模式匹配来描述?
自1.3.0-beta.10版本以来,AngularJS有了一个新的function: “懒惰的一次性绑定” 。 简单的expression式可以用::作为前缀,在第一次评估expression式之后告诉angular度停止观察。 给出的常见例子是这样的: <div>{{::user.name}}</div> 是否有像以下类似的expression式类似的语法? <div ng-if="user.isSomething && user.isSomethingElse"></div> <div ng-class="{classNameFoo: user.isSomething}"></div>
我一直在想,为什么懒惰的评估是有用的。 我还没有任何人以一种合理的方式向我解释; 大多数情况下,它最终会熬到“相信我”。 注意:我不是指记忆。
C ++没有对懒惰评估的本机支持(就像Haskell一样)。 我想知道是否有可能以合理的方式在C ++中实现懒惰评估。 如果是的话,你会怎么做? 编辑:我喜欢康拉德鲁道夫的答案。 我想知道是否有可能以更通用的方式实现它,例如通过使用一个参数化的类惰性,本质上适用于matrix_add为matrix工作的方式。 T上的任何操作都会返回。 唯一的问题是将参数和操作代码存储在懒本身中。 任何人都可以看到如何改善呢?
我想使用dplyr来参数化下面的计算,它发现哪个Sepal.Length值与多个Sepal.Length值相关联: library(dplyr) iris %>% group_by(Sepal.Length) %>% summarise(n.uniq=n_distinct(Sepal.Width)) %>% filter(n.uniq > 1) 通常我会写这样的东西: not.uniq.per.group <- function(data, group.var, uniq.var) { iris %>% group_by(group.var) %>% summarise(n.uniq=n_distinct(uniq.var)) %>% filter(n.uniq > 1) } 但是,这种方法会引发错误,因为dplyr使用非标准评估 。 这个函数应该如何写?
我发现这篇关于Lazy : 懒惰在C#4.0 – 懒惰 使用Lazy对象获得最佳性能的最佳做法是什么? 有人能指出我在实际应用中的实际使用吗? 换句话说,我应该什么时候使用它?
我通常听说生产代码应该避免使用惰性I / O。 我的问题是,为什么? 使用Lazy I / O之外的东西可以玩吗? 什么使替代scheme(例如统计员)更好?
这个问题中 myAny函数的代码使用了foldr。 当谓词满足时,它停止处理无限列表。 我用foldl重写了它: myAny :: (a -> Bool) -> [a] -> Bool myAny p list = foldl step False list where step acc item = p item || acc (请注意,step函数的参数正确颠倒了。) 但是,它不再停止处理无限列表。 我试图跟踪Apocalisp答案中的函数执行情况: myAny even [1..] foldl step False [1..] step (foldl step False [2..]) 1 even 1 || (foldl step False [2..]) False || […]