isPrefixOf & isSuffixOf
That is very idiomatic Haskell code. The only thing I'd mention is that the empty list is a prefix of everything, so your first case should be

isPrefixOf' [] _ = True


With that change, you can remove

  | null xs &amp;&amp; x == y = True


since it will be correctly handled by

  | x == y = isPrefixOf' xs ys


As for implementing isSuffixOf in terms of inPrefixOf, you're in good company; that's how Data.List does it.