То, что я пытаюсь сделать, - это (в модуле, который я пишу) экспортировать функцию, которая работает с определенным типом в монаде состояния (в приведенном ниже примере этот тип будет Foo
). Однако я бы хотел, чтобы пользователь мог использовать функцию в любом типе MonadState
, который он пожелает: State.Lazy
, State.Strict
, StateT
и т. Д. Поэтому он должен быть полиморфным в своей монаде внешнего состояния. *
Вот пример того, что я хотел бы сделать:
РЕДАКТИРОВАНИЕ с лучшим вопросом:
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 жалуется, что расширение FlexibleInstances требуется для определения типа выше. Является ли использование этого расширения правильным способом определения моей функции или есть лучший способ?
Спасибо