F# 如何生成一个值,使其反映为另一个生成值的元素?

F# 如何生成一个值,使其反映为另一个生成值的元素?,f#,fscheck,F#,Fscheck,如何生成一个值,使其反映为另一个生成值的元素 例如,以以下代码为例: type Space = | Occupied of Piece | Available of Coordinate // Setup let pieceGen = Arb.generate<Piece> let destinationGen = Arb.generate<Space> let positionsGen = Arb.generate<Space

如何生成一个值,使其反映为另一个生成值的元素

例如,以以下代码为例:

type Space =
    | Occupied  of Piece
    | Available of Coordinate

// Setup
let pieceGen =       Arb.generate<Piece> 
let destinationGen = Arb.generate<Space>
let positionsGen =   Arb.generate<Space list>
我希望PositionGen包含由pieceGen和spaceGen生成的值。 然而,我对如何做到这一点一无所知

要为我的问题添加上下文,我的位置列表(又称棋盘格)应在列表中包含生成的工件和生成的目的地

这是我的测试:

附件:

如中所述,可以使用gen计算表达式来表示更复杂的生成器

在这个特定的示例中,您声明需要positionsGen包含由pieceGen和spaceGen生成的值。您可以这样做:

[<Property(QuietOnSuccess = true, MaxTest=10000)>]
let ``moving checker retains set count`` () =
    gen {
        let! piece = Arb.generate<Piece>
        let! destination = Arb.generate<Space>

        let! otherPositions = Arb.generate<Space list>
        let! positions =
            Occupied piece :: destination :: otherPositions |> Gen.shuffle

        let! status = Arb.generate<Status>
        return piece, destination, positions |> Array.toList, status }
    |> Arb.fromGen
    |> Prop.forAll
    // ... the rest of the test goes here...
这是测试问题还是实现问题是另一个问题…

如中所述,您可以使用gen计算表达式来表示更复杂的生成器

在这个特定的示例中,您声明需要positionsGen包含由pieceGen和spaceGen生成的值。您可以这样做:

[<Property(QuietOnSuccess = true, MaxTest=10000)>]
let ``moving checker retains set count`` () =
    gen {
        let! piece = Arb.generate<Piece>
        let! destination = Arb.generate<Space>

        let! otherPositions = Arb.generate<Space list>
        let! positions =
            Occupied piece :: destination :: otherPositions |> Gen.shuffle

        let! status = Arb.generate<Status>
        return piece, destination, positions |> Array.toList, status }
    |> Arb.fromGen
    |> Prop.forAll
    // ... the rest of the test goes here...

这是测试的问题还是实现的问题是另一个问题…

这种基于属性的测试既烦人又可怕。FsCheck在我的逻辑中发现了我不知道的漏洞。非常感谢你@ScottNimrod我希望你在某个时候克服烦恼——我只是觉得它很棒:这种基于属性的测试既讨厌又可怕。FsCheck在我的逻辑中发现了我不知道的漏洞。非常感谢你@ScottNimrod我希望你在某个时候克服烦恼-我只是觉得它很棒:
[<Property(QuietOnSuccess = true, MaxTest=10000)>]
let ``moving checker retains set count`` () =
    gen {
        let! piece = Arb.generate<Piece>
        let! destination = Arb.generate<Space>

        let! otherPositions = Arb.generate<Space list>
        let! positions =
            Occupied piece :: destination :: otherPositions |> Gen.shuffle

        let! status = Arb.generate<Status>
        return piece, destination, positions |> Array.toList, status }
    |> Arb.fromGen
    |> Prop.forAll
    // ... the rest of the test goes here...
Test 'Ploeh.StackOverflow.Q38857462.Properties.moving checker retains set count' failed: FsCheck.Xunit.PropertyFailedException : 
Falsifiable, after 70 tests (0 shrinks) (StdGen (1318556550,296190265)):
Original:
<null>
(Black (BlackKing,(-1, 1)), Available (0, 0),
 [Occupied (Red (RedSoldier,(-1, 0))); Available (0, 0);
  Occupied (Black (BlackKing,(-1, 1))); Available (0, 0)], RedsTurn)