Понимание равенства типов в сигнатуре функции - PullRequest
1 голос
/ 28 октября 2019

В GPipe есть функция для записи в текстуру:

writeTexture2D :: forall ctx b c h w os f m. (ContextHandler ctx, MonadIO m, BufferFormat b, ColorSampleable c, BufferColor (Color c (ColorElement c)) h ~ b, h ~ HostFormat b) => Texture2D os (Format c) -> Level -> StartPos2 -> Size2 -> [h] -> ContextT ctx os m () 

У меня проблема с пониманием части сигнатуры, где используется равенство типов. Существует учебник , в котором говорится об этом, но я не вдавался в подробности, объясняющие то, что я считаю очевидным.

BufferColor (Color c (ColorElement c)) h ~ b, h ~ HostFormat b

Итак, что я знаю:

  • существует экземпляр BufferFormat для b
  • BufferFormat класс имеет связанный тип HostFormat
  • h ~ HostFormat b говорит мне, что h должно бытьHostFormat для данного b?
  • h ~ b это говорит мне, что h и b должны быть одного типа?

Но когда я смотрю на экземпляры из BufferFormat b Я не думаю, что есть такой экземпляр, который бы имел b, равный его собственному HostFormat b? Где я делаю ошибку?

1 Ответ

4 голосов
/ 28 октября 2019

Это BufferColor (Color c (ColorElement c)) h, что должно быть равно b, а не h.

BufferColor - это семейство типов с двумя аргументами . Семейства типов ведут себя немного как функции на уровне типов. Вы вводите типы и получаете взамен другой тип.

И «приложение семейства типов» имеет более высокий приоритет, чем оператор равенства типов ~.

...