I want to reinforce Adam's advice about starting with a fresh sandbox.
When using -fdevelopment you should ALWAYS start off by building from
scratch with a fresh sandbox. This isn't unique to Snap's development
mode. The whole purpose of cabal is to figure out a set of consistent
dependencies. Cabal has a number of preferences, such as preferring
newer versions of packages to older ones and preferring already
installed versions over just about anything else. Any time you add a
new dependency into the mix there's a chance that it will introduce
constraints that conflict with the ones already chose. If that
happens, you need to blow away your sandbox and try fresh to see if
GHC can find a solution with fewer restrictions.
This doesn't mean that your production deployment and your development
mode deployment have to use the same packages. You could develop on
7.10 and deploy on 7.8. Assuming all your code builds fine on both,
that's a perfectly doable scenario. But what you will not be able to
do is use your 7.10 sandbox to build the 7.8 version for deployment.
Another option is to use a cabal freeze file to unify both cases. You
would first build from a clean sandbox with -fdevelopment. Then, when
everything is built run "cabal freeze". This creates a file
cabal.config that records specific versions of every package in your
dependency tree and fixes you to using those versions. Now you should
be able to switch back and forth between -fdevelopment and
non-development without deleting your entire sandbox. You should only
need to do "cabal clean" first. The key here is that you have to do
the "cabal freeze" when you're in your most restricted state...i.e.
development mode.