Andy Fingerhut <andy.finger...@gmail.com> writes: > Dave, you say "seq on a set cannot be pure unless you were to provide an > argument to explicitly specify which order the items should be in". > > I think I would instead say: seq *is* a pure function, even though it > violates the property of "x equals y implies f(x) equals f(y)". There is > nothing impure about the definition of seq on sets. I would say that it is > the way equals is defined on hash sets, intentionally ignoring internal > implementation details that are visible to seq, that leads to the violation > of that property. > > I have updated my article with a Conclusion section since yesterday. I > have copied it below for those that have already read the article and want > to see only the new stuff: > > In hindsight after writing this, it now seems clear to me that if one > wants to maintain the property "x is equal to y implies f(x) is equal > to f(y)" for all functions f, then it is pretty important to be clear > on what "equal" means. > > As a silly example, if one gets to define their own equals for lists, > and you decide to define lists as equal if they contain the same > number of items, e.g. the list (1 2 3) is equal to the list (4 5 6) > because they both have 3 items, then you are easily going to violate > the property.
another example is that in clojure '(2) is equal to [2] - and this is a good thing, but (conj '(2) 3) is not equal to (conj [2] 3). so I agree that the property x = y => f(x) = f(y) is not reasonable for normal equality. It could be for pure functions and identical? > > Example 3 highlights this point: one can create implementations of > data structures using only pure functions, and a 'reasonable' > definition of equality, where the property can be violated. The root > of this issue is: sometimes reasonable definitions of equality regard > two values as equal, intentionally ignoring internal implementation > details of the data structure, but those differences ignored by equal > can be made observable by other functions you implement on the data > structure (like `seq` / `toList`). > > Andy > > > On Wed, Apr 22, 2015 at 1:22 AM, Dave Sann <daves...@gmail.com> wrote: > >> "x is equal to y" to imply "f(x) is equal to f(y)" - can only be true >> where a function is really based only on its arguments. I hadn't considered >> this before - while it seems simple, it is also a bit subtle. >> >> for example: seq on a set cannot be pure unless you were to provide an >> argument to explicitly specify which order the items should be in. If you >> do not do this, the order is defined either by some random interaction of >> the of the data and function implementations - that you thought was >> irrelevant - or has to be literally picked at random by the implementation. >> The former of these will appear to be pure until you hit the special cases. >> >> I speculate that only functions that retain or reduce the information >> content of their inputs can be pure. So if you rearrange or filter or map >> they can be pure. But if you *implicitly* add new information - as (seq >> set) does - then they cannot be. >> >> Dave >> >> On Wednesday, 22 April 2015 15:28:30 UTC+10, Andy Fingerhut wrote: >>> >>> One thing I was surprised by in my investigation was the lengths that >>> some people are willing to go to in order to avoid such things. >>> >>> Some people seem to *really* want the property "x is equal to y" to imply >>> "f(x) is equal to f(y)" for all functions, without exception, and consider >>> it a bug if a single function violates that property. >>> >>> I'm personally on the side of violating it if there is no good way to >>> keep it true for a particular function, preferably with documentation if >>> you are aware that you are not preserving it. >>> >>> Andy >>> >>> On Tue, Apr 21, 2015 at 8:32 PM, Dave Sann <dave...@gmail.com> wrote: >>> >>>> Just to expand on this slightly - seq applied to a set must introduce an >>>> order that is not present in the set. This order in principle comes from >>>> nowhere in the data. But it does in practice come from some arbitrary >>>> decisions in the implementation. Maybe this was andy's point. >>>> >>>> >>>> On Wednesday, 22 April 2015 13:18:43 UTC+10, Dave Sann wrote: >>>>> >>>>> Agree it's an interesting writeup. >>>>> >>>>> I think that the behaviour of seq should be entirely expected though. >>>>> Sets have no ordering (logically) so turning them into an ordered sequence >>>>> should be considered to be an entirely arbitrary operation (unless >>>>> specific >>>>> guarantees are provided). The fact that the implementations sometimes >>>>> maintain an order should not be used or relied upon at all. >>>>> >>>>> a seq of a set is not itself a set and therefore is not subject to the >>>>> same referential transparency rules as a set. >>>>> >>>>> Dave >>>>> >>>>> On Wednesday, 22 April 2015 12:39:42 UTC+10, Mike Rodriguez wrote: >>>>>> >>>>>> Thanks for sharing this. I found the write-up to be very informative >>>>>> and to have good background sources. >>>>>> >>>>>> I certainly never thought about this sneaky behavior concerning `seq` >>>>>> and hash sets before now. I'll have to look out for that one! >>>>>> >>>>>> On Tuesday, April 21, 2015 at 8:13:48 PM UTC-5, Andy Fingerhut wrote: >>>>>>> >>>>>>> I had come across the issue of Clojure hash sets that contain the >>>>>>> same set of elements returning their elements in different orders from >>>>>>> each >>>>>>> other, depending upon which order they were added to the set (only if >>>>>>> they >>>>>>> have equal values for (hash x)). >>>>>>> >>>>>>> This and other questions on referential transparency on the Clojure >>>>>>> group got me thinking on my commutes about it some more, and I dug into >>>>>>> it >>>>>>> way more than I expected to, and wrote up an article on it. If you >>>>>>> think >>>>>>> such a topic would interest you, you can read more about it here: >>>>>>> >>>>>>> >>>>>>> https://github.com/jafingerhut/thalia/blob/master/doc/other-topics/referential-transparency.md >>>>>>> >>>>>>> Guaranteed at least 99% epiphany free >>>>>>> >>>>>>> Andy >>>>>>> >>>>>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "Clojure" group. >>>> To post to this group, send email to clo...@googlegroups.com >>>> Note that posts from new members are moderated - please be patient with >>>> your first post. >>>> To unsubscribe from this group, send email to >>>> clojure+u...@googlegroups.com >>>> For more options, visit this group at >>>> http://groups.google.com/group/clojure?hl=en >>>> --- >>>> You received this message because you are subscribed to the Google >>>> Groups "Clojure" group. >>>> To unsubscribe from this group and stop receiving emails from it, send >>>> an email to clojure+u...@googlegroups.com. >>>> For more options, visit https://groups.google.com/d/optout. >>>> >>> >>> -- >> You received this message because you are subscribed to the Google >> Groups "Clojure" group. >> To post to this group, send email to clojure@googlegroups.com >> Note that posts from new members are moderated - please be patient with >> your first post. >> To unsubscribe from this group, send email to >> clojure+unsubscr...@googlegroups.com >> For more options, visit this group at >> http://groups.google.com/group/clojure?hl=en >> --- >> You received this message because you are subscribed to the Google Groups >> "Clojure" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to clojure+unsubscr...@googlegroups.com. >> For more options, visit https://groups.google.com/d/optout. >> -- Maik Schünemann Email: maikschuenem...@gmail.com Github: https://github.com/mschuene -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.