In Haskell, is there a way to restrict a monad M a
so that a
satisfy a type class constraint?
I am translating the probabilistic modeling example from F# to Haskell. However, in Haskell, I omitted support
because it would change data Distribution a
to data (Ord a) => Distribution a
. With this change, I get the following error:
...probabilisticModeling.hs:42:13:
Could not deduce (Ord a) from the context ()
arising from a use of `always'
at ...probabilisticModeling.hs:42:13-18
Possible fix:
add (Ord a) to the context of the type signature for `return'
In the expression: always
In the definition of `return': return = always
In the instance declaration for `Monad Distribution'
Indeed, the type of always
/return
is: (Ord a) => a -> Distribution a
. Is there a way I can have a monad Distribution
, but force the constraint (Ord a)
on this monad? I tried:
instance Monad Distribution where
(>>=) = bind
return :: (Ord a) => a -> Distribution a = always
But I get the error:
...probabilisticModeling2.hs:48:4:
Pattern bindings (except simple variables) not allowed in instance declarations
return :: (Ord a) => a -> Distribution a = always
Failed, modules loaded: none.
So it there a way to have a monad M a
, but restrict the a
with a constraint such as Ord a
?
Thanks.