-1

我正在寻找更多关于 haskells 懒惰方法的 Pro 和 contras

  • 无限数据结构的可能性(例如,取 5 [1..] 的 fib)
  • 更高的性能:不要做多余的事情(例如 head (map (2 *) [1 .. 10]) 只计算前 2 个)

魂斗罗

  • 我会更先进,因为有严格的顺序
  • Debuggen 也会比较困难
  • 所需内存量和速度的预测也将更加困难

亲切的问候

4

1 回答 1

4

首先,惰性求值并不是在 Haskell 中发明的,这样归类它是不正确的。

其次,Haskell 也有急切的评估(相反;当被提及时评估)的可能性。

第三,惰性评估工具也很容易在其他语言和技术中获得;Python 的生成器(回想一下xrange函数)、C++ 中的 Meyers 单例和模板实例化、运行时链接器中的延迟符号解析——都是这种想法的例子。

所以无论如何,适应这个想法和相应的词汇对软件工程师来说永远不会有害。

至于利弊,你提到了主要的。可以命名更多(请记住,您几乎可以使用任何具有数据结构和函数调用的语言来执行这些操作):

  • 递归数据结构,例如,您可以在其中创建一个列表值,其中元素排列成一个圆圈,头部是next“最后一个”的元素;遍历这样的列表将产生无限重复的元素序列。可能不是最有启发性的例子,但你可以对树、图表等做同样的事情。

  • 使用惰性数据结构而不是内置原语来安排控制流;想想用惰性列表构建协程。这实际上是更复杂和令人费解的评估顺序的硬币的另一面(即你的对手是一个优势)。

  • 计算的半自动并行化。这更多的是引用透明性的优势,而不是懒惰的评估;但是,这些功能仍然非常有机地融合在一起。

  • 在性能方面,当考虑惰性评估时,经常会想到记忆化;尽管自动执行它是一个很难(可能仍未解决)的问题,其中包含许多细节和陷阱。

所以,基本上,如果你更深入地观察它,每个方面都伴随着可能性和权衡;作为一名软件工程师,你的任务是了解所有这些,并根据具体的问题细节做出明智的选择。

于 2012-12-27T17:38:27.000 回答