В GHC-8.2.2 может ли перекрывающееся разрешение экземпляра зависеть от того, включен ли файл в качестве открытого модуля?
Я сталкиваюсь со следующим трудно понять поведение из GHC-8.2.2
У меня есть несколько перекрывающихся экземпляров классов типов. Нет непоследовательных экземпляров классов типов. Есть определенный экземпляр класса типов, примерно,
instance (C f h, C g h) => D1 (D2 f g) h
где C
имеет перекрывающиеся экземпляры. Когда я загружаю свой проект в 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, и я просто делаю что-то не так.
- Если я делаю что-то не так, то я могу выбрать "правильный" экземпляр при импорте материала из моего проекта в другие проекты.
Эта проблема в настоящее время отслеживается по адресу: https://ghc.haskell.org/trac/ghc/ticket/15599