We can find all (Haskell) libraries linked against the final executable with:

strings "$(which yeganesh)" | rg '-lHS([A-Aa-z-]+\d+(.\d)*)' -r'$1' --only-matching

which gives:

xdg-basedir-0.2.2 strict-0.4.0.1 these-1.1.1.1 hashable-1.4.0.2 text-1.2.5.0 binary-0.8.9.0 assoc-1.0.2 bifunctors-5.5.1 th-abstraction-0.4.3.0 comonad-5.0.8 transformers-compat-0.7.1 indexed-traversable-0.1.2 distributive-0.6.2.1 tagged-0.8.6.1 transformers-0.5.6.2 template-haskell-2.1 pretty-1.1.3.6 ghc-boot-th-9.2.1 base-orphans-0.8.6 process-1.6.1 directory-1.3.6.2 unix-2.7.2.2 bytestring-0.1 time-1.1 filepath-1.4.2.1 containers-0.6.5.1 deepseq-1.4.6.0 array-0.5.4.0 base-4.1 ghc-bignum-1.2 ghc-prim-0.8.0

To find what is actually used, we can use Jacinda, viz.

strings $(which yeganesh) | ja '[x ~* 1 /(^[A-Za-z][A-Za-z0-9-]*-\d+(.\d+)*)-[0-9a-f]{64}$/]:? $0'

which gives:

xdg-basedir-0.2.2 strict-0.4.0.1

Now, the latter does not account for base libraries, but in any case one can see that there are a great many libraries which have to be present at compile time in order for the whole thing to build but which have no effect on the final artifact:

these-1.1.1.1 hashable-1.4.0.2 binary-0.8.9.0 assoc-1.0.2 bifunctors-5.5.1 th-abstraction-0.4.3.0 comonad-5.0.8 transformers-compat-0.7.1 indexed-traversable-0.1.2 distributive-0.6.2.1 tagged-0.8.6.1 transformers-0.5.6.2 pretty-1.1.3.6 base-orphans-0.8.6 time-1.1 filepath-1.4.2.1

These are provided to avoid orphan instances. The question of where to put instances has been around awhile in the Haskell world (it affects libraries, packaging, builds) but the above attests to how stark it is. Compiling code for these instances and installing them is wasteful and the whole ecosystem is unnecessarily brittle.