On 09.02.2013 01:02, Nicolas Bock wrote:
Yes, a histogram. The binning code is really a little awkward. I haven't
gotten used to thinking in terms of inmutable objects yet and this list
appending is really a pretty bad hack to kind of allow me to increment
the bin counts. How would one do this more haskellishish?

Histogramming is a bit awkward in haskell. If we want to stick to immutable data types best choice is to have map bin → number of entries. For every new entry select bin and add 1 to its content.

But if we want to store data in array we have to deal with mutable state. It's not realistic to copy array on every update. For that case I wrote I library histogram-fill[1]. Below is program which does approximately same thing.

> import Data.Histogram.Fill
> import Data.Histogram      (Histogram)
>
> hb :: HBuilder String (Histogram LogBinD Int)
> hb = forceInt -<< mkSimple (logBinDN 1e-8 10 10) <<- read
>
> main :: IO ()
> main = do
>   l <- getContents
>   print $ fillBuilder hb $ lines l

I cheated and used sed to strip unused data. It uses String so it's still slower than python.


$ time (python gen.py -N 300 | sed 's/.*=//' | ./printMatrixDecay )
real    0m0.958s
user    0m2.096s
sys     0m0.052s

$ time (python gen.py -N 300 | python printMatrixDecay.py -)
real    0m0.590s
user    0m0.952s
sys     0m0.016s


[1] http://hackage.haskell.org/package/histogram-fill

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to