4

假设你正在编写一个搜索指数级大或无限空间的程序:游戏玩法、定理证明、优化等,任何你无法搜索整个空间的地方,结果的质量很大程度上取决于选择要搜索的部分在可用资源范围内。

在 Eager 语言中,这在概念上很简单:该语言允许您指定评估顺序,并使用它来控制首先评估搜索空间的哪些部分。(在实践中,它往往会变得混乱和复杂,因为您的推理控制代码布局与问题定义混在一起,这也是我对用惰性语言执行此操作的方法感兴趣的原因之一。但它是概念上直截​​了当。)

在像 Haskell 这样的惰性语言中,你不能那样做。我可以想到两种方法来代替:

  1. 编写代码,该代码取决于您正在使用的当前版本的编译器恰好选择的评估的确切顺序,以及您正在使用的优化标志,以便最终以正确的顺序发生。这似乎可能导致可维护性问题。

  2. 编写编写代码的代码,具体而言,编写将问题定义与一组启发式算法一起转换为急切语言的指令序列的代码,该指令指定了应该完成的确切顺序。如果您愿意支付前期费用,这似乎有好处。

还有其他推荐的方法来做这种事情吗?

4

2 回答 2

5

在惰性语言中执行此操作的典型方法是将搜索空间定义为(可能是无限的)数据结构,然后编写您希望使用的任何策略来单独遍历此结构。这样,您可以控制所使用的策略,但它与问题定义分开。

于 2011-07-09T16:33:01.510 回答
1

你可以让你的部分haskell代码基于严格的评估

http://www.haskell.org/haskellwiki/Performance/Strictness

于 2011-07-09T16:28:03.340 回答