Ce que j'essaie de faire est (dans un module que j'écris) exporter une fonction qui fonctionne sur un type particulier dans une monade d'état (dans l'exemple ci-dessous, ce type serait Foo
). Cependant, je voudrais que l'utilisateur puisse utiliser la fonction dans n'importe quel type MonadState
qu'ils souhaitent: State.Lazy
, State.Strict
, StateT
, etc. Il doit donc être polymorphe dans son état externe monad.Exportation d'une fonction MonadState polymorphe pour un type de données d'état particulier
Voici un exemple de ce que je voudrais faire:
ÉDITÉ une meilleure question:
import Control.Monad.State
data Foo a = Foo { cnt :: Int, val :: a }
--test :: State (Foo a) a -- THIS WORKS
--test :: StateT (Foo a) Maybe a -- ...SO DOES THIS
-- ... BUT INCLUDING THE FOLLOWING SIGNATURE GIVES AN ERROR:
test :: MonadState (Foo a) m => m a
test = modify (\(Foo i a)-> Foo (i+1) a) >> gets val
GHC se plaint que l'extension FlexibleInstances est nécessaire pour définir le type ci-dessus. Est-ce que l'utilisation de cette extension est la bonne façon de définir ma fonction ou existe-t-il un meilleur moyen?
Merci
Quelque chose comme cela devrait probablement travailler - Je crains que je ne peux pas le tester au moment (et ça devient non formaté): [_ test :: MonadState (Foo a) m => ma _] –