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

函数评估如何在Haskell中工作

汤玉宸
2023-03-14

我觉得我的知识的函数式编程是有点缺乏所以我决定看看网上并按照教程得到更好的当我凸轮通过它的状态在第一页

“假设您有一个不可变的数字列表xs=[1,2,3,4,5,6,7,8]和一个函数doubleMe,该函数将每个元素乘以2,然后返回一个新列表。如果我们想用命令式语言将列表乘以8,并执行doubleMe(doubleMe(xs)))),它可能会通过列表一次,复制一份,然后返回。然后,它将再次通过列表两次并返回结果。"

从我对函数式编程的了解来看,这似乎是错误的,让我告诉你为什么:

doubleMe = (\x.* 2 x)

所以

doubleMe doubleMe doubleMe xs

β是否会降低到:

(\x.* 2 x) doubleMe doubleMe xs ->beta
(* 2 doubleMe) doubleMe xs 
(* 2 (\x.* 2 x)) doubleMe xs ->eta
(\x.* 2 * 2 x) doubleMe  xs ->beta
(* 2 * 2 doubleMe)  xs
(* 2 * 2 (\x.* 2 x)) xs ->eta
(\x.* 2 * 2 * 2 x) xs ->beta
(* 2 * 2 * 2 xs) ->beta
(* 4 * 2 xs) -> beta
(* 8 xs)

这意味着该函数的beta等效于(\x*8 x)

我的印象是Haskell编译器在执行之前执行了这个缩减,这意味着不,它不会像本教程建议的那样在列表上传递3次,它只会传递一次。我错了吗?如果是这样,为什么哈斯克尔不这么做?当然,这将大大提高性能

共有1个答案

阎鸿煊
2023-03-14

我认为你只是误读了那一段。它说(强调我的):

如果我们想用命令式语言将列表乘以8,并执行doubleMe(doubleMe(doubleMe(xs)),它可能会通过列表一次,复制一个副本,然后返回它。

命令式语言是像C或Python这样的语言。不是哈斯克尔。

同一段继续将这种行为与“懒惰的语言”做了对比:

用一种懒惰的语言。。。它只会在你真正需要的时候通过列表。这样,当你想从一种懒惰的语言中得到一些东西时,你只需要获取一些初始数据,并有效地转换和修复它,使其与你最终想要的相似。

这更接近你的预期。

 类似资料:
  • 问题内容: 有什么好方法可以生成一个包含在n维点网格上评估的函数值的numpy数组? 例如,假设我要评估由 假设我要在二维点数组上对它进行评估,其中x值以10步从0变为4,y值以20步从-1变为1。在numpy中执行此操作的好方法是什么? PS这已经在上以各种形式被多次询问,但是我找不到简明扼要的问答。我将其发布以提供简洁的简单解决方案(如下)。 问题答案: 更短,更快和更清晰的答案,避免使用网格

  • 评估可能的员工,却没有得到它应得的能量。一个糟糕的雇佣,就像糟糕的婚姻,是非常糟糕的。每个人首要的一部分精力应该投入到招聘上,尽管这很少发生。 有不同的面试风格。有的是折磨人的,设计用来把候选人放在巨大压力下。这是为了这样一个有用的目的:在压力下折射出性格缺陷和弱点。候选人对待面试官不会比对待他们自己更诚实,而且,人的自欺能力是令人惊奇的。 你应当,最少,对候选人进行两个小时的与口头考核等价的技术

  • 问题内容: 我如何创建一些简单的ajax评级,如本页http://watir.com/documentation/所示?每个访问者都应该能够评分,我不需要设置权限。我想将评级存储在列中。因此,用户可以按评分排序。请举一个详细的例子。我不是JavaScript专家。 我找到了一个从头开始创建评分的示例。但是它授权用户。有人可以向我显示创建没有评分者(用户)的评分的指南吗?它不仅应存储值,还应计算票数

  • 我正在使用Spring WebFlow 2.5.0,但是我的SpEL表达式没有得到正确的计算。我想我一定是做了什么与我的WebFlow配置或SpEL错误,但我不确定哪个。 我的登录流中有以下决策状态。xml: 但是,即使我的方法返回一个Event.success(),我也从未转换到状态。测试结果似乎总是错误的。 是我的SpEL错了,还是我做评估/测试的方式错了?如何调试SpEL评估以查看发生了什么

  • 我正在尝试使用线性回归解决WEKA中数字属性的数字分类问题,然后我想在现有数据集上测试我的模型,并在当前测试数据集上重新评估模型。 作为评估的结果,我得到了总结: 相关系数0.9924平均绝对误差1.1017均方根误差1.2445实例总数17 但我没有这里显示的结果:http://weka.wikispaces.com/Making预言 如何让WEKA达到我需要的结果? 非常感谢。 要回答我的问题

  • 有时(例如用于测试和bechmark)我想强制执行在DataFrame上定义的转换。AFAIK调用像这样的操作并不能确保所有都被实际计算,可能只计算所有的子集(参见下面的示例) 我的解决方案是使用df将数据帧写入HDFS。写saveAsTable,但这会将我的系统与我不想再保留的表“混在一起”。 那么,触发数据帧评估的最佳方式是什么呢? 编辑: 请注意,最近还讨论了火花开发者列表:http://a