How does dependency hell happen in Cabal-install?
I read the following at Cabal/Survival - HaskellWiki:
1. What is the difficulty caused by C
You have scenarios like this:

Where both B and C depend on A. However, if they were installed at different times, they may depend on different versions of A. For example, A version 1 export type T = Int, but in version 2 it exports type T = Bool.
Only when you try to build D do you expose the problem that B and C were build against different versions of A, and you can't compare T version 1 against T version 2.