Tag: 懒惰评估

recursion函数导致堆栈溢出

我正在尝试编写一个简单的筛选函数来计算clojure中的素数。 我已经看到了关于编写一个有效的筛选函数的问题,但我还没有到那个时候。 现在我只是想写一个非常简单的(慢)筛。 这是我所想到的: (defn sieve [potentials primes] (if-let [p (first potentials)] (recur (filter #(not= (mod % p) 0) potentials) (conj primes p)) primes)) 对于小范围,它工作正常,但会导致大范围堆栈溢出: 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) 我认为,通过使用recur这将是一个非堆栈消耗循环结构? 我错过了什么?

经验丰富的Haskell开发人员在devise*时间如何处理懒惰?

我是一名中级Haskell程序员,拥有严格的FP和非FP语言的丰富经验。 我的大多数Haskell代码分析中等大的数据集(10 ^ 6..10 ^ 9),所以懒惰总是潜伏着。 我对thunk,WHNF,模式匹配和共享有相当好的理解,并且我已经能够用爆炸模式和seq来修复泄漏,但是这种简介和祈祷方法感觉肮脏和错误。 我想知道Haskell程序员在devise时如何接近懒惰。 我不是问如Data.ByteString.Lazy或foldl'; 相反,我想知道如何考虑导致运行时内存问题和棘手的debugging的较低级别的懒惰机制。 在devise期间,你如何思考thunk,模式匹配和共享? 你用什么样的devise模式和习语来避免泄漏? 你是怎么学习这些模式和习语的,你有没有好的参考? 你如何避免过早优化不泄漏的非问题? (2014-05-15修订时间预算): 你预算大量的项目时间来寻找和解决内存问题? 或者,您的devise技巧通常是否会避免内存问题,并且在开发周期的早期就会获得预期的内存消耗?

了解GHCi让绑定的不同行为

我一直在玩Simon Marlow关于Haskell中并行和并发编程的书中的一些例子,并偶然发现了一个我不太了解的有趣的行为。 这实际上是关于我想了解GHC的一些内部工作。 假设我在REPL中执行以下操作: λ» let x = 1 + 2 :: Int λ» let z = (x,x) λ» :sprint x x = _ λ» :sprint z z = (_,_) λ» seq x () () λ» :sprint z z = (3,3) 好吧,这几乎是我所期望的,除了z已经被评估为WHNF。 让我们写一个类似的程序,并把它放在一个文件中: module Thunk where import Debug.Trace x :: Int x = trace "add" […]

Clojure惰性序列用法

我很难理解如何在Clojure中创build一个惰性序列。 macros的文档并不完全清楚: 用法:(lazy-seq&body)获取返回ISeq或nil的expression式体,并产生一个Seqable对象,只有在第一次调用seq时才会调用主体,并caching结果并将其返回到所有后续seq电话。 我见过的所有例子似乎都是这样的: ; return everything in the sequence starting at idx n (defn myseq-after-n [n] (…) ) (def my-lazy-seq (lazy-seq (conj [init-value] (myseq-after-n 2))) ) 所以,我没有得到的第一件事是,因为lazy-seq在conj的调用之外,它如何防止conj在评估中产生一个无限序列? 我的第二个问题是,懒惰的序列定义总是采取这种一般forms?

懒评估与macros

我习惯了从Haskell的懒惰评估,并发现自己现在已经使用懒惰评估正确地使用默认的急切语言激怒。 这实际上是非常有害的,因为我使用的其他语言主要是懒散地评估一些非常尴尬的东西,通常涉及到自定义迭代器等等。 所以,仅仅通过获取一些知识,我实际上使自己的原有语言的生产力下降 。 叹。 但是我听说ASTmacros提供了另一种干净的方式来做同样的事情。 我经常听到类似“懒惰的评估使得macros冗余”的说法,反之亦然,主要来自Lisp和Haskell社区的争吵。 我已经涉足了各种Lisp变体的macros。 他们看起来像是一个真正有组织的方式来复制和粘贴大量的代码,以便在编译时处理。 他们当然不是Lispers喜欢认为的圣杯。 但是,这几乎可以肯定是因为我不能正确使用它们。 当然,让macros观系统工作在相同的核心数据结构上,这种语言本身就是非常有用的,但它基本上仍然是复制和粘贴代码的有组织的方式。 我承认,将macros系统放在与允许完整运行时变更的语言相同的AST上是非常有用的。 我想知道的是,macros是如何简明扼要地做懒惰评估呢? 如果我想一行一行地处理一个文件,而不是浑浊起来,我只是返回一个列表,其中有一个线路阅读程序映射到它。 这是DWIM的完美例子(按照我的意思)。 我甚至不必考虑这个问题。 我显然不会得到macros。 我已经使用了它们,并没有特别留下深刻印象的炒作。 所以有些东西我错过了,我没有通过在线阅读文档。 有人可以向我解释这一切吗?

string.Format上的{{{0}}是做什么的?

在命名空间MS.Internal ,有一个名为NamedObject的类。 它有一个奇怪的代码块: public override string ToString() { if (_name[0] != '{') { // lazily add {} around the name, to avoid allocating a string // until it's actually needed _name = String.Format(CultureInfo.InvariantCulture, "{{{0}}}", _name); } return _name; } 我很好奇这个评论: // lazily add {} around the name, to avoid allocating a string // until it's […]

哈斯克尔:非严格和懒惰有什么不同?

我经常看到懒惰和非严格不一样,但是我发现很难理解这个差别。 它们似乎可以互换使用,但是我知道它们有不同的含义。 我将不胜感激有助于理解差异。 我有几个分散在这个职位的问题。 我将在这篇文章结尾总结这些问题。 我有几个例子片段,我没有testing它们,只是把它们作为概念呈现出来。 我已经添加了引号,以防止您查找它们。 也许这会在以后同样的问题上帮助别人。 非严格防卫: 函数f被认为是严格的,如果应用于非终止expression式时,它也不能终止。 换句话说,如果f bot的值是| ,则f是严格的 。 对于大多数编程语言,所有function都是严格的。 但在Haskell中并非如此。 作为一个简单的例子,考虑const1,常量1函数,定义如下: const1 x = 1 在Haskell中const1 bot的值是1.在操作上,因为const1不需要它的参数的值,所以它永远不会试图评估它,因此永远不会被捕获到一个非终结的计算。 由于这个原因,非严格函数也被称为“懒惰函数”,并被认为是“懒惰”或“需要”评价他们的论点。 – 对Haskell的一个简单介绍:函数 我非常喜欢这个定义。 这似乎是最好的,我可以find理解严格。 是const1 x = 1懒吗? 非严格意味着减less(评估的math术语)从外部进行, 所以如果你有(a +(b c))那么你先减less+,然后你减less内部(b c)。 – Haskell维基:Lavy vs非严格 Haskell Wiki真的让我困惑。 我明白他们在说什么,但是我不明白(a+(b*c))是如何评价非严格的,如果是通过_|_ ? 在非严格评估中,除非函数实际用于评估函数体,否则不会评估函数的参数。 在教会编码下,运营商的懒惰评估映射到function的非严格评估; 为此,非严格评价通常被称为“懒惰”。 许多语言中的布尔expression式都使用一种非严格评估forms,称为短路评估,只要能够确定将产生一个明确的布尔值就会返回评估结果 – 例如,在遇到真值的分离expression式中,或者在遇到错误的连接expression式等等。 条件expression式通常也使用懒惰评估,只要一个明确的分支会导致评估返回。 – 维基百科:评估策略 懒惰Def: 另一方面,懒惰评价意味着只有在需要结果的时候评价一个expression(注意从“减less”转变为“评价”)。 […]

用filter代替filter

在使用filter,flatmap等函数的时候,使用Filter来代替filter,总是更高效的吗? 为什么只支持map,flatmap和foreach? (像forall /期望的function也存在)

让我的getter方法更改存储值是不好的做法吗?

在我的课堂中更改我的getter方法(如版本2)是不好的做法。 版本1: public String getMyValue(){ return this.myValue } 版本2: public String getMyValue(){ if(this.myValue == null || this.myValue.isEmpty()){ this.myValue = "N/A"; } return this.myValue; }

hibernate: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() ) ); 它在第三个assertTrue失败,它试图将sf中的值与sf2中的相应值进行比较。 这是一个例外: org.hibernate.LazyInitializationException: could not initialize proxy – no Session at […]