[GHC] #11511: Type family producing infinite type accepted as injective
GHC
ghc-devs at haskell.org
Fri Jan 29 15:32:21 UTC 2016
#11511: Type family producing infinite type accepted as injective
-------------------------------------+-------------------------------------
Reporter: jstolarek | Owner:
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 8.1
(Type checker) |
Keywords: TypeFamilies, | Operating System: Unknown/Multiple
Injective |
Architecture: | Type of failure: None/Unknown
Unknown/Multiple |
Test Case: | Blocked By:
Blocking: | Related Tickets:
Differential Rev(s): | Wiki Page:
-------------------------------------+-------------------------------------
A question came up during discussion at University of Wrocław:
{{{#!hs
type family F a = r | r -> a where
F a = [F a]
}}}
Should this pass the injectivity check? Currently it does but I don't
think this is correct. After all `F Bool` and `F Char` both reduce to the
same infinite type `[[[...]]]`, which by definition of injectivity gives
us `Char ~ Bool`. Is this dangerous in practice? It can cause reduction
stack overflow (or an infinite loop if you disable that check) but I don't
think this can be used to construct unsafe coerce. We'd have to unify two
infinite types, which does not seem possible.
This is not an implementation problem - this stays faithful to theory
developed in injective type families paper. If others agree that this is
indeed incorrect then I think the right solution here would be to drop
equation (7) from our algorithm in the paper. For generalized injectivity
we planned drop that equation anyway. Here's another reason for doing
this.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/11511>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list