Scott Lawrence bytbox at gmail.com
Mon Jun 6 08:13:49 CEST 2011

On Mon, Jun 6, 2011 at 01:52, Yitzchak Gale <gale at sefer.org> 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?
> 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