【问题标题】:Haskell "Source reduction"Haskell“资源缩减”
【发布时间】: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) 说明惰性求值的一个优点和严格求值的一个优点

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

【问题讨论】:

    标签: haskell terminology evaluation reduction


    【解决方案1】:

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

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

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

    (\x. e) m
    

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

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

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

    请注意,您通常有一个选择关于要减少哪个应用程序;例如,在您给出的术语中,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)

      【讨论】:

      • 我希望他只是在论文中说“评估这个”会更有意义!
      • @你找到的笔记:我在伯明翰学习计算机科学,这些是我学习的模块的笔记。我确实喜欢编造故事的讲师。
      猜你喜欢
      • 2012-01-01
      • 2017-12-16
      • 2010-10-22
      • 1970-01-01
      • 1970-01-01
      • 2013-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多