Personal tools

Upgrading from MTL 1 to MTL 2

From HaskellWiki

(Difference between revisions)
Jump to: navigation, search
(Copied text from the Haskell Platfrom trac wiki page)
 
(Introductory sentence was taken out of context)
Line 1: Line 1:
Most packages build unchanged with mtl-2. Most of the remainder require only small changes to upgrade to it, though that will usually render them incompatible with mtl-1 without some CPP directives. Here are the fixes for common messages:
+
Many packages written for earlier versions of MTL build unchanged with version 2. Most of the remainder require only small changes to upgrade to it, though that will usually render them incompatible with version 1 without some CPP directives. Here are the fixes for common messages:
   
 
''Illegal instance declaration for Applicative (State a)''
 
''Illegal instance declaration for Applicative (State a)''

Revision as of 11:37, 16 November 2010

Many packages written for earlier versions of MTL build unchanged with version 2. Most of the remainder require only small changes to upgrade to it, though that will usually render them incompatible with version 1 without some CPP directives. Here are the fixes for common messages:

Illegal instance declaration for Applicative (State a)

This usually means that the instance you're defining is now defined in the transformers package. You may wish to check it's the same, so you can just delete it.

Could not deduce (Functor m) from the context (Monad m)
arising from a use of fmap

This will be a situation where you're using a monad constructed with a transformer as a Functor. You can replace
fmap
with
liftM
and the code will build with old and new versions of mtl.

Could not deduce (Functor m) from the context (Monad m)
arising from the superclasses of an instance declaration

This will be another situation where you're using a monad constructed with a transformer as a Functor. You can replace the
Monad m
with
Functor m
to make it work with mtl-2, or add a
Functor m
constraint to make it work with old and new versions of mtl.

Not in scope: data constructor State

The
State
type is now a type synonym. You could replace the
State
data constructor with the
state
function.

Not in scope: runState

You probably imported
State(..)
, which won't work now that
State
is a type synonym. You need to import
State
and
runState
. (That will work with old versions of mtl too.)

Illegal instance declaration for Myclass (State Foo)

If you have a matching instance for
StateT
, you can delete the instance for
State
. Otherwise you need to generalize your instance to
StateT
. If that's not possible, you may need to introduce a
newtype
.