这个背景意味着什么:( Monad m,(〜)*a())?

Dmi*_*tsa 5 haskell

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

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

Dan*_*ner 6

(~)是类型级相等(你可以把它写成=or的某个变体==,但是意见是这个符号已经有足够的不同含义引入另一个会令人困惑).*是那种类型.所以(~) *是断言两个(危旧房)类型相同.换句话说,实例也可以这样写:

instance Monad m => LaTeXC (LaTeXT m ())
Run Code Online (Sandbox Code Playgroud)

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

  • @Cirdec是的,很不幸,但GHC没有公开用于特定种类的`~`的用户级语法.但是,在它的内部语言中,`~`采用一种类型的参数(因此当使用时需要应用于某种类型).这些类型是通过类型推理插入的,类似于Haskell的隐式`forall被转换为类型多态,并通过类型推断隐式地类型应用.GHC对此有足够的了解,可以在打印过程中去除隐含的类型,但是haddock没有进行剥离. (5认同)
  • 我只看过这个书面中缀为`a~()`并想象前缀版本是`(〜)a()`.怎么样`*`进入它?[等式约束]的文档中没有提到它(https://downloads.haskell.org/~ghc/7.8.4/docs/html/users_guide/equality-constraints.html). (3认同)
  • 有趣.我在心理上将它解析为`Monad m,f(〜)(a())`除了`f`被命名为`*`并使用了中缀,并且想知道究竟是什么需要这样的上下文...: - ) (3认同)