"Intelligent" removal of carriage returns that preserves paragraph breaks, headings, etc
Two things:


Try using String instead of [Char], it reads a lot easier (imho).
Don't use head, use pattern matching instead. It reads better, and it's good practice, because if it passes an empty list you will get an error (though you will not encounter that in this program, since you already check for empty lists).


If you wanted to have your program consider multiple lines, a quick and dirty solution would be something like this:

function :: [String] -&gt; [Bool]
function [] = []
function [line1,line2] = [(shouldMerge line1 line2)]
function (line1:line2:morelines) = [(shouldMerge line1 line2)] ++ function (line2:morelines)


NOTE: I haven't tested the above code for bugs.

Another solution would be to make shouldMerge recursive, with a type of [String] -&gt; [Bool].