В Haskell, есть ли способ ограничить монаду M a
, чтобы a
удовлетворял ограничению класса типа?
Я перевожу пример вероятностного моделирования с F # на Haskell . Однако в Haskell я пропустил support
, потому что он изменит data Distribution a
на data (Ord a) => Distribution a
. С этим изменением я получаю следующую ошибку:
...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'
Действительно, тип always
/ return
: (Ord a) => a -> Distribution a
. Есть ли способ получить монаду Distribution
, но навязать ограничение (Ord a)
на эту монаду? Я попробовал:
instance Monad Distribution where
(>>=) = bind
return :: (Ord a) => a -> Distribution a = always
Но я получаю ошибку:
...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.
Так что есть способ получить монаду M a
, но ограничить a
с помощью ограничения, такого как Ord a
?
Спасибо.