I skipped the experimental and to my knowledge unused
Extensible modules. If you would like to see them ported let me know.
For straight-forward usage, e.g. the examples on the dimensional wiki, the only change required from library users to switch from dimensional to dimensional-tf is inserting
.TF in the import statements. E.g.:
import Numeric.Units.Dimensional.TF.Prelude import Numeric.Units.Dimensional.TF.NonSI
In such cases the choice of using dimensional backed by functional dependencies or type families is largely philosophical as neither will be visible in the client code.
If you do more advanced things with polymorphic dimensions and explicit type signatures you will have to convert the type signatures from MLTC style constraints to type families. E.g.:
myFunc :: (Num a, Mul d1 d2 d3) => Quantity d1 a -> Quantity d2 a -> Quantity d3 a
would change to:
myFunc :: Num a => Quantity d1 a -> Quantity d2 a -> Quantity (Mul d1 d2) a
Compiler errors will also be different in dimensional-tf, for better or for worse.
So, should you use dimensional or dimensional-tf? For the time being I consider dimensional-tf to be experimental. If you want stability stick with dimensional for now. If your dislike of functional dependencies trumps your need for stability, then try dimensional-tf. If dimensional-tf eventually proves itself to be a better dimensional I will merge it into the latter with a major version bump.
Dimensional-tf-0.1 compiles on GHC-7.0. The source code is on Github.
Update 2012-02-15: In case this wasn't building for you on GHC-7.4.1; I've added a FlexibleInstances pragma that should take care of it. Dimensional-tf-0.1.0.1 compiles on GHC-7.0 and 7.4.