On Wed, Nov 25, 2009 at 11:02 AM, Neil Brown <nccb2@kent.ac.uk> wrote:
David Menendez wrote:
From what I can tell, insEdge inserts an edge between two nodes which are already in the graph. The code is calling insEdge on arbitrarily-labeled nodes, which may not exist in the graph.
That's what I thought initially, but in fact what it is doing is exactly what you suggest:
Instead of picking arbitrary node labels, try selecting arbitrary elements from the list of node labels.
That "nGen = elements ns" line assigns into nGen a random generator that will pick from ns, the list of nodes.
You're right. I've tried this in ghci, and I'm not able to reproduce the error. I did get an exception from QuickCheck when it tried to call elements on an empty list, though. This code works fine for me: a :: Gen ([LNode Char], [LEdge Char], Gr Char Char) a = do NonEmpty ns' <- arbitrary let ns = nub ns' let nGen = elements ns lns <- mapM (\n -> liftM ((,) n) arbitrary) ns les <- listOf $ liftM3 (,,) nGen nGen arbitrary return (lns, les, mkGraph lns les) I suspect that there's no value to generating an arbitrary list of node IDs, as opposed to something like: ns <- liftM (\(Positive n) -> [0..n]) arbitrary -- Dave Menendez <dave@zednenem.com> <http://www.eyrie.org/~zednenem/>