[GHC] #14542: Renamer / typechecker hang (UndecidableSuperClasses)

#14542: Renamer / typechecker hang (UndecidableSuperClasses) -------------------------------------+------------------------------------- Reporter: Iceland_jack | Owner: (none) Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 8.3 Keywords: | Operating System: Unknown/Multiple UndecidableSuperClasses | Architecture: | Type of failure: None/Unknown Unknown/Multiple | Test Case: | Blocked By: Blocking: | Related Tickets: Differential Rev(s): | Wiki Page: -------------------------------------+------------------------------------- Adapted from [https://gist.github.com/ekmett/b26363fc0f38777a637d hask], this does not look like a normal superclass loop. Loop is avoided by removing `instance (Category p, Category q) => Category (Nat p q)`. {{{#!hs {-# language KindSignatures #-} {-# language PolyKinds #-} {-# language DataKinds #-} {-# language TypeFamilies #-} {-# language RankNTypes #-} {-# language NoImplicitPrelude #-} {-# language FlexibleContexts #-} {-# language MultiParamTypeClasses #-} {-# language GADTs #-} {-# language ConstraintKinds #-} {-# language FlexibleInstances #-} {-# language TypeOperators #-} {-# language ScopedTypeVariables #-} {-# language DefaultSignatures #-} {-# language FunctionalDependencies #-} {-# language UndecidableSuperClasses #-} {-# language UndecidableInstances #-} {-# language TypeInType #-} import GHC.Types (Constraint, Type) type Cat i = i -> i -> Type newtype Y p a b = Y { getY :: p b a } class (Functor p, Dom p ~ Op p, Cod p ~ Nat p (->), Ob (Op p) ~ Ob p) => Category (p :: Cat i) where type Op p :: Cat i type Op p = Y p type Ob p :: i -> Constraint class (Category (Dom f), Category (Cod f)) => Functor (f :: i -> j) where type Dom f :: Cat i type Cod f :: Cat j data Nat :: Cat i -> Cat j -> Cat (i -> j) instance (Category p, Category q) => Category (Nat p q) }}} I get {{{ $ ghci2 -ignore-dot-ghci -v /tmp/Hangs.hs GHCi, version 8.3.20171122: http://www.haskell.org/ghc/ :? for help Glasgow Haskell Compiler, Version 8.3.20171122, stage 2 booted by GHC version 8.2.1 ... Loading package integer-gmp-1.0.1.0 ... linking ... done. Loading package base-4.11.0.0 ... linking ... done. *** Parser [source]: !!! Parser [source]: finished in 0.66 milliseconds, allocated 0.136 megabytes *** Desugar: *** Simplify [expr]: !!! Simplify [expr]: finished in 0.43 milliseconds, allocated 0.233 megabytes *** CorePrep [expr]: !!! CorePrep [expr]: finished in 0.23 milliseconds, allocated 0.167 megabytes *** ByteCodeGen [Ghci1]: !!! ByteCodeGen [Ghci1]: finished in 0.35 milliseconds, allocated 0.284 megabytes *** Parser [source]: !!! Parser [source]: finished in 0.21 milliseconds, allocated 0.197 megabytes *** Desugar: *** Simplify [expr]: !!! Simplify [expr]: finished in 0.52 milliseconds, allocated 0.268 megabytes *** CorePrep [expr]: !!! CorePrep [expr]: finished in 0.23 milliseconds, allocated 0.113 megabytes *** ByteCodeGen [Ghci1]: !!! ByteCodeGen [Ghci1]: finished in 0.46 milliseconds, allocated 0.334 megabytes *** Chasing dependencies: Chasing modules from: !!! Chasing dependencies: finished in 0.14 milliseconds, allocated 0.047 megabytes Stable obj: [] Stable BCO: [] unload: retaining objs [] unload: retaining bcos [] Ready for upsweep [] Upsweep completely successful. *** Deleting temp files: Deleting: *** Chasing dependencies: Chasing modules from: */tmp/Hangs.hs !!! Chasing dependencies: finished in 6.10 milliseconds, allocated 10.504 megabytes Stable obj: [] Stable BCO: [] unload: retaining objs [] unload: retaining bcos [] Ready for upsweep [NONREC ModSummary { ms_hs_date = 2017-11-28 22:14:57.810561584 UTC ms_mod = Main, ms_textual_imps = [(Nothing, GHC.Types)] ms_srcimps = [] }] *** Deleting temp files: Deleting: compile: input file /tmp/Hangs.hs *** Checking old interface for Main (use -ddump-hi-diffs for more details): [1 of 1] Compiling Main ( /tmp/Hangs.hs, interpreted ) *** Parser [Main]: !!! Parser [Main]: finished in 2.63 milliseconds, allocated 4.821 megabytes *** Renamer/typechecker [Main]: }}} -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/14542 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#14542: Renamer / typechecker hang (UndecidableSuperClasses) -------------------------------------+------------------------------------- Reporter: Iceland_jack | Owner: (none) Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 8.3 Resolution: | Keywords: | UndecidableSuperClasses Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by simonpj): Well, every given `(Category p)` constraint will give rise to four superclasses {{{ class (Functor p, Dom p ~ Op p, Cod p ~ Nat p (->), Ob (Op p) ~ Ob p) => Category (p :: Cat i) where }}} That `Functor p` constraint will give rise to two `(Category (Dom p), Category (Cod p))` constraints. {{{ class (Category (Dom f), Category (Cod f)) => Functor (f :: i -> j) where }}} And so on. So in each round of superclass expansion we get double the number of constraints. Result: exponential blowup. So I'd say this is expected bahaviour. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/14542#comment:1 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#14542: Renamer / typechecker hang (UndecidableSuperClasses) -------------------------------------+------------------------------------- Reporter: Iceland_jack | Owner: (none) Type: bug | Status: closed Priority: normal | Milestone: Component: Compiler | Version: 8.3 Resolution: invalid | Keywords: | UndecidableSuperClasses Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Changes (by RyanGlScott): * status: new => closed * resolution: => invalid Comment: Per comment:1, this doesn't seem to be a use case for `UndecidableSuperClasses` that should reasonably terminate. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/14542#comment:2 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler
participants (1)
-
GHC