6.4.1 is a bugfix release over 6.4. No library APIs have changed, so code that worked with 6.4 should continue to work with 6.4.1.
Many, many bugs have been fixed relative to 6.4. Far too many to list here.
The following new features were added in this release:
Much improved support for the amd64/Linux platform, including GHCi, Template Haskell, a native code generator, foreign import "wrapper", and -split-objs.
GHCi support is currently experimental on this platform. Due to the nature of the object file format on this architecture, GHCi is unable to support loading objects that contain data references to shared libraries: please be aware that if you are doing this (perhaps via foreign import "&"), then you can expect crashes. The solution is either to access the symbol via an indirection, or to access the symbol using a function in a shared library. Fortunately none of our existing packages do this (errno is accessed via a function, for example).
The package infrastructure has been improved in various ways, and some restrictions have been relaxed. In GHC 6.4, a package module would take precedence over local module, such that the local module would be ignored in favour of the package module. In GHC 6.4.1 this behaviour is now reversed: the local module will be picked up in preference to the package module. There is still the restriction that the program can contain only a single module with a given name, but conflicts are now reported lazilly - i.e. as long as you don't use a package that contains a module with the same name as a local module, the conflict will not be reported).
Ambiguous imports are now reported lazilly: if there are two packages that provide the same module, the error is not reported until an attempt to import the module is made.
Various error conditions in the behaviour of the package flags have been replaced by “do what I want” behaviour. For example, if there were two versions of a package P, then -package P used to be an error, now it uses the most recent version of P. In general, if multiple versions of a package are available, GHC will pick the most recent version unless told to do otherwise with a -package flag.
There's a new flag: -hide-all-packages (Section 4.8.1, “Using Packages ”) which causes all packages to be hidden by default, forcing you to explicitly list each package required by the code being compiled. This is useful for avoiding hidden dependencies, and Cabal now uses this flag by default.
Some performance issues have been addressed. Various cases where GHC was taking overly long to compile modules have been fixed. Some space leaks in the compiler have been fixed.
The character predicates in Data.Char now have a new implementation. Rather than relying on support from the C library, which was patchy at best, the Data.Char implementation now contains an internal table of character properties for the entire Unicode character set.
The ghc-pkg tool has two new variants: ghc-pkg list P lists all version of P that are available, and ghc-pkg latest P gives the latest version of P. See Section 4.8.5, “Package management (the ghc-pkg command)”.
The runghc (aka runhaskell) utility now accepts options to pass to GHC before the name of the script to run.
Note that although many improvements have been made to Cabal since 6.4 was released, due to our policy of not changing library APIs in a patchlevel release, GHC 6.4.1 does NOT contain the newer version of Cabal. However, if you need an updated Cabal, upgrading is a fairly painless procedure.