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“资源缩减”的主要内容,如果未能解决你的问题,请参考以下文章
Haskell如何强制在haskell中评估Data.Map?
哪种 KeyBoard / KeyBoard Layout 最适合 Haskell 编程? haskell 是不是将所有数学符号作为函数?