lazy-evaluation相关内容
我对 Haskell 比较陌生,我正在尝试学习如何使用 do 表示法按顺序执行不同的操作.特别是,我正在编写一个程序来对算法(函数)进行基准测试 foo :: [String] ->[细绳] 为此,我想写一个类似的函数 import System.CPUTime基准 :: [字符串] ->IO 整数基准输入列表 = 做开始
..
我编写了一个小的 Haskell 程序来打印当前目录中所有文件的 MD5 校验和(递归搜索).基本上是 md5deep 的 Haskell 版本.一切都很好,除非当前目录有大量文件,在这种情况下,我会收到如下错误: : : openBinaryFile: 资源耗尽(打开的文件太多) Haskell 的懒惰似乎导致它不关闭文件,即使在其相应的输出行完成后也是如此. 相关代码如下.感兴趣的函
..
我正在浏览 stackoverflow 非平凡的懒惰评估,这让我想到了 Keegan McAllister's演示:为什么学习 Haskell.在幻灯片 8 中,他展示了最小函数,定义为: minimum = head .种类 并声明其复杂度为 O(n).如果按替换排序是 O(nlog n),我不明白为什么说复杂性是线性的.帖子中提到的排序不能是线性的,因为它不对数据做任何假设,这是线性排序方
..
我可以在这个表达式中取消对列表理解的糖化: [(i,j) |i 这是输出: [(1,2),(1,3),(1,4),(2,3),(2,4),(3,4)] 我怎样才能用 map、filter 等写出那段代码? 编辑 这里是另一个: [(i,j,k) |i 这是输出: [(1,2,3),(1,2,4),(1,2,5),(1,2,6),(1,3,4),(1,3,5),(1,3
..
我正在学习 Haskell,并且遇到了以下代码: fibs = 0 : 1 : zipWith (+) fibs (tail fibs) 就其工作原理而言,我在解析时遇到了一些麻烦.它非常简洁,我知道不需要更多内容,但我想了解 Haskell 如何在我写作时设法“填写"谎言: 拿 50 条信息 有什么帮助吗? 谢谢! 解决方案 我将稍微解释一下它的内部工作原理.首先,您必须意
..
我一直想知道为什么惰性求值很有用.我还没有让任何人以一种有意义的方式向我解释;大多数情况下,它最终会归结为“相信我". 注意:我的意思不是记忆. 解决方案 主要是因为它可以更高效 -- 如果不使用值,则不需要计算它们.例如,我可能将三个值传递给一个函数,但根据条件表达式的顺序,实际上可能只使用一个子集.在像 C 这样的语言中,无论如何都会计算所有三个值;但在 Haskell 中,只计
..
当我尝试使用真实项目来驱动它来学习 Haskell 时,我遇到了以下定义.我不明白每个参数前面的感叹号是什么意思,我的书似乎没有提到它. data MidiMessage = MidiMessage !Int !MidiMessage 解决方案 这是一个严格性声明.基本上,这意味着在创建数据结构值时必须将其评估为所谓的“弱头范式".让我们看一个例子,这样我们就能明白这意味着什么: data
..
中 myAny 函数的代码这个问题使用foldr.当谓词满足时,它停止处理无限列表. 我使用 foldl 重写了它: myAny :: (a -> Bool) -> [a] -> BoolmyAny p list = foldl step False list在哪里步骤 acc 项目 = p 项目 ||收货 (注意 step 函数的参数是正确反转的.) 但是,它不再停止处理无限列表
..
我普遍听说生产代码应该避免使用 Lazy I/O.我的问题是,为什么?除了玩玩之外,还可以使用 Lazy I/O 吗?什么使替代方案(例如枚举器)更好? 解决方案 懒惰 IO 的问题是释放您获得的任何资源都有些不可预测,因为这取决于您的程序如何使用数据——它的“需求模式".一旦您的程序删除对资源的最后一个引用,GC 最终将运行并释放该资源. 惰性流是一种非常的编程风格.这就是 she
..
这个斐波那契函数是通过什么机制记忆的? fib = (map fib' [0..] !!)其中 fib' 1 = 1fib' 2 = 1fib' n = fib (n-2) + fib (n-1) 在相关说明中,为什么这个版本没有? fib n = (map fib' [0..] !! n)其中 fib' 1 = 1fib' 2 = 1fib' n = fib (n-2) + fib (n-
..
我无法理解这段代码: let筛 (p:xs) = p : 筛 (过滤器 (\ x -> x `mod` p/= 0) xs)在筛子 [2 .. ] 谁能帮我分解一下?我知道其中存在递归,但这就是我无法理解此示例中的递归如何工作的问题. 解决方案 其实很优雅. 首先,我们定义一个函数sieve,它接受一个元素列表: sieve (p:xs) = 在sieve的主体中,我们取了列
..
前奏>让 a = 3前奏>:冲刺一 = _前奏>让 c = "ab"前奏>:sprint cc = _ 为什么它总是打印_?我不太明白 :sprint 命令的语义. 解决方案 Haskell 是一种惰性语言.在“需要"结果之前,它不会评估结果. 现在,只需打印一个值就会导致“需要"所有这些值.换句话说,如果您在 GHCi 中键入一个表达式,它会尝试打印出结果,这会导致对所有结果进行
..
所以考虑下面的代码块,它不像大多数人所期望的那样工作 #cartoon 示例a
..
我试图从另一个问题的答案中概括我的技巧. 它应该提供一种方法来引用尚未在其初始值设定项中构造的值(当然,不是直接构造,而是在 lambdas 和对象表达式中). 我目前拥有的: class SelfReference(val 初始值设定项:SelfReference.() -> T) {val self: T by lazy {内部 ?: throw IllegalStateExce
..
Spark Transformations 是惰性求值的 - 当我们调用 action 时,它会执行基于谱系图的所有转换. 延迟评估转换有什么好处? 与急切评估相比,它是否会提高性能和更少的内存消耗? 延迟评估 Transformation 有什么缺点吗? 解决方案 对于转换,Spark 将它们添加到计算的 DAG 中,并且只有当驱动程序请求某些数据时,这个 DAG 才会
..
这是一个让我感到困惑的地方.我正在尝试实现一个基本的 Hibernate DAO 结构,但遇到了问题. 以下是基本代码: int startingCount = sfdao.count();sfdao.create(sf);SecurityFiling sf2 = sfdao.read(sf.getId());sfdao.delete(sf);int endCount = sfdao.co
..
我有这个代码: 导入Data.ListnewList_bad lst = foldl' (\acc x -> acc ++ [x*2]) [] lstnewList_good lst = foldl' (\acc x -> x*2 : acc) [] lst 这些函数返回每个元素乘以 2 的列表: *Main>newList_bad [1..10][2,4,6,8,10,12,14,16,1
..
我的理解是否正确 def 每次被访问时都会被评估 lazy val 一旦被访问就会被评估 val 一旦进入执行范围就被评估? 解决方案 是的,虽然对于第三个我会说“当那个语句被执行时",因为,例如: def foo() {新的 {val a: Any = sys.error("b is " + b)val b: Any = sys.error("a is " + a)}
..
考虑这个片段: 对象 A {val b = cval c = "foo"}println( A.b )//打印“null" 作为较大程序的一部分,这会导致运行时失败.编译器显然允许从 'b' 到(未初始化的)'c' 的前向引用,但 'b' 保留了 c 的原始空值.为什么这是允许的?是否有可以从该功能中受益的编程场景? 将代码改为直线序列,行为改变: val b = cval c =
..
在之后应用 map、flatmap 等函数时,使用 withFilter 而不是 filter 总是更高效吗? 为什么只支持 map、flatmap 和 foreach?(预期的功能,如 forall/exists 以及) 解决方案 来自 Scala 文档: 注意:c filter p 和 c withFilter p 的区别在于前者创建一个新的集合,而后者只限制域后续的map
..