我遇到了以下来自 GHC-8.2.2 的难以理解的行为
我有一些重叠的类型类实例。没有不连贯的类型类实例。大致有一个表单的特定类型类实例,
instance (C f h, C g h) => D1 (D2 f g) h
whereC
有重叠的实例。当我将我的项目加载到stack repl
中时,一切都很好。这个实例的上下文被解析为C
我正在寻找的实例。
如果我创建一个test.hs
导入属于上述实例的数据类型的文件,那么一切都不好。当我将它加载到stack repl
中并调用 的操作时D1
,很明显实例的上下文D1
被解析为 的“错误”实例C
。
特别奇怪的是,如果我将test.hs
其作为暴露模块添加到我的项目中,然后在没有其他更改的情况下将其重新加载到 repl 中,那么上面实例的上下文将解析为C
.
我看不到 GHC-7.10.3、8.0.1、8.0.2 或 8.4.3 的这种行为。也许这与这个错误有关?
但是我没有使用不连贯的实例,这就是那个错误似乎涉及的内容。我在发生上述实例的模块中使用了大量语言扩展:
{-#LANGUAGE TypeFamilies, UndecidableInstances, FlexibleInstances, MultiParamTypeClasses, FunctionalDependencies, GADTs, DataKinds, PolyKinds, TypeOperators, PatternSynonyms, RankNTypes, FlexibleContexts, ScopedTypeVariables, DefaultSignatures #-}
我还没有一个最小的例子。可以在GHC-Repro中找到该行为的最小示例。跑test.sh
看现象。我想知道的是:
- 这是否可能是 GHC 的预期行为,我只是做错了什么。
- 如果我做错了什么,在将项目中的内容导入其他项目时,我可能会做些什么来选择“正确”的实例。