当前位置: 首页 > 知识库问答 >
问题:

Haskell:插入排序的延迟求值与渴望求值

杨晓博
2023-03-14

我现在被IFPH第7章的一个问题困住了。

练习7.1.2内容如下:

“排序的一个定义是取

insert x [] = [x]
insert x (y:ys) = if x <= y then x : y : ys else y : insert x ys

详细给出表达式排序[3,4,2,1]的渴望和懒惰求值减少序列,解释它们的区别。”

现在,我先从急切的求值缩减序列开始,我假设它是最内部的缩减。

对我来说,这产生了...

sort [3,4,2,1] 
=> foldr insert [] [3,4,2,1]
=> insert 3 (foldr insert [] [4,2,1])
=> insert 3 (insert 4 (foldr insert [] [2,1]
=> insert 3 (insert 4 (insert 2 (foldr insert [] [1])))
=> insert 3 (insert 4 (insert 2 (insert 1 (foldr [] []))))
=> insert 3 (insert 4 (insert 2 (insert 1 [])))
=> insert 3 (insert 4 (insert 2 [1]))
=> insert 3 (insert 4 (1 : insert 2 []))
=> insert 3 (insert 4 (1 : [2]))
=> insert 3 (1 : insert 4 [2])
=> insert 3 (1 : 2 : insert 4 [])
=> insert 3 (1 : 2 : [4])
=> insert 3 [1,2,4]
=> 1 : insert 3 [2,4]
=> 1 : 2 : insert 2 : [4]
=> 1 : 2 : 3 : [4]
=> [1,2,3,4]

这是已排序的列表。

现在对于惰性评估,我能想到的唯一减少序列与渴望评估完全相同。当然,Haskell对惰性评估进行最左边的最外层评估:但是我认为它不能对大部分列表进行操作,直到内部计算完成。

这个推理正确吗?直觉告诉我没有。

如果有人能指出如何执行惰性评估缩减序列,那就太好了。

谢谢

共有1个答案

陈宜修
2023-03-14

在线上包含

insert 3 (1 : insert 4 [2])

您已经计算了足够多的外部插入的第二个参数,可以运行计算,并给出下一行

if 3 <= 1 then 3 : 1 : insert 4 [2] else 1 : insert 3 (insert 4 [2])

您现在可以运行if语句,将下一个计算作为

1 : insert 3 (insert 4 [2])     -- (LAZY)

而不是急于评价你所拥有的:

insert 3 (1 : 2 : insert 4 [])  -- (EAGER)

使用惰性评估,您在对列表的其余部分进行排序之前计算结果的第一个元素是1-与急切评估形成对比,急切评估几乎对列表的整个尾部进行排序,然后才发现第一个元素是什么。

 类似资料:
  • 问题内容: hibernate的新手。 我有用户组多对多关系。三个表:User,Group和UserGroup映射表。 实体: 注意,在组实体中,我正在使用获取方法EAGER。现在,当我打电话给DAO时,请使用以下条件来检索系统中的所有组: 我从mappgin表(用户组)获取所有行,而不是获取组的实际数量… 例如,如果我在用户表中 在组表中 在用户组表中 结果将是以下列表-{grp1,grp2,g

  • 本文向大家介绍Haskell插入排序,包括了Haskell插入排序的使用技巧和注意事项,需要的朋友参考一下 示例 使用示例: 结果:            

  • Flask 的设计原则中有一条是响应对象被创建并在一条可能的回调链中传递,而在 这条回调链但中的任意一个回调,您都可以修改或者替换掉他们。当请求开始被 处理时,还没有响应对象,响应对象将在这一过程中,被某个视图函数或者系统 的其他组件按照实际需要来闯将。 但是,如果您想在响应过程的结尾修改响应对象,但是这是对象还不存在,那么会发生 什么呢?一个常见的例子是您可能需要在 before-request

  • 好的,对于前面提到的技术,这是一个非常奇怪的行为,我有一个控制器,它调用一个服务,这调用一个dao。传递给持久化的实体有一个带有注释的字段,当我为dao或服务运行测试并插入重复值时,会抛出异常这是正常的,是预期的行为。但是,当我运行web应用程序时,异常会在服务完成执行后抛出。在执行dao时不会。因此,这迫使我在控制器中捕获异常,而不是在服务中。 控制器启动 服务//继续 DAO//继续(但是此时

  • 问题内容: 我有一个Hibernate对象,其属性都被延迟加载。这些属性大多数是其他Hibernate对象或PersistentSets。 现在,我想强制Hibernate只渴望一次加载这些属性。 当然,我可以通过“接触”这些属性中的每一个,但是也许还有另一种方法可以实现我的目标。 问题答案: 该文档将其如下所示: 您可以在HQL中强制执行通常急切的属性获取。 参考文献 Hibernate Cor

  • 本文向大家介绍Hibernate中的延迟加载和渴望加载之间的区别,包括了Hibernate中的延迟加载和渴望加载之间的区别的使用技巧和注意事项,需要的朋友参考一下 Lazy和Eager是ORM中的两种数据加载策略,例如休眠和Eclipse链接。当一个实体类引用其他实体(例如Employee和Phone(员工中的电话))时,我们使用了这些数据加载策略。  延迟加载-仅当我们显式调用getter或si