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
被命名为*
,并使用了中缀,我想知道到底什么需要这样的上下文…:-)