[GHC] #14674: Deferring more levity polymorphism checks in indefinite backpack modules
GHC
ghc-devs at haskell.org
Thu Feb 1 15:28:01 UTC 2018
#14674: Deferring more levity polymorphism checks in indefinite backpack modules
-------------------------------------+-------------------------------------
Reporter: andrewthad | Owner: (none)
Type: feature request | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 8.4.1-alpha1
Resolution: | Keywords: backpack
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 andrewthad):
With this patch, I can get my example code to compile:
{{{
diff --git a/compiler/types/Type.hs b/compiler/types/Type.hs
index 3f893dbcb2..3a50fd2d3c 100644
--- a/compiler/types/Type.hs
+++ b/compiler/types/Type.hs
@@ -2348,7 +2348,7 @@ isTypeLevPoly = go
go ty@(TyVarTy {}) = check_kind ty
go ty@(AppTy {}) = check_kind ty
go ty@(TyConApp tc _) | not (isTcLevPoly tc) = False
- | otherwise = check_kind ty
+ | otherwise = False -- check_kind ty
go (ForAllTy _ ty) = go ty
go (FunTy {}) = False
go (LitTy {}) = False
}}}
Of course, this is not acceptable since it disables the levity binder
check for type families in both indefinite modules and in conventional
modules. Just for context, here is the full function definition (before
applying the above patch):
{{{
-- | Returns True if a type is levity polymorphic. Should be the same
-- as (isKindLevPoly . typeKind) but much faster.
-- Precondition: The type has kind (TYPE blah)
isTypeLevPoly :: Type -> Bool
isTypeLevPoly = go
where
go ty@(TyVarTy {}) = check_kind ty
go ty@(AppTy {}) = check_kind ty
go ty@(TyConApp tc _) | not (isTcLevPoly tc) = False
| otherwise = False -- check_kind ty
go (ForAllTy _ ty) = go ty
go (FunTy {}) = False
go (LitTy {}) = False
go ty@(CastTy {}) = check_kind ty
go ty@(CoercionTy {}) = pprPanic "isTypeLevPoly
co" (ppr ty)
check_kind = isKindLevPoly . typeKind
}}}
One way to solve this is to make `isTypeLevPoly` take an additional
argument that tells it what type of module we are in. But there might be
an easier solution. I don't what `TyCon` indefinite data types (is that
what they are called?) like `MyLiftedness` are represented in GHC. I'm
guessing that it's `AlgTyCon`. There may be something inside `AlgTyCon`
that can be used to figure out where of not it's an indefinite data type
(for example, if it has a kind other than `Type` and it isn't a builtin
type). If that's the case, then in the `TyConApp` check above, we could
check to see if we're looking at a type family. If so, if any on the
arguments are indefinite data types, then we could say that it's alright,
since this could only happen in an indefinite module. I need feedback on
this since though I'm not familiar with these things.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/14674#comment:2>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list