Haskell解释器实现随机分支执行与不合规结果重试机制
Haskell自定义程序解释器Selection分支随机执行与重试实现问题
已完成开发模块
- 定义核心类型
HVal、HStatement - 实现
Do、Skip、Print、Eval等基础语句的evalStatement_求值逻辑 - 完成带守卫条件的
If条件分支、Selection选择结构的Parser解析逻辑
待实现的执行规则
需求为实现可循环重试的随机分支选择逻辑:
- 从Selection结构包含的、由「If守卫条件+关联执行语句」组成的分支列表中,仅对守卫值为真的分支随机选取条目执行
- 若选中分支的执行结果不符合预设要求,不终止程序,重新执行随机选支流程,直到选出的分支执行结果满足要求为止
过往实现尝试与现存缺陷
竞速方案
最初计划基于Async库的race函数实现多分支竞速求值:只对守卫通过的分支并行触发求值,取最先完成的分支执行结果返回。但该方案受IO monad的约束,实现复杂度远超预期,最终放弃。
随机索引方案的现有问题
目前落地的随机索引选支逻辑,通过自实现的randIdx函数结合unsafePerformIO生成随机索引选取分支,选中分支执行后若得到不符合预期的单位值(),就递归触发Selection的重新求值。但该实现存在明显bug:
- 运行带有偶数筛选打印逻辑的示例程序时,程序完全无输出且无法终止
- 若将Selection的求值逻辑临时替换为
traverse_顺序执行所有分支,程序可正常运行,但完全失去了随机选支的效果 - 之前调试过一版简化的Selection随机执行逻辑,虽然可以让程序正常终止,但执行结果极不稳定:跑1-10范围内偶数筛选打印的测试样例时,部分运行会打印全部偶数,部分运行仅输出单个数字6,始终达不到「选到不合规分支就重选,直到拿到理想执行结果」的预期
当前需要匹配该场景的正确随机分支执行与重试逻辑实现方案。
内容的提问来源于stack exchange,提问作者Mr.Bloom
相关产品推荐
相关产品推荐

