从任意节点列表生成边

时间:2016-04-23 15:43:27

标签: haskell testing quickcheck

"article"

我目前有这个来生成我的图表。 然而,通过在ghci上使用样本,我注意到它要么不生成边缘,要么生成单个边缘。 是否可以控制生成的边数? 我该怎么做?

编辑:图表在以下情况下被视为有效: 1-存在边的源节点和目标节点。 2-A节点不能成为多个Edge的源。

1 个答案:

答案 0 :(得分:3)

arbitrary值是Gen monad中的值。您可以在此monad中执行更多操作,而不仅仅将arbitrary值组合在一起。您可以执行任何其他Gen操作,包括choose

choose :: Random a => (a, a) -> Gen a
     

在给定的包含范围内生成随机元素。

您可以使用choose生成除arbitrary之外的其他随机值。

instance (Ord v, Arbitrary v) => Arbitrary (Graph v) where
    arbitrary = do
        nodes <- arbitrary
        let
            lNodes = toList nodes
            numNodes = length lNodes
            arbitraryEdge = do
                source <- elements lNodes
                target <- elements lNodes
                return $ Edge {
                    source = source,
                    target = target
                }
        numEdges <- choose (0, numNodes * numNodes)
        lEdges <- vectorOf numEdges arbitraryEdge
        return $ Graph {nodes = nodes, edges = fromList lEdges}

在生成大图时,这种天真的实现并不是非常有效。如果每次使用elements

时不需要扫描列表中的生成值,那么它可能是图表中节点数量的一个因素