Экспорт полиморфной функции MonadState для определенного типа данных состояния - PullRequest
0 голосов
/ 03 декабря 2010

То, что я пытаюсь сделать, - это (в модуле, который я пишу) экспортировать функцию, которая работает с определенным типом в монаде состояния (в приведенном ниже примере этот тип будет 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 требуется для определения типа выше. Является ли использование этого расширения правильным способом определения моей функции или есть лучший способ?

Спасибо

1 Ответ

2 голосов
/ 03 декабря 2010

Разве вы не можете просто использовать класс типов MonadState?

{-# LANGUAGE FlexibleContexts #-}
import Control.Monad.State

data Foo a = Foo { cnt :: Int, val :: a }


test :: MonadState (Foo a) m => m a
test = modify (\(Foo i a)-> Foo (i+1) a) >> gets val

Он отлично загружается в GHCi.

РЕДАКТИРОВАТЬ: Это с MTL-2.0 и GHCi-7.0.1

...