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.
Parece que encontré un problema bien conocido en Haskell. Encontré muchas soluciones al buscar "mónadas restringidas" en Google . Esta solución parece ser la menos perjudicial. Aún así, para mis propósitos, parece excesivo. Creo que mantendré general la mónada Distribution
y simplificaré un soporte a través de una función restringida, como sugiere Revolucent.
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.