Clarification of HsBang and isBanged
Simon Peyton Jones
simonpj at microsoft.com
Thu Jan 8 15:09:52 UTC 2015
I’m glad you are getting back to strictness.
Good questions.
I’ve pushed (or will as soon as I have validated) a patch that adds type synonyms, updates comments (some of which were indeed misleading), and changes a few names for clarity and consistency. I hope that answers all your questions.
Except these:
· Why is there a coercion in `HsUnpack` but not in `HsUserBang (Just True) True`? Because the former is implementation generated but the latter is source code specified.
· Why isn't this information split over two data types. Because there’s a bit of overlap. See comments with HsSrcBang
Simon
From: Johan Tibell [mailto:johan.tibell at gmail.com]
Sent: 08 January 2015 07:36
To: ghc-devs at haskell.org
Cc: Simon Peyton Jones
Subject: Clarification of HsBang and isBanged
HsBang is defined as:
-- HsBang describes what the *programmer* wrote
-- This info is retained in the DataCon.dcStrictMarks field
data HsBang
= HsUserBang -- The user's source-code request
(Maybe Bool) -- Just True {-# UNPACK #-}
-- Just False {-# NOUNPACK #-}
-- Nothing no pragma
Bool -- True <=> '!' specified
| HsNoBang -- Lazy field
-- HsUserBang Nothing False means the same as HsNoBang
| HsUnpack -- Definite commitment: this field is strict and unboxed
(Maybe Coercion) -- co :: arg-ty ~ product-ty
| HsStrict -- Definite commitment: this field is strict but not unboxed
This data type is a bit unclear to me:
* What are the reasons for the following constructor overlaps?
* `HsNoBang` and `HsUserBang Nothing False`
* `HsStrict` and `HsUserBang Nothing True`
* `HsUnpack mb_co` and `HsUserBang (Just True) True`
* Why is there a coercion in `HsUnpack` but not in `HsUserBang (Just True) True`?
* Is there a difference in what the user wrote in the case of HsUserBang and HsNoBang/HsUnpack/HsStrict e.g are the latter three generated by the compiler as opposed to being written by the user (the function documentation notwithstanding)?
A very related function is isBanged:
isBanged :: HsBang -> Bool
isBanged HsNoBang = False
isBanged (HsUserBang Nothing bang) = bang
isBanged _ = True
What's the meaning of this function? Is it intended to communicate what the user wrote or whether result of what the user wrote results in a strict function?
Context: I'm adding a new StrictData language pragma [1] that makes fields strict by default and a '~' annotation of fields to reverse the default behavior. My intention is to change HsBang like so:
- Bool -- True <=> '!' specified
+ (Maybe Bool) -- True <=> '!' specified, False <=> '~'
+ -- specified, Nothing <=> unspecified
1. https://ghc.haskell.org/trac/ghc/wiki/StrictPragma
-- Johan
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/ghc-devs/attachments/20150108/dd053bd4/attachment-0001.html>
More information about the ghc-devs
mailing list