<div dir="ltr"><div>I'm writing a program with several functions, some of which depend on certain fields in a state monad, others of which depend on others, but no routine needs all the fields. <br></div><div><br></div><div>So I thought I would declare a two classes, one for each type of data need that a function has:</div><div><br></div><div>-- as an aside, here's an example of data which is parameterized by two types. <br></div><div><br></div><div>data ReportData t1 t2 = ...<br></div><div><br></div><div>-- this is rolling my own state monad with a random generator<br></div><div>class Monad m => RandMonad m where</div><div>   getGen :: m StdGen</div><div>   putGen :: StdGen -> ()</div><div><br></div><div>-- this is a class of state monad which logs ReportData:</div><div><br></div><div>class Monad m => LogMonad m where</div><div>   putReport :: ReportData t1 t2 -> m ()</div><div><br></div><div>For a particular use case, I declare a type of State monad:</div><div><br></div><div>data MyStateData t1 t2 = MyStateData t1 t2<br></div><div>  { theGen :: StdGen</div><div>  , theReports :: [StepReport t1 t2]</div><div>  }</div><div><br></div><div>type MyState t1 t2 = State (MyStateData t1 t2)</div><div><br></div><div>And I try to define my instances:</div><div><br></div><div>instance RandMonad (MyState t1 t2) where</div><div>  getGen = gets theGen</div><div>  putGen g = modify (\s -> s { theGen = g})</div><div><br></div><div>instance LogMonad (MyState t1 t2) where</div><div>  putReport r = modify (\s -> s { theReports = r : theReports s})</div><div><br></div><div>I get an error on the LogMonad instance, saying that there's no instance for (MonadState (MyState t1 t2) (StateT (MyState t1 t2) Identity))</div><div><br></div><div>I guess I don't really understand typeclasses once you start using higher kinded types, so please enlighten me. Any reading on this subject would be helpful, too.<br></div></div>