Ограничение монады классом типов - PullRequest
15 голосов
/ 19 декабря 2008

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

Спасибо.

Ответы [ 3 ]

13 голосов
/ 19 декабря 2008

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

10 голосов
/ 19 декабря 2008

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

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

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

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

и т.д.

3 голосов
/ 19 декабря 2008

Выезд Библиотека Мартина Эрвига, PFP :

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

...