假设我定义了一个类型
data A a = A a | B deriving Show
Run Code Online (Sandbox Code Playgroud)
我知道这(B :: A Int) == (B :: A Double)不是类型检查,因为A Int它A 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呢?
我有点困惑.这在任何地方描述?
行为的原因是ghc扩展名为ExtendedDefaultRules.
引用链接:
但是,用户必须指定类型是很烦人的,因此GHCi扩展了Haskell的类型默认规则(Haskell 2010报告的第4.3.4节),如下所示.标准规则为每个类型变量a采用每组约束(C1 a,C2 a,...,Cn a),并默认类型变量if
- 类型变量a不出现在其他约束中
- 所有Ci类都是标准的.
- 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错误.