Подтвердить что ты не робот

Ограничение монады классом типа

В 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?

Спасибо.

4b9b3361

Ответ 1

Мое понимание этого состоит в том, что вы просто не можете, потому что монада предназначена для обобщения по всем типам, а не для некоторого ограниченного подмножества таких типов, как (Ord a).

Вместо ограничения монадического типа M a вы можете просто ограничить функции, которые используют этот монадический тип, например,

foo :: Ord a => Int -> M a

На самом деле предпочтительнее сохранять типы как можно более общие и использовать классы типов только для ограничения функций.

и др.

Ответ 2

Похоже, я столкнулся с известной проблемой в Haskell. я нашел много обходных решений googling для "ограниченных монад" . Эти решения кажутся наименее разрушительными. Тем не менее, для моих целей это кажется излишним. Я думаю, что я сохраню общий монад Distribution и упрощу поддержку с помощью ограниченной функции, как это было предложено Revolucent.

Ответ 3

Отъезд Библиотека Martin Erwig, PFP:

Библиотека PFP представляет собой набор модулей для Haskell, который облегчает вероятностное функциональное программирование, то есть программирование со стохастическими значениями. Вероятностный подход к функциональному программированию основан на типе данных для представления распределений. Распределение представляет собой результат вероятностного события как совокупность всех возможных значений, помеченных их вероятностью.