在haskell中,没有参数的ADT构造函数的确切类型是什么?

Kir*_*ill 4 haskell

假设我定义了一个类型

data A a = A a | B deriving Show
Run Code Online (Sandbox Code Playgroud)

我知道这(B :: A Int) == (B :: A Double)不是类型检查,因为A IntA Double是不同的,不相等的类型,所以我不能申请(==) :: Eq a => a -> a -> Bool

但后来我可以问ghci是什么show B,而ghci说它是字符串"B".究竟是什么类型的B?是A Int吗?为什么?为什么ghci不抱怨这种类型B是模棱两可的,因为它可以A a绝对任意a.

我同样可以问ghci是什么show (B==B),它说"真",这两者的类型B是什么?

当我向ghci询问B的类型时:t B,会打印出来B :: A a,但除非我在上面的两个例子中感到困惑,否则它必须是一些没有任何类型参数的特定类型.那么如何找出Bin 的类型B==B呢?

我有点困惑.这在任何地方描述?

ben*_*ofs 9

行为的原因是ghc扩展名为ExtendedDefaultRules.

引用链接:

但是,用户必须指定类型是很烦人的,因此GHCi扩展了Haskell的类型默认规则(Haskell 2010报告的第4.3.4节),如下所示.标准规则为每个类型变量a采用每组约束(C1 a,C2 a,...,Cn a),并默认类型变量if

  1. 类型变量a不出现在其他约束中
  2. 所有Ci类都是标准的.
  3. Ci类中的至少一个是数字.

在GHCi提示符下,或者如果给出-XExtendedDefaultRules标志,则使用GHC,以下附加差异适用:

  • 因此放宽了上面的规则2:所有类Ci都是单参数类型类.
  • 上面的规则3放宽了:Ci中的至少一个类是数字,或者是Show,Eq或Ord.单元类型()被添加到标准类型列表的开头,这些类型在执行类型默认时尝试.

因此,根据这些规则,B == B或者show B,()被采摘a.

您还可以通过在GHCi提示符下执行以下操作来测试:

:set -XNoExtendedDefaultRules
data Foo a = A a | B deriving Eq
B == B
Run Code Online (Sandbox Code Playgroud)

这导致预期的ambiguous type variable a错误.