这个上下文是什么意思:(Monad m, (~) * a ())?

What does this context mean: (Monad m, (~) * a ())?

我找到了以下 class 个实例:(Monad m, (~) * a ()) => LaTeXC (LaTeXT m a),但不太理解它的上下文。

(~) * a ()是什么意思?我在哪里可以阅读它?

(~) 是类型级相等(你可以把它写成 === 的某种变体,但人们认为这个符号已经有足够多的不同含义,因此引入另一个会令人困惑)。 *就是那种类型。所以 (~) * 是两个(可居住的)类型相等的断言。也就是说,实例也可以这样写:

instance Monad m => LaTeXC (LaTeXT m ())

为什么不是呢?好吧,这是一个推理问题。它的编写方式让编译器选择这个实例,即使它(还)不知道 LaTeXT 的最终参数是 (),然后强制它,而提议的替代实例只会抱怨.