1

假设允许两种不同的方式来定义派生策略,@composite并且flatmap。据我所知,前者可以做后者可以做的任何事情。但是,numpy策略的实施arrays,讲了一些隐性成本

    # We support passing strategies as arguments for convenience, or at least
    # for legacy reasons, but don't want to pay the perf cost of a composite
    # strategy (i.e. repeated argument handling and validation) when it's not
    # needed.  So we get the best of both worlds by recursing with flatmap,
    # but only when it's actually needed.

我认为这意味着更糟糕的收缩行为,但我不确定,我在其他任何地方都找不到这个记录。那么我应该什么时候使用@composite,什么flatmap时候应该像上面链接的实现那样走这条中途路线?

4

1 回答 1

3

@composite并且.flatmap确实是完全等价的——你可以用一个做的任何事情,你也可以用另一个做,而且它也将具有相同的性能。

我实际上写了那条评论,原因是我们有时只想使用平面图/合成,但总是想仔细验证我们的逻辑。按照我的设置方式,我们可以避免通过使用多次调用验证器.flatmap- 如果我们想使用@composite.

(还有一个 API 风格的问题,因为这些参数几乎总是值,但有时可能是策略。我们现在禁止此类 API 主要是基于arrays()造成的混乱,有利于让用户编写自己的.flatmaps)

于 2019-12-16T09:58:01.190 回答