yes - ok - I agree with that.

I don't see this as a problem with the definition of equality.

D


On Thursday, 23 April 2015 00:40:20 UTC+10, Hannes Steffenhagen wrote:
>
>
> This. x = y => f(x) = f(y) obviously doesn't hold for arbitrary functions 
> and arbitrary notions of equality (e.g. all sets that contain the same 
> elements are equal, but the structures used to implement 'equal' sets need 
> not be equal themselves). So if you then introduce a function that derives 
> its result from the internal structure of the set - such as seq does - then 
> you obviously break that property for your notion of 'set equality'. This 
> doesn't mean the function isn't pure. It means your assumptions are wrong. 
> If you want to guarantee a specific ordering then you have to use 
> containers and/or algorithms that do actually guarantee a specific ordering.
>
> On Wednesday, April 22, 2015 at 9:53:47 AM UTC-4, Andy Fingerhut wrote:
>>
>> 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 equalThis.
>> 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.
>>
>> 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 <dave...@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 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.

Reply via email to