[Haskell-cafe] Test on identity?
Joachim Durchholz
jo at durchholz.org
Wed Jul 8 17:27:09 UTC 2020
Hi Dusan,
If you go imperative here, all code that builds on that data structure
will be imperative as well, and you'll lose much of what makes Haskell
interesting.
Try this mental model:
Step 1: Two objects are equal if all attributes are equal.
Just value equality here, i.e. assuming a language where you access all
attributes (reference or direct) through an accessor like a.x, two
objects a and b are equal if all accessor chains (e.g. x.y.z) that end
in primitive values give you primitive-equality (e.g. a.x.y.z ==
b.x.y.z, and this works for all valid accessor chains).
(As you can see, equality is not a simple concept, and in languages
where you have no primitives the definition becomes circular, but it's
good enough for the model here.)
Step 2: Define "identity" to be "equality under change".
I.e. a and b are identical that if you assign to a.x.y.z, the same value
will be found in b.x.y.z.
This "identity is equality under change" definition captures not just
two objects at identical addresses, but also proxies, network objects,
files, and whatever there is.
Step 3: Realize that if you have an immutable object, there is no
relevant difference between equality and identity anymore. (You can make
various formal statements about this.)
Step 4: So for an immutable object,
A B
/ \ is not just equal but identical to / \
/ \ \ /
x x x
Step 5: You want to be able to have
A
/ \
/ \
x' x''
after some updates.
That's not a problem! You "update" an object by creating a copy. Nothing
prevents your code from creating an A(x',x'') tree when given an A(x,x)
tree!
This train of thought helped my wrap my mind around some ideas in
Haskell; I hope it will help you, and possibly other readers.
Everybody feel free to make it even more generally helpful :-)
Regards,
Jo
Am 08.07.20 um 18:42 schrieb Dušan Kolář:
> Well, it makes a difference for me if I have twice the same subtree or
> sharing one subtree from several places. Later, I add some markers,
> thus, I know it is already processed or not.
>
> Adding unique numbers and counting them makes sense if I know the
> result. If not then I don't know how to exploit it. But I may be tired
> too much already. :-(
>
> Anyway, probably more imperative style would be a better option.
>
> Thanks all,
>
> Dušan
>
>
> 8. července 2020 18:13:34 SELČ, Viktor Dukhovni <ietf-dane at dukhovni.org>
> napsal:
>
> On Wed, Jul 08, 2020 at 08:17:41AM +0200, Dušan Kolář wrote:
>
> Nevertheless, I do even some transformations. Thus, I would like
> to know it is still a
> DAG, not adding, accidentally, a node.
>
> Is there any way, if I have data like
>
> data Ex
> = Val Int
> | Add Ex Ex
>
> so that I can test that some value Val i === Val i ? I mean, the
> pointers go to the
> same data box? I could do that via some IORefs, AFAIK, but I
> don't think it is
> feasible. Maybe to tune the algorithm...
>
>
> If, for the same "n", two "distinct" leaf nodes "Val n" are possible, in
> what sense is what you have still a DAG? If there's a difference
> between:
>
> Add
> / \
> / \
> / \
> v v
> Val 1 Val 1
>
> and:
>
> Add
> / \
> / \
> \ /
> v v
> Val 1
>
> then perhaps the data model is flawed by failing to capture the
> distinguishing attributes of distinct leaf objects. And of course
> you might also have:
>
> Add
> / \
> / \
> \ /
> v v
> Add
> / \
> / \
> / \
> v v
> Val 1 Val 2
>
> So the most portable approach would be to assign a unique serial number
> all the nodes, both "Add", and "Val", and check that there's only path
> from the root to each distinct node (by serial number). Or, equivalently,
> a recursive enumeration of all the serial numbers contains no duplicates.
>
>
> _______________________________________________
> Haskell-Cafe mailing list
> To (un)subscribe, modify options or view archives go to:
> http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
> Only members subscribed via the mailman list are allowed to post.
>
More information about the Haskell-Cafe
mailing list