Persistant (as in on disk) data
diatchki@cse.ogi.edu
diatchki@cse.ogi.edu
Sun, 9 Mar 2003 17:14:21 -0800 (PST)
hello,
> I'm not convinced that the binary library should "natively" support
> cyclic data. I think that if saying:
>
> print x
>
> would not terminate, then there's no reason that
>
> puts bh x
>
> should terminate. I like to think of "puts" as a binary version of
> print. (That is, of course, unless the instance writer for the
> Binary/Show instances of the type of x is smart enough to not keep
> writing the same thing over and over again.) I would challenge the
> interested party to write a Show instance of String which wouldn't loop
> indefinitely on "repeat 'x'".
well, it is your choice to think of it as you like, but this is not what
my original mail was about. i think the ability to make data persistant
is a useful one and it should be as transperant to the programmer as
possible. when i write something like:
ones = 1 : ones
i don't think of "printing infinately many ones in memory" and i don't see
why i should start thinking of it that way just because i want to make the
object persistant. after all, one can think of the disk as a verys low
memory.
> If the user has some cyclic data structure and they want to be able to
> write it in binary form, it should be on their shoulders to do it
> correctly, not on the library's.
why is that? i thought the whole point of having nice tools is that you
don't need to write mindless stuff and concentrate on the important bits
of your program. i don't have to worry much about sharing and cyclic data
when i program in Haskell (i.e. it just happens), why should i suddenly
start to worry about that if i want to make something persistant across
executions of my program.
> So essentially, I believe 'deriving Binary' should work identically to
> 'deriving Show', except using a binary rep instead of a string rep.
something like that could be useful, but with drift and the atrem library
one can already do some of that. and the aterm library is a reasonably
portable way to represent terms. this is definately not what i had in
mind in my original post.
>> it in Haskell, as presumbably sharing is not observable from within
>> the language. this is why the "deriving" bit seems essential - the
>> compiler can perform some magic.
>
> I assume you mean something like:
>
> let x = ...some really large structure...
> y = [x,x]
> in puts bh y
>
> then the size of what is written is |x+c| not |2x| for some small c? If
> so, then I don't believe this can be implemented in the language; it
> would have to be in the compiler.
this is what i meant by compiler magic.
> I see this as unlikely of happening
> because it would mean that all compilers would have to implement this
> identically and some might not handle sharing the same manner.
different implementations do not need to implement sharing in the same
way. they need to understand a common format. i am not saying designing
such a format is easy, in fact things like:
nats = 0 : map (+1) nats
seem tricky as they involve functions. but persitance is useful.
in fact as a beginning i was hoping for something that works in say GHC,
and won't be too hard to implement. actually i thought it might already
exist, but i guess not.
bye
iavor