Jason Catena wrote:
By this example State doesn't seem to give you anything more than a
closure would, since it doesn't act like much of an accumulator (by,
for example, storing 6 as its new internal value).

Reader r = (r->)
Writer m = Monoid m => (m,)
State  s = (s->) . (s,)

So, yes, the state monad can "change the internal value".

Could you use State for something like storing the latest two values
of a Fibonacci series?

Sure. let s = (Int,Int) and

    fibs = start
        where
        start 0 = 0
        start 1 = 1
        start n = evalState (recurse $! n-2) (0,1)

        recurse n = do
            (x,y) <- get
            let z = x+y
            z `seq` if n==0
                then return z
                else do
                    put (y,z)
                    recurse $! n-1

will return the nth Fibonacci number, with memoization, while only holding onto the previous two memos.


Would Haskell memoize already-generated values in either case?

No. Doing so would lead to enormous memory leaks.

Could
we write a general memoizer across both the recursive and State
implementations, or must we write a specific one to each case?

There are a number of generic memoization libraries on Hackage, just take a look.

--
Live well,
~wren
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to