Ограничение монады классом типа
В Haskell существует ли способ ограничить монаду M a
, чтобы a
удовлетворял ограничениям типа типа?
Я переводя пример вероятностного моделирования из F # to 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
?
Спасибо.
Ответы
Ответ 1
Мое понимание этого состоит в том, что вы просто не можете, потому что монада предназначена для обобщения по всем типам, а не для некоторого ограниченного подмножества таких типов, как (Ord a)
.
Вместо ограничения монадического типа M a
вы можете просто ограничить функции, которые используют этот монадический тип, например,
foo :: Ord a => Int -> M a
На самом деле предпочтительнее сохранять типы как можно более общие и использовать классы типов только для ограничения функций.
и др.
Ответ 2
Похоже, я столкнулся с известной проблемой в Haskell. я нашел много обходных решений googling для "ограниченных монад" . Эти решения кажутся наименее разрушительными. Тем не менее, для моих целей это кажется излишним. Я думаю, что я сохраню общий монад Distribution
и упрощу поддержку с помощью ограниченной функции, как это было предложено Revolucent.
Ответ 3
Отъезд Библиотека Martin Erwig, PFP:
Библиотека PFP представляет собой набор модулей для Haskell, который облегчает вероятностное функциональное программирование, то есть программирование со стохастическими значениями. Вероятностный подход к функциональному программированию основан на типе данных для представления распределений. Распределение представляет собой результат вероятностного события как совокупность всех возможных значений, помеченных их вероятностью.