Questions tagged «lazy-evaluation»

懒惰评估是指各种概念,这些概念试图避免对表达式的评估(除非需要其值),并在对其所有使用中共享对表达式的评估结果,从而无需对表达式进行一次以上的评估。

4
Haskell是否具有尾递归优化?
我今天在Unix中发现了“ time”命令,以为我会用它来检查Haskell的尾递归函数与普通递归函数之间的运行时差异。 我编写了以下函数: --tail recursive fac :: (Integral a) => a -> a fac x = fac' x 1 where fac' 1 y = y fac' x y = fac' (x-1) (x*y) --normal recursive facSlow :: (Integral a) => a -> a facSlow 1 = 1 facSlow x = x …


14
休眠:LazyInitializationException:无法初始化代理
这是让我困惑的一个。我正在尝试实现基本的Hibernate DAO结构,但是遇到了问题。 这是基本代码: int startingCount = sfdao.count(); sfdao.create( sf ); SecurityFiling sf2 = sfdao.read( sf.getId() ); sfdao.delete( sf ); int endingCount = sfdao.count(); assertTrue( startingCount == endingCount ); assertTrue( sf.getId().longValue() == sf2.getId().longValue() ); assertTrue( sf.getSfSubmissionType().equals( sf2.getSfSubmissionType() ) ); assertTrue( sf.getSfTransactionNumber().equals( sf2.getSfTransactionNumber() ) ); 它在尝试将sf中的值与sf2中的对应值进行比较的第三个assertTrue上失败。这是例外: org.hibernate.LazyInitializationException: could not initialize proxy - …

7
惰性评估和时间复杂度
我一直在研究stackoverflow非临时性惰性评估,这使我想到了Keegan McAllister的演讲:为什么要学习Haskell。在幻灯片8中,他显示了最小功能,定义为: minimum = head . sort 并指出其复杂度为O(n)。我不明白,如果按替换排序为O(nlog n),为什么说复杂度是线性的。帖子中提到的排序不能是线性的,因为它不假设任何有关数据的信息,这是线性排序方法(例如计数排序)所要求的。 懒惰的评估在这里扮演着神秘的角色吗?如果是这样,其背后的解释是什么?



5
Clojure:休息与下一个
我很难理解Clojurerest和之间的区别next。官方网站上关于懒惰的页面表明,偏好可能应该是使用rest,但是并不能真正清楚地解释两者之间的区别。谁能提供一些见识?


12
C ++中的惰性评估
C ++不像Haskell那样对延迟评估提供本机支持。 我想知道是否有可能以合理的方式在C ++中实现惰性评估。如果是,您将如何做? 编辑:我喜欢康拉德·鲁道夫的答案。 我想知道是否有可能以更通用的方式实现它,例如,通过使用参数化的类lazy,该类实际上对T有效,而matrix_add对矩阵有效。 对T的任何操作都将返回惰性。唯一的问题是将参数和操作代码存储在惰性内部。谁能看到如何改善这一点?

6
Haskell:非严格和懒惰有何区别?
我经常读到懒惰与非严格不一样,但是我很难理解它们之间的区别。它们似乎可以互换使用,但我知道它们具有不同的含义。我希望能帮助您理解其中的区别。 我对此帖子有一些疑问。我将在本文结尾总结这些问题。我有一些示例代码片段,我没有对其进行测试,仅将它们作为概念进行了介绍。我添加了报价,以免您查找报价。也许它将对以后的某个问题有所帮助。 非严格Def: 如果函数f在应用于非终止表达式时也未能终止,则称其为严格函数。换句话说,当f bot的值是|时,f是严格的。。对于大多数编程语言,所有功能都是严格的。但这在Haskell中并非如此。举一个简单的例子,考虑const1,常量1函数,其定义为: const1 x = 1 在Haskell中const1 bot的值是1。从操作上来说,由于const1不需要参数的值,因此它从不尝试对其求值,因此也不会陷入无限终止的计算中。因此,非严格函数也称为“惰性函数”,并说是“懒惰地”或“根据需要”评估其参数。 -一个温柔的介绍哈斯克尔:函数 我真的很喜欢这个定义。这似乎是我了解严格的最佳选择。是const1 x = 1懒惰的呢? 非严格意味着减少(评估的数学术语)从外部进入, 因此,如果您有(a +(b c)),则首先减小+,然后减小内部(b c)。 -哈斯克尔百科:懒惰与非严格 Haskell Wiki确实使我感到困惑。我了解他们在说什么订单,但是我看不到(a+(b*c))如果通过了,将如何严格地评估_|_? 在非严格评估中,不评估函数的参数,除非在函数主体的评估中实际使用了参数。 在教会编码下,运算符的惰性评估映射为功能的非严格评估;因此,非严格评估通常称为“惰性”。许多语言中的布尔表达式使用一种称为短路评估的非严格评估形式,在这种评估中,只要可以确定会产生明确的布尔值,评估就会立即返回,例如,在遇到真值的析取表达式中,或者遇到假的合取表达式,依此类推。条件表达式通常也使用惰性求值,即在得到明确的分支后立即返回求值。 -维基百科:评估策略 懒惰的Def: 另一方面,惰性求值意味着仅在需要表达式的结果时才对表达式求值(请注意从“归约”到“求值”的转变)。因此,当评估引擎看到一个表达式时,它将构建一个thunk数据结构,其中包含评估该表达式所需的任何值以及指向该表达式本身的指针。当实际需要结果时,评估引擎将调用该表达式,然后将结果替换为thunk以供将来参考。... 显然,一个笨拙的表情和一个部分评估的表情之间有很强的对应关系。因此,在大多数情况下,术语“惰性”和“非严格”是同义词。但不完全是。 -哈斯克尔百科:懒惰与非严格 这似乎是Haskell的特定答案。我认为懒惰意味着沉重,非严格意味着部分评估。比较是否简化了?不懒总是意味着的thunk和非严格总是意味着部分评价。 在编程语言理论中,惰性评估或按需调用1是一种评估策略,它会延迟对表达式的评估,直到实际需要其值为止(非严格评估),并且还避免了重复评估(共享)。 -维基百科:懒惰的评估 势在必行的例子 我知道大多数人在学习功能语言时都会说忘记命令式编程。但是,我想知道这些是否属于非严格,懒惰,或者两者兼有?至少它会提供一些熟悉的东西。 短路 f1() || f2() C#,Python和其他具有“ yield”功能的语言 public static IEnumerable Power(int number, int exponent) { …

3
并行无限Java流内存不足
我试图理解为什么以下Java程序给出OutOfMemoryError,而没有的相应程序没有给出.parallel()。 System.out.println(Stream .iterate(1, i -> i+1) .parallel() .flatMap(n -> Stream.iterate(n, i -> i+n)) .mapToInt(Integer::intValue) .limit(100_000_000) .sum() ); 我有两个问题: 该程序的预期输出是什么? 如果没有,.parallel()这似乎只是输出sum(1+2+3+...),这意味着它只是在flatMap的第一个流“卡住”了,这是有道理的。 对于并行,我不知道是否有预期的行为,但是我的猜测是它以某种方式交错了第一个n左右的流,n并行工作者的数量在哪里。根据组块/缓冲行为,它也可能略有不同。 是什么导致它的内存不足?我正在专门尝试了解这些流是如何在后台实现的。 我猜有些东西阻塞了流,因此它永远不会完成,并且能够摆脱生成的值,但是我不太清楚事物的评估顺序和缓冲发生的位置。 编辑:如果相关,我正在使用Java 11。 Editt 2:即使对于简单的程序IntStream.iterate(1,i->i+1).limit(1000_000_000).parallel().sum(),显然也会发生同样的事情,因此它可能与limit而不是的懒惰有关flatMap。

1
在Haskell中评估函数->()有什么规则?
就像标题中所说的那样:对Haskell函数返回单元进行评估有什么保证?有人会认为在这种情况下无需运行任何类型的评估,()除非存在明确的严格性要求,否则编译器可以将所有此类调用替换为立即值,在这种情况下,代码可能必须决定是否应返回()或底部。 我已经在GHCi中对此进行了实验,似乎发生了相反的情况,也就是说,似乎正在评估这种功能。一个非常原始的例子是 f :: a -> () f _ = undefined f 1由于存在,评估会引发错误undefined,因此肯定会发生某些评估。但是,尚不清楚评估的深度。有时它看起来像需要评估返回函数的所有调用一样深入()。例: g :: [a] -> () g [] = () g (_:xs) = g xs 如果使用,此代码将无限循环g (let x = 1:x in x)。但是之后 f :: a -> () f _ = undefined h :: a -> () h _ …


5
如何在不重复自己的情况下使该算法变得更懒惰?
(受到我对这个问题的回答的启发。) 考虑下面的代码(它应该找到小于或等于给定输入的最大元素): data TreeMap v = Leaf | Node Integer v (TreeMap v) (TreeMap v) deriving (Show, Read, Eq, Ord) closestLess :: Integer -> TreeMap v -> Maybe (Integer, v) closestLess i = precise Nothing where precise :: Maybe (Integer, v) -> TreeMap v -> Maybe (Integer, v) precise closestSoFar …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.