a reliable way of dropping levity args?

Simon Peyton Jones simonpj at microsoft.com
Fri Jan 29 08:36:17 UTC 2016


Well, isLevityTy tests whether its argument is Levity
But you want to test if the argument is a data constructor (e.g. Lifted, Unlifted) whose type is Levity.

So you need something like

	isLevityCon :: Type -> Bool
	isLevityCon (TyConApp tc []) = isLevityTy (tyConKind tc)
	..

Please document both functions carefully

ALSO there is a bug in isLevityTy; it is missing a coreView test.  Would you like to fix this?



Simon
|  -----Original Message-----
|  From: ghc-devs [mailto:ghc-devs-bounces at haskell.org] On Behalf Of Ömer
|  Sinan Agacan
|  Sent: 28 January 2016 22:49
|  To: Richard Eisenberg <eir at cis.upenn.edu>
|  Cc: ghc-devs <ghc-devs at haskell.org>
|  Subject: Re: a reliable way of dropping levity args?
|  
|  I finally had some time to have another look. I have this line in my
|  compiler pass:
|  
|      | Just (tc, args) <- splitTyConApp_maybe ty
|      , isUnboxedTupleTyCon tc
|      = pprTrace "elimUbxSumRepTypes"
|          (text "orig args:" <+> ppr args $$
|           text "dropWhile isLevityTy args = " <+> ppr (dropWhile
|  isLevityTy args)) $
|        concatMap go (drop (length args `div` 2) args)
|  
|  This is one of the outputs:
|  
|      elimUbxSumRepTypes
|        orig args: ['Lifted, 'Lifted, 'Lifted, String, String, String]
|        dropWhile isLevityTy args =  ['Lifted, 'Lifted, 'Lifted, String,
|                                      String, String]
|  
|  Am I doing this wrong?
|  
|  2016-01-25 7:30 GMT-05:00 Richard Eisenberg <eir at cis.upenn.edu>:
|  > As discussed on IRC, your approach below looks right to me: dropWhile
|  (isLevityTy . idType) args. But you then said this wasn't working for
|  you. What does (map idType args) say?
|  >
|  > Richard
|  >
|  > On Jan 24, 2016, at 8:58 PM, Ömer Sinan Ağacan <omeragacan at gmail.com>
|  wrote:
|  >
|  >> Hi all,
|  >>
|  >> I'm looking for a reliable way of dropping levity args from TyCon
|  applications.
|  >> When I know that a particular TyCon gets some number of levity args,
|  >> I can just drop the args manually (for example, I can drop the first
|  >> half of arguments of a tuple TyCon application) but the code looks
|  >> fragile (what happens if I use a different TyCon in the future) and
|  >> confusing to the reader because it looks like this:
|  >>
|  >>    drop (length args `div` 2) args
|  >>
|  >> Ideally it'd look like this:
|  >>
|  >>    dropWhile isLevityArg args
|  >>
|  >> Now, there's a function called isLevityTy, but I don't understand
|  >> what it's supposed to do. This doesn't do anyting to 'Boxed and
|  'Unboxed arguments:
|  >>
|  >>    dropWhile (isLevityArg . idType) args
|  >>
|  >> Any ideas on this?
|  >>
|  >> Thanks..
|  >
|  _______________________________________________
|  ghc-devs mailing list
|  ghc-devs at haskell.org
|  https://na01.safelinks.protection.outlook.com/?url=http%3a%2f%2fmail.ha
|  skell.org%2fcgi-bin%2fmailman%2flistinfo%2fghc-
|  devs%0a&data=01%7c01%7csimonpj%40064d.mgd.microsoft.com%7c60501578c8024
|  97bb4a208d328354eff%7c72f988bf86f141af91ab2d7cd011db47%7c1&sdata=2%2fOf
|  nL4IPh41UZLx2XskQF%2fTf6kSA%2bP%2bXmn3r346kiI%3d


More information about the ghc-devs mailing list