[Haskell-cafe] Cons of -XUndecidableInstances
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?
> 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
More information about the Haskell-Cafe
mailing list