On 30/01/2011 00:42, Daniel Peebles wrote:
In a slightly related proposal on the same topic, what do people think of:

newArrayWith# :: (Int# -> a) -> Int# -> State# s -> (# State# s,
MutableArray# s a #)

that would do the obvious thing, by allocating an array of the size
specified by the Int#, and then pass indices into the function to get
elements. This would again be to avoid the initialization cost for large
arrays, but provides a way more flexible interface than the clones
(which could be implemented in terms of it, but not as quickly).

I don't know how to implement this, other than by initialising all the elements to _|_ first. Each application of the (Int# -> a) function could be arbitrarily expensive, and might require GC, and the array would only be partially-initialised at that point.

Cheers,
        Simon



On Tue, Jan 25, 2011 at 5:05 PM, Daniel Peebles <[email protected]
<mailto:[email protected]>> wrote:

    So, to summarize what you guys have been talking about, it's looking
    like the primops would become:

    copyArray#        ::        Array# a -> Int# -> MutableArray# s a ->
    Int# -> Int# -> State# s -> State# s
    copyMutableArray# :: MutableArray# a -> Int# -> MutableArray# s a ->
    Int# -> Int# -> State# s -> State# s

    copyByteArray#        ::        ByteArray#   -> Int# ->
    MutableByteArray# s -> Int# -> Int# -> State# s -> State# s
    copyMutableByteArray# :: MutableByteArray# s -> Int# ->
    MutableByteArray# s -> Int# -> Int# -> State# s -> State# s


    cloneArray#        ::        Array#   a -> Int# -> Int# -> State# s
    -> (# State# s, Array# a #)
    cloneMutableArray# :: MutableArray# s a -> Int# -> Int# -> State# s
    -> (# State# s, MutableArray# s a #)

    freezeArray# :: MutableArray# s a -> Int# -> Int# -> State# s -> (#
    State# s, Array# a #)
    thawArray#   ::        Array#   a -> Int# -> Int# -> State# s -> (#
    State# s, MutableArray# s a #)

    Roman: I'm thinking that even in the absence of GC during foreign
    calls, it still seems worthwhile to provide the plain copying
    primitives, if only to save "user" code from having to know a) the
    structure of a (Byte)Array# and where the "data" lives vs. the
    metadata b) the card marking stuff for Array#, both of which could
    easily change between GHC versions.

    Does this seem reasonable? I was thinking of putting in the
    fillArray# primitive you suggested too (and making it use
    memset_pattern on mac OS), but then we'd need a bunch of different
    fillArray# for different-sized things on ByteArray# and that might
    get ugly. I do however like the idea of putting in a generic
    operation that may not be optimized on all platforms right now, but
    will only get faster with time (once we come up with memset_pattern
    analogues on other platforms).

    Thanks,
    Dan

    On Tue, Jan 25, 2011 at 4:50 PM, Johan Tibell
    <[email protected] <mailto:[email protected]>> wrote:

        On Tue, Jan 25, 2011 at 10:30 PM, Roman Leshchinskiy
        <[email protected] <mailto:[email protected]>> wrote:
         > thawArray# (which creates a mutable copy), update the
        element, then unsafeFreeze#. I thought that's what you wanted
        (modulo names). In theory, since both unsafeFreeze# and
        unsafeThaw# do some work we might want 4 different variants of
        clone:
         >
         >  Array# -> Array#
         >  MutableArray# -> MutableArray#
         >  MutableArray# -> Array#
         >  Array# -> MutableArray#
         >
         > I just proposed to call the latter two thaw and freeze to
        avoid confusing names. I'm not sure if all of them are equally
        important, even though I would probably use all 4 in vector.

        I think I like this. The first version (Array# -> Array#) of
        close is
        only really usable if you want to make sure that an array occupies
        less memory than before, but I can see that being useful when
        slicing.

        Johan





_______________________________________________
Cvs-ghc mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/cvs-ghc

Reply via email to