significado quiere que percepcion neo mónada monadología monadologia monadas monada leibniz genetica espiritual decir apeticion haskell types monads typeclass

haskell - quiere - neo monadología



Restringir una mónada a una clase de tipo (3)

En Haskell, ¿hay alguna forma de restringir una mónada M a para que satisfaga una restricción de tipo de clase?

Estoy traduciendo el ejemplo de modelado probabilístico de F # a Haskell . Sin embargo, en Haskell, omití el support porque cambiaría data Distribution a a los data (Ord a) => Distribution a . Con este cambio, me aparece el siguiente 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''

De hecho, el tipo de always / return es: (Ord a) => a -> Distribution a . ¿Hay alguna manera de que pueda tener una Distribution mónadas, pero forzar la restricción (Ord a) en esta mónada? Lo intenté:

instance Monad Distribution where (>>=) = bind return :: (Ord a) => a -> Distribution a = always

Pero me sale el 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.

Entonces, ¿hay alguna manera de tener una mónada M a , pero restringir la a con una restricción como Ord a ?

Gracias.


Mi comprensión de esto es que simplemente no se puede, porque una mónada debe generalizarse en todos los tipos, no en un subconjunto restringido de tipos como (Ord a) .

En lugar de restringir el tipo monádico M a , puede limitar las funciones que usan ese tipo monádico, por ejemplo,

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

De hecho, es preferible mantener los tipos lo más generales posible y usar clases de tipos solo para restringir las funciones.

etc.



Mira la biblioteca de Martin Erwig, PFP :

La biblioteca de PFP es una colección de módulos para Haskell que facilita la programación funcional probabilística, es decir, la programación con valores estocásticos. El enfoque de programación funcional probabilística se basa en un tipo de datos para representar distribuciones. Una distribución representa el resultado de un evento probabilístico como una colección de todos los valores posibles, etiquetados con su probabilidad.