Я работаю над некоторым кодом глубоко в недрах приложения и хотел бы сделать его обобщенным c по отношению к некоторым типам, которые он использует, чтобы я мог высмеивать типы для модульных тестов.
Я пытаюсь настроить класс типов в соответствии с:
class (Monad m) => SomeClass m a x d | m -> a where
makeState :: x -> m (a x)
open :: (a x) -> m (a d)
use :: OtherArg -> (a d) -> m ()
close :: (a d) -> m ()
, где переменная типа m
будет монадой (например, IO
, ST
), a
будет каким-то типом типа оболочки в монаде (например, MVar
, STRef
) и x
будут известны во время компиляции, но меня не волнует тип d
в функциях, использующих type-class, просто в самих реализациях функций экземпляра класса type.
Сейчас я просто пытаюсь настроить типы и выдает ошибку, когда я добавляю ограничение к своим функциям, например:
someFn :: (SomeClass m a Model d) => a d -> a Model -> T m ()
компилятор жалуется на то, что d
является неоднозначным и не даст мне уйти, не указав конкретный тип, то есть я не смогу его высмеять.
Я посмотрел кратко на некоторых языковых расширениях и кажется, что RankNTypes
может быть то, что мне нужно но я не уверен, как go использовать его.
Это правильный подход к достижению sh того, что я пытаюсь сделать, или я должен подходить к нему иначе? (Я не удивлюсь, если подойду к нему слишком ООПили, так как недавно много работал в Java.)
Заранее спасибо.