了解函数签名中的类型相等

时间:2019-10-28 06:15:13

标签: haskell type-families

在GPipe中,有一个function用于写入纹理:

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 () 

我在理解使用类型相等的签名部分时遇到问题。有tutorial这样的话题,但没有详细解释我认为是显而易见的。

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

所以我知道:

  • BufferFormat有一个b的实例
  • BufferFormat类具有关联的类型HostFormat
  • h ~ HostFormat b告诉我,h必须是给定HostFormat的{​​{1}}吗?
  • b这告诉我h和b必须是同一类型?

但是当我查看h ~ b的{​​{3}}时,我不认为会有这样的实例具有BufferFormat b等于它自己的b吗?我在哪里犯错了?

1 个答案:

答案 0 :(得分:4)

BufferColor (Color c (ColorElement c)) h必须等于b,而不是h

BufferColor是两个参数type family。类型族在类型级别上的行为有点像函数。您输入类型,然后返回另一种类型。

“类型家族应用程序”的优先级高于类型相等运算符~