haskell - 从任意节点列表生成边

标签 haskell testing quickcheck

data Edge v = Edge {source :: v, target :: v}
          deriving (Show,Eq,Ord)

data Graph v = Graph {nodes :: Set v, edges :: Set (Edge v)}
           deriving Show


instance Arbitrary v => Arbitrary (Edge v) where
    arbitrary = do s <- arbitrary
                   t <- arbitrary
                   return $ Edge {source = s, target = t}

instance (Ord v, Arbitrary v) => Arbitrary (Graph v) where
    arbitrary = aux `suchThat` validGraph
        where aux = do lNodes <- arbitrary
                       lEdges <- arbitrary
                       return $ Graph {nodes = fromList lNodes, edges = fromList lEdges}

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

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

最佳答案

arbitrary value 是 Gen 中的一个值单子(monad)。您可以在这个 monad 中做更多的事情,而不仅仅是将 任意 值组合在一起。您可以执行任何其他 Gen 操作,包括 choose :

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

Generates a random element in the given inclusive range.

您可以使用 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 时都需要扫描列表以获取生成的值,那么它可能是图中节点数量更快的一个因素。

关于haskell - 从任意节点列表生成边,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36812882/

相关文章:

haskell - 将流转换器函数转换为 Haskell 中的 Mealy 自动机

haskell - Either a 和 Either Int 有什么区别?什么是要么 a ?多态类型构造函数?它的目的是什么?

Haskell:ST/GC 泄漏内存未收集?

maven - Allure:如何重新运行所有损坏的测试,然后生成报告

algorithm - 是否有用于递增生成希尔伯特点曲线的恒定时间算法?

linux - Linux 服务器上的性能测试方面

windows - 自动化 Win32 驱动程序测试

haskell - 跳棋和 EqProp

haskell - 如何从 Test.QuickCheck 显式导入 'Fn' 模式?

haskell - 如何使用检查器测试此应用实例? (没有 CoArbitrary 实例(验证 e0 [Char]))