Haskell“资源缩减”

Posted

技术标签:

【中文标题】Haskell“资源缩减”【英文标题】:Haskell "Source reduction" 【发布时间】:2011-02-22 16:36:31 【问题描述】:

我正在为即将到来的 Haskell 考试进行复习,但我不理解过去试卷上的一个问题。谷歌出现nothing useful

fst(x, y) = x
square i = i * i

i) Source reduce,使用 Haskells 惰性求值,表达式:

fst(square(3+4), square 8)

ii) Source reduce,使用严格的评估,相同的表达式

iii) 说明惰性求值的一个优点和严格求值的一个优点

我不明白的是是什么源缩减?

【问题讨论】:

【参考方案1】:

归约是 lambda 演算中的一个术语,它涉及一种保留语义的转换,将一个术语替换为等效术语。对于您给出的示例,最重要的减少是

用定义替换名称(用 equals 代替 equals 的一个实例)。 功能应用程序的 Beta 缩减。

Beta-reduction 是 lambda 演算中的基本规则,在 Haskell 等纯粹的惰性语言中,它始终保留语义。测试版规则是这样说的:

(\x. e) m

可以用e 替换m 替换x。 (替换必须避免在m 中“捕获”x 的免费实例。)

很有可能您的讲师希望您按以下方式组合减少:

    找到一个函数应用程序,其中所应用的函数是一个名称。 将名称替换为其定义,这将是一个 lambda 抽象。 Beta-reduce 应用程序。 一步完成。

请注意,您通常有一个选择关于要减少哪个应用程序;例如,在您给出的术语中,square 的两个应用程序和fst 的一个应用程序可以以这种方式减少。 (+的应用也可以归约,但是涉及常量的归约需要不同的规则。)

从问题中,我看到您的老师希望您重复减少每个学期,直到达到正常形式,并且您的老师希望您展示您对不同的理解减少策略。 “source reduce”中的“source”一词是多余的; reduction意味着在某些语言中对源术语的操作。我会将问题表述如下:

使用与 Haskell 的惰性求值对应的归约策略,将以下表达式归约为弱头范式。显示归约序列中的每一步。

使用与严格函数式语言中的求值对应的归约策略,将以下表达式归约为头范式。

我可能会选择不那么腼腆,只命名减少策略:按需减少策略和按价值减少策略。

【讨论】:

【参考方案2】:

从问题的结构来看,它可能只是表示“手动评估表达式”,例如

head (map primeTest (enumFromTo 1000 2000))

在惰性(仅在需要时进行评估)评估中,

  head (map primeTest (enumFromTo 1000 2000))
= head (map primeTest (1000 : enumFromTo 1001 2000))
= head (primeTest 1000 : map primeTest (enumFromTo 1001 2000))
= primeTest 1000
= False

严格(先评估一切)评估

  head (map primeTest (enumFromTo 1000 2000))
= head (map primeTest (1000 : enumFromTo 1001 2000))
= ...
= head (map primeTest [1000, 1001, ..., 2000])
= head (primeTest 1000 : map primeTest [1001, 1002, ..., 2000])
= head (False : map primeTest [1001, 1002, ..., 2000])
= ...
= head [False, False, ..., False]
= False

我能找到的唯一相关地方是http://www.cs.bham.ac.uk/internal/modules/2009/11582.html,其中“源代码缩减”被列为“编程技术”。 (O_O)

【讨论】:

我希望他只是在论文中说“评估这个”会更有意义! @你找到的笔记:我在伯明翰学习计算机科学,这些是我学习的模块的笔记。我确实喜欢编造故事的讲师。

以上是关于Haskell“资源缩减”的主要内容,如果未能解决你的问题,请参考以下文章

2019年Haskell调查报告

Haskell如何强制在haskell中评估Data.Map?

Haskell作业任务代做代编程代写Haskell作业编程

Haskell趣学指南

哪种 KeyBoard / KeyBoard Layout 最适合 Haskell 编程? haskell 是不是将所有数学符号作为函数?

如何在 emacs - haskell 模式下运行 haskell 应用程序?