I did another set of benchmarks, and Milan's implementation has a small but clear advantage over mine. Therefore I amend my proposal to use Milan's implementation instead. I would suggest perhaps using the following names:
isSuffixOf :: (Eq a) => [a] -> [a] -> Bool
[] `isSuffixOf` _ = True
needle `isSuffixOf` hay = dropNeedleFromHay needle hay
where dropNeedleFromHay [] remainingHay = dropToHayEnd remainingHay hay
dropNeedleFromHay _ [] = False -- needle longer than hay
dropNeedleFromHay (n:ns) (h:hs) = dropNeedleFromHay ns hs
dropToHayEnd [] suffix = needle == suffix
dropToHayEnd _ [] = True -- This can't happen, but returning True is measurably (slightly) faster than throwing an error here.
dropToHayEnd (d:ds) (s:ss) = dropToHayEnd ds ss