[Haskell-cafe] Re: Optimizing cellular automata evaluation (round 2)
rahn at ira.uka.de
Mon Dec 3 05:44:35 EST 2007
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
More information about the Haskell-Cafe