http://hpaste.org/4151#a1

It is interesting, that the naive implementation

import Data.List (tails)

neighbours :: Int -> [a] -> [[a]]
neighbours w = rotL . take w . map (take 3) . tails . cycle

rotL :: [a] -> [a]
rotL xs = last xs : init xs

type Rule a = [a] -> a

step :: Int -> Rule a -> [a] -> [a]
step w f = map f . neighbours w

rule110 :: Rule Char
rule110 "   " = ' '
rule110 "X  " = ' '
rule110 "XXX" = ' '
rule110 _     = 'X'

main = let f = step 149 rule110
           init = replicate 148 ' ' ++ "X"
       in mapM_ putStrLn $ take 10000 $ iterate f init

is only 3 times slower than your quite complex, hard to follow and hard to debug implementation.

As always, I prefer to write most code in Haskell, quick, easy, nice, reasonable fast, ... If speed matters, I switch to some lower level language, as you did staying inside Haskell.

/BR, Mirko Rahn

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

Reply via email to