Hola,
Respecto a la suma, la segunda ecuación (suma n Zero = n) es innecesaria. Fijate que el segundo argumento de suma juega el rol de parámetro constante durante la recursión; simplemente lo retornás cuando el primer parámetro llega a Zero.
La definición de suma en términos de foldN es muy similar a la de append (++) en términos de foldr. Hay varias alternativas pero lo mas sencillo es plantearla de esta forma:
suma m n = foldN h e m
where h = ...
e = ...
El foldN lo estoy definiendo sobre m (que fue el argumento recursivo en tu definición). Es claro que en el cuerpo del foldN (esto es, en h o en e) tiene que aparecer n. Te dejo para que pienses las definiciones de h y e.
Ahora, respecto a predecesor, la definición que das es correcta, Escribirlo en términos de foldN no es inmediato. Tiene el mismo problema que tiene escribir dropWhile p xs en términos de foldr. El problema está en la forma que tiene el esquema recursivo foldN. En efecto, el paso recursivo (la función h en foldN h e) solo puede utilizar como entrada el resultado de la llamada recursiva.
foldN h e (Succ n) = h (foldN h e n)
El problema en el caso del predecesor es que h precisa conocer el valor n para poder retornarlo, pero no lo tiene a mano (la definición de h no puede depender del n que está a la izquierda de la ecuación). Por lo tanto, si ese valor no está accesible, entonces la salida que hay es escribir una definición en términos de foldN que reconstruya el n para poder retornarlo. Te dejo para que lo pienses con esta sugerencia.
Saludos,
Alberto.