[Haskell-cafe] forcing a type constraint on data
Mathijs Kwik
bluescreen303 at gmail.com
Sun Jan 2 01:37:24 CET 2011
Hi all,
I would like to make a more restrictive version of a certain datatype.
I tried wrapping it in a newtype, fundeps, type families, really got lost :)
What I'm trying to achieve is the following:
The original package
http://hackage.haskell.org/packages/archive/reaction-logic/2010.11.17/doc/html/Data-Reactor.html
has a constructor function (mkReactor) with exactly the constraints
I'm after. However, the constraint is just on this constructor
function, not on the data itself.
All functions I write are inferred as "Reactor (State s) c", while the
use of that constructor ensures that s == c.
Also, I might switch "State s" for some "StateT s m" later on, so I
would really like to be able to use "(MonadState c m) => Reactor m c"
in my functions as well, since this is the most generic.
Trying that blows up however:
Could not deduce (m ~ StateT s Identity)
from the context (ValidEvent event, MonadState s m)
`m' is a rigid type variable bound by
the type signature for `stepper2' at Eventer.hs:77:45
In the first argument of `runState', namely
`(insertExternals reactor [Serial event])'
In the expression:
runState (insertExternals reactor [Serial event]) state
In an equation for `stepper2':
stepper2 (Just reactor, state) event
= runState (insertExternals reactor [Serial event]) state
Can someone please explain the cause of this problem?
Are there workarounds? Language extensions?
Thanks in advance,
Mathijs
More information about the Haskell-Cafe
mailing list