Высшее родовое пустое ограничение - PullRequest
2 голосов
/ 15 апреля 2019

Я хочу иметь пустое ограничение для более высокого вида.

Предположим, у меня есть следующий класс:

class Category k where
  type Obj k :: * -> Constraint
  id  :: Obj k a => a `k` a
  (.) :: (Obj k a, Obj k b, Obj k c) => b `k` c -> a `k` b -> a `k` c

Теперь я хочу сделать экземпляр для функций таким, чтобы он никоим образом не ограничивал элементы. Что я даю в качестве примера для Obj?

instance Category (->) where
  type Obj (->) = ?
  id    = \a -> a
  f . g = \a -> f (g a)

1 Ответ

4 голосов
/ 15 апреля 2019

Вам нужно будет дать ему явный дополнительный аргумент в объявлении класса.

class Category k where
  type Obj k a :: Constraint

Тогда легко определить экземпляры, используя пустое ограничение () с нижним родом.

instance Category (->) where
  type Obj (->) a = ()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...