Как я могу сообщить Haskell, что мне все равно, каков тип generi c? - PullRequest
1 голос
/ 24 марта 2020

Я работаю над некоторым кодом глубоко в недрах приложения и хотел бы сделать его обобщенным 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.)

Заранее спасибо.

1 Ответ

4 голосов
/ 24 марта 2020

Может быть, этого достаточно, чтобы заставить фаната сходить с ума:

class (Monad m) => SomeClass m a x d | m -> a <b>d</b> where

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...