Browse thread
RE: [Caml-list] Re: ocaml sefault in bytecode: unanswered questions
- David Allsopp
[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
| Date: | -- (:) |
| From: | David Allsopp <dra-news@m...> |
| Subject: | RE: [Caml-list] Re: ocaml sefault in bytecode: unanswered questions |
Ivan Chollet wrote: > See the following snippet: > > # let q = Queue.create () in > Queue.push 0 q; > q == q;; > - : bool = true > > Standard behavior. > Now let see this: > > # let q = Queue.create () in > Queue.push 0 q; > q = q;; > > which hangs for ever... Internally, Queues are a cyclic data structure (see stdlib/queue.ml in the sources). The documentation for Pervasives.(=) notes "Equality between cyclic data structures may not terminate". If you want to compare two queues for structural equality you'd have to fold the two Queues to a list and then compare those. Perhaps a Queue isn't the most appropriate data structure for what you're doing, therefore (functional queues wouldn't suffer from this problem but note that their performance characteristic is subtly different from an imperative queue)? Alternatively, if Queue.compare would be a handy function, you could try raising a feature-request for it in Mantis. > I would have thought physical equality implies structural equality, but it doesn't seem like it. > Can you please explain to me what’s wrong there? "It does" - but only with the given caveat that comparison of cyclic structures may not terminate. Pervasives.compare has a similar restriction, although note that [compare q q] in your example does return 0 (which is lucky or it would be a bug as the docs for Pervasives.(==) state that [x == y] => [compare x y = 0]). The notes in http://caml.inria.fr/mantis/view.php?id=3322 may be of interest too... David