在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
吗?我在哪里犯错了?
答案 0 :(得分:4)
BufferColor (Color c (ColorElement c)) h
必须等于b
,而不是h
。
BufferColor
是两个参数type family。类型族在类型级别上的行为有点像函数。您输入类型,然后返回另一种类型。
“类型家族应用程序”的优先级高于类型相等运算符~
。