[Haskell-cafe] Re: [Haskell] ANN: random-access-list-0.1
Stephan Friedrichs
deduktionstheorem at web.de
Thu Jun 12 14:47:12 EDT 2008
Isaac Dupree wrote:
> [...]
>
> Great to see it, it deserved implementing, IIRC! I don't remember
enough about it.. (and don't have Okasaki anywhere handy). Can it be
lazy or infinitely long?
No, it has to be finite as it's actually a list of complete binary trees
whose size depend on the skew binary representation of the list's size.
I'll document this.
> [...]
>
> Is "RandomAccessList" the best name for something that's not O(1),
just O(log n)? Or just that "RandomAccessList" is just much longer than
"[]"?
Well Chris Okasaki called them "Skew Binary Random-Access Lists", which
is even longer :)
>
> don't use those unorthodox infix function names.. `cons` is hardly
worse than .:. , `append` or `mappend` than .+. , and .!. than, hmm.. .
Export a ++ and ! (!! ?) if you're really dedicated. But I'd prefer an
`at` that's the same partial indexing operation, rather than the name
.!. (I think this "at" was a new name being put somewhere else? partly
because "!" is trying to be gradually used only to refer to strictness?)
Good point!
>
> "extractHead" is an ugly name for a nevertheless standardish-meaning
function... what is it usually called? uncons? headTail? (Data.Sequence,
which is meant to be left-right symmetric, calls it "viewr"... except
your version doesn't have the Maybe, it's partial instead, fails on
empty lists)
Yes, I wasn't happy with that one either. The view-concept of
Data.Sequence is a good idea.
>
> For "index", don't use Monad, use Maybe (I think that's what the
recent libraries at haskell.org discussion concluded, in the context of
switching Data.Map back to Maybe).
I was just copying the idea from Data.Map and it's usually a good thing
to have functions as general as possible, or why is it not?
> Also, Data.List has genericLength etc, to
At the moment, I'm using the Int type for size and indexing only for one
reason: I haven't found a proper way to generalize it. I'd really like
to use the Ix class, but it doesn't provide enough functionality, it
only works on fixed-size intervals (i. e. for arrays, which don't change
their size, but a list does). Maybe someone has an idea of how to
realize lists with a variable starting index and size?
> support. Isn't "index" (like Data.List.genericIndex) supposed to be
a name for a partial operation, not one that returns a Maybe? Shouldn't
"size" be named "length" (or exported as both names, since e.g.
Data.Map.size, .List.length) (why is it O(1) not O(log n)? Is it
possible for these RandomAccessLists to be longer than maxBound::Int?)?
The size function is in O(1) because I cache it, otherwise it would be
size (RandomAccessList xs) = sum (map fst xs)
which is O(log n). I consider the caching useful, as most applications
will check 0 <= i < size quite often.
>
> for e.g. toList, is the O(n) cost spread over traversing/demanding
the items of the generated list, or all up-front, or somewhere in between?
>
> Why is zip slow with unbalanced lists? Obviously, it could be
implemented O(min(m,n)*(log m + log n)) just indexing each one, which
would be faster for really unbalanced-size lists... Obviously, I don't
If two lists have exactly the same size, all the complete binary trees
holding the data have the same size as well. This can be zipped directly
and is a bit (~5% in my tests) faster.
> understand the implementation. BTW, looking at the file,
> data RandomAccessList a
> = RandomAccessList {-# UNPACK #-} !Int ![(Int, CBTree a)]
> Marking a list strict like that doesn't have much effect because it
only makes the first (:) or [] strict. Did you mean for an
element-strict or spine-strict(which would necessarily be non-infinite)
list?
Oh, you're right, I just meant to mark the Int strict. It obviously was
too late yesterday!
Thanks for this feedback!
//Stephan
--
Früher hieß es ja: Ich denke, also bin ich.
Heute weiß man: Es geht auch so.
- Dieter Nuhr
More information about the Haskell-Cafe
mailing list