Hi Nicolas, Your design doesn't look too unreasonable, though I haven't looked at in detail. I do have a quick observation regarding the implementation that I hope might help. Your gist defines
> class MonadLog m a where > getEntry :: Index -> m (Entry a) > > instance MonadLog (MemLog a) a and then you hit the error > No instance for (MonadLog (MemLog a0) ()) which is a tell-tale ambiguity problem. This is a common issue with multi-parameter type classes. GHC cannot determine the existential variable a0, because it will not commit to the instance for MemLog in case a more specific instance turns up. One option is to turn on GADTs or TypeFamilies and write > instance a ~ a' => MonadLog (MemLog a) a' which will allow the instance to match and generate the easily solved constraint a0 ~ (). You may need to do the same for other instances. Alternatively, you could add a functional dependency > class MonadLog m a | m -> a or use a type family: > class MonadLog' m where > type Element m > getEntry' :: Index -> m (Entry (Element m)) > instance MonadLog' (MemLog a) where > type Element (MemLog a) = a > getEntry' i = flip (IntMap.!) i `fmap` ask Hope this helps, Adam On 20/05/13 12:25, Nicolas Trangez wrote: > All, > > Since I'm stuck on a coding problem and can't figure out how to proceed, > I decided to call for help. > > I'm unable to get some code to typecheck, so maybe I'm missing something > obvious on the implementation side, or more likely the design is > completely wrong. > > Here's the idea: I have some code which uses some log of "Entry a" > values (for some polymorphic type 'a'), and provides actions which > output "Command a" values which should be interpreted by some wrapper > code, e.g. adding some new entries to the log. These actions are > implemented in a custom WriterT transformer (in this demo code, the > original is more complex) to output Commands, while the inner monad > should give access to the log entries (this could be in-memory like in > the example, or stored on disk so using IO). > > You can find a trimmed-down version at > https://gist.github.com/NicolasT/4230251f4f87f110d197 > > This doesn't type-check, and I'm not sure how to proceed. Am I taking a > wrong approach? Do I need a different design? > > Thanks, > > Nicolas > > > _______________________________________________ > Haskell-Cafe mailing list > Haskell-Cafe@haskell.org > http://www.haskell.org/mailman/listinfo/haskell-cafe > > -- The University of Strathclyde is a charitable body, registered in Scotland, with registration number SC015263. _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe