为什么没有`Action a -> Rules a` 函数

问题描述

在 Shake 中有一种方法可以从 Action 运行 Rules

action :: Action a -> Rules ()

但我找不到返回 Action 结果的函数,即:

actionWithResult :: Action a -> Rules a

怎么会?

解决方法

原因是 Rules 首先运行,直到完成,然后 Action 运行 - 所以它有点分阶段编程。 action 所做的只是记录一个 Action,以便稍后执行。您必须首先运行所有 Rules 的原因是它可以收集所有可能的可用规则类型,因为它们都可用于所有 Action

一旦你理解了分期,就不可能有 Action a -> Rules a,因为这意味着运行一个 Action 并将结果返回到 Rules,所以 Action 必须在 { 之前运行{1}} 完成。但是,Rules 很好,因为它实际上并没有在那时运行,而是在以后运行。