Game of Life in Haskell
Refactor's answer is excellent and captures most points. One thing in your code which sticks out is the overuse of if. E.g. consider

get_bounds xs = if null xs
    then (0, 0)
    else (length xs, length $ head xs)


I think

getBounds [] = (0,0)
getBounds xs = (length xs, length $ head xs)


is much clearer. Or this, which looks really strange:

make_population_transition from to condition image | image origin == from = 
    if (condition . population_count) image 
            then replace image origin to 
            else image
make_population_transition from to test image | otherwise = image


You should write

make_population_transition from to condition image 
     | image origin == from &amp;&amp; 
       (condition . population_count) image = replace image origin to 
     | otherwise = image