Skip to content

UndecidableSuperClasses causes the compiler to spin with UndecidableInstances

Looks like I spoke too soon when I said all my examples worked in #10318 (closed) -- it doesn't seem to work when the superclass cycle gets sufficiently interesting, possibly caused by the use of PolyKinds in the style mentioned in #9201 (closed).

I took my hask code, and removed the shimming hacks above, and the following stripped down example sends the compiler into an infinite loop, which I believe should be able to work:

{-# language KindSignatures, PolyKinds, TypeFamilies, 
  NoImplicitPrelude, FlexibleContexts,
  MultiParamTypeClasses, GADTs, 
  ConstraintKinds, FlexibleInstances, 
  FunctionalDependencies, UndecidableSuperClasses #-}

import GHC.Types (Constraint)
import qualified Prelude

data Nat (c :: i -> i -> *) (d :: j -> j -> *) (f :: i -> j) (g :: i -> j)

class Functor p (Nat p (->)) p => Category (p :: i -> i -> *)
class (Category dom, Category cod) => Functor (dom :: i -> i -> *) (cod :: j -> j -> *) (f :: i -> j) | f -> dom cod

instance (Category c, Category d) => Category (Nat c d)
instance (Category c, Category d) => Functor (Nat c d) (Nat (Nat c d) (->)) (Nat c d)
instance (Category c, Category d) => Functor (Nat c d) (->) (Nat c d f)

instance Category (->)
instance Functor (->) (->) ((->) e)
instance Functor (->) (Nat (->) (->)) (->)

Sorry for the largish example, but I don't know how to strip it down smaller than the 6 instances that remain.

One potentially telling observation is that without the instances it compiles, and produces what I expect, so the UndecidableSuperClasses part seems to be letting the classes compile, but there seems to be a bad interaction with the way the instances work.

Also, in this stripped down form, I can remove the use of UndecidableInstances and that avoids the spinning problem, but once I flesh it out further I need UndecidableInstances in the "real" version of the problem.

Trac metadata
Trac field Value
Version 7.10.3
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Compiler (Type checker)
Test case
Differential revisions
BlockedBy
Related
Blocking
CC
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information