Programming languages 懒惰作为一种内置语言特性的实际用途是什么?

Programming languages 懒惰作为一种内置语言特性的实际用途是什么?,programming-languages,functional-programming,language-design,lazy-evaluation,Programming Languages,Functional Programming,Language Design,Lazy Evaluation,很明显,为什么一种想要懒惰的函数式编程语言需要纯粹。我在看一个相反的问题:如果一门语言想要纯粹,那么懒惰有很大的优势吗?Haskell的一位设计师提出的一个论点是,它消除了诱惑;也许吧,但我正在努力权衡更具体的优势 如果你想做函数式编程,那么内置的惰性可以让你更清楚、简单或简洁地表达什么样的用例呢 简单地说:为什么懒惰如此重要,以至于你想把它融入语言中? (我正在寻找更面向应用程序而不是演示的用例——我知道你可以通过过滤无限自然数列表来生成无限素数列表,但谁在午餐前写了十遍…)Mac OS X的

很明显,为什么一种想要懒惰的函数式编程语言需要纯粹。我在看一个相反的问题:如果一门语言想要纯粹,那么懒惰有很大的优势吗?Haskell的一位设计师提出的一个论点是,它消除了诱惑;也许吧,但我正在努力权衡更具体的优势

如果你想做函数式编程,那么内置的惰性可以让你更清楚、简单或简洁地表达什么样的用例呢

简单地说:为什么懒惰如此重要,以至于你想把它融入语言中?


(我正在寻找更面向应用程序而不是演示的用例——我知道你可以通过过滤无限自然数列表来生成无限素数列表,但谁在午餐前写了十遍…)

Mac OS X的核心映像是惰性评估的一个很好的实际例子

基本上,Core Image允许您创建图像生成器和过滤器的有向无环图。直到过程的最后一步:物化,才真正进行评估。当您请求具体化核心图像图形时,最终图像帧将通过图形的变换向后传播,从而最大限度地减少需要计算的实际像素值的数量。

“在其他位置需要之前,不会计算任何内容。”是一个简化的隐喻,它没有涵盖懒惰评估的所有方面(例如,它没有提到严格现象)

从理论角度来看,设计纯语言时有三种方法(当然,如果它是基于某种lambda演算,而不是基于更奇特的评估模型的话):严格、非严格和总体

它们各有优缺点,所以你需要阅读相应的研究论文

三种语言中,所有语言都是最纯粹的。在另外两种情况下,不终止可以看作是一种副作用,因此必须构建严格性和总体性分析器以保持实现效率。这两种分析都是不可判定的,因此分析仪永远不可能完成

然而,总体语言的表达能力最低:总体语言不可能是图灵完备的。要获得足够好的表达能力,一个常见的方法是为基础良好的递归建立一个内置的证明系统,这与非总体语言的分析器相比并不容易构建

从实用的角度来看,非严格语义使您能够更容易地定义控件抽象,因为控件结构本质上是非严格的。在严格的语言中,您仍然需要一些具有非严格语义的地方。例如,
if
构造即使在严格的语言中也具有非严格的语义

因此,如果您的语言是严格的,那么控制结构就是一个特例。相反,非严格的语言可以是一致的非严格的-它在严格的构造中没有内在的需要

至于“谁在午餐前写了十次”—任何使用Haskell进行项目的人都会写。我认为使用一种语言(在你的例子中是一种非严格的语言)开发一个非玩具项目是掌握其优缺点的最好方法

下面是一些非玩具示例所说明的懒惰的通用用例:

  • 控制流难以预测的情况。如果没有惰性,您必须对属性执行拓扑排序以解决依赖关系,请考虑属性语法。每次更改依赖关系图时重新排序代码是不实际的。在Haskell中,您可以实现属性语法形式主义,而无需显式排序,在Hackage上至少有两个实际实现。属性文法在编译器构造中有着广泛的应用

  • “生成和搜索”方法可以解决许多优化问题。在严格的语言中,您必须交错生成和搜索,在Haskell中,您只需编写单独的生成和搜索函数,代码在语法上保持模块化,但在运行时交错。想想旅行商问题(TSP),当您生成所有可能的旅行,然后使用分支定界算法搜索它们时。请注意,分支定界算法只检查旅游的某些第一个城市,只生成路线的必要部分。即使在最纯的配方中,TSP也有多种应用,如规划、物流和微芯片制造。稍加修改后,它在许多领域,如DNA测序,似乎是一个子问题

  • 惰性代码具有非模块化的控制流,因此单个函数可以具有许多可能的控制流,这取决于它在其中执行的环境。这种现象可以看作是某种“控制流多态性”,因此惰性控制流抽象比严格的抽象更通用,并且高阶函数的标准库在惰性语言中更有用。想想Python生成器、循环和列表迭代器:在Haskell中,列表函数涵盖了所有三种用例,控制流由于惰性而适应不同的使用场景。它不仅限于列表——想想数据。Arrow和iteratees,State monad的惰性和严格版本等。还注意到非模块化控制流是一个优点和缺点,因为它使性能推理变得更加困难

  • 除了玩具示例之外,懒惰的可能无限的数据结构非常有用。参见Conal Elliott关于使用tries记忆高阶函数的著作。在Python意义上,无限的数据结构表现为无限的搜索空间(见2)、无限的循环和永不耗尽的生成器(见3)


  • 休斯的经典著作中对这一点进行了广泛的讨论。其中,休斯认为懒惰允许改进模块化,usin