lazy-evaluation相关内容

如何在 Haskell 中强制评估?

我对 Haskell 比较陌生,我正在尝试学习如何使用 do 表示法按顺序执行不同的操作.特别是,我正在编写一个程序来对算法(函数)进行基准测试 foo :: [String] ->[细绳] 为此,我想写一个类似的函数 import System.CPUTime基准 :: [字符串] ->IO 整数基准输入列表 = 做开始 ..
发布时间:2021-12-14 12:34:13 其他开发

Haskell 延迟 I/O 和关闭文件

我编写了一个小的 Haskell 程序来打印当前目录中所有文件的 MD5 校验和(递归搜索).基本上是 md5deep 的 Haskell 版本.一切都很好,除非当前目录有大量文件,在这种情况下,我会收到如下错误: : : openBinaryFile: 资源耗尽(打开的文件太多) Haskell 的懒惰似乎导致它不关闭文件,即使在其相应的输出行完成后也是如此. 相关代码如下.感兴趣的函 ..
发布时间:2021-12-14 12:30:47 其他开发

惰性求值和时间复杂度

我正在浏览 stackoverflow 非平凡的懒惰评估,这让我想到了 Keegan McAllister's演示:为什么学习 Haskell.在幻灯片 8 中,他展示了最小函数,定义为: minimum = head .种类 并声明其复杂度为 O(n).如果按替换排序是 O(nlog n),我不明白为什么说复杂性是线性的.帖子中提到的排序不能是线性的,因为它不对数据做任何假设,这是线性排序方 ..

理解递归定义的列表(就 zipWith 而言的 fibs)

我正在学习 Haskell,并且遇到了以下代码: fibs = 0 : 1 : zipWith (+) fibs (tail fibs) 就其工作原理而言,我在解析时遇到了一些麻烦.它非常简洁,我知道不需要更多内容,但我想了解 Haskell 如何在我写作时设法“填写"谎言: 拿 50 条信息 有什么帮助吗? 谢谢! 解决方案 我将稍微解释一下它的内部工作原理.首先,您必须意 ..
发布时间:2021-12-14 12:01:26 其他开发

为什么惰性求值有用?

我一直想知道为什么惰性求值很有用.我还没有让任何人以一种有意义的方式向我解释;大多数情况下,它最终会归结为“相信我". 注意:我的意思不是记忆. 解决方案 主要是因为它可以更高效 -- 如果不使用值,则不需要计算它们.例如,我可能将三个值传递给一个函数,但根据条件表达式的顺序,实际上可能只使用一个子集.在像 C 这样的语言中,无论如何都会计算所有三个值;但在 Haskell 中,只计 ..
发布时间:2021-12-14 11:50:23 其他开发

Haskell 声明中的感叹号是什么意思?

当我尝试使用真实项目来驱动它来学习 Haskell 时,我遇到了以下定义.我不明白每个参数前面的感叹号是什么意思,我的书似乎没有提到它. data MidiMessage = MidiMessage !Int !MidiMessage 解决方案 这是一个严格性声明.基本上,这意味着在创建数据结构值时必须将其评估为所谓的“弱头范式".让我们看一个例子,这样我们就能明白这意味着什么: data ..
发布时间:2021-12-14 11:37:40 其他开发

具有无限列表的 foldl 与 foldr 行为

中 myAny 函数的代码这个问题使用foldr.当谓词满足时,它停止处理无限列表. 我使用 foldl 重写了它: myAny :: (a -> Bool) -> [a] -> BoolmyAny p list = foldl step False list在哪里步骤 acc 项目 = p 项目 ||收货 (注意 step 函数的参数是正确反转的.) 但是,它不再停止处理无限列表 ..
发布时间:2021-12-14 11:35:37 其他开发

Lazy I/O 有什么不好?

我普遍听说生产代码应该避免使用 Lazy I/O.我的问题是,为什么?除了玩玩之外,还可以使用 Lazy I/O 吗?什么使替代方案(例如枚举器)更好? 解决方案 懒惰 IO 的问题是释放您获得的任何资源都有些不可预测,因为这取决于您的程序如何使用数据——它的“需求模式".一旦您的程序删除对资源的最后一个引用,GC 最终将运行并释放该资源. 惰性流是一种非常的编程风格.这就是 she ..
发布时间:2021-12-14 11:34:22 其他开发

解释这段输出素数流的haskell代码

我无法理解这段代码: let筛 (p:xs) = p : 筛 (过滤器 (\ x -> x `mod` p/= 0) xs)在筛子 [2 .. ] 谁能帮我分解一下?我知道其中存在递归,但这就是我无法理解此示例中的递归如何工作的问题. 解决方案 其实很优雅. 首先,我们定义一个函数sieve,它接受一个元素列表: sieve (p:xs) = 在sieve的主体中,我们取了列 ..
发布时间:2021-12-14 11:30:03 其他开发

为什么 :sprint 总是打印“_"?

前奏>让 a = 3前奏>:冲刺一 = _前奏>让 c = "ab"前奏>:sprint cc = _ 为什么它总是打印_?我不太明白 :sprint 命令的语义. 解决方案 Haskell 是一种惰性语言.在“需要"结果之前,它不会评估结果. 现在,只需打印一个值就会导致“需要"所有这些值.换句话说,如果您在 GHCi 中键入一个表达式,它会尝试打印出结果,这会导致对所有结果进行 ..
发布时间:2021-12-14 08:39:10 其他开发

编写一个 Kotlin util 函数,它在初始化程序中提供自引用

我试图从另一个问题的答案中概括我的技巧. 它应该提供一种方法来引用尚未在其初始值设定项中构造的值(当然,不是直接构造,而是在 lambdas 和对象表达式中). 我目前拥有的: class SelfReference(val 初始值设定项:SelfReference.() -> T) {val self: T by lazy {内部 ?: throw IllegalStateExce ..
发布时间:2021-12-10 17:15:54 其他开发

Spark Transformation - 为什么懒惰,有什么好处?

Spark Transformations 是惰性求值的 - 当我们调用 action 时,它会执行基于谱系图的所有转换. 延迟评估转换有什么好处? 与急切评估相比,它是否会提高性能和更少的内存消耗? 延迟评估 Transformation 有什么缺点吗? 解决方案 对于转换,Spark 将它们添加到计算的 DAG 中,并且只有当驱动程序请求某些数据时,这个 DAG 才会 ..
发布时间:2021-12-09 23:16:34 其他开发

Scala 中的“def"与“val"与“lazy val"评估

我的理解是否正确 def 每次被访问时都会被评估 lazy val 一旦被访问就会被评估 val 一旦进入执行范围就被评估? 解决方案 是的,虽然对于第三个我会说“当那个语句被执行时",因为,例如: def foo() {新的 {val a: Any = sys.error("b is " + b)val b: Any = sys.error("a is " + a)} ..
发布时间:2021-12-07 13:30:15 其他开发

前向引用 - 为什么这段代码会编译?

考虑这个片段: 对象 A {val b = cval c = "foo"}println( A.b )//打印“null" 作为较大程序的一部分,这会导致运行时失败.编译器显然允许从 'b' 到(未初始化的)'c' 的前向引用,但 'b' 保留了 c 的原始空值.为什么这是允许的?是否有可以从该功能中受益的编程场景? 将代码改为直线序列,行为改变: val b = cval c = ..
发布时间:2021-12-07 13:25:19 其他开发

用过滤器代替过滤器

在之后应用 map、flatmap 等函数时,使用 withFilter 而不是 filter 总是更高效吗? 为什么只支持 map、flatmap 和 foreach?(预期的功能,如 forall/exists 以及) 解决方案 来自 Scala 文档: 注意:c filter p 和 c withFilter p 的区别在于前者创建一个新的集合,而后者只限制域后续的map ..