
Oops. I can just abandon the Entropy typeclass and put the function
directly into Model, eh? Yeah, I think I'll do that...
Supposing I didn't want to - any alternatives? Other instances of
Entropy I might consider:
instance (Eq a) => Entropy [a]
instance (Eq a) => Entropy (Tree a)
On Mon, Jun 6, 2011 at 02:13, Scott Lawrence
On Mon, Jun 6, 2011 at 01:52, Yitzchak Gale
wrote: Scott Lawrence wrote: You almost never want to use UndecidableInstances when writing practical programs in Haskell.
Ah. That's what I wanted to know :P
(Although it does seem to me - from looking around docs and the source - that GHC's rules for allowing certain combinations might be a bit too conservative - but then, I have next to no idea what I'm doing, so hey.)
When GHC tells you that you need them, it almost always means that your types are poorly designed, usually due to influence from previous experience with OOP.
* hides behind book
Your best bet is to step back and think again about the problem you are trying to solve. What is the best way to formulate the problem functionally? That will lead you in the right direction. Please feel free to share more details about what you are trying to do. We would be happy to help you work out some good directions.
I'm modelling text in a markov-model-like way. I have an actual markov model (albeit one in which X_n depends on a fixed range X_n-1 .. X-n-k). I'm vaguely anticipating the presence of other models:
class Model m a | m -> a where lexemes :: m -> Set a genFunc :: m -> [a] -> ProbDist a
Having that working, I'm trying to estimate the information entropy of a model
entropy :: (Model m) => m -> Double
(This is a slight simplification, since entropy needs a second argument "precision" to know when to terminate.)
Which works well and fine - this function is pretty trivial to implement, on the assumption that Markov (the instance of Model described above) implements genFunc properly. But it happens not to - the array argument to genFunc must be the right size, otherwise an even probability distribution is used. So my OOP-infected mind wants to specialize 'entropy' for Markov:
class Entropy d where entropy :: d -> Double -- again, simplified
Note that it's not (Entropy d a) because the type of the lexeme doesn't matter. Now, the problem code
instance (Model m a) => Entropy m where entropy = undefined
As you might have picked up, I suspect the part where I want to specialize entropy for Markov is where I mess up - but I'm not sure what to do. (To be clear, I expect to want to specialize entropy for other models too - the general function I have in mind would be horribly slow for many reasonable models.)
Thanks.
Regards, Yitz
-- Scott Lawrence
-- Scott Lawrence