Speaking of definitions of equality:
Writing a university project jvm to llvm 'compiler', I found myself
designing a type in Haskell whose Ord and Eq instances 'naturally' got
defined in such a way that "less than AND equal to" made sense.  I doubt
anyone's sanity except mine survived the project.

Joel

On Wed, Apr 22, 2015 at 6:25 PM, Maik Schünemann <maikschuenem...@gmail.com>
wrote:

> 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.
>

-- 
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.

Reply via email to