[Haskell-cafe] Debugging Haskell code
andy morris
andy at adradh.org.uk
Sun Sep 27 16:02:45 EDT 2009
2009/9/27 Paul Moore <p.f.moore at gmail.com>:
> I'm still playing round with my random dieroll generation program. In
> doing so, I just hit a segmentation fault (I didn't think Haskell
> could *cause* a segfault!) I'm sure it's my code - I got this to
> compile by fiddling with types until the errors (which I didn't
> understand) went away. Certainly not the right way to code, I know,
> but never mind.
>
> The problem is that I have *no idea* how to begin debugging this. In
> C, Python, or any other imperative language, I'd put traces in, etc.
> But in Haskell, I don't even know where to start.
>
> I attach the code below. While help in the form of pointers to what I
> did wrong would of course be appreciated, what I'm really looking for
> is a pointer on how I'd find out for myself. (Hey! I just read the bit
> in the ghc manual which says if I am not using foreign or unsafe
> functions, a crash is a compiler bug. Did I find a compiler bug?)
>
> My code is below. All I did is ghc --make hist_3d6.hs, then run
> hist_3d6.exe. This is ghc 6.10.4 on Windows Vista Home 32-bit.
>
> Thanks for any help,
> Paul.
>
> import System.Random.Mersenne
> import qualified Data.Map as Map
> import Data.Map (Map)
> import Data.List
>
> takes :: Int -> [a] -> [[a]]
> takes n [] = []
> takes n xs = take n xs : takes n (drop n xs)
>
> sums :: Num a => Int -> [a] -> [a]
> sums n xs = map sum (takes n xs)
>
> simulate :: Int -> IO [Double]
> simulate count = do
> gen <- newMTGen Nothing
> dice <- (randoms gen :: IO [Double])
> return (take count dice)
>
> histogram :: Ord a => [a] -> [(a,Int)]
> histogram = Map.assocs . foldl' f Map.empty
> where
> f m k = Map.insertWith' (+) k 1 m
>
> simulation = do
> lst <- simulate 100000
> return lst
> --return (histogram lst)
>
> main = do
> s <- simulation
> putStrLn (show s)
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>
mersenne-random uses the FFI, so it's probably that. I just ran your
code with mersenne-random-1.0 and didn't get a segfault. What version
are you using?
More information about the Haskell-Cafe
mailing list