Когда экземпляры класса условного типа работают глубоко, может быть трудно понять, почему ghc жалуется на отсутствующий экземпляр класса типа.Например:
class MyClass1 c
class MyClass2 c
class MyClass3 c
data MyType1 a
data MyType2 a
instance MyClass1 a => MyClass2 (MyType1 a)
instance MyClass2 a => MyClass3 (MyType2 a)
foo :: (MyClass3 c) => c
foo = undefined
bar :: MyType2 (MyType1 Int)
bar = foo
GHC выдает следующую ошибку:
Example.hs:149:7-9: error:
• No instance for (MyClass1 Int) arising from a use of ‘foo’
• In the expression: foo
In an equation for ‘bar’: bar = foo
|
149 | bar = foo
| ^^^
Предположим, я написал только определения для foo
и bar
, а все остальное было импортировано кодом, который яне писал, я могу быть очень смущен тем, почему ghc пытается найти экземпляр MyClass1
для Int
.Это может быть даже первый раз, когда я слышал о классе MyClass1
, если до сих пор я полагался на импортированные экземпляры.Было бы неплохо, если бы ghc мог дать мне «трассировку стека» цепочки экземпляров классов типов, например,
Sought (MyClass2 (MyType1 Int)) to satisfy (MyClass3 (MyType2 (MyType1 Int))) from conditional type class instance OtherModule.hs:37:1-18
Sought (MyClass1 Int) to satisfy (MyClass2 (MyType1 Int)) from conditional type class instance OtherModule.hs:36:1-18
Есть ли у ghc опция командной строки для этого?Если нет, то как мне отладить это?
Имейте в виду, что моя настоящая проблема намного сложнее, чем этот простой пример.например,
Search.hs:110:31-36: error:
• Could not deduce (Ord
(Vars (DedupingMap (Rep (Index gc)) (IndexedProblem ac))))
arising from a use of ‘search’
from the context: (PP gc (IndexedProblem ac),
Show (Vars (DedupingMap (Rep (Index gc)) (IndexedProblem ac))),
Foldable f, MonadNotify m)
bound by the type signature for:
searchIndexedReplicaProblem :: forall gc ac (f :: * -> *) (m :: *
-> *).
(PP gc (IndexedProblem ac),
Show
(Vars
(DedupingMap
(Rep (Index gc)) (IndexedProblem ac))),
Foldable f, MonadNotify m) =>
f (Index
(Clzs
(PartitionedProblem
gc (IndexedProblem ac))))
-> m (Maybe
(Vars
(PartitionedProblem
gc (IndexedProblem ac))))
at Search.hs:(103,1)-(109,131)
• In the expression: search
In an equation for ‘searchIndexedReplicaProblem’:
searchIndexedReplicaProblem = search
|
110 | searchIndexedReplicaProblem = search
| ^^^^^^
Существует пять условий покрытия для PP, и я использую семейства типов и неразрешимые экземпляры, поэтому совершенно не очевидно, почему ghc выдает мне свою ошибку.Какие инструменты я могу использовать, чтобы отследить проблему?