On Tue, 8 Oct 2002 09:14:26 -0400 David Roundy <[EMAIL PROTECTED]> wrote:
> > My only guess is that for some reason it is making an entirely new copy of > the array each time it recurses, but that doesn't make any sense, ... > >>hunt_one_char :: String -> [Int] -> Array Int (Threshold String) -> > >> Array Int (Threshold String) > >>hunt_one_char c [] th = th > >>hunt_one_char c (j:js) th = > >> case my_bs (Thresh j [c]) th of > >> Nothing -> hunt_one_char c js th > >> Just k -> > >> case th!(k-1) of > >> Thresh _ rest -> > >> hunt_one_char c js th//[(k,Thresh j (c:rest))] Yes, I think you're actually copying the array at each recursive invocation when you do the update "th//[..]". The compiler can't guess that the array can be updated in-place. You could use state-thread arrays rather than ordinary Haskell arrays. State-thread are an extension to H98 standard that is supported by ghc and hugs (at least). The basic idea is to use a monad to encapsulate the code that manipulates memory references/updates in place and guaranties that the references are actually used in a single-threaded way. Look up the paper entitled "Lazy Functional State Threads" by John Lauchbury and Simon Peyton Jones (it's available for download). Section 3 contains examples with array updates in-place. Hope this helps, Pedro Vasconcelos. _______________________________________________ Haskell-Cafe mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/haskell-cafe
