[Haskell-cafe] a problem defining a monad instance
Neil Brown
nccb2 at kent.ac.uk
Fri Nov 6 13:19:56 EST 2009
Petr Pudlak wrote:
> The problem is the (Ord b) condition, which is required for the Map
> functions. When I try to define the monad instance as
>> instance Monad Distrib where
>> return = dreturn
>> (>>=) = dcompose
>>
> obviously, I get an error at (>>=):
> Could not deduce (Ord b) from the context.
>
> Is there some way around? Either to somehow define the monad, or to
> achieve the same functionality without using Map, which requires Ord
> instances?
>
Not being allowed constraints on the variables for class methods is
probably the problem I have most frequently run into recently in Haskell
(is there any way to fix this, or does it open up a whole can of worms?).
There is no easy way around it, but for your problem, do you require
that the items be kept unique as you go along? Could you not use a list
of items with probabilities -- that can potentially contain duplicate
items (but all the summed probabilities should add to one at every
stage, presumably), and then combine them at the end? i.e. your code
would look like:
newtype Distrib a = Distrib { undistrib :: [(a, Float)] }
runDistrib :: Ord a => Distrib a -> Map.Map a Float
runDistrib = Map.fromListWith (+) . undistrib
This would push the Ord constraint to runDistrib, and allow you to leave
it off (>>=).
Neil.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/haskell-cafe/attachments/20091106/50088a9a/attachment.html
More information about the Haskell-Cafe
mailing list