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)