Programming languages 懒惰作为一种内置语言特性的实际用途是什么?
很明显,为什么一种想要懒惰的函数式编程语言需要纯粹。我在看一个相反的问题:如果一门语言想要纯粹,那么懒惰有很大的优势吗?Haskell的一位设计师提出的一个论点是,它消除了诱惑;也许吧,但我正在努力权衡更具体的优势 如果你想做函数式编程,那么内置的惰性可以让你更清楚、简单或简洁地表达什么样的用例呢 简单地说:为什么懒惰如此重要,以至于你想把它融入语言中?Programming languages 懒惰作为一种内置语言特性的实际用途是什么?,programming-languages,functional-programming,language-design,lazy-evaluation,Programming Languages,Functional Programming,Language Design,Lazy Evaluation,很明显,为什么一种想要懒惰的函数式编程语言需要纯粹。我在看一个相反的问题:如果一门语言想要纯粹,那么懒惰有很大的优势吗?Haskell的一位设计师提出的一个论点是,它消除了诱惑;也许吧,但我正在努力权衡更具体的优势 如果你想做函数式编程,那么内置的惰性可以让你更清楚、简单或简洁地表达什么样的用例呢 简单地说:为什么懒惰如此重要,以至于你想把它融入语言中? (我正在寻找更面向应用程序而不是演示的用例——我知道你可以通过过滤无限自然数列表来生成无限素数列表,但谁在午餐前写了十遍…)Mac OS X的
(我正在寻找更面向应用程序而不是演示的用例——我知道你可以通过过滤无限自然数列表来生成无限素数列表,但谁在午餐前写了十遍…)Mac OS X的核心映像是惰性评估的一个很好的实际例子 基本上,Core Image允许您创建图像生成器和过滤器的有向无环图。直到过程的最后一步:物化,才真正进行评估。当您请求具体化核心图像图形时,最终图像帧将通过图形的变换向后传播,从而最大限度地减少需要计算的实际像素值的数量。“在其他位置需要之前,不会计算任何内容。”是一个简化的隐喻,它没有涵盖懒惰评估的所有方面(例如,它没有提到严格现象) 从理论角度来看,设计纯语言时有三种方法(当然,如果它是基于某种lambda演算,而不是基于更奇特的评估模型的话):严格、非严格和总体 它们各有优缺点,所以你需要阅读相应的研究论文 三种语言中,所有语言都是最纯粹的。在另外两种情况下,不终止可以看作是一种副作用,因此必须构建严格性和总体性分析器以保持实现效率。这两种分析都是不可判定的,因此分析仪永远不可能完成 然而,总体语言的表达能力最低:总体语言不可能是图灵完备的。要获得足够好的表达能力,一个常见的方法是为基础良好的递归建立一个内置的证明系统,这与非总体语言的分析器相比并不容易构建 从实用的角度来看,非严格语义使您能够更容易地定义控件抽象,因为控件结构本质上是非严格的。在严格的语言中,您仍然需要一些具有非严格语义的地方。例如,
if
构造即使在严格的语言中也具有非严格的语义
因此,如果您的语言是严格的,那么控制结构就是一个特例。相反,非严格的语言可以是一致的非严格的-它在严格的构造中没有内在的需要
至于“谁在午餐前写了十次”—任何使用Haskell进行项目的人都会写。我认为使用一种语言(在你的例子中是一种非严格的语言)开发一个非玩具项目是掌握其优缺点的最好方法
下面是一些非玩具示例所说明的懒惰的通用用例:
休斯的经典著作中对这一点进行了广泛的讨论。其中,休斯认为懒惰允许改进模块化,usin