diff options
author | Krzysztof Gogolewski <krzysztof.gogolewski@tweag.io> | 2020-06-15 19:58:10 +0200 |
---|---|---|
committer | Ben Gamari <ben@smart-cactus.org> | 2020-06-17 16:21:58 -0400 |
commit | 40fa237e1daab7a76b9871bb6c50b953a1addf23 (patch) | |
tree | 79751e932434be440ba35b4d65c54f25a437e134 /testsuite/tests/callarity | |
parent | 20616959a7f4821034e14a64c3c9bf288c9bc956 (diff) | |
download | haskell-40fa237e1daab7a76b9871bb6c50b953a1addf23.tar.gz |
Linear types (#15981)
This is the first step towards implementation of the linear types proposal
(https://github.com/ghc-proposals/ghc-proposals/pull/111).
It features
* A language extension -XLinearTypes
* Syntax for linear functions in the surface language
* Linearity checking in Core Lint, enabled with -dlinear-core-lint
* Core-to-core passes are mostly compatible with linearity
* Fields in a data type can be linear or unrestricted; linear fields
have multiplicity-polymorphic constructors.
If -XLinearTypes is disabled, the GADT syntax defaults to linear fields
The following items are not yet supported:
* a # m -> b syntax (only prefix FUN is supported for now)
* Full multiplicity inference (multiplicities are really only checked)
* Decent linearity error messages
* Linear let, where, and case expressions in the surface language
(each of these currently introduce the unrestricted variant)
* Multiplicity-parametric fields
* Syntax for annotating lambda-bound or let-bound with a multiplicity
* Syntax for non-linear/multiple-field-multiplicity records
* Linear projections for records with a single linear field
* Linear pattern synonyms
* Multiplicity coercions (test LinearPolyType)
A high-level description can be found at
https://ghc.haskell.org/trac/ghc/wiki/LinearTypes/Implementation
Following the link above you will find a description of the changes made to Core.
This commit has been authored by
* Richard Eisenberg
* Krzysztof Gogolewski
* Matthew Pickering
* Arnaud Spiwack
With contributions from:
* Mark Barbone
* Alexander Vershilov
Updates haddock submodule.
Diffstat (limited to 'testsuite/tests/callarity')
-rw-r--r-- | testsuite/tests/callarity/unittest/CallArity1.hs | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/testsuite/tests/callarity/unittest/CallArity1.hs b/testsuite/tests/callarity/unittest/CallArity1.hs index 60cb97835f..55427ff4b7 100644 --- a/testsuite/tests/callarity/unittest/CallArity1.hs +++ b/testsuite/tests/callarity/unittest/CallArity1.hs @@ -1,8 +1,9 @@ -{-# LANGUAGE TupleSections #-} +{-# LANGUAGE TupleSections, PatternSynonyms #-} import GHC.Core import GHC.Core.Utils import GHC.Types.Id import GHC.Core.Type +import GHC.Core.Multiplicity ( pattern Many ) import GHC.Core.Make import GHC.Core.Opt.CallArity (callArityRHS) import GHC.Types.Id.Make @@ -27,16 +28,16 @@ import GHC.Data.FastString go, go2, x, d, n, y, z, scrutf, scruta :: Id [go, go2, x,d, n, y, z, scrutf, scruta, f] = mkTestIds (words "go go2 x d n y z scrutf scruta f") - [ mkVisFunTys [intTy, intTy] intTy - , mkVisFunTys [intTy, intTy] intTy + [ mkVisFunTysMany [intTy, intTy] intTy + , mkVisFunTysMany [intTy, intTy] intTy , intTy - , mkVisFunTys [intTy] intTy - , mkVisFunTys [intTy] intTy + , mkVisFunTysMany [intTy] intTy + , mkVisFunTysMany [intTy] intTy , intTy , intTy - , mkVisFunTys [boolTy] boolTy + , mkVisFunTysMany [boolTy] boolTy , boolTy - , mkVisFunTys [intTy, intTy] intTy -- protoypical external function + , mkVisFunTysMany [intTy, intTy] intTy -- protoypical external function ] exprs :: [(String, CoreExpr)] @@ -188,7 +189,7 @@ mkLApps v = mkApps (Var v) . map mkLit mkACase = mkIfThenElse (mkVarApps (Var scrutf) [scruta]) mkTestId :: Int -> String -> Type -> Id -mkTestId i s ty = mkSysLocal (mkFastString s) (mkBuiltinUnique i) ty +mkTestId i s ty = mkSysLocal (mkFastString s) (mkBuiltinUnique i) Many ty mkTestIds :: [String] -> [Type] -> [Id] mkTestIds ns tys = zipWith3 mkTestId [0..] ns tys |