case is unnecessary, since
break'' already handles empty lists.
g is unnecessary, since
f is in scope.
break'' has two nearly identical base cases, which could be combined into one (you may need to use
tail instead of pattern-matching). That's a line shorter but IMO no clearer.
My previous advice to reverse the accumulator contained a subtle flaw: it needs to find the boundary before it returns anything, so it's not lazy enough. (This is a subtlety of lazy data structures; if you don't understand it yet, don't worry about it.) This occasionally matters in cases like this:
let (a, b) = break (==' ') $ "abc" ++ undefined in head a
The actual implementation avoids this by simply adding
x to the result of the recursive call, without using an accumulator:
break _ xs@ = (xs, xs)
break p xs@(x:xs')
| p x = (,xs)
| otherwise = let (ys,zs) = break p xs' in (x:ys,zs)