在Haskell中表示流程图指定的算法

时间:2010-12-14 10:54:34

标签: haskell

我面临着实现以流程图表示的算法(主要是业务逻辑风格)的任务。我知道流程图不是最好的算法表示法,因为它的意大利面条代码属性(这是CPS的用例吗?),但我坚持使用表示为流程图的规范。

虽然我可以在实现它们之前将流程图转换为更合适的等效表示,但这可能会使得更难以“识别”生成的实现中的原始流程图,所以我希望有一些方法可以直接表示流程图 - 算法作为Haskell中的(可能是monadic)EDSL,因此与原始流程图规范的相似性将更加明显。

3 个答案:

答案 0 :(得分:4)

流程图的一种可能表示是通过使用一组相互尾递归函数,通过将“转到步骤X”转换为“用状态S评估函数X”。为了提高可读性,您可以将操作(更改状态的外部函数)和if/else链或模式匹配组合成单个函数,以帮助确定接下来要采取的步骤。

当然,这是假设您的流程图是硬编码的(而不是在运行时从外部源加载)。

答案 1 :(得分:1)

Arrows之类的声音恰好符合您的描述。如果必须,可以对箭头进行可视化(应该非常简单)或者从流程图生成/转换箭头代码。

答案 2 :(得分:1)

假设流程图中存在“全局”状态,那么打包成状态monad是有意义的。至少那时,不像现在这样做,每次调用都不需要任何参数,因此可以读作a)修改状态,b)以当前状态为条件,跳转。