Re: [Haskell-cafe] Memory allocation in extractor function (newbie question)

On Mon, Apr 7, 2008 at 4:16 PM, Yitzchak Gale
You didn't show us the code for countForPoints. I'll bet you wrote something like
countForPoints area ls count points = sum $ map (countPathsFrom area (count + 1) ls) points
Unfortunately, the standard sum function is too lazy in many situations. And if you wrote out the recursion for countForPoints by hand, you may have run into the same problem. In either case, you'll be accumulating huge amounts of unevaluated (+) thunks instead of adding up the count as you go along.
If this is the problem, you can fix it by using foldl', a strict version of foldl from Data.List, instead of sum:
countForPoints area ls count points = foldl' (+) 0 $ map (countPathsFrom area (count + 1) ls) points
Thanks for the pointer. In fact my version was already using the fold function, albeit the lazy version of it: countForPoints :: Area -> String -> Int -> [Point] -> Int countForPoints area goal count points = let newCount = foldl (countSubPaths area goal) count points in if countExceeded newCount then -1 else newCount countExceeded :: Int -> Bool countExceeded count = (count < 0) || (count > countLimit) countSubPaths :: Area -> String -> Int -> Point -> Int countSubPaths area goal count point = if (countExceeded count) then -1 else countPathsFrom area count goal point Switching to the strict version reduced the amount of garbage in that function and in countSubPaths, but the problem with 'letterAt' still shines. I was thinking that adding strictness to that function might help, but no amount of exclamation marks helped it so far. -Alexander // copying to the mailing list, because first reply didn't get through.
participants (1)
-
Alexander Kireyev