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

Haskell 这个上下文是什么意思:(单子m,(~)*a())?,haskell,Haskell,我找到了以下类实例:(Monad m,(~)*a())=>LaTeXC(LaTeXT ma),但不能完全理解其上下文 (~)*a()是什么意思?我在哪里可以读到它?(~)是类型级别的相等(你可以把它写成=或=的一些变体,但意见是这个符号已经有了足够多的不同含义,引入另一个符号会让人困惑)*是类型的类型。因此,(~)*是两种(可居住)类型相等的断言。换句话说,实例也可以这样编写: instance Monad m => LaTeXC (LaTeXT m ()) 为什么不是呢?这是一个推理的

我找到了以下类实例:
(Monad m,(~)*a())=>LaTeXC(LaTeXT ma)
,但不能完全理解其上下文

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

(~)
是类型级别的相等(你可以把它写成
=
=
的一些变体,但意见是这个符号已经有了足够多的不同含义,引入另一个符号会让人困惑)<代码>*是类型的类型。因此,
(~)*
是两种(可居住)类型相等的断言。换句话说,实例也可以这样编写:

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

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

我只见过这个编写的中缀是
a~)
想象一下前缀版本是
(~)a()
。那种
*
是如何进入的?文档中没有提到它。@Cirdec是的,这很不幸,但GHC没有为特定种类的
~
公开用户级语法。但是,在其内部语言中,
~
接受一个种类参数(因此,在使用时需要应用于种类)。这些种类是通过种类推断插入的,类似于Haskell的隐式
forall
s是如何通过类型推断隐式转换为类型多态性和类型应用程序的。GHC对此非常了解,可以在打印过程中剥离隐式类型,但haddock不进行剥离。这完全回答了我的问题,谢谢!我也只把它看作是
a~()
,甚至无法想象
~
会有一个好的参数。很有趣。我在心里把它解析为
Monad m,f(~)(a()
,除了
f
被命名为
*
,并使用了中缀,我想知道到底什么需要这样的上下文…:-)