很明显,为什么想要变得懒惰的函数式编程语言需要是纯的。我在看相反的问题:如果一种语言想要纯粹,那么懒惰是否有很大的优势? Haskell 的一位设计者提出的一个论点是,它消除了诱惑;也许吧,但我正在努力权衡更具体的优势。
考虑到您想做函数式编程,在哪些用例中,内置懒惰可以让您更清晰、简单或简洁地表达事物?
简单地说:为什么懒惰如此重要以至于您想将其构建到语言中?
(我正在寻找更面向应用程序而不是演示的用例 - 我知道你可以通过过滤自然数的无限列表来生成无限的素数列表,但是谁在午餐前写了十次...)
最佳答案
“除非在另一个地方需要它,否则不会评估任何东西”是一个简化的比喻,它没有涵盖惰性评估的所有方面(例如,它没有提到严格现象)。
从理论的角度来看,在设计纯语言时有 3 种方法(当然,如果它基于某种 lambda 演算而不是更奇特的评估模型):严格、非严格和完全。
它们每个都有其优点和缺点,因此您需要阅读相应的研究论文。
总语言是三者中最纯粹的。在另外两个中,非终止可以被视为副作用,因此必须构建严格性和总体分析器以保持实现高效。两种分析都是不可判定的,因此分析器永远不可能是完整的。
然而,总语言的表达能力最低:总语言不可能是图灵完备的。获得足够好的表达能力的一种常用方法是为有根据的递归建立一个内置的证明系统,这并不比非总语言的分析器更容易构建。
从实用的角度来看,非严格语义让您可以更轻松地定义控制抽象,因为控制结构本质上是非严格的。在严格的语言中,您仍然需要一些具有非严格语义的地方。例如。 if
即使在严格的语言中,construct 也具有非严格的语义。
因此,如果您的语言很严格,则控制结构是一种特殊情况。相比之下,非严格语言可以是统一非严格的——它没有严格结构的内在需求。
至于“谁在午餐前写了十次” - 任何使用 Haskell 进行项目的人都会这样做。我认为使用一种语言(在您的情况下是一种非严格的语言)开发一个非玩具项目是了解其优缺点的最佳方式。
以下是一些非玩具示例说明的懒惰的通用用例:
关于programming-languages - 懒惰作为内置语言功能的实际用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8279781/