singletons-base 3.1.1 → 3.2
raw patch · 302 files changed
+37240/−36471 lines, 302 filesdep ~basedep ~singletons-thdep ~template-haskellsetup-changed
Dependency ranges changed: base, singletons-th, template-haskell, th-desugar
Files
- CHANGES.md +191/−159
- LICENSE +27/−27
- README.md +31/−31
- Setup.hs +138/−138
- singletons-base.cabal +167/−165
- src/Control/Applicative/Singletons.hs +66/−66
- src/Control/Monad/Fail/Singletons.hs +59/−59
- src/Control/Monad/Singletons.hs +285/−286
- src/Control/Monad/Singletons/Internal.hs +480/−480
- src/Control/Monad/Zip/Singletons.hs +103/−103
- src/Data/Bool/Singletons.hs +114/−114
- src/Data/Either/Singletons.hs +105/−105
- src/Data/Eq/Singletons.hs +121/−121
- src/Data/Foldable/Singletons.hs +662/−669
- src/Data/Function/Singletons.hs +117/−117
- src/Data/Functor/Compose/Singletons.hs +92/−92
- src/Data/Functor/Const/Singletons.hs +146/−146
- src/Data/Functor/Identity/Singletons.hs +107/−108
- src/Data/Functor/Product/Singletons.hs +112/−112
- src/Data/Functor/Singletons.hs +194/−194
- src/Data/Functor/Sum/Singletons.hs +95/−95
- src/Data/List/NonEmpty/Singletons.hs +519/−519
- src/Data/List/Singletons.hs +281/−281
- src/Data/List/Singletons/Internal.hs +641/−640
- src/Data/List/Singletons/Internal/Disambiguation.hs +171/−171
- src/Data/Maybe/Singletons.hs +122/−122
- src/Data/Monoid/Singletons.hs +205/−204
- src/Data/Ord/Singletons.hs +102/−108
- src/Data/Ord/Singletons/Disambiguation.hs +33/−33
- src/Data/Proxy/Singletons.hs +159/−159
- src/Data/Semigroup/Singletons.hs +247/−247
- src/Data/Semigroup/Singletons/Internal.hs +0/−219
- src/Data/Semigroup/Singletons/Internal/Classes.hs +117/−0
- src/Data/Semigroup/Singletons/Internal/Disambiguation.hs +44/−44
- src/Data/Semigroup/Singletons/Internal/Wrappers.hs +108/−0
- src/Data/Singletons/Base/CustomStar.hs +32/−32
- src/Data/Singletons/Base/Enum.hs +152/−152
- src/Data/Singletons/Base/Instances.hs +40/−40
- src/Data/Singletons/Base/PolyError.hs +28/−0
- src/Data/Singletons/Base/SomeSing.hs +83/−83
- src/Data/Singletons/Base/TH.hs +144/−139
- src/Data/Singletons/Base/TypeError.hs +188/−188
- src/Data/Singletons/Base/TypeRepTYPE.hs +97/−97
- src/Data/Singletons/Base/Util.hs +67/−67
- src/Data/String/Singletons.hs +55/−55
- src/Data/Traversable/Singletons.hs +303/−303
- src/Data/Tuple/Singletons.hs +74/−74
- src/Data/Void/Singletons.hs +46/−46
- src/GHC/Base/Singletons.hs +111/−111
- src/GHC/Num/Singletons.hs +131/−141
- src/GHC/TypeLits/Singletons.hs +260/−269
- src/GHC/TypeLits/Singletons/Internal.hs +288/−310
- src/Prelude/Singletons.hs +421/−420
- src/Text/Show/Singletons.hs +273/−286
- tests/README.md +65/−65
- tests/SingletonsBaseTestSuite.hs +173/−169
- tests/SingletonsBaseTestSuiteUtils.hs +204/−204
- tests/compile-and-dump/GradingClient/Database.golden +3487/−3478
- tests/compile-and-dump/GradingClient/Database.hs +545/−545
- tests/compile-and-dump/GradingClient/Main.golden +169/−144
- tests/compile-and-dump/GradingClient/Main.hs +52/−52
- tests/compile-and-dump/InsertionSort/InsertionSortImp.golden +224/−219
- tests/compile-and-dump/InsertionSort/InsertionSortImp.hs +199/−199
- tests/compile-and-dump/Promote/Constructors.golden +73/−73
- tests/compile-and-dump/Promote/Constructors.hs +12/−12
- tests/compile-and-dump/Promote/GenDefunSymbols.golden +63/−63
- tests/compile-and-dump/Promote/GenDefunSymbols.hs +16/−16
- tests/compile-and-dump/Promote/Newtypes.golden +73/−73
- tests/compile-and-dump/Promote/Newtypes.hs +9/−9
- tests/compile-and-dump/Promote/Pragmas.golden +15/−15
- tests/compile-and-dump/Promote/Pragmas.hs +10/−10
- tests/compile-and-dump/Promote/Prelude.golden +21/−21
- tests/compile-and-dump/Promote/Prelude.hs +132/−132
- tests/compile-and-dump/Promote/T180.golden +59/−59
- tests/compile-and-dump/Promote/T180.hs +10/−10
- tests/compile-and-dump/Promote/T361.golden +27/−27
- tests/compile-and-dump/Promote/T361.hs +11/−11
- tests/compile-and-dump/Singletons/AsPattern.golden +405/−406
- tests/compile-and-dump/Singletons/AsPattern.hs +30/−30
- tests/compile-and-dump/Singletons/BadBoundedDeriving.golden +6/−6
- tests/compile-and-dump/Singletons/BadBoundedDeriving.hs +7/−7
- tests/compile-and-dump/Singletons/BadEnumDeriving.golden +6/−6
- tests/compile-and-dump/Singletons/BadEnumDeriving.hs +8/−8
- tests/compile-and-dump/Singletons/BoundedDeriving.golden +291/−291
- tests/compile-and-dump/Singletons/BoundedDeriving.hs +52/−52
- tests/compile-and-dump/Singletons/BoxUnBox.golden +56/−55
- tests/compile-and-dump/Singletons/BoxUnBox.hs +9/−9
- tests/compile-and-dump/Singletons/CaseExpressions.golden +325/−320
- tests/compile-and-dump/Singletons/CaseExpressions.hs +64/−64
- tests/compile-and-dump/Singletons/Classes.golden +616/−607
- tests/compile-and-dump/Singletons/Classes.hs +97/−97
- tests/compile-and-dump/Singletons/Classes2.golden +94/−96
- tests/compile-and-dump/Singletons/Classes2.hs +21/−21
- tests/compile-and-dump/Singletons/Contains.golden +53/−53
- tests/compile-and-dump/Singletons/Contains.hs +12/−12
- tests/compile-and-dump/Singletons/DataValues.golden +203/−190
- tests/compile-and-dump/Singletons/DataValues.hs +19/−19
- tests/compile-and-dump/Singletons/Empty.golden +10/−10
- tests/compile-and-dump/Singletons/Empty.hs +7/−7
- tests/compile-and-dump/Singletons/EmptyShowDeriving.golden +73/−73
- tests/compile-and-dump/Singletons/EmptyShowDeriving.hs +7/−7
- tests/compile-and-dump/Singletons/EnumDeriving.golden +223/−218
- tests/compile-and-dump/Singletons/EnumDeriving.hs +11/−11
- tests/compile-and-dump/Singletons/EqInstances.golden +88/−87
- tests/compile-and-dump/Singletons/EqInstances.hs +8/−8
- tests/compile-and-dump/Singletons/Error.golden +30/−30
- tests/compile-and-dump/Singletons/Error.hs +11/−11
- tests/compile-and-dump/Singletons/Fixity.golden +96/−93
- tests/compile-and-dump/Singletons/Fixity.hs +16/−16
- tests/compile-and-dump/Singletons/FunDeps.golden +106/−102
- tests/compile-and-dump/Singletons/FunDeps.hs +21/−21
- tests/compile-and-dump/Singletons/FunctorLikeDeriving.golden +1385/−1373
- tests/compile-and-dump/Singletons/FunctorLikeDeriving.hs +16/−16
- tests/compile-and-dump/Singletons/HigherOrder.golden +514/−505
- tests/compile-and-dump/Singletons/HigherOrder.hs +55/−55
- tests/compile-and-dump/Singletons/LambdaCase.golden +250/−247
- tests/compile-and-dump/Singletons/LambdaCase.hs +38/−38
- tests/compile-and-dump/Singletons/Lambdas.golden +787/−779
- tests/compile-and-dump/Singletons/Lambdas.hs +92/−92
- tests/compile-and-dump/Singletons/LambdasComprehensive.golden +84/−76
- tests/compile-and-dump/Singletons/LambdasComprehensive.hs +27/−27
- tests/compile-and-dump/Singletons/LetStatements.golden +1003/−981
- tests/compile-and-dump/Singletons/LetStatements.hs +192/−192
- tests/compile-and-dump/Singletons/Maybe.golden +186/−183
- tests/compile-and-dump/Singletons/Maybe.hs +7/−7
- tests/compile-and-dump/Singletons/Nat.golden +321/−317
- tests/compile-and-dump/Singletons/Nat.hs +18/−18
- tests/compile-and-dump/Singletons/NatSymbolReflexive.hs +11/−11
- tests/compile-and-dump/Singletons/Natural.golden +80/−78
- tests/compile-and-dump/Singletons/Natural.hs +13/−13
- tests/compile-and-dump/Singletons/NegativeLiterals.golden +21/−21
- tests/compile-and-dump/Singletons/NegativeLiterals.hs +11/−11
- tests/compile-and-dump/Singletons/Operators.golden +139/−138
- tests/compile-and-dump/Singletons/Operators.hs +19/−19
- tests/compile-and-dump/Singletons/OrdDeriving.golden +1498/−1506
- tests/compile-and-dump/Singletons/OrdDeriving.hs +57/−57
- tests/compile-and-dump/Singletons/OverloadedStrings.golden +41/−40
- tests/compile-and-dump/Singletons/OverloadedStrings.hs +14/−14
- tests/compile-and-dump/Singletons/PatternMatching.golden +600/−577
- tests/compile-and-dump/Singletons/PatternMatching.hs +51/−51
- tests/compile-and-dump/Singletons/PolyKinds.golden +27/−27
- tests/compile-and-dump/Singletons/PolyKinds.hs +8/−8
- tests/compile-and-dump/Singletons/PolyKindsApp.golden +15/−16
- tests/compile-and-dump/Singletons/PolyKindsApp.hs +12/−12
- tests/compile-and-dump/Singletons/Records.golden +89/−91
- tests/compile-and-dump/Singletons/Records.hs +28/−28
- tests/compile-and-dump/Singletons/ReturnFunc.golden +109/−105
- tests/compile-and-dump/Singletons/ReturnFunc.hs +22/−22
- tests/compile-and-dump/Singletons/Sections.golden +148/−134
- tests/compile-and-dump/Singletons/Sections.hs +39/−39
- tests/compile-and-dump/Singletons/ShowDeriving.golden +649/−614
- tests/compile-and-dump/Singletons/ShowDeriving.hs +41/−41
- tests/compile-and-dump/Singletons/StandaloneDeriving.golden +553/−548
- tests/compile-and-dump/Singletons/StandaloneDeriving.hs +30/−30
- tests/compile-and-dump/Singletons/Star.golden +507/−504
- tests/compile-and-dump/Singletons/Star.hs +13/−13
- tests/compile-and-dump/Singletons/T124.golden +37/−35
- tests/compile-and-dump/Singletons/T124.hs +13/−13
- tests/compile-and-dump/Singletons/T136.golden +186/−180
- tests/compile-and-dump/Singletons/T136.hs +27/−27
- tests/compile-and-dump/Singletons/T136b.golden +55/−54
- tests/compile-and-dump/Singletons/T136b.hs +14/−14
- tests/compile-and-dump/Singletons/T145.golden +42/−41
- tests/compile-and-dump/Singletons/T145.hs +9/−9
- tests/compile-and-dump/Singletons/T150.golden +417/−417
- tests/compile-and-dump/Singletons/T150.hs +53/−53
- tests/compile-and-dump/Singletons/T153.hs +10/−10
- tests/compile-and-dump/Singletons/T157.hs +6/−6
- tests/compile-and-dump/Singletons/T159.golden +267/−267
- tests/compile-and-dump/Singletons/T159.hs +27/−27
- tests/compile-and-dump/Singletons/T160.golden +70/−69
- tests/compile-and-dump/Singletons/T160.hs +13/−13
- tests/compile-and-dump/Singletons/T163.golden +51/−51
- tests/compile-and-dump/Singletons/T163.hs +5/−5
- tests/compile-and-dump/Singletons/T166.golden +154/−149
- tests/compile-and-dump/Singletons/T166.hs +12/−12
- tests/compile-and-dump/Singletons/T167.golden +199/−195
- tests/compile-and-dump/Singletons/T167.hs +16/−16
- tests/compile-and-dump/Singletons/T172.golden +46/−46
- tests/compile-and-dump/Singletons/T172.hs +10/−10
- tests/compile-and-dump/Singletons/T175.golden +55/−55
- tests/compile-and-dump/Singletons/T175.hs +18/−18
- tests/compile-and-dump/Singletons/T176.golden +175/−173
- tests/compile-and-dump/Singletons/T176.hs +21/−21
- tests/compile-and-dump/Singletons/T178.golden +259/−262
- tests/compile-and-dump/Singletons/T178.hs +15/−15
- tests/compile-and-dump/Singletons/T183.golden +532/−523
- tests/compile-and-dump/Singletons/T183.hs +65/−65
- tests/compile-and-dump/Singletons/T184.golden +476/−455
- tests/compile-and-dump/Singletons/T184.hs +27/−27
- tests/compile-and-dump/Singletons/T187.golden +93/−93
- tests/compile-and-dump/Singletons/T187.hs +8/−8
- tests/compile-and-dump/Singletons/T190.golden +233/−233
- tests/compile-and-dump/Singletons/T190.hs +5/−5
- tests/compile-and-dump/Singletons/T197.golden +49/−48
- tests/compile-and-dump/Singletons/T197.hs +10/−10
- tests/compile-and-dump/Singletons/T197b.golden +105/−105
- tests/compile-and-dump/Singletons/T197b.hs +10/−10
- tests/compile-and-dump/Singletons/T200.golden +220/−216
- tests/compile-and-dump/Singletons/T200.hs +15/−15
- tests/compile-and-dump/Singletons/T204.golden +106/−106
- tests/compile-and-dump/Singletons/T204.hs +17/−17
- tests/compile-and-dump/Singletons/T206.hs +5/−5
- tests/compile-and-dump/Singletons/T209.golden +90/−90
- tests/compile-and-dump/Singletons/T209.hs +17/−17
- tests/compile-and-dump/Singletons/T216.golden +42/−42
- tests/compile-and-dump/Singletons/T216.hs +12/−12
- tests/compile-and-dump/Singletons/T226.golden +6/−6
- tests/compile-and-dump/Singletons/T226.hs +5/−5
- tests/compile-and-dump/Singletons/T229.golden +27/−26
- tests/compile-and-dump/Singletons/T229.hs +6/−6
- tests/compile-and-dump/Singletons/T249.golden +90/−90
- tests/compile-and-dump/Singletons/T249.hs +12/−12
- tests/compile-and-dump/Singletons/T271.golden +287/−289
- tests/compile-and-dump/Singletons/T271.hs +13/−13
- tests/compile-and-dump/Singletons/T287.golden +118/−115
- tests/compile-and-dump/Singletons/T287.hs +11/−11
- tests/compile-and-dump/Singletons/T29.golden +121/−123
- tests/compile-and-dump/Singletons/T29.hs +44/−44
- tests/compile-and-dump/Singletons/T296.golden +74/−74
- tests/compile-and-dump/Singletons/T296.hs +14/−14
- tests/compile-and-dump/Singletons/T297.golden +67/−67
- tests/compile-and-dump/Singletons/T297.hs +13/−13
- tests/compile-and-dump/Singletons/T312.golden +199/−199
- tests/compile-and-dump/Singletons/T312.hs +14/−14
- tests/compile-and-dump/Singletons/T313.golden +126/−126
- tests/compile-and-dump/Singletons/T313.hs +38/−38
- tests/compile-and-dump/Singletons/T316.golden +42/−42
- tests/compile-and-dump/Singletons/T316.hs +10/−10
- tests/compile-and-dump/Singletons/T322.golden +54/−53
- tests/compile-and-dump/Singletons/T322.hs +13/−13
- tests/compile-and-dump/Singletons/T323.hs +7/−7
- tests/compile-and-dump/Singletons/T326.golden +73/−72
- tests/compile-and-dump/Singletons/T326.hs +23/−23
- tests/compile-and-dump/Singletons/T33.golden +40/−39
- tests/compile-and-dump/Singletons/T33.hs +9/−9
- tests/compile-and-dump/Singletons/T332.golden +67/−66
- tests/compile-and-dump/Singletons/T332.hs +17/−17
- tests/compile-and-dump/Singletons/T342.golden +18/−18
- tests/compile-and-dump/Singletons/T342.hs +13/−13
- tests/compile-and-dump/Singletons/T353.golden +99/−99
- tests/compile-and-dump/Singletons/T353.hs +17/−17
- tests/compile-and-dump/Singletons/T358.golden +119/−119
- tests/compile-and-dump/Singletons/T358.hs +24/−24
- tests/compile-and-dump/Singletons/T367.golden +41/−40
- tests/compile-and-dump/Singletons/T367.hs +12/−12
- tests/compile-and-dump/Singletons/T371.golden +247/−241
- tests/compile-and-dump/Singletons/T371.hs +16/−16
- tests/compile-and-dump/Singletons/T376.golden +44/−44
- tests/compile-and-dump/Singletons/T376.hs +8/−8
- tests/compile-and-dump/Singletons/T378a.golden +90/−90
- tests/compile-and-dump/Singletons/T378a.hs +64/−64
- tests/compile-and-dump/Singletons/T378b.golden +127/−129
- tests/compile-and-dump/Singletons/T378b.hs +40/−40
- tests/compile-and-dump/Singletons/T401.golden +13/−13
- tests/compile-and-dump/Singletons/T401.hs +8/−8
- tests/compile-and-dump/Singletons/T401b.golden +13/−13
- tests/compile-and-dump/Singletons/T401b.hs +8/−8
- tests/compile-and-dump/Singletons/T402.golden +13/−13
- tests/compile-and-dump/Singletons/T402.hs +7/−7
- tests/compile-and-dump/Singletons/T410.golden +61/−61
- tests/compile-and-dump/Singletons/T410.hs +12/−12
- tests/compile-and-dump/Singletons/T412.golden +399/−399
- tests/compile-and-dump/Singletons/T412.hs +33/−33
- tests/compile-and-dump/Singletons/T414.golden +77/−77
- tests/compile-and-dump/Singletons/T414.hs +16/−16
- tests/compile-and-dump/Singletons/T443.golden +127/−127
- tests/compile-and-dump/Singletons/T443.hs +14/−14
- tests/compile-and-dump/Singletons/T445.golden +74/−74
- tests/compile-and-dump/Singletons/T445.hs +26/−26
- tests/compile-and-dump/Singletons/T450.golden +212/−209
- tests/compile-and-dump/Singletons/T450.hs +53/−53
- tests/compile-and-dump/Singletons/T453.golden +19/−19
- tests/compile-and-dump/Singletons/T453.hs +15/−15
- tests/compile-and-dump/Singletons/T470.golden +96/−96
- tests/compile-and-dump/Singletons/T470.hs +24/−24
- tests/compile-and-dump/Singletons/T480.golden +14/−14
- tests/compile-and-dump/Singletons/T480.hs +8/−8
- tests/compile-and-dump/Singletons/T487.golden +74/−73
- tests/compile-and-dump/Singletons/T487.hs +40/−40
- tests/compile-and-dump/Singletons/T489.golden +61/−60
- tests/compile-and-dump/Singletons/T489.hs +14/−14
- tests/compile-and-dump/Singletons/T492.hs +25/−25
- tests/compile-and-dump/Singletons/T511.golden +13/−13
- tests/compile-and-dump/Singletons/T511.hs +9/−9
- tests/compile-and-dump/Singletons/T536.golden +97/−0
- tests/compile-and-dump/Singletons/T536.hs +41/−0
- tests/compile-and-dump/Singletons/T54.golden +57/−57
- tests/compile-and-dump/Singletons/T54.hs +12/−12
- tests/compile-and-dump/Singletons/T555.golden +203/−0
- tests/compile-and-dump/Singletons/T555.hs +15/−0
- tests/compile-and-dump/Singletons/T559.golden +11/−0
- tests/compile-and-dump/Singletons/T559.hs +6/−0
- tests/compile-and-dump/Singletons/T78.golden +35/−34
- tests/compile-and-dump/Singletons/T78.hs +13/−13
- tests/compile-and-dump/Singletons/T89.golden +79/−0
- tests/compile-and-dump/Singletons/T89.hs +6/−0
- tests/compile-and-dump/Singletons/TopLevelPatterns.golden +402/−396
- tests/compile-and-dump/Singletons/TopLevelPatterns.hs +37/−37
- tests/compile-and-dump/Singletons/TypeRepTYPE.hs +41/−41
- tests/compile-and-dump/Singletons/Undef.golden +53/−51
- tests/compile-and-dump/Singletons/Undef.hs +12/−12
CHANGES.md view
@@ -1,159 +1,191 @@-Changelog for the `singletons-base` project-===========================================--3.1.1 [2022.08.23]--------------------* Require building with GHC 9.4.--3.1 [2021.10.30]------------------* Require building with GHC 9.2.-* `singletons-base` now supports type-level `Char`s, a feature added in- GHC 9.2. In particular:-- * Promoting and singling character literal expressions (e.g., `f = 'a'`) is- now supported. Promoting (but not singling) character patterns- (e.g., `g 'a' = ()`) is also supported.- * `GHC.TypeLits.Singletons` now offers singled versions of the `ConsSymbol`,- `UnconsSymbol`, `CharToNat`, and `NatToChar` type families that were- introduced to `GHC.TypeLits` in GHC 9.2.- * `Text.Show.Singletons` now makes use of type-level `Char`s, a feature added- in GHC 9.2. As a result, there is no longer any need for the `SChar` type- synonym, so it has been removed.- * The `PShow` and `SShow` instances for `Symbol` now display escape characters- properly rather than returning the input `Symbol` unchanged.--* In GHC 9.2, `Nat` is now a synonym for `Natural`. As a result, the bogus- `Num`, `Eq`, `Ord`, `Enum`, and `Show` instances for `Nat` in- `GHC.TypeLits.Singletons` have been removed, as they have replaced by the- corresponding instances for `Natural`.-* Add `Data.Functor.{Compose,Product,Sum}.Singletons`.-* The types of various entities in `Data.Functor.Const.Singletons` and- `Data.Proxy.Singletons` have been tweaked slightly such that their- specificities match their term-level counterparts:-- ```diff- -SConst :: forall {k} {a} {b :: k} (x :: a). Sing x -> Sing ('Const @a @b x)- +SConst :: forall {k} a (b :: k) (x :: a). Sing x -> Sing ('Const @a @b x)-- -type ConstSym0 :: forall k a (b :: k). a ~> Const a b- +type ConstSym0 :: forall {k} a (b :: k). a ~> Const a b-- -type ConstSym1 :: forall k a (b :: k). a -> Const a b- +type ConstSym1 :: forall {k} a (b :: k). a -> Const a b-- -type ProxySym0 :: forall k (t :: k). Proxy t- +type ProxySym0 :: forall {k} (t :: k). Proxy t- ```-* Define instances of `SingI1` and `SingI2` when possible.--3.0 [2021.03.12]------------------* The `singletons` library has been split into three libraries:-- * The new `singletons` library is now a minimal library that only provides- `Data.Singletons`, `Data.Singletons.Decide`, `Data.Singletons.Sigma`, and- `Data.Singletons.ShowSing` (if compiled with GHC 8.6 or later).- `singletons` now supports building GHCs back to GHC 8.0, as well as GHCJS.- * The `singletons-th` library defines Template Haskell functionality for- promoting and singling term-level definitions, but but nothing else. This- library continues to require the latest stable release of GHC.- * The `singletons-base` library defines promoted and singled versions of- definitions from the `base` library, including the `Prelude`. This library- continues to require the latest stable release of GHC.-- Consult the changelogs for `singletons` and `singletons-th` for changes- specific to those libraries. For more information on this split, see the- [relevant GitHub discussion](https://github.com/goldfirere/singletons/issues/420).-* Require building with GHC 9.0.-* The modules in `singletons-base` have been renamed to better reflect the- modules from `base` from which they take inspiration. In particular, the- following module renamings have been applied:-- * `Data.Singletons.CustomStar` -> `Data.Singletons.Base.CustomStar`- * `Data.Singletons.Prelude` -> `Prelude.Singletons`- * `Data.Singletons.Prelude.Applicative` -> `Control.Applicative.Singletons`- * `Data.Singletons.Prelude.Bool` -> `Data.Bool.Singletons`- * `Data.Singletons.Prelude.Const` -> `Data.Functor.Const.Singletons`- * `Data.Singletons.Prelude.Either` -> `Data.Either.Singletons`- * `Data.Singletons.Prelude.Enum` -> `Data.Singletons.Base.Enum`- * `Data.Singletons.Prelude.Eq` -> `Data.Eq.Singletons`- * `Data.Singletons.Prelude.Foldable` -> `Data.Foldable.Singletons`- * `Data.Singletons.Prelude.Function` -> `Data.Function.Singletons`- * `Data.Singletons.Prelude.Functor` -> `Data.Functor.Const.Singletons`- * `Data.Singletons.Prelude.Identity` -> `Data.Functor.Identity.Singletons`- * `Data.Singletons.Prelude.IsString` -> `Data.String.Singletons`- * `Data.Singletons.Prelude.Ord` -> `Data.Ord.Singletons`- * `Data.Singletons.Prelude.List` -> `Data.List.Singletons`- * `Data.Singletons.Prelude.List.NonEmpty` -> `Data.List.NonEmpty.Singletons`- * `Data.Singletons.Prelude.Maybe` -> `Data.Maybe.Singletons`- * `Data.Singletons.Prelude.Monad` -> `Control.Monad.Singletons`- * `Data.Singletons.Prelude.Monad.Fail` -> `Control.Monad.Fail.Singletons`- * `Data.Singletons.Prelude.Monad.Zip` -> `Control.Monad.Zip.Singletons`- * `Data.Singletons.Prelude.Monoid` -> `Data.Monoid.Singletons`- * `Data.Singletons.Prelude.Proxy` -> `Data.Proxy.Singletons`- * `Data.Singletons.Prelude.Semigroup` -> `Data.Semigroup.Singletons`- * `Data.Singletons.Prelude.Show` -> `Data.Show.Singletons`- * `Data.Singletons.Prelude.Traversable` -> `Data.Traversable.Singletons`- * `Data.Singletons.Prelude.Tuple` -> `Data.Tuple.Singletons`- * `Data.Singletons.Prelude.Void` -> `Data.Void.Singletons`- * `Data.Singletons.TH` -> `Data.Singletons.Base.TH`- * `Data.Singletons.TypeError` -> `Data.Singletons.Base.TypeError`- * `Data.Singletons.TypeLits` -> `GHC.TypeLits.Singletons`- * `Data.Singletons.TypeRepTYPE` -> `Data.Singletons.Base.TypeRepTYPE`-- Note that modules that do not correspond to any particular module in `base`- now have the prefix `Data.Singletons.Base.*`. This includes- `Data.Singletons.Base.Enum`, a special module that exists to provide a- home for the `Succ` and `Pred` promoted type families that is separate from- `Prelude.Singletons` (which exports everything from `PEnum` _except_ `Succ`- and `Pred`). This is done in an effort to make importing `Prelude.Singletons`- less likely to induce name clashes with code that works over unary natural- numbers, which often use the names "`Succ`" and "`Pred`".-* An effort has been made to make the API of `Prelude.Singletons` more closely- mirror that of the `Prelude` in `base`. As a result, `Prelude.Singletons` now- exports some different functions than it used to. In particular, it now- exports the following:-- * `Until`/`sUntil`/`UntilSym{N}`- * `type (++@#@$$$)`- * `type (.@#@$$$$)`- * `FlipSym3`- * `type (!!)`/`(%!!)`/`type (!!@#@{$})`- * `Length`/`sLength`/`LengthSym{N}`- * `DropWhile`/`sDropWhile`- * `LookupSym{N}`- * `Unzip3Sym{N}`-- `Prelude.Singletons` also used to export some things that were _not_ exported- by the `Prelude`. Accordingly, these exports have been removed from- `Prelude.Singletons`. They are:-- * `(^)`/`(%^)`/`type (^@#@{$})`. Although the `Prelude` does define a- function named `(^)`, it is more general than the one defined in- `singletons-base`, which only works on `Nat`s. Import- `GHC.TypeLits.Singletons` if you wish to use the `Nat`-specific versions.- * `DefaultEq`, which has no counterpart in the `Prelude`.- Import `Data.Eq.Singletons` if you wish to use this.- * `bool_`, which has no counterpart in the `Prelude`.- Import `Data.Bool.Singletons` if you wish to use this.-* Two previously public-facing modules—`Data.Singletons.Prelude.Base` and- `Data.Singletons.Prelude.Num`—have been turned into internal modules. The- contents of these modules are re-exported from `Prelude.Singletons`, so that- can be used instead.-* Due to the `singletons` package split, the `Eq`, `Ord`, etc. instances for- `SomeSing` are no longer provided in the `Data.Singletons` module in the- `singletons` library. Instead, they are now provided in a new- `Data.Singletons.Base.SomeSing` module, which defines `Eq`, `Ord`, etc.- instances for `SomeSing` as orphans.-* The `PEq` class no longer uses `DefaultEq` as its default implementation for- `(==)`. `DefaultEq`, despite its name, is actually not a suitable- implementation for `(==)` for a good majority of singleton types- (see the discussion in- [this GitHub issue](https://github.com/goldfirere/singletons/issues/457)- for more information). `(==)`'s default is now defined in terms of `(/=)`,- just like its term-level counterpart in the `Eq` class.-* Since `base-4.15.0.0` now deprecates `Data.Singletons.Option` (in- anticipation of its removal in a future version of `base`), this library no- longer offers a singleton type for `Option`. Accordingly, the `option_`- function has also been removed.+Changelog for the `singletons-base` project +=========================================== + +3.2 [2023.03.12] +---------------- +* Require building with GHC 9.6. +* The kinds of the promoted `Error` and `ErrorWithoutStackTrace` functions have + been monomorphized to `Symbol`. A previous release generalized the kinds of + these arguments to allow passing arguments besides `Symbol`s, but this change + introduces ambiguity in derived code when `OverloadedString`s is enabled. + See [#89](https://github.com/goldfirere/singletons/issues/89) for the full + story. + + If you were relying on the previous, kind-polymorphic behavior of `Error`, you + can instead use the new `Data.Singletons.Base.PolyError` module that provides + `PolyError`, a version of `Error` with a kind-polymorphic argument. +* `Data.Ord.Singletons` and `Data.Singletons.Base.TH` no longer define a + `thenCmp :: Ordering -> Ordering -> Ordering` function, as this is not + something that has ever existed in `base`. The existence of a `thenCmp` + function was solely motivated by the code generated by derived `Ord` + instances, but `singletons-base` now uses `(<>) @Ordering` instead. +* `GHC.TypeLits.Singletons` now re-exports the `SChar`, `SNat`, and `SSymbol` + singleton types offered by `GHC.TypeLits` in `base-4.18.0.0` rather than + defining its own versions. The versions of `SChar`, `SNat`, and `SSymbol` + offered by `GHC.TypeLits` are nearly identical, minus some minor cosmetic + changes (e.g., `GHC.TypeLits` defines pattern synonyms for `SNat` _et a._ + instead of data constructors). +* `GHC.TypeLits.Singletons` now re-exports the `SSymbol` pattern synonym + from `GHC.TypeLits`. `GHC.TypeLits.Singletons` also continues to export `SSym` + for backwards compatibility. +* `Prelude.Singletons` now re-exports `LiftA2` and `sLiftA2`, mirroring the + fact that `Prelude` now re-exports `liftA2` in `base-4.18.0.0`. +* Provide `TestEquality` and `TestCoercion` instances for `SNat, `SSymbol`, and + `SChar`. + +3.1.1 [2022.08.23] +------------------ +* Require building with GHC 9.4. + +3.1 [2021.10.30] +---------------- +* Require building with GHC 9.2. +* `singletons-base` now supports type-level `Char`s, a feature added in + GHC 9.2. In particular: + + * Promoting and singling character literal expressions (e.g., `f = 'a'`) is + now supported. Promoting (but not singling) character patterns + (e.g., `g 'a' = ()`) is also supported. + * `GHC.TypeLits.Singletons` now offers singled versions of the `ConsSymbol`, + `UnconsSymbol`, `CharToNat`, and `NatToChar` type families that were + introduced to `GHC.TypeLits` in GHC 9.2. + * `Text.Show.Singletons` now makes use of type-level `Char`s, a feature added + in GHC 9.2. As a result, there is no longer any need for the `SChar` type + synonym, so it has been removed. + * The `PShow` and `SShow` instances for `Symbol` now display escape characters + properly rather than returning the input `Symbol` unchanged. + +* In GHC 9.2, `Nat` is now a synonym for `Natural`. As a result, the bogus + `Num`, `Eq`, `Ord`, `Enum`, and `Show` instances for `Nat` in + `GHC.TypeLits.Singletons` have been removed, as they have replaced by the + corresponding instances for `Natural`. +* Add `Data.Functor.{Compose,Product,Sum}.Singletons`. +* The types of various entities in `Data.Functor.Const.Singletons` and + `Data.Proxy.Singletons` have been tweaked slightly such that their + specificities match their term-level counterparts: + + ```diff + -SConst :: forall {k} {a} {b :: k} (x :: a). Sing x -> Sing ('Const @a @b x) + +SConst :: forall {k} a (b :: k) (x :: a). Sing x -> Sing ('Const @a @b x) + + -type ConstSym0 :: forall k a (b :: k). a ~> Const a b + +type ConstSym0 :: forall {k} a (b :: k). a ~> Const a b + + -type ConstSym1 :: forall k a (b :: k). a -> Const a b + +type ConstSym1 :: forall {k} a (b :: k). a -> Const a b + + -type ProxySym0 :: forall k (t :: k). Proxy t + +type ProxySym0 :: forall {k} (t :: k). Proxy t + ``` +* Define instances of `SingI1` and `SingI2` when possible. + +3.0 [2021.03.12] +---------------- +* The `singletons` library has been split into three libraries: + + * The new `singletons` library is now a minimal library that only provides + `Data.Singletons`, `Data.Singletons.Decide`, `Data.Singletons.Sigma`, and + `Data.Singletons.ShowSing` (if compiled with GHC 8.6 or later). + `singletons` now supports building GHCs back to GHC 8.0, as well as GHCJS. + * The `singletons-th` library defines Template Haskell functionality for + promoting and singling term-level definitions, but but nothing else. This + library continues to require the latest stable release of GHC. + * The `singletons-base` library defines promoted and singled versions of + definitions from the `base` library, including the `Prelude`. This library + continues to require the latest stable release of GHC. + + Consult the changelogs for `singletons` and `singletons-th` for changes + specific to those libraries. For more information on this split, see the + [relevant GitHub discussion](https://github.com/goldfirere/singletons/issues/420). +* Require building with GHC 9.0. +* The modules in `singletons-base` have been renamed to better reflect the + modules from `base` from which they take inspiration. In particular, the + following module renamings have been applied: + + * `Data.Singletons.CustomStar` -> `Data.Singletons.Base.CustomStar` + * `Data.Singletons.Prelude` -> `Prelude.Singletons` + * `Data.Singletons.Prelude.Applicative` -> `Control.Applicative.Singletons` + * `Data.Singletons.Prelude.Bool` -> `Data.Bool.Singletons` + * `Data.Singletons.Prelude.Const` -> `Data.Functor.Const.Singletons` + * `Data.Singletons.Prelude.Either` -> `Data.Either.Singletons` + * `Data.Singletons.Prelude.Enum` -> `Data.Singletons.Base.Enum` + * `Data.Singletons.Prelude.Eq` -> `Data.Eq.Singletons` + * `Data.Singletons.Prelude.Foldable` -> `Data.Foldable.Singletons` + * `Data.Singletons.Prelude.Function` -> `Data.Function.Singletons` + * `Data.Singletons.Prelude.Functor` -> `Data.Functor.Const.Singletons` + * `Data.Singletons.Prelude.Identity` -> `Data.Functor.Identity.Singletons` + * `Data.Singletons.Prelude.IsString` -> `Data.String.Singletons` + * `Data.Singletons.Prelude.Ord` -> `Data.Ord.Singletons` + * `Data.Singletons.Prelude.List` -> `Data.List.Singletons` + * `Data.Singletons.Prelude.List.NonEmpty` -> `Data.List.NonEmpty.Singletons` + * `Data.Singletons.Prelude.Maybe` -> `Data.Maybe.Singletons` + * `Data.Singletons.Prelude.Monad` -> `Control.Monad.Singletons` + * `Data.Singletons.Prelude.Monad.Fail` -> `Control.Monad.Fail.Singletons` + * `Data.Singletons.Prelude.Monad.Zip` -> `Control.Monad.Zip.Singletons` + * `Data.Singletons.Prelude.Monoid` -> `Data.Monoid.Singletons` + * `Data.Singletons.Prelude.Proxy` -> `Data.Proxy.Singletons` + * `Data.Singletons.Prelude.Semigroup` -> `Data.Semigroup.Singletons` + * `Data.Singletons.Prelude.Show` -> `Data.Show.Singletons` + * `Data.Singletons.Prelude.Traversable` -> `Data.Traversable.Singletons` + * `Data.Singletons.Prelude.Tuple` -> `Data.Tuple.Singletons` + * `Data.Singletons.Prelude.Void` -> `Data.Void.Singletons` + * `Data.Singletons.TH` -> `Data.Singletons.Base.TH` + * `Data.Singletons.TypeError` -> `Data.Singletons.Base.TypeError` + * `Data.Singletons.TypeLits` -> `GHC.TypeLits.Singletons` + * `Data.Singletons.TypeRepTYPE` -> `Data.Singletons.Base.TypeRepTYPE` + + Note that modules that do not correspond to any particular module in `base` + now have the prefix `Data.Singletons.Base.*`. This includes + `Data.Singletons.Base.Enum`, a special module that exists to provide a + home for the `Succ` and `Pred` promoted type families that is separate from + `Prelude.Singletons` (which exports everything from `PEnum` _except_ `Succ` + and `Pred`). This is done in an effort to make importing `Prelude.Singletons` + less likely to induce name clashes with code that works over unary natural + numbers, which often use the names "`Succ`" and "`Pred`". +* An effort has been made to make the API of `Prelude.Singletons` more closely + mirror that of the `Prelude` in `base`. As a result, `Prelude.Singletons` now + exports some different functions than it used to. In particular, it now + exports the following: + + * `Until`/`sUntil`/`UntilSym{N}` + * `type (++@#@$$$)` + * `type (.@#@$$$$)` + * `FlipSym3` + * `type (!!)`/`(%!!)`/`type (!!@#@{$})` + * `Length`/`sLength`/`LengthSym{N}` + * `DropWhile`/`sDropWhile` + * `LookupSym{N}` + * `Unzip3Sym{N}` + + `Prelude.Singletons` also used to export some things that were _not_ exported + by the `Prelude`. Accordingly, these exports have been removed from + `Prelude.Singletons`. They are: + + * `(^)`/`(%^)`/`type (^@#@{$})`. Although the `Prelude` does define a + function named `(^)`, it is more general than the one defined in + `singletons-base`, which only works on `Nat`s. Import + `GHC.TypeLits.Singletons` if you wish to use the `Nat`-specific versions. + * `DefaultEq`, which has no counterpart in the `Prelude`. + Import `Data.Eq.Singletons` if you wish to use this. + * `bool_`, which has no counterpart in the `Prelude`. + Import `Data.Bool.Singletons` if you wish to use this. +* Two previously public-facing modules—`Data.Singletons.Prelude.Base` and + `Data.Singletons.Prelude.Num`—have been turned into internal modules. The + contents of these modules are re-exported from `Prelude.Singletons`, so that + can be used instead. +* Due to the `singletons` package split, the `Eq`, `Ord`, etc. instances for + `SomeSing` are no longer provided in the `Data.Singletons` module in the + `singletons` library. Instead, they are now provided in a new + `Data.Singletons.Base.SomeSing` module, which defines `Eq`, `Ord`, etc. + instances for `SomeSing` as orphans. +* The `PEq` class no longer uses `DefaultEq` as its default implementation for + `(==)`. `DefaultEq`, despite its name, is actually not a suitable + implementation for `(==)` for a good majority of singleton types + (see the discussion in + [this GitHub issue](https://github.com/goldfirere/singletons/issues/457) + for more information). `(==)`'s default is now defined in terms of `(/=)`, + just like its term-level counterpart in the `Eq` class. +* Since `base-4.15.0.0` now deprecates `Data.Singletons.Option` (in + anticipation of its removal in a future version of `base`), this library no + longer offers a singleton type for `Option`. Accordingly, the `option_` + function has also been removed.
LICENSE view
@@ -1,27 +1,27 @@-Copyright (c) 2012-2020, Richard Eisenberg-All rights reserved.--Redistribution and use in source and binary forms, with or without-modification, are permitted provided that the following conditions are met:--1. Redistributions of source code must retain the above copyright notice, this-list of conditions and the following disclaimer.--2. Redistributions in binary form must reproduce the above copyright notice,-this list of conditions and the following disclaimer in the documentation-and/or other materials provided with the distribution.--3. Neither the name of the author nor the names of its contributors may be-used to endorse or promote products derived from this software without-specific prior written permission.--THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.+Copyright (c) 2012-2020, Richard Eisenberg +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation +and/or other materials provided with the distribution. + +3. Neither the name of the author nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
README.md view
@@ -1,31 +1,31 @@-`singletons-base`-=================--[](http://hackage.haskell.org/package/singletons-base)--`singletons-base` uses `singletons-th` to define promoted and singled-functions from the @base@ library, including the `Prelude`. This library was-originally presented in-[_Dependently Typed Programming with Singletons_](https://richarde.dev/papers/2012/singletons/paper.pdf),-published at the Haskell Symposium, 2012. See also-[the paper published at Haskell Symposium, 2014](https://richarde.dev/papers/2014/promotion/promotion.pdf),-which describes how promotion works in greater detail.--WARNING: `singletons-base` defines orphan instances for `Sing`, `SingKind`, etc.-for common types such as `Bool`, `[]`, `Maybe`, etc. If you define-instances of these types in your code, you will likely not be able to use-that code with `singletons-base`.--`singletons-base` uses code that relies on bleeding-edge GHC language-extensions. As such, `singletons-base` only supports the latest major version-of GHC (currently GHC 9.4). For more information,-consult the `singletons`-[`README`](https://github.com/goldfirere/singletons/blob/master/README.md).--You may also be interested in the following related libraries:--* The `singletons` library is a small, foundational library that defines- basic singleton-related types and definitions.-* The `singletons-th` library defines Template Haskell functionality that- allows _promotion_ of term-level functions to type-level equivalents and- _singling_ functions to dependently typed equivalents.+`singletons-base` +================= + +[](http://hackage.haskell.org/package/singletons-base) + +`singletons-base` uses `singletons-th` to define promoted and singled +functions from the @base@ library, including the `Prelude`. This library was +originally presented in +[_Dependently Typed Programming with Singletons_](https://richarde.dev/papers/2012/singletons/paper.pdf), +published at the Haskell Symposium, 2012. See also +[the paper published at Haskell Symposium, 2014](https://richarde.dev/papers/2014/promotion/promotion.pdf), +which describes how promotion works in greater detail. + +WARNING: `singletons-base` defines orphan instances for `Sing`, `SingKind`, etc. +for common types such as `Bool`, `[]`, `Maybe`, etc. If you define +instances of these types in your code, you will likely not be able to use +that code with `singletons-base`. + +`singletons-base` uses code that relies on bleeding-edge GHC language +extensions. As such, `singletons-base` only supports the latest major version +of GHC (currently GHC 9.6). For more information, +consult the `singletons` +[`README`](https://github.com/goldfirere/singletons/blob/master/README.md). + +You may also be interested in the following related libraries: + +* The `singletons` library is a small, foundational library that defines + basic singleton-related types and definitions. +* The `singletons-th` library defines Template Haskell functionality that + allows _promotion_ of term-level functions to type-level equivalents and + _singling_ functions to dependently typed equivalents.
Setup.hs view
@@ -1,138 +1,138 @@-{-# OPTIONS_GHC -Wall #-}-module Main (main) where--import Control.Monad--import qualified Data.List as List-import Data.String--import Distribution.PackageDescription-import Distribution.Simple-import Distribution.Simple.BuildPaths-import Distribution.Simple.LocalBuildInfo-import Distribution.Simple.PackageIndex-import Distribution.Simple.Program-import Distribution.Simple.Setup-import Distribution.Simple.Utils-import Distribution.Text--import System.Directory-import System.FilePath--main :: IO ()-main = defaultMainWithHooks simpleUserHooks- { buildHook = \pkg lbi hooks flags -> do- generateBuildModule flags pkg lbi- buildHook simpleUserHooks pkg lbi hooks flags- , confHook = \(gpd, hbi) flags ->- confHook simpleUserHooks (amendGPD gpd, hbi) flags- , haddockHook = \pkg lbi hooks flags -> do- generateBuildModule (haddockToBuildFlags flags) pkg lbi- haddockHook simpleUserHooks pkg lbi hooks flags- }---- | Convert only flags used by 'generateBuildModule'.-haddockToBuildFlags :: HaddockFlags -> BuildFlags-haddockToBuildFlags f = emptyBuildFlags- { buildVerbosity = haddockVerbosity f- , buildDistPref = haddockDistPref f- }--generateBuildModule :: BuildFlags -> PackageDescription -> LocalBuildInfo -> IO ()-generateBuildModule flags pkg lbi = do- rootDir <- getCurrentDirectory- let verbosity = fromFlag (buildVerbosity flags)- distPref = fromFlag (buildDistPref flags)- distPref' | isRelative distPref = rootDir </> distPref- | otherwise = distPref- -- Package DBs- dbStack = withPackageDB lbi ++ [ SpecificPackageDB $ distPref' </> "package.conf.inplace" ]- dbFlags = "-hide-all-packages" : "-package-env=-" : packageDbArgsDb dbStack-- ghc = case lookupProgram ghcProgram (withPrograms lbi) of- Just fp -> locationPath $ programLocation fp- Nothing -> error "Can't find GHC path"- withTestLBI pkg lbi $ \suite suitecfg -> when (testName suite == fromString testSuiteName) $ do- let testAutogenDir = autogenComponentModulesDir lbi suitecfg- createDirectoryIfMissingVerbose verbosity True testAutogenDir- let buildSingletonsBaseFile = testAutogenDir </> buildSingletonsBaseModule <.> "hs"- withLibLBI pkg lbi $ \_ libCLBI -> do- let libDeps = map fst $ componentPackageDeps libCLBI- pidx = case dependencyClosure (installedPkgs lbi) libDeps of- Left p -> p- Right _ -> error "Broken dependency closure"- libTransDeps = map installedUnitId $ allPackages pidx- singletonsBaseUnitId = componentUnitId libCLBI- deps = formatDeps (singletonsBaseUnitId:libTransDeps)- allFlags = dbFlags ++ deps- writeFile buildSingletonsBaseFile $ unlines- [ "module Build_singletons_base where"- , ""- , "ghcPath :: FilePath"- , "ghcPath = " ++ show ghc- , ""- , "ghcFlags :: [String]"- , "ghcFlags = " ++ show allFlags- , ""- , "rootDir :: FilePath"- , "rootDir = " ++ show rootDir- ]- where- formatDeps = map formatOne- formatOne installedPkgId = "-package-id=" ++ display installedPkgId-- -- GHC >= 7.6 uses the '-package-db' flag. See- -- https://ghc.haskell.org/trac/ghc/ticket/5977.- packageDbArgsDb :: [PackageDB] -> [String]- -- special cases to make arguments prettier in common scenarios- packageDbArgsDb dbstack = case dbstack of- (GlobalPackageDB:UserPackageDB:dbs)- | all isSpecific dbs -> concatMap single dbs- (GlobalPackageDB:dbs)- | all isSpecific dbs -> "-no-user-package-db"- : concatMap single dbs- dbs -> "-clear-package-db"- : concatMap single dbs- where- single (SpecificPackageDB db) = [ "-package-db=" ++ db ]- single GlobalPackageDB = [ "-global-package-db" ]- single UserPackageDB = [ "-user-package-db" ]- isSpecific (SpecificPackageDB _) = True- isSpecific _ = False--buildSingletonsBaseModule :: FilePath-buildSingletonsBaseModule = "Build_singletons_base"--testSuiteName :: String-testSuiteName = "singletons-base-test-suite"--amendGPD :: GenericPackageDescription -> GenericPackageDescription-amendGPD gpd = gpd- { condTestSuites = map f (condTestSuites gpd)- }- where- f (name, condTree)- | name == fromString testSuiteName = (name, condTree')- | otherwise = (name, condTree)- where- -- I miss 'lens'- testSuite = condTreeData condTree- bi = testBuildInfo testSuite- om = otherModules bi- am = autogenModules bi-- -- Cons the module to both other-modules and autogen-modules.- -- At the moment, cabal-spec-2.0 and cabal-spec-2.2 don't have- -- "all autogen-modules are other-modules if they aren't exposed-modules"- -- rule. Hopefully cabal-spec-3.0 will have.- --- -- Note: we `nub`, because it's unclear if that's ok to have duplicate- -- modules in the lists.- om' = List.nub $ mn : om- am' = List.nub $ mn : am-- mn = fromString buildSingletonsBaseModule-- bi' = bi { otherModules = om', autogenModules = am' }- testSuite' = testSuite { testBuildInfo = bi' }- condTree' = condTree { condTreeData = testSuite' }+{-# OPTIONS_GHC -Wall #-} +module Main (main) where + +import Control.Monad + +import qualified Data.List as List +import Data.String + +import Distribution.PackageDescription +import Distribution.Simple +import Distribution.Simple.BuildPaths +import Distribution.Simple.LocalBuildInfo +import Distribution.Simple.PackageIndex +import Distribution.Simple.Program +import Distribution.Simple.Setup +import Distribution.Simple.Utils +import Distribution.Text + +import System.Directory +import System.FilePath + +main :: IO () +main = defaultMainWithHooks simpleUserHooks + { buildHook = \pkg lbi hooks flags -> do + generateBuildModule flags pkg lbi + buildHook simpleUserHooks pkg lbi hooks flags + , confHook = \(gpd, hbi) flags -> + confHook simpleUserHooks (amendGPD gpd, hbi) flags + , haddockHook = \pkg lbi hooks flags -> do + generateBuildModule (haddockToBuildFlags flags) pkg lbi + haddockHook simpleUserHooks pkg lbi hooks flags + } + +-- | Convert only flags used by 'generateBuildModule'. +haddockToBuildFlags :: HaddockFlags -> BuildFlags +haddockToBuildFlags f = emptyBuildFlags + { buildVerbosity = haddockVerbosity f + , buildDistPref = haddockDistPref f + } + +generateBuildModule :: BuildFlags -> PackageDescription -> LocalBuildInfo -> IO () +generateBuildModule flags pkg lbi = do + rootDir <- getCurrentDirectory + let verbosity = fromFlag (buildVerbosity flags) + distPref = fromFlag (buildDistPref flags) + distPref' | isRelative distPref = rootDir </> distPref + | otherwise = distPref + -- Package DBs + dbStack = withPackageDB lbi ++ [ SpecificPackageDB $ distPref' </> "package.conf.inplace" ] + dbFlags = "-hide-all-packages" : "-package-env=-" : packageDbArgsDb dbStack + + ghc = case lookupProgram ghcProgram (withPrograms lbi) of + Just fp -> locationPath $ programLocation fp + Nothing -> error "Can't find GHC path" + withTestLBI pkg lbi $ \suite suitecfg -> when (testName suite == fromString testSuiteName) $ do + let testAutogenDir = autogenComponentModulesDir lbi suitecfg + createDirectoryIfMissingVerbose verbosity True testAutogenDir + let buildSingletonsBaseFile = testAutogenDir </> buildSingletonsBaseModule <.> "hs" + withLibLBI pkg lbi $ \_ libCLBI -> do + let libDeps = map fst $ componentPackageDeps libCLBI + pidx = case dependencyClosure (installedPkgs lbi) libDeps of + Left p -> p + Right _ -> error "Broken dependency closure" + libTransDeps = map installedUnitId $ allPackages pidx + singletonsBaseUnitId = componentUnitId libCLBI + deps = formatDeps (singletonsBaseUnitId:libTransDeps) + allFlags = dbFlags ++ deps + writeFile buildSingletonsBaseFile $ unlines + [ "module Build_singletons_base where" + , "" + , "ghcPath :: FilePath" + , "ghcPath = " ++ show ghc + , "" + , "ghcFlags :: [String]" + , "ghcFlags = " ++ show allFlags + , "" + , "rootDir :: FilePath" + , "rootDir = " ++ show rootDir + ] + where + formatDeps = map formatOne + formatOne installedPkgId = "-package-id=" ++ display installedPkgId + + -- GHC >= 7.6 uses the '-package-db' flag. See + -- https://ghc.haskell.org/trac/ghc/ticket/5977. + packageDbArgsDb :: [PackageDB] -> [String] + -- special cases to make arguments prettier in common scenarios + packageDbArgsDb dbstack = case dbstack of + (GlobalPackageDB:UserPackageDB:dbs) + | all isSpecific dbs -> concatMap single dbs + (GlobalPackageDB:dbs) + | all isSpecific dbs -> "-no-user-package-db" + : concatMap single dbs + dbs -> "-clear-package-db" + : concatMap single dbs + where + single (SpecificPackageDB db) = [ "-package-db=" ++ db ] + single GlobalPackageDB = [ "-global-package-db" ] + single UserPackageDB = [ "-user-package-db" ] + isSpecific (SpecificPackageDB _) = True + isSpecific _ = False + +buildSingletonsBaseModule :: FilePath +buildSingletonsBaseModule = "Build_singletons_base" + +testSuiteName :: String +testSuiteName = "singletons-base-test-suite" + +amendGPD :: GenericPackageDescription -> GenericPackageDescription +amendGPD gpd = gpd + { condTestSuites = map f (condTestSuites gpd) + } + where + f (name, condTree) + | name == fromString testSuiteName = (name, condTree') + | otherwise = (name, condTree) + where + -- I miss 'lens' + testSuite = condTreeData condTree + bi = testBuildInfo testSuite + om = otherModules bi + am = autogenModules bi + + -- Cons the module to both other-modules and autogen-modules. + -- At the moment, cabal-spec-2.0 and cabal-spec-2.2 don't have + -- "all autogen-modules are other-modules if they aren't exposed-modules" + -- rule. Hopefully cabal-spec-3.0 will have. + -- + -- Note: we `nub`, because it's unclear if that's ok to have duplicate + -- modules in the lists. + om' = List.nub $ mn : om + am' = List.nub $ mn : am + + mn = fromString buildSingletonsBaseModule + + bi' = bi { otherModules = om', autogenModules = am' } + testSuite' = testSuite { testBuildInfo = bi' } + condTree' = condTree { condTreeData = testSuite' }
singletons-base.cabal view
@@ -1,165 +1,167 @@-name: singletons-base-version: 3.1.1-cabal-version: 1.24-synopsis: A promoted and singled version of the base library-homepage: http://www.github.com/goldfirere/singletons-category: Dependent Types-author: Richard Eisenberg <rae@cs.brynmawr.edu>, Jan Stolarek <jan.stolarek@p.lodz.pl>-maintainer: Ryan Scott <ryan.gl.scott@gmail.com>-bug-reports: https://github.com/goldfirere/singletons/issues-stability: experimental-tested-with: GHC == 9.4.1-extra-source-files: README.md, CHANGES.md, tests/README.md,- tests/compile-and-dump/GradingClient/*.hs,- tests/compile-and-dump/InsertionSort/*.hs,- tests/compile-and-dump/Promote/*.hs,- tests/compile-and-dump/Singletons/*.hs- tests/compile-and-dump/GradingClient/*.golden,- tests/compile-and-dump/InsertionSort/*.golden,- tests/compile-and-dump/Promote/*.golden,- tests/compile-and-dump/Singletons/*.golden-license: BSD3-license-file: LICENSE-build-type: Custom-description:- @singletons-base@ uses @singletons-th@ to define promoted and singled- functions from the @base@ library, including the "Prelude". This library was- originally presented in /Dependently Typed Programming with Singletons/,- published at the Haskell Symposium, 2012.- (<https://richarde.dev/papers/2012/singletons/paper.pdf>)- See also the paper published at Haskell Symposium, 2014, which describes- how promotion works in greater detail:- <https://richarde.dev/papers/2014/promotion/promotion.pdf>.- .- WARNING: @singletons-base@ defines orphan instances for @Sing@, @SingKind@,- etc. for common types such as @Bool@, @[]@, @Maybe@, etc. If you define- instances of these types in your code, you will likely not be able to use- that code with @singletons-base@.- .- @singletons-base@ uses code that relies on bleeding-edge GHC language- extensions. As such, @singletons-base@ only supports the latest major version- of GHC (currently GHC 9.4). For more information,- consult the @singletons@- @<https://github.com/goldfirere/singletons/blob/master/README.md README>@.- .- You may also be interested in the following related libraries:- .- * The @singletons@ library is a small, foundational library that defines- basic singleton-related types and definitions.- .- * The @singletons-th@ library defines Template Haskell functionality that- allows /promotion/ of term-level functions to type-level equivalents and- /singling/ functions to dependently typed equivalents.--source-repository this- type: git- location: https://github.com/goldfirere/singletons.git- subdir: singletons-base- tag: v3.1.1--source-repository head- type: git- location: https://github.com/goldfirere/singletons.git- subdir: singletons-base- branch: master--custom-setup- setup-depends:- base >= 4.17 && < 4.18,- Cabal >= 3.0 && < 3.9,- directory >= 1,- filepath >= 1.3--library- hs-source-dirs: src- build-depends: base >= 4.17 && < 4.18,- pretty,- singletons == 3.0.*,- singletons-th == 3.1.*,- template-haskell >= 2.19 && < 2.20,- text >= 1.2,- th-desugar >= 1.14 && < 1.15- default-language: GHC2021- other-extensions: TemplateHaskell- exposed-modules: Data.Singletons.Base.CustomStar- Data.Singletons.Base.Enum- Data.Singletons.Base.TH- Data.Singletons.Base.SomeSing- Data.Singletons.Base.TypeError- Data.Singletons.Base.TypeRepTYPE-- Control.Applicative.Singletons- Control.Monad.Singletons- Control.Monad.Fail.Singletons- Control.Monad.Zip.Singletons- Data.Bool.Singletons- Data.Either.Singletons- Data.Eq.Singletons- Data.Foldable.Singletons- Data.Function.Singletons- Data.Functor.Compose.Singletons- Data.Functor.Const.Singletons- Data.Functor.Identity.Singletons- Data.Functor.Product.Singletons- Data.Functor.Singletons- Data.Functor.Sum.Singletons- Data.List.Singletons- Data.List.NonEmpty.Singletons- Data.Maybe.Singletons- Data.Monoid.Singletons- Data.Ord.Singletons- Data.Proxy.Singletons- Data.Semigroup.Singletons- Data.String.Singletons- Data.Traversable.Singletons- Data.Tuple.Singletons- Data.Void.Singletons- GHC.TypeLits.Singletons- Prelude.Singletons- Text.Show.Singletons-- other-modules: Data.Singletons.Base.Instances- Data.Singletons.Base.Util-- Control.Monad.Singletons.Internal- Data.List.Singletons.Internal- Data.List.Singletons.Internal.Disambiguation- Data.Ord.Singletons.Disambiguation- Data.Semigroup.Singletons.Internal- Data.Semigroup.Singletons.Internal.Disambiguation- GHC.Base.Singletons- GHC.Num.Singletons- GHC.TypeLits.Singletons.Internal-- -- singletons re-exports- reexported-modules: Data.Singletons- , Data.Singletons.Decide- , Data.Singletons.ShowSing- , Data.Singletons.Sigma-- -- singletons-th re-exports- reexported-modules: Data.Singletons.TH- , Data.Singletons.TH.CustomStar- , Data.Singletons.TH.Options- , Data.Singletons.TH.SuppressUnusedWarnings-- ghc-options: -Wall -Wcompat -Wno-redundant-constraints--test-suite singletons-base-test-suite- type: exitcode-stdio-1.0- hs-source-dirs: tests- ghc-options: -Wall -Wcompat -threaded -with-rtsopts=-maxN16- default-language: GHC2021- main-is: SingletonsBaseTestSuite.hs- other-modules: SingletonsBaseTestSuiteUtils-- build-depends: base >= 4.17 && < 4.18,- bytestring >= 0.10.9,- deepseq >= 1.4.4,- filepath >= 1.3,- process >= 1.1,- turtle >= 1.5,- text >= 1.2,- singletons-base,- tasty >= 1.2,- tasty-golden >= 2.2+name: singletons-base +version: 3.2 +cabal-version: 1.24 +synopsis: A promoted and singled version of the base library +homepage: http://www.github.com/goldfirere/singletons +category: Dependent Types +author: Richard Eisenberg <rae@cs.brynmawr.edu>, Jan Stolarek <jan.stolarek@p.lodz.pl> +maintainer: Ryan Scott <ryan.gl.scott@gmail.com> +bug-reports: https://github.com/goldfirere/singletons/issues +stability: experimental +tested-with: GHC == 9.6.1 +extra-source-files: README.md, CHANGES.md, tests/README.md, + tests/compile-and-dump/GradingClient/*.hs, + tests/compile-and-dump/InsertionSort/*.hs, + tests/compile-and-dump/Promote/*.hs, + tests/compile-and-dump/Singletons/*.hs + tests/compile-and-dump/GradingClient/*.golden, + tests/compile-and-dump/InsertionSort/*.golden, + tests/compile-and-dump/Promote/*.golden, + tests/compile-and-dump/Singletons/*.golden +license: BSD3 +license-file: LICENSE +build-type: Custom +description: + @singletons-base@ uses @singletons-th@ to define promoted and singled + functions from the @base@ library, including the "Prelude". This library was + originally presented in /Dependently Typed Programming with Singletons/, + published at the Haskell Symposium, 2012. + (<https://richarde.dev/papers/2012/singletons/paper.pdf>) + See also the paper published at Haskell Symposium, 2014, which describes + how promotion works in greater detail: + <https://richarde.dev/papers/2014/promotion/promotion.pdf>. + . + WARNING: @singletons-base@ defines orphan instances for @Sing@, @SingKind@, + etc. for common types such as @Bool@, @[]@, @Maybe@, etc. If you define + instances of these types in your code, you will likely not be able to use + that code with @singletons-base@. + . + @singletons-base@ uses code that relies on bleeding-edge GHC language + extensions. As such, @singletons-base@ only supports the latest major version + of GHC (currently GHC 9.6). For more information, + consult the @singletons@ + @<https://github.com/goldfirere/singletons/blob/master/README.md README>@. + . + You may also be interested in the following related libraries: + . + * The @singletons@ library is a small, foundational library that defines + basic singleton-related types and definitions. + . + * The @singletons-th@ library defines Template Haskell functionality that + allows /promotion/ of term-level functions to type-level equivalents and + /singling/ functions to dependently typed equivalents. + +source-repository this + type: git + location: https://github.com/goldfirere/singletons.git + subdir: singletons-base + tag: v3.1.2 + +source-repository head + type: git + location: https://github.com/goldfirere/singletons.git + subdir: singletons-base + branch: master + +custom-setup + setup-depends: + base >= 4.18 && < 4.19, + Cabal >= 3.0 && < 3.11, + directory >= 1, + filepath >= 1.3 + +library + hs-source-dirs: src + build-depends: base >= 4.18 && < 4.19, + pretty, + singletons == 3.0.*, + singletons-th >= 3.2 && < 3.3, + template-haskell >= 2.20 && < 2.21, + text >= 1.2, + th-desugar >= 1.15 && < 1.16 + default-language: GHC2021 + other-extensions: TemplateHaskell + exposed-modules: Data.Singletons.Base.CustomStar + Data.Singletons.Base.Enum + Data.Singletons.Base.TH + Data.Singletons.Base.PolyError + Data.Singletons.Base.SomeSing + Data.Singletons.Base.TypeError + Data.Singletons.Base.TypeRepTYPE + + Control.Applicative.Singletons + Control.Monad.Singletons + Control.Monad.Fail.Singletons + Control.Monad.Zip.Singletons + Data.Bool.Singletons + Data.Either.Singletons + Data.Eq.Singletons + Data.Foldable.Singletons + Data.Function.Singletons + Data.Functor.Compose.Singletons + Data.Functor.Const.Singletons + Data.Functor.Identity.Singletons + Data.Functor.Product.Singletons + Data.Functor.Singletons + Data.Functor.Sum.Singletons + Data.List.Singletons + Data.List.NonEmpty.Singletons + Data.Maybe.Singletons + Data.Monoid.Singletons + Data.Ord.Singletons + Data.Proxy.Singletons + Data.Semigroup.Singletons + Data.String.Singletons + Data.Traversable.Singletons + Data.Tuple.Singletons + Data.Void.Singletons + GHC.TypeLits.Singletons + Prelude.Singletons + Text.Show.Singletons + + other-modules: Data.Singletons.Base.Instances + Data.Singletons.Base.Util + + Control.Monad.Singletons.Internal + Data.List.Singletons.Internal + Data.List.Singletons.Internal.Disambiguation + Data.Ord.Singletons.Disambiguation + Data.Semigroup.Singletons.Internal.Classes + Data.Semigroup.Singletons.Internal.Disambiguation + Data.Semigroup.Singletons.Internal.Wrappers + GHC.Base.Singletons + GHC.Num.Singletons + GHC.TypeLits.Singletons.Internal + + -- singletons re-exports + reexported-modules: Data.Singletons + , Data.Singletons.Decide + , Data.Singletons.ShowSing + , Data.Singletons.Sigma + + -- singletons-th re-exports + reexported-modules: Data.Singletons.TH + , Data.Singletons.TH.CustomStar + , Data.Singletons.TH.Options + , Data.Singletons.TH.SuppressUnusedWarnings + + ghc-options: -Wall -Wcompat -Wno-redundant-constraints + +test-suite singletons-base-test-suite + type: exitcode-stdio-1.0 + hs-source-dirs: tests + ghc-options: -Wall -Wcompat -threaded -with-rtsopts=-maxN16 + default-language: GHC2021 + main-is: SingletonsBaseTestSuite.hs + other-modules: SingletonsBaseTestSuiteUtils + + build-depends: base >= 4.18 && < 4.19, + bytestring >= 0.10.9, + deepseq >= 1.4.4, + filepath >= 1.3, + process >= 1.1, + turtle >= 1.5, + text >= 1.2, + singletons-base, + tasty >= 1.2, + tasty-golden >= 2.2
src/Control/Applicative/Singletons.hs view
@@ -1,66 +1,66 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE UndecidableInstances #-}-{-# OPTIONS_GHC -Wno-orphans #-}---------------------------------------------------------------------------------- |--- Module : Control.Applicative.Singletons--- Copyright : (C) 2018 Ryan Scott--- License : BSD-style (see LICENSE)--- Maintainer : Ryan Scott--- Stability : experimental--- Portability : non-portable------ Defines the promoted and singled versions of the 'Applicative' type class.----------------------------------------------------------------------------------module Control.Applicative.Singletons (- PApplicative(..), SApplicative(..),- PAlternative(..), SAlternative(..),- Sing, SConst(..), Const, GetConst, sGetConst,- type (<$>), (%<$>), type (<$), (%<$), type (<**>), (%<**>),- LiftA, sLiftA, LiftA3, sLiftA3, Optional, sOptional,-- -- * Defunctionalization symbols- PureSym0, PureSym1,- type (<*>@#@$), type (<*>@#@$$), type (<*>@#@$$$),- type (*>@#@$), type (*>@#@$$), type (*>@#@$$$),- type (<*@#@$), type (<*@#@$$), type (<*@#@$$$),- EmptySym0, type (<|>@#@$), type (<|>@#@$$), type (<|>@#@$$$),- ConstSym0, ConstSym1, GetConstSym0, GetConstSym1,- type (<$>@#@$), type (<$>@#@$$), type (<$>@#@$$$),- type (<$@#@$), type (<$@#@$$), type (<$@#@$$$),- type (<**>@#@$), type (<**>@#@$$), type (<**>@#@$$$),- LiftASym0, LiftASym1, LiftASym2,- LiftA2Sym0, LiftA2Sym1, LiftA2Sym2, LiftA2Sym3,- LiftA3Sym0, LiftA3Sym1, LiftA3Sym2, LiftA3Sym3,- OptionalSym0, OptionalSym1- ) where--import Control.Applicative-import Control.Monad.Singletons.Internal-import Data.Functor.Const.Singletons-import Data.Functor.Singletons-import Data.Monoid.Singletons-import Data.Ord (Down(..))-import Data.Ord.Singletons-import Data.Singletons.Base.Instances-import Data.Singletons.TH--$(singletonsOnly [d|- -- -| One or none.- optional :: Alternative f => f a -> f (Maybe a)- optional v = Just <$> v <|> pure Nothing-- instance Monoid a => Applicative ((,) a) where- pure x = (mempty, x)- (u, f) <*> (v, x) = (u `mappend` v, f x)- liftA2 f (u, x) (v, y) = (u `mappend` v, f x y)-- instance Applicative Down where- pure = Down- Down f <*> Down x = Down (f x)- |])+{-# LANGUAGE DataKinds #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE UndecidableInstances #-} +{-# OPTIONS_GHC -Wno-orphans #-} + +----------------------------------------------------------------------------- +-- | +-- Module : Control.Applicative.Singletons +-- Copyright : (C) 2018 Ryan Scott +-- License : BSD-style (see LICENSE) +-- Maintainer : Ryan Scott +-- Stability : experimental +-- Portability : non-portable +-- +-- Defines the promoted and singled versions of the 'Applicative' type class. +-- +---------------------------------------------------------------------------- + +module Control.Applicative.Singletons ( + PApplicative(..), SApplicative(..), + PAlternative(..), SAlternative(..), + Sing, SConst(..), Const, GetConst, sGetConst, + type (<$>), (%<$>), type (<$), (%<$), type (<**>), (%<**>), + LiftA, sLiftA, LiftA3, sLiftA3, Optional, sOptional, + + -- * Defunctionalization symbols + PureSym0, PureSym1, + type (<*>@#@$), type (<*>@#@$$), type (<*>@#@$$$), + type (*>@#@$), type (*>@#@$$), type (*>@#@$$$), + type (<*@#@$), type (<*@#@$$), type (<*@#@$$$), + EmptySym0, type (<|>@#@$), type (<|>@#@$$), type (<|>@#@$$$), + ConstSym0, ConstSym1, GetConstSym0, GetConstSym1, + type (<$>@#@$), type (<$>@#@$$), type (<$>@#@$$$), + type (<$@#@$), type (<$@#@$$), type (<$@#@$$$), + type (<**>@#@$), type (<**>@#@$$), type (<**>@#@$$$), + LiftASym0, LiftASym1, LiftASym2, + LiftA2Sym0, LiftA2Sym1, LiftA2Sym2, LiftA2Sym3, + LiftA3Sym0, LiftA3Sym1, LiftA3Sym2, LiftA3Sym3, + OptionalSym0, OptionalSym1 + ) where + +import Control.Applicative +import Control.Monad.Singletons.Internal +import Data.Functor.Const.Singletons +import Data.Functor.Singletons +import Data.Monoid.Singletons +import Data.Ord (Down(..)) +import Data.Ord.Singletons +import Data.Singletons.Base.Instances +import Data.Singletons.TH + +$(singletonsOnly [d| + -- -| One or none. + optional :: Alternative f => f a -> f (Maybe a) + optional v = Just <$> v <|> pure Nothing + + instance Monoid a => Applicative ((,) a) where + pure x = (mempty, x) + (u, f) <*> (v, x) = (u `mappend` v, f x) + liftA2 f (u, x) (v, y) = (u `mappend` v, f x y) + + instance Applicative Down where + pure = Down + Down f <*> Down x = Down (f x) + |])
src/Control/Monad/Fail/Singletons.hs view
@@ -1,59 +1,59 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE UndecidableInstances #-}---------------------------------------------------------------------------------- |--- Module : Control.Monad.Fail.Singletons--- Copyright : (C) 2019 Ryan Scott--- License : BSD-style (see LICENSE)--- Maintainer : Ryan Scott--- Stability : experimental--- Portability : non-portable------ Defines the promoted and singled versions of the 'MonadFail' type class.----------------------------------------------------------------------------------module Control.Monad.Fail.Singletons (- PMonadFail(..), SMonadFail(..),-- -- * Defunctionalization symbols- FailSym0, FailSym1- ) where--import Control.Monad.Singletons.Internal-import Data.Singletons.Base.Instances-import Data.Singletons.TH--$(singletonsOnly [d|- -- -| When a value is bound in @do@-notation, the pattern on the left- -- hand side of @<-@ might not match. In this case, this class- -- provides a function to recover.- --- -- A 'Monad' without a 'MonadFail' instance may only be used in conjunction- -- with pattern that always match, such as newtypes, tuples, data types with- -- only a single data constructor, and irrefutable patterns (@~pat@).- --- -- Instances of 'MonadFail' should satisfy the following law: @fail s@ should- -- be a left zero for 'Control.Monad.>>=',- --- -- @- -- fail s >>= f = fail s- -- @- --- -- If your 'Monad' is also 'Control.Monad.MonadPlus', a popular definition is- --- -- @- -- fail _ = mzero- -- @- class Monad m => MonadFail m where- fail :: String -> m a-- instance MonadFail Maybe where- fail _ = Nothing-- instance MonadFail [] where- fail _ = []- |])+{-# LANGUAGE DataKinds #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE UndecidableInstances #-} + +----------------------------------------------------------------------------- +-- | +-- Module : Control.Monad.Fail.Singletons +-- Copyright : (C) 2019 Ryan Scott +-- License : BSD-style (see LICENSE) +-- Maintainer : Ryan Scott +-- Stability : experimental +-- Portability : non-portable +-- +-- Defines the promoted and singled versions of the 'MonadFail' type class. +-- +---------------------------------------------------------------------------- + +module Control.Monad.Fail.Singletons ( + PMonadFail(..), SMonadFail(..), + + -- * Defunctionalization symbols + FailSym0, FailSym1 + ) where + +import Control.Monad.Singletons.Internal +import Data.Singletons.Base.Instances +import Data.Singletons.TH + +$(singletonsOnly [d| + -- -| When a value is bound in @do@-notation, the pattern on the left + -- hand side of @<-@ might not match. In this case, this class + -- provides a function to recover. + -- + -- A 'Monad' without a 'MonadFail' instance may only be used in conjunction + -- with pattern that always match, such as newtypes, tuples, data types with + -- only a single data constructor, and irrefutable patterns (@~pat@). + -- + -- Instances of 'MonadFail' should satisfy the following law: @fail s@ should + -- be a left zero for 'Control.Monad.>>=', + -- + -- @ + -- fail s >>= f = fail s + -- @ + -- + -- If your 'Monad' is also 'Control.Monad.MonadPlus', a popular definition is + -- + -- @ + -- fail _ = mzero + -- @ + class Monad m => MonadFail m where + fail :: String -> m a + + instance MonadFail Maybe where + fail _ = Nothing + + instance MonadFail [] where + fail _ = [] + |])
src/Control/Monad/Singletons.hs view
@@ -1,286 +1,285 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE UndecidableInstances #-}-{-# OPTIONS_GHC -Wno-orphans #-}---------------------------------------------------------------------------------- |--- Module : Control.Monad.Singletons--- Copyright : (C) 2018 Ryan Scott--- License : BSD-style (see LICENSE)--- Maintainer : Ryan Scott--- Stability : experimental--- Portability : non-portable------ Defines the promoted and singled versions of the 'Monad' type class.----------------------------------------------------------------------------------module Control.Monad.Singletons (- PFunctor(Fmap), SFunctor(sFmap),- PMonad(..), SMonad(..), PMonadPlus(..), SMonadPlus(..),- PMonadFail(Fail), SMonadFail(sFail),-- MapM, sMapM, MapM_, sMapM_, ForM, sForM,- Sequence, sSequence, Sequence_, sSequence_,- type (=<<), (%=<<), type (>=>), (%>=>), type (<=<), (%<=<),- Void, sVoid,-- Join, sJoin,- Msum, sMsum,- Mfilter, sMfilter, FilterM, sFilterM,- MapAndUnzipM, sMapAndUnzipM, ZipWithM, sZipWithM,- ZipWithM_, sZipWithM_, FoldlM, sFoldlM,- ReplicateM, sReplicateM, ReplicateM_, sReplicateM_,-- Guard, sGuard, When, sWhen, Unless, sUnless,-- LiftM, sLiftM, LiftM2, sLiftM2, LiftM3, sLiftM3,- LiftM4, sLiftM4, LiftM5, sLiftM5, Ap, sAp,-- type (<$!>), (%<$!>),-- -- * Defunctionalization symbols- FmapSym0, FmapSym1, FmapSym2,- type (>>=@#@$), type (>>=@#@$$), type (>>=@#@$$$),- type (>>@#@$), type (>>@#@$$), type (>>@#@$$$),- ReturnSym0, ReturnSym1, FailSym0, FailSym1,- MzeroSym0, MplusSym0, MplusSym1, MplusSym2,-- MapMSym0, MapMSym1, MapMSym2,- MapM_Sym0, MapM_Sym1, MapM_Sym2,- ForMSym0, ForMSym1, ForMSym2,- SequenceSym0, SequenceSym1,- Sequence_Sym0, Sequence_Sym1,- type (=<<@#@$), type (=<<@#@$$), type (=<<@#@$$$),- type (>=>@#@$), type (>=>@#@$$), type (>=>@#@$$$),- type (<=<@#@$), type (<=<@#@$$), type (<=<@#@$$$),- VoidSym0, VoidSym1,-- JoinSym0, JoinSym1,- MsumSym0, MsumSym1,- MfilterSym0, MfilterSym1, MfilterSym2,- FilterMSym0, FilterMSym1, FilterMSym2,- MapAndUnzipMSym0, MapAndUnzipMSym1, MapAndUnzipMSym2,- ZipWithMSym0, ZipWithMSym1, ZipWithMSym2, ZipWithMSym3,- ZipWithM_Sym0, ZipWithM_Sym1, ZipWithM_Sym2, ZipWithM_Sym3,- FoldlMSym0, FoldlMSym1, FoldlMSym2, FoldlMSym3,- ReplicateMSym0, ReplicateMSym1, ReplicateMSym2,- ReplicateM_Sym0, ReplicateM_Sym1, ReplicateM_Sym2,-- GuardSym0, GuardSym1,- WhenSym0, WhenSym1, WhenSym2,- UnlessSym0, UnlessSym1, UnlessSym2,-- LiftMSym0, LiftMSym1, LiftMSym2,- LiftM2Sym0, LiftM2Sym1, LiftM2Sym2, LiftM2Sym3,- LiftM3Sym0, LiftM3Sym1, LiftM3Sym2, LiftM3Sym3, LiftM3Sym4,- LiftM4Sym0, LiftM4Sym1, LiftM4Sym2, LiftM4Sym3, LiftM4Sym4, LiftM4Sym5,- LiftM5Sym0, LiftM5Sym1, LiftM5Sym2, LiftM5Sym3, LiftM5Sym4, LiftM5Sym5, LiftM5Sym6,- ApSym0, ApSym1, ApSym2,-- type (<$!>@#@$), type (<$!>@#@$$), type (<$!>@#@$$$),- ) where--import Control.Applicative-import Control.Applicative.Singletons ()-import Control.Monad-import Control.Monad.Fail.Singletons-import Control.Monad.Singletons.Internal-import Data.Foldable.Singletons-import Data.Functor.Singletons-import Data.List.Singletons (UnzipSym0, sUnzip, ZipWithSym0, sZipWith)-import Data.Monoid.Singletons-import Data.Ord (Down(..))-import Data.Ord.Singletons-import Data.Singletons.Base.Instances-import Data.Singletons.TH hiding (Void)-import Data.Traversable.Singletons-import GHC.Base.Singletons hiding (Foldr, FoldrSym0, sFoldr)-import GHC.Num.Singletons-import GHC.TypeNats--$(singletonsOnly [d|- -- ------------------------------------------------------------------------------ -- Functions mandated by the Prelude-- -- -| This generalizes the list-based 'filter' function.-- filterM :: (Applicative m) => (a -> m Bool) -> [a] -> m [a]- filterM p = foldr (\ x -> liftA2 (\ flg -> if flg then (x:) else id) (p x)) (pure [])-- infixr 1 <=<, >=>-- -- -| Left-to-right Kleisli composition of monads.- (>=>) :: Monad m => (a -> m b) -> (b -> m c) -> (a -> m c)- f >=> g = \x -> f x >>= g-- -- -| Right-to-left Kleisli composition of monads. @('>=>')@, with the arguments flipped.- --- -- Note how this operator resembles function composition @('.')@:- --- -- > (.) :: (b -> c) -> (a -> b) -> a -> c- -- > (<=<) :: Monad m => (b -> m c) -> (a -> m b) -> a -> m c- (<=<) :: Monad m => (b -> m c) -> (a -> m b) -> (a -> m c)- (<=<) = flip (>=>)-- {-- Relies on infinite lists-- -- -| @'forever' act@ repeats the action infinitely.- forever :: (Applicative f) => f a -> f b- forever a = let a' = a *> a' in a'- -- Use explicit sharing here, as it prevents a space leak regardless of- -- optimizations.- -}-- -- ------------------------------------------------------------------------------ -- Other monad functions-- -- -| The 'mapAndUnzipM' function maps its first argument over a list, returning- -- the result as a pair of lists. This function is mainly used with complicated- -- data structures or a state-transforming monad.- mapAndUnzipM :: (Applicative m) => (a -> m (b,c)) -> [a] -> m ([b], [c])- mapAndUnzipM f xs = unzip <$> traverse f xs-- -- -| The 'zipWithM' function generalizes 'zipWith' to arbitrary applicative functors.- zipWithM :: (Applicative m) => (a -> b -> m c) -> [a] -> [b] -> m [c]- zipWithM f xs ys = sequenceA (zipWith f xs ys)-- -- -| 'zipWithM_' is the extension of 'zipWithM' which ignores the final result.- zipWithM_ :: (Applicative m) => (a -> b -> m c) -> [a] -> [b] -> m ()- zipWithM_ f xs ys = sequenceA_ (zipWith f xs ys)-- {- -| The 'foldM' function is analogous to 'foldl', except that its result is- encapsulated in a monad. Note that 'foldM' works from left-to-right over- the list arguments. This could be an issue where @('>>')@ and the `folded- function' are not commutative.--- > foldM f a1 [x1, x2, ..., xm]-- ==-- > do- > a2 <- f a1 x1- > a3 <- f a2 x2- > ...- > f am xm-- If right-to-left evaluation is required, the input list should be reversed.-- Note: 'foldM' is the same as 'foldlM'- -}-- foldM :: (Foldable t, Monad m) => (b -> a -> m b) -> b -> t a -> m b- foldM = foldlM-- -- -| Like 'foldM', but discards the result.- foldM_ :: (Foldable t, Monad m) => (b -> a -> m b) -> b -> t a -> m ()- foldM_ f a xs = foldlM f a xs >> return ()-- {-- Note [Worker/wrapper transform on replicateM/replicateM_]- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-- The implementations of replicateM and replicateM_ both leverage the- worker/wrapper transform. The simpler implementation of replicateM_, as an- example, would be:-- replicateM_ 0 _ = pure ()- replicateM_ n f = f *> replicateM_ (n - 1) f-- However, the self-recursive nature of this implementation inhibits inlining,- which means we never get to specialise to the action (`f` in the code above).- By contrast, the implementation below with a local loop makes it possible to- inline the entire definition (as happens for foldr, for example) thereby- specialising for the particular action.-- For further information, see this Trac comment, which includes side-by-side- Core: https://ghc.haskell.org/trac/ghc/ticket/11795#comment:6- -}-- -- -| @'replicateM' n act@ performs the action @n@ times,- -- gathering the results.- replicateM :: forall m a. (Applicative m) => Natural -> m a -> m [a]- replicateM cnt0 f =- loop cnt0- where- loop :: Natural -> m [a]- loop cnt- | cnt <= 0 = pure []- | otherwise = liftA2 (:) f (loop (cnt - 1))-- -- -| Like 'replicateM', but discards the result.- replicateM_ :: forall m a. (Applicative m) => Natural -> m a -> m ()- replicateM_ cnt0 f =- loop cnt0- where- loop :: Natural -> m ()- loop cnt- | cnt <= 0 = pure ()- | otherwise = f *> loop (cnt - 1)--- -- -| The reverse of 'when'.- unless :: (Applicative f) => Bool -> f () -> f ()- unless p s = if p then pure () else s-- infixl 4 <$!>-- -- -| Strict version of 'Data.Functor.<$>'.- --- -- @since 4.8.0.0- (<$!>) :: Monad m => (a -> b) -> m a -> m b- f <$!> m = do- x <- m- let z = f x- z `seq` return z--- -- ------------------------------------------------------------------------------ -- Other MonadPlus functions-- -- -| Direct 'MonadPlus' equivalent of 'filter'- -- @'filter'@ = @(mfilter:: (a -> Bool) -> [a] -> [a]@- -- applicable to any 'MonadPlus', for example- -- @mfilter odd (Just 1) == Just 1@- -- @mfilter odd (Just 2) == Nothing@-- mfilter :: (MonadPlus m) => (a -> Bool) -> m a -> m a- mfilter p ma = do- a <- ma- if p a then return a else mzero-- {- -$naming-- The functions in this library use the following naming conventions:-- * A postfix \'@M@\' always stands for a function in the Kleisli category:- The monad type constructor @m@ is added to function results- (modulo currying) and nowhere else. So, for example,-- > filter :: (a -> Bool) -> [a] -> [a]- > filterM :: (Monad m) => (a -> m Bool) -> [a] -> m [a]-- * A postfix \'@_@\' changes the result type from @(m a)@ to @(m ())@.- Thus, for example:-- > sequence :: Monad m => [m a] -> m [a]- > sequence_ :: Monad m => [m a] -> m ()-- * A prefix \'@m@\' generalizes an existing function to a monadic form.- Thus, for example:-- > sum :: Num a => [a] -> a- > msum :: MonadPlus m => [m a] -> m a-- -}-- instance Monoid a => Monad ((,) a) where- (u, a) >>= k = case k a of (v, b) -> (u `mappend` v, b)-- instance Monad Down where- Down a >>= k = k a- |])+{-# LANGUAGE DataKinds #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE UndecidableInstances #-} +{-# OPTIONS_GHC -Wno-orphans #-} + +----------------------------------------------------------------------------- +-- | +-- Module : Control.Monad.Singletons +-- Copyright : (C) 2018 Ryan Scott +-- License : BSD-style (see LICENSE) +-- Maintainer : Ryan Scott +-- Stability : experimental +-- Portability : non-portable +-- +-- Defines the promoted and singled versions of the 'Monad' type class. +-- +---------------------------------------------------------------------------- + +module Control.Monad.Singletons ( + PFunctor(Fmap), SFunctor(sFmap), + PMonad(..), SMonad(..), PMonadPlus(..), SMonadPlus(..), + PMonadFail(Fail), SMonadFail(sFail), + + MapM, sMapM, MapM_, sMapM_, ForM, sForM, + Sequence, sSequence, Sequence_, sSequence_, + type (=<<), (%=<<), type (>=>), (%>=>), type (<=<), (%<=<), + Void, sVoid, + + Join, sJoin, + Msum, sMsum, + Mfilter, sMfilter, FilterM, sFilterM, + MapAndUnzipM, sMapAndUnzipM, ZipWithM, sZipWithM, + ZipWithM_, sZipWithM_, FoldlM, sFoldlM, + ReplicateM, sReplicateM, ReplicateM_, sReplicateM_, + + Guard, sGuard, When, sWhen, Unless, sUnless, + + LiftM, sLiftM, LiftM2, sLiftM2, LiftM3, sLiftM3, + LiftM4, sLiftM4, LiftM5, sLiftM5, Ap, sAp, + + type (<$!>), (%<$!>), + + -- * Defunctionalization symbols + FmapSym0, FmapSym1, FmapSym2, + type (>>=@#@$), type (>>=@#@$$), type (>>=@#@$$$), + type (>>@#@$), type (>>@#@$$), type (>>@#@$$$), + ReturnSym0, ReturnSym1, FailSym0, FailSym1, + MzeroSym0, MplusSym0, MplusSym1, MplusSym2, + + MapMSym0, MapMSym1, MapMSym2, + MapM_Sym0, MapM_Sym1, MapM_Sym2, + ForMSym0, ForMSym1, ForMSym2, + SequenceSym0, SequenceSym1, + Sequence_Sym0, Sequence_Sym1, + type (=<<@#@$), type (=<<@#@$$), type (=<<@#@$$$), + type (>=>@#@$), type (>=>@#@$$), type (>=>@#@$$$), + type (<=<@#@$), type (<=<@#@$$), type (<=<@#@$$$), + VoidSym0, VoidSym1, + + JoinSym0, JoinSym1, + MsumSym0, MsumSym1, + MfilterSym0, MfilterSym1, MfilterSym2, + FilterMSym0, FilterMSym1, FilterMSym2, + MapAndUnzipMSym0, MapAndUnzipMSym1, MapAndUnzipMSym2, + ZipWithMSym0, ZipWithMSym1, ZipWithMSym2, ZipWithMSym3, + ZipWithM_Sym0, ZipWithM_Sym1, ZipWithM_Sym2, ZipWithM_Sym3, + FoldlMSym0, FoldlMSym1, FoldlMSym2, FoldlMSym3, + ReplicateMSym0, ReplicateMSym1, ReplicateMSym2, + ReplicateM_Sym0, ReplicateM_Sym1, ReplicateM_Sym2, + + GuardSym0, GuardSym1, + WhenSym0, WhenSym1, WhenSym2, + UnlessSym0, UnlessSym1, UnlessSym2, + + LiftMSym0, LiftMSym1, LiftMSym2, + LiftM2Sym0, LiftM2Sym1, LiftM2Sym2, LiftM2Sym3, + LiftM3Sym0, LiftM3Sym1, LiftM3Sym2, LiftM3Sym3, LiftM3Sym4, + LiftM4Sym0, LiftM4Sym1, LiftM4Sym2, LiftM4Sym3, LiftM4Sym4, LiftM4Sym5, + LiftM5Sym0, LiftM5Sym1, LiftM5Sym2, LiftM5Sym3, LiftM5Sym4, LiftM5Sym5, LiftM5Sym6, + ApSym0, ApSym1, ApSym2, + + type (<$!>@#@$), type (<$!>@#@$$), type (<$!>@#@$$$), + ) where + +import Control.Applicative.Singletons () +import Control.Monad +import Control.Monad.Fail.Singletons +import Control.Monad.Singletons.Internal +import Data.Foldable.Singletons +import Data.Functor.Singletons +import Data.List.Singletons (UnzipSym0, sUnzip, ZipWithSym0, sZipWith) +import Data.Monoid.Singletons +import Data.Ord (Down(..)) +import Data.Ord.Singletons +import Data.Singletons.Base.Instances +import Data.Singletons.TH hiding (Void) +import Data.Traversable.Singletons +import GHC.Base.Singletons hiding (Foldr, FoldrSym0, sFoldr) +import GHC.Num.Singletons +import GHC.TypeNats + +$(singletonsOnly [d| + -- ----------------------------------------------------------------------------- + -- Functions mandated by the Prelude + + -- -| This generalizes the list-based 'filter' function. + + filterM :: (Applicative m) => (a -> m Bool) -> [a] -> m [a] + filterM p = foldr (\ x -> liftA2 (\ flg -> if flg then (x:) else id) (p x)) (pure []) + + infixr 1 <=<, >=> + + -- -| Left-to-right Kleisli composition of monads. + (>=>) :: Monad m => (a -> m b) -> (b -> m c) -> (a -> m c) + f >=> g = \x -> f x >>= g + + -- -| Right-to-left Kleisli composition of monads. @('>=>')@, with the arguments flipped. + -- + -- Note how this operator resembles function composition @('.')@: + -- + -- > (.) :: (b -> c) -> (a -> b) -> a -> c + -- > (<=<) :: Monad m => (b -> m c) -> (a -> m b) -> a -> m c + (<=<) :: Monad m => (b -> m c) -> (a -> m b) -> (a -> m c) + (<=<) = flip (>=>) + + {- + Relies on infinite lists + + -- -| @'forever' act@ repeats the action infinitely. + forever :: (Applicative f) => f a -> f b + forever a = let a' = a *> a' in a' + -- Use explicit sharing here, as it prevents a space leak regardless of + -- optimizations. + -} + + -- ----------------------------------------------------------------------------- + -- Other monad functions + + -- -| The 'mapAndUnzipM' function maps its first argument over a list, returning + -- the result as a pair of lists. This function is mainly used with complicated + -- data structures or a state-transforming monad. + mapAndUnzipM :: (Applicative m) => (a -> m (b,c)) -> [a] -> m ([b], [c]) + mapAndUnzipM f xs = unzip <$> traverse f xs + + -- -| The 'zipWithM' function generalizes 'zipWith' to arbitrary applicative functors. + zipWithM :: (Applicative m) => (a -> b -> m c) -> [a] -> [b] -> m [c] + zipWithM f xs ys = sequenceA (zipWith f xs ys) + + -- -| 'zipWithM_' is the extension of 'zipWithM' which ignores the final result. + zipWithM_ :: (Applicative m) => (a -> b -> m c) -> [a] -> [b] -> m () + zipWithM_ f xs ys = sequenceA_ (zipWith f xs ys) + + {- -| The 'foldM' function is analogous to 'foldl', except that its result is + encapsulated in a monad. Note that 'foldM' works from left-to-right over + the list arguments. This could be an issue where @('>>')@ and the `folded + function' are not commutative. + + + > foldM f a1 [x1, x2, ..., xm] + + == + + > do + > a2 <- f a1 x1 + > a3 <- f a2 x2 + > ... + > f am xm + + If right-to-left evaluation is required, the input list should be reversed. + + Note: 'foldM' is the same as 'foldlM' + -} + + foldM :: (Foldable t, Monad m) => (b -> a -> m b) -> b -> t a -> m b + foldM = foldlM + + -- -| Like 'foldM', but discards the result. + foldM_ :: (Foldable t, Monad m) => (b -> a -> m b) -> b -> t a -> m () + foldM_ f a xs = foldlM f a xs >> return () + + {- + Note [Worker/wrapper transform on replicateM/replicateM_] + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + The implementations of replicateM and replicateM_ both leverage the + worker/wrapper transform. The simpler implementation of replicateM_, as an + example, would be: + + replicateM_ 0 _ = pure () + replicateM_ n f = f *> replicateM_ (n - 1) f + + However, the self-recursive nature of this implementation inhibits inlining, + which means we never get to specialise to the action (`f` in the code above). + By contrast, the implementation below with a local loop makes it possible to + inline the entire definition (as happens for foldr, for example) thereby + specialising for the particular action. + + For further information, see this Trac comment, which includes side-by-side + Core: https://ghc.haskell.org/trac/ghc/ticket/11795#comment:6 + -} + + -- -| @'replicateM' n act@ performs the action @n@ times, + -- gathering the results. + replicateM :: forall m a. (Applicative m) => Natural -> m a -> m [a] + replicateM cnt0 f = + loop cnt0 + where + loop :: Natural -> m [a] + loop cnt + | cnt <= 0 = pure [] + | otherwise = liftA2 (:) f (loop (cnt - 1)) + + -- -| Like 'replicateM', but discards the result. + replicateM_ :: forall m a. (Applicative m) => Natural -> m a -> m () + replicateM_ cnt0 f = + loop cnt0 + where + loop :: Natural -> m () + loop cnt + | cnt <= 0 = pure () + | otherwise = f *> loop (cnt - 1) + + + -- -| The reverse of 'when'. + unless :: (Applicative f) => Bool -> f () -> f () + unless p s = if p then pure () else s + + infixl 4 <$!> + + -- -| Strict version of 'Data.Functor.<$>'. + -- + -- @since 4.8.0.0 + (<$!>) :: Monad m => (a -> b) -> m a -> m b + f <$!> m = do + x <- m + let z = f x + z `seq` return z + + + -- ----------------------------------------------------------------------------- + -- Other MonadPlus functions + + -- -| Direct 'MonadPlus' equivalent of 'filter' + -- @'filter'@ = @(mfilter:: (a -> Bool) -> [a] -> [a]@ + -- applicable to any 'MonadPlus', for example + -- @mfilter odd (Just 1) == Just 1@ + -- @mfilter odd (Just 2) == Nothing@ + + mfilter :: (MonadPlus m) => (a -> Bool) -> m a -> m a + mfilter p ma = do + a <- ma + if p a then return a else mzero + + {- -$naming + + The functions in this library use the following naming conventions: + + * A postfix \'@M@\' always stands for a function in the Kleisli category: + The monad type constructor @m@ is added to function results + (modulo currying) and nowhere else. So, for example, + + > filter :: (a -> Bool) -> [a] -> [a] + > filterM :: (Monad m) => (a -> m Bool) -> [a] -> m [a] + + * A postfix \'@_@\' changes the result type from @(m a)@ to @(m ())@. + Thus, for example: + + > sequence :: Monad m => [m a] -> m [a] + > sequence_ :: Monad m => [m a] -> m () + + * A prefix \'@m@\' generalizes an existing function to a monadic form. + Thus, for example: + + > sum :: Num a => [a] -> a + > msum :: MonadPlus m => [m a] -> m a + + -} + + instance Monoid a => Monad ((,) a) where + (u, a) >>= k = case k a of (v, b) -> (u `mappend` v, b) + + instance Monad Down where + Down a >>= k = k a + |])
src/Control/Monad/Singletons/Internal.hs view
@@ -1,480 +1,480 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE DefaultSignatures #-}-{-# LANGUAGE NoNamedWildCards #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE UndecidableInstances #-}---------------------------------------------------------------------------------- |--- Module : Control.Monad.Singletons.Internal--- Copyright : (C) 2018 Ryan Scott--- License : BSD-style (see LICENSE)--- Maintainer : Ryan Scott--- Stability : experimental--- Portability : non-portable------ Defines the promoted and singled versions of:------ * 'Functor'--- * 'Applicative'--- * 'Alternative'--- * 'Monad'--- * 'MonadPlus'------ As well as auxiliary definitions.------ This module exists to break up import cycles.----------------------------------------------------------------------------------module Control.Monad.Singletons.Internal where--import Control.Applicative-import Control.Monad-import Data.List.NonEmpty (NonEmpty(..))-import Data.Singletons.Base.Instances-import Data.Singletons.TH-import GHC.Base.Singletons--$(singletonsOnly [d|- infixl 4 <$-- {- -| The 'Functor' class is used for types that can be mapped over.- Instances of 'Functor' should satisfy the following laws:-- > fmap id == id- > fmap (f . g) == fmap f . fmap g-- The instances of 'Functor' for lists, 'Data.Maybe.Maybe' and 'System.IO.IO'- satisfy these laws.- -}-- class Functor f where- fmap :: (a -> b) -> f a -> f b-- -- -| Replace all locations in the input with the same value.- -- The default definition is @'fmap' . 'const'@, but this may be- -- overridden with a more efficient version.- (<$) :: a -> f b -> f a- (<$) = fmap . const-- infixl 4 <*>, <*, *>, <**>-- -- -| A functor with application, providing operations to- --- -- -* embed pure expressions ('pure'), and- --- -- -* sequence computations and combine their results ('<*>' and 'liftA2').- --- -- A minimal complete definition must include implementations of 'pure'- -- and of either '<*>' or 'liftA2'. If it defines both, then they must behave- -- the same as their default definitions:- --- -- @('<*>') = 'liftA2' 'id'@- --- -- @'liftA2' f x y = f '<$>' x '<*>' y@- --- -- Further, any definition must satisfy the following:- --- -- [/identity/]- --- -- @'pure' 'id' '<*>' v = v@- --- -- [/composition/]- --- -- @'pure' (.) '<*>' u '<*>' v '<*>' w = u '<*>' (v '<*>' w)@- --- -- [/homomorphism/]- --- -- @'pure' f '<*>' 'pure' x = 'pure' (f x)@- --- -- [/interchange/]- --- -- @u '<*>' 'pure' y = 'pure' ('$' y) '<*>' u@- --- --- -- The other methods have the following default definitions, which may- -- be overridden with equivalent specialized implementations:- --- -- * @u '*>' v = ('id' '<$' u) '<*>' v@- --- -- * @u '<*' v = 'liftA2' 'const' u v@- --- -- As a consequence of these laws, the 'Functor' instance for @f@ will satisfy- --- -- * @'fmap' f x = 'pure' f '<*>' x@- --- --- -- It may be useful to note that supposing- --- -- @forall x y. p (q x y) = f x . g y@- --- -- it follows from the above that- --- -- @'liftA2' p ('liftA2' q u v) = 'liftA2' f u . 'liftA2' g v@- --- --- -- If @f@ is also a 'Monad', it should satisfy- --- -- * @'pure' = 'return'@- --- -- * @('<*>') = 'ap'@- --- -- * @('*>') = ('>>')@- --- -- (which implies that 'pure' and '<*>' satisfy the applicative functor laws).-- class Functor f => Applicative f where- -- {-# MINIMAL pure, ((<*>) | liftA2) #-}- -- -| Lift a value.- pure :: a -> f a-- -- -| Sequential application.- --- -- A few functors support an implementation of '<*>' that is more- -- efficient than the default one.- (<*>) :: f (a -> b) -> f a -> f b- (<*>) = liftA2 id-- -- -| Lift a binary function to actions.- --- -- Some functors support an implementation of 'liftA2' that is more- -- efficient than the default one. In particular, if 'fmap' is an- -- expensive operation, it is likely better to use 'liftA2' than to- -- 'fmap' over the structure and then use '<*>'.- liftA2 :: (a -> b -> c) -> f a -> f b -> f c- liftA2 f x = (<*>) (fmap f x)-- -- -| Sequence actions, discarding the value of the first argument.- (*>) :: f a -> f b -> f b- a1 *> a2 = (id <$ a1) <*> a2- -- This is essentially the same as liftA2 (flip const), but if the- -- Functor instance has an optimized (<$), it may be better to use- -- that instead. Before liftA2 became a method, this definition- -- was strictly better, but now it depends on the functor. For a- -- functor supporting a sharing-enhancing (<$), this definition- -- may reduce allocation by preventing a1 from ever being fully- -- realized. In an implementation with a boring (<$) but an optimizing- -- liftA2, it would likely be better to define (*>) using liftA2.-- -- -| Sequence actions, discarding the value of the second argument.- (<*) :: f a -> f b -> f a- (<*) = liftA2 const-- -- -| A variant of '<*>' with the arguments reversed.- (<**>) :: Applicative f => f a -> f (a -> b) -> f b- (<**>) = liftA2 (\a f -> f a)- -- Don't use $ here, see the note at the top of the page-- -- -| Lift a function to actions.- -- This function may be used as a value for `fmap` in a `Functor` instance.- liftA :: Applicative f => (a -> b) -> f a -> f b- liftA f a = pure f <*> a- -- Caution: since this may be used for `fmap`, we can't use the obvious- -- definition of liftA = fmap.-- -- -| Lift a ternary function to actions.- liftA3 :: Applicative f => (a -> b -> c -> d) -> f a -> f b -> f c -> f d- liftA3 f a b c = liftA2 f a b <*> c-- infixl 1 >>, >>=- infixr 1 =<<-- -- -| The 'join' function is the conventional monad join operator. It- -- is used to remove one level of monadic structure, projecting its- -- bound argument into the outer level.- --- -- ==== __Examples__- --- -- A common use of 'join' is to run an 'IO' computation returned from- -- an 'GHC.Conc.STM' transaction, since 'GHC.Conc.STM' transactions- -- can't perform 'IO' directly. Recall that- --- -- @- -- 'GHC.Conc.atomically' :: STM a -> IO a- -- @- --- -- is used to run 'GHC.Conc.STM' transactions atomically. So, by- -- specializing the types of 'GHC.Conc.atomically' and 'join' to- --- -- @- -- 'GHC.Conc.atomically' :: STM (IO b) -> IO (IO b)- -- 'join' :: IO (IO b) -> IO b- -- @- --- -- we can compose them as- --- -- @- -- 'join' . 'GHC.Conc.atomically' :: STM (IO b) -> IO b- -- @- --- -- to run an 'GHC.Conc.STM' transaction and the 'IO' action it- -- returns.- join :: (Monad m) => m (m a) -> m a- join x = x >>= id-- {- -| The 'Monad' class defines the basic operations over a /monad/,- a concept from a branch of mathematics known as /category theory/.- From the perspective of a Haskell programmer, however, it is best to- think of a monad as an /abstract datatype/ of actions.- Haskell's @do@ expressions provide a convenient syntax for writing- monadic expressions.-- Instances of 'Monad' should satisfy the following laws:-- * @'return' a '>>=' k = k a@- * @m '>>=' 'return' = m@- * @m '>>=' (\\x -> k x '>>=' h) = (m '>>=' k) '>>=' h@-- Furthermore, the 'Monad' and 'Applicative' operations should relate as follows:-- * @'pure' = 'return'@- * @('<*>') = 'ap'@-- The above laws imply:-- * @'fmap' f xs = xs '>>=' 'return' . f@- * @('>>') = ('*>')@-- and that 'pure' and ('<*>') satisfy the applicative functor laws.-- The instances of 'Monad' for lists, 'Data.Maybe.Maybe' and 'System.IO.IO'- defined in the "Prelude" satisfy these laws.- -}- class Applicative m => Monad m where- -- -| Sequentially compose two actions, passing any value produced- -- by the first as an argument to the second.- (>>=) :: forall a b. m a -> (a -> m b) -> m b-- -- -| Sequentially compose two actions, discarding any value produced- -- by the first, like sequencing operators (such as the semicolon)- -- in imperative languages.- (>>) :: forall a b. m a -> m b -> m b- m >> k = m >>= \_ -> k -- See Note [Recursive bindings for Applicative/Monad]-- -- -| Inject a value into the monadic type.- return :: a -> m a- return = pure-- {- Note [Recursive bindings for Applicative/Monad]- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-- The original Applicative/Monad proposal stated that after- implementation, the designated implementation of (>>) would become-- (>>) :: forall a b. m a -> m b -> m b- (>>) = (*>)-- by default. You might be inclined to change this to reflect the stated- proposal, but you really shouldn't! Why? Because people tend to define- such instances the /other/ way around: in particular, it is perfectly- legitimate to define an instance of Applicative (*>) in terms of (>>),- which would lead to an infinite loop for the default implementation of- Monad! And people do this in the wild.-- This turned into a nasty bug that was tricky to track down, and rather- than eliminate it everywhere upstream, it's easier to just retain the- original default.-- -}-- -- -| Same as '>>=', but with the arguments interchanged.- (=<<) :: Monad m => (a -> m b) -> m a -> m b- f =<< x = x >>= f-- -- -| Conditional execution of 'Applicative' expressions. For example,- --- -- > when debug (putStrLn "Debugging")- --- -- will output the string @Debugging@ if the Boolean value @debug@- -- is 'True', and otherwise do nothing.- when :: (Applicative f) => Bool -> f () -> f ()- when p s = if p then s else pure ()-- -- -| Promote a function to a monad.- liftM :: (Monad m) => (a1 -> r) -> m a1 -> m r- liftM f m1 = do { x1 <- m1; return (f x1) }-- -- -| Promote a function to a monad, scanning the monadic arguments from- -- left to right. For example,- --- -- > liftM2 (+) [0,1] [0,2] = [0,2,1,3]- -- > liftM2 (+) (Just 1) Nothing = Nothing- --- liftM2 :: (Monad m) => (a1 -> a2 -> r) -> m a1 -> m a2 -> m r- liftM2 f m1 m2 = do { x1 <- m1; x2 <- m2; return (f x1 x2) }- -- Caution: since this may be used for `liftA2`, we can't use the obvious- -- definition of liftM2 = liftA2.-- -- -| Promote a function to a monad, scanning the monadic arguments from- -- left to right (cf. 'liftM2').- liftM3 :: (Monad m) => (a1 -> a2 -> a3 -> r) -> m a1 -> m a2 -> m a3 -> m r- liftM3 f m1 m2 m3 = do { x1 <- m1; x2 <- m2; x3 <- m3; return (f x1 x2 x3) }-- -- -| Promote a function to a monad, scanning the monadic arguments from- -- left to right (cf. 'liftM2').- liftM4 :: (Monad m) => (a1 -> a2 -> a3 -> a4 -> r) -> m a1 -> m a2 -> m a3 -> m a4 -> m r- liftM4 f m1 m2 m3 m4 = do { x1 <- m1; x2 <- m2; x3 <- m3; x4 <- m4; return (f x1 x2 x3 x4) }-- -- -| Promote a function to a monad, scanning the monadic arguments from- -- left to right (cf. 'liftM2').- liftM5 :: (Monad m) => (a1 -> a2 -> a3 -> a4 -> a5 -> r) -> m a1 -> m a2 -> m a3 -> m a4 -> m a5 -> m r- liftM5 f m1 m2 m3 m4 m5 = do { x1 <- m1; x2 <- m2; x3 <- m3; x4 <- m4; x5 <- m5; return (f x1 x2 x3 x4 x5) }-- {- -| In many situations, the 'liftM' operations can be replaced by uses of- 'ap', which promotes function application.-- > return f `ap` x1 `ap` ... `ap` xn-- is equivalent to-- > liftMn f x1 x2 ... xn-- -}-- ap :: (Monad m) => m (a -> b) -> m a -> m b- ap m1 m2 = do { x1 <- m1; x2 <- m2; return (x1 x2) }- -- Since many Applicative instances define (<*>) = ap, we- -- cannot define ap = (<*>)-- -- ------------------------------------------------------------------------------ -- The Alternative class definition-- infixl 3 <|>-- -- -| A monoid on applicative functors.- --- -- If defined, 'some' and 'many' should be the least solutions- -- of the equations:- --- -- -* @'some' v = (:) '<$>' v '<*>' 'many' v@- --- -- -* @'many' v = 'some' v '<|>' 'pure' []@- class Applicative f => Alternative f where- -- -| The identity of '<|>'- empty :: f a- -- -| An associative binary operation- (<|>) :: f a -> f a -> f a-- {-- some and many rely on infinite lists-- -- -| One or more.- some :: f a -> f [a]- some v = some_v- where- many_v = some_v <|> pure []- some_v = liftA2 (:) v many_v-- -- -| Zero or more.- many :: f a -> f [a]- many v = many_v- where- many_v = some_v <|> pure []- some_v = liftA2 (:) v many_v- -}-- -- -| @'guard' b@ is @'pure' ()@ if @b@ is 'True',- -- and 'empty' if @b@ is 'False'.- guard :: (Alternative f) => Bool -> f ()- guard True = pure ()- guard False = empty-- -- ------------------------------------------------------------------------------ -- The MonadPlus class definition-- -- -| Monads that also support choice and failure.- class (Alternative m, Monad m) => MonadPlus m where- -- -| The identity of 'mplus'. It should also satisfy the equations- --- -- > mzero >>= f = mzero- -- > v >> mzero = mzero- --- -- The default definition is- --- -- @- -- mzero = 'empty'- -- @- mzero :: m a- mzero = empty-- -- -| An associative operation. The default definition is- --- -- @- -- mplus = ('<|>')- -- @- mplus :: m a -> m a -> m a- mplus = (<|>)- |])--$(singletonsOnly [d|- -------------------------------------------------------------------------------- -- Instances-- deriving instance Functor Maybe- deriving instance Functor NonEmpty- deriving instance Functor []- deriving instance Functor (Either a)-- instance Applicative Maybe where- pure = Just-- Just f <*> m = fmap f m- Nothing <*> _m = Nothing-- liftA2 f (Just x) (Just y) = Just (f x y)- liftA2 _ Just{} Nothing = Nothing- liftA2 _ Nothing Just{} = Nothing- liftA2 _ Nothing Nothing = Nothing-- Just _m1 *> m2 = m2- Nothing *> _m2 = Nothing-- instance Applicative NonEmpty where- pure a = a :| []- (<*>) = ap- liftA2 = liftM2-- instance Applicative [] where- pure x = [x]- (<*>) = ap- liftA2 = liftM2- m *> k = m >>= \_ -> k-- instance Applicative (Either e) where- pure = Right- Left e <*> _ = Left e- Right f <*> r = fmap f r-- instance Monad Maybe where- (Just x) >>= k = k x- Nothing >>= _ = Nothing-- (>>) = (*>)-- instance Monad NonEmpty where- (a :| as) >>= f = b :| (bs ++ bs')- where b :| bs = f a- bs' = as >>= toList . f- toList (c :| cs) = c : cs-- instance Monad [] where- xs >>= f = foldr ((++) . f) [] xs-- instance Monad (Either e) where- Left l >>= _ = Left l- Right r >>= k = k r-- instance Alternative Maybe where- empty = Nothing- Nothing <|> r = r- l@(Just{}) <|> _ = l-- instance Alternative [] where- empty = []- (<|>) = (++)-- instance MonadPlus Maybe- instance MonadPlus []- |])+{-# LANGUAGE DataKinds #-} +{-# LANGUAGE DefaultSignatures #-} +{-# LANGUAGE NoNamedWildCards #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE UndecidableInstances #-} + +----------------------------------------------------------------------------- +-- | +-- Module : Control.Monad.Singletons.Internal +-- Copyright : (C) 2018 Ryan Scott +-- License : BSD-style (see LICENSE) +-- Maintainer : Ryan Scott +-- Stability : experimental +-- Portability : non-portable +-- +-- Defines the promoted and singled versions of: +-- +-- * 'Functor' +-- * 'Applicative' +-- * 'Alternative' +-- * 'Monad' +-- * 'MonadPlus' +-- +-- As well as auxiliary definitions. +-- +-- This module exists to break up import cycles. +-- +---------------------------------------------------------------------------- + +module Control.Monad.Singletons.Internal where + +import Control.Applicative +import Control.Monad +import Data.List.NonEmpty (NonEmpty(..)) +import Data.Singletons.Base.Instances +import Data.Singletons.TH +import GHC.Base.Singletons + +$(singletonsOnly [d| + infixl 4 <$ + + {- -| The 'Functor' class is used for types that can be mapped over. + Instances of 'Functor' should satisfy the following laws: + + > fmap id == id + > fmap (f . g) == fmap f . fmap g + + The instances of 'Functor' for lists, 'Data.Maybe.Maybe' and 'System.IO.IO' + satisfy these laws. + -} + + class Functor f where + fmap :: (a -> b) -> f a -> f b + + -- -| Replace all locations in the input with the same value. + -- The default definition is @'fmap' . 'const'@, but this may be + -- overridden with a more efficient version. + (<$) :: a -> f b -> f a + (<$) = fmap . const + + infixl 4 <*>, <*, *>, <**> + + -- -| A functor with application, providing operations to + -- + -- -* embed pure expressions ('pure'), and + -- + -- -* sequence computations and combine their results ('<*>' and 'liftA2'). + -- + -- A minimal complete definition must include implementations of 'pure' + -- and of either '<*>' or 'liftA2'. If it defines both, then they must behave + -- the same as their default definitions: + -- + -- @('<*>') = 'liftA2' 'id'@ + -- + -- @'liftA2' f x y = f '<$>' x '<*>' y@ + -- + -- Further, any definition must satisfy the following: + -- + -- [/identity/] + -- + -- @'pure' 'id' '<*>' v = v@ + -- + -- [/composition/] + -- + -- @'pure' (.) '<*>' u '<*>' v '<*>' w = u '<*>' (v '<*>' w)@ + -- + -- [/homomorphism/] + -- + -- @'pure' f '<*>' 'pure' x = 'pure' (f x)@ + -- + -- [/interchange/] + -- + -- @u '<*>' 'pure' y = 'pure' ('$' y) '<*>' u@ + -- + -- + -- The other methods have the following default definitions, which may + -- be overridden with equivalent specialized implementations: + -- + -- * @u '*>' v = ('id' '<$' u) '<*>' v@ + -- + -- * @u '<*' v = 'liftA2' 'const' u v@ + -- + -- As a consequence of these laws, the 'Functor' instance for @f@ will satisfy + -- + -- * @'fmap' f x = 'pure' f '<*>' x@ + -- + -- + -- It may be useful to note that supposing + -- + -- @forall x y. p (q x y) = f x . g y@ + -- + -- it follows from the above that + -- + -- @'liftA2' p ('liftA2' q u v) = 'liftA2' f u . 'liftA2' g v@ + -- + -- + -- If @f@ is also a 'Monad', it should satisfy + -- + -- * @'pure' = 'return'@ + -- + -- * @('<*>') = 'ap'@ + -- + -- * @('*>') = ('>>')@ + -- + -- (which implies that 'pure' and '<*>' satisfy the applicative functor laws). + + class Functor f => Applicative f where + -- {-# MINIMAL pure, ((<*>) | liftA2) #-} + -- -| Lift a value. + pure :: a -> f a + + -- -| Sequential application. + -- + -- A few functors support an implementation of '<*>' that is more + -- efficient than the default one. + (<*>) :: f (a -> b) -> f a -> f b + (<*>) = liftA2 id + + -- -| Lift a binary function to actions. + -- + -- Some functors support an implementation of 'liftA2' that is more + -- efficient than the default one. In particular, if 'fmap' is an + -- expensive operation, it is likely better to use 'liftA2' than to + -- 'fmap' over the structure and then use '<*>'. + liftA2 :: (a -> b -> c) -> f a -> f b -> f c + liftA2 f x = (<*>) (fmap f x) + + -- -| Sequence actions, discarding the value of the first argument. + (*>) :: f a -> f b -> f b + a1 *> a2 = (id <$ a1) <*> a2 + -- This is essentially the same as liftA2 (flip const), but if the + -- Functor instance has an optimized (<$), it may be better to use + -- that instead. Before liftA2 became a method, this definition + -- was strictly better, but now it depends on the functor. For a + -- functor supporting a sharing-enhancing (<$), this definition + -- may reduce allocation by preventing a1 from ever being fully + -- realized. In an implementation with a boring (<$) but an optimizing + -- liftA2, it would likely be better to define (*>) using liftA2. + + -- -| Sequence actions, discarding the value of the second argument. + (<*) :: f a -> f b -> f a + (<*) = liftA2 const + + -- -| A variant of '<*>' with the arguments reversed. + (<**>) :: Applicative f => f a -> f (a -> b) -> f b + (<**>) = liftA2 (\a f -> f a) + -- Don't use $ here, see the note at the top of the page + + -- -| Lift a function to actions. + -- This function may be used as a value for `fmap` in a `Functor` instance. + liftA :: Applicative f => (a -> b) -> f a -> f b + liftA f a = pure f <*> a + -- Caution: since this may be used for `fmap`, we can't use the obvious + -- definition of liftA = fmap. + + -- -| Lift a ternary function to actions. + liftA3 :: Applicative f => (a -> b -> c -> d) -> f a -> f b -> f c -> f d + liftA3 f a b c = liftA2 f a b <*> c + + infixl 1 >>, >>= + infixr 1 =<< + + -- -| The 'join' function is the conventional monad join operator. It + -- is used to remove one level of monadic structure, projecting its + -- bound argument into the outer level. + -- + -- ==== __Examples__ + -- + -- A common use of 'join' is to run an 'IO' computation returned from + -- an 'GHC.Conc.STM' transaction, since 'GHC.Conc.STM' transactions + -- can't perform 'IO' directly. Recall that + -- + -- @ + -- 'GHC.Conc.atomically' :: STM a -> IO a + -- @ + -- + -- is used to run 'GHC.Conc.STM' transactions atomically. So, by + -- specializing the types of 'GHC.Conc.atomically' and 'join' to + -- + -- @ + -- 'GHC.Conc.atomically' :: STM (IO b) -> IO (IO b) + -- 'join' :: IO (IO b) -> IO b + -- @ + -- + -- we can compose them as + -- + -- @ + -- 'join' . 'GHC.Conc.atomically' :: STM (IO b) -> IO b + -- @ + -- + -- to run an 'GHC.Conc.STM' transaction and the 'IO' action it + -- returns. + join :: (Monad m) => m (m a) -> m a + join x = x >>= id + + {- -| The 'Monad' class defines the basic operations over a /monad/, + a concept from a branch of mathematics known as /category theory/. + From the perspective of a Haskell programmer, however, it is best to + think of a monad as an /abstract datatype/ of actions. + Haskell's @do@ expressions provide a convenient syntax for writing + monadic expressions. + + Instances of 'Monad' should satisfy the following laws: + + * @'return' a '>>=' k = k a@ + * @m '>>=' 'return' = m@ + * @m '>>=' (\\x -> k x '>>=' h) = (m '>>=' k) '>>=' h@ + + Furthermore, the 'Monad' and 'Applicative' operations should relate as follows: + + * @'pure' = 'return'@ + * @('<*>') = 'ap'@ + + The above laws imply: + + * @'fmap' f xs = xs '>>=' 'return' . f@ + * @('>>') = ('*>')@ + + and that 'pure' and ('<*>') satisfy the applicative functor laws. + + The instances of 'Monad' for lists, 'Data.Maybe.Maybe' and 'System.IO.IO' + defined in the "Prelude" satisfy these laws. + -} + class Applicative m => Monad m where + -- -| Sequentially compose two actions, passing any value produced + -- by the first as an argument to the second. + (>>=) :: forall a b. m a -> (a -> m b) -> m b + + -- -| Sequentially compose two actions, discarding any value produced + -- by the first, like sequencing operators (such as the semicolon) + -- in imperative languages. + (>>) :: forall a b. m a -> m b -> m b + m >> k = m >>= \_ -> k -- See Note [Recursive bindings for Applicative/Monad] + + -- -| Inject a value into the monadic type. + return :: a -> m a + return = pure + + {- Note [Recursive bindings for Applicative/Monad] + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + The original Applicative/Monad proposal stated that after + implementation, the designated implementation of (>>) would become + + (>>) :: forall a b. m a -> m b -> m b + (>>) = (*>) + + by default. You might be inclined to change this to reflect the stated + proposal, but you really shouldn't! Why? Because people tend to define + such instances the /other/ way around: in particular, it is perfectly + legitimate to define an instance of Applicative (*>) in terms of (>>), + which would lead to an infinite loop for the default implementation of + Monad! And people do this in the wild. + + This turned into a nasty bug that was tricky to track down, and rather + than eliminate it everywhere upstream, it's easier to just retain the + original default. + + -} + + -- -| Same as '>>=', but with the arguments interchanged. + (=<<) :: Monad m => (a -> m b) -> m a -> m b + f =<< x = x >>= f + + -- -| Conditional execution of 'Applicative' expressions. For example, + -- + -- > when debug (putStrLn "Debugging") + -- + -- will output the string @Debugging@ if the Boolean value @debug@ + -- is 'True', and otherwise do nothing. + when :: (Applicative f) => Bool -> f () -> f () + when p s = if p then s else pure () + + -- -| Promote a function to a monad. + liftM :: (Monad m) => (a1 -> r) -> m a1 -> m r + liftM f m1 = do { x1 <- m1; return (f x1) } + + -- -| Promote a function to a monad, scanning the monadic arguments from + -- left to right. For example, + -- + -- > liftM2 (+) [0,1] [0,2] = [0,2,1,3] + -- > liftM2 (+) (Just 1) Nothing = Nothing + -- + liftM2 :: (Monad m) => (a1 -> a2 -> r) -> m a1 -> m a2 -> m r + liftM2 f m1 m2 = do { x1 <- m1; x2 <- m2; return (f x1 x2) } + -- Caution: since this may be used for `liftA2`, we can't use the obvious + -- definition of liftM2 = liftA2. + + -- -| Promote a function to a monad, scanning the monadic arguments from + -- left to right (cf. 'liftM2'). + liftM3 :: (Monad m) => (a1 -> a2 -> a3 -> r) -> m a1 -> m a2 -> m a3 -> m r + liftM3 f m1 m2 m3 = do { x1 <- m1; x2 <- m2; x3 <- m3; return (f x1 x2 x3) } + + -- -| Promote a function to a monad, scanning the monadic arguments from + -- left to right (cf. 'liftM2'). + liftM4 :: (Monad m) => (a1 -> a2 -> a3 -> a4 -> r) -> m a1 -> m a2 -> m a3 -> m a4 -> m r + liftM4 f m1 m2 m3 m4 = do { x1 <- m1; x2 <- m2; x3 <- m3; x4 <- m4; return (f x1 x2 x3 x4) } + + -- -| Promote a function to a monad, scanning the monadic arguments from + -- left to right (cf. 'liftM2'). + liftM5 :: (Monad m) => (a1 -> a2 -> a3 -> a4 -> a5 -> r) -> m a1 -> m a2 -> m a3 -> m a4 -> m a5 -> m r + liftM5 f m1 m2 m3 m4 m5 = do { x1 <- m1; x2 <- m2; x3 <- m3; x4 <- m4; x5 <- m5; return (f x1 x2 x3 x4 x5) } + + {- -| In many situations, the 'liftM' operations can be replaced by uses of + 'ap', which promotes function application. + + > return f `ap` x1 `ap` ... `ap` xn + + is equivalent to + + > liftMn f x1 x2 ... xn + + -} + + ap :: (Monad m) => m (a -> b) -> m a -> m b + ap m1 m2 = do { x1 <- m1; x2 <- m2; return (x1 x2) } + -- Since many Applicative instances define (<*>) = ap, we + -- cannot define ap = (<*>) + + -- ----------------------------------------------------------------------------- + -- The Alternative class definition + + infixl 3 <|> + + -- -| A monoid on applicative functors. + -- + -- If defined, 'some' and 'many' should be the least solutions + -- of the equations: + -- + -- -* @'some' v = (:) '<$>' v '<*>' 'many' v@ + -- + -- -* @'many' v = 'some' v '<|>' 'pure' []@ + class Applicative f => Alternative f where + -- -| The identity of '<|>' + empty :: f a + -- -| An associative binary operation + (<|>) :: f a -> f a -> f a + + {- + some and many rely on infinite lists + + -- -| One or more. + some :: f a -> f [a] + some v = some_v + where + many_v = some_v <|> pure [] + some_v = liftA2 (:) v many_v + + -- -| Zero or more. + many :: f a -> f [a] + many v = many_v + where + many_v = some_v <|> pure [] + some_v = liftA2 (:) v many_v + -} + + -- -| @'guard' b@ is @'pure' ()@ if @b@ is 'True', + -- and 'empty' if @b@ is 'False'. + guard :: (Alternative f) => Bool -> f () + guard True = pure () + guard False = empty + + -- ----------------------------------------------------------------------------- + -- The MonadPlus class definition + + -- -| Monads that also support choice and failure. + class (Alternative m, Monad m) => MonadPlus m where + -- -| The identity of 'mplus'. It should also satisfy the equations + -- + -- > mzero >>= f = mzero + -- > v >> mzero = mzero + -- + -- The default definition is + -- + -- @ + -- mzero = 'empty' + -- @ + mzero :: m a + mzero = empty + + -- -| An associative operation. The default definition is + -- + -- @ + -- mplus = ('<|>') + -- @ + mplus :: m a -> m a -> m a + mplus = (<|>) + |]) + +$(singletonsOnly [d| + ------------------------------------------------------------------------------- + -- Instances + + deriving instance Functor Maybe + deriving instance Functor NonEmpty + deriving instance Functor [] + deriving instance Functor (Either a) + + instance Applicative Maybe where + pure = Just + + Just f <*> m = fmap f m + Nothing <*> _m = Nothing + + liftA2 f (Just x) (Just y) = Just (f x y) + liftA2 _ Just{} Nothing = Nothing + liftA2 _ Nothing Just{} = Nothing + liftA2 _ Nothing Nothing = Nothing + + Just _m1 *> m2 = m2 + Nothing *> _m2 = Nothing + + instance Applicative NonEmpty where + pure a = a :| [] + (<*>) = ap + liftA2 = liftM2 + + instance Applicative [] where + pure x = [x] + (<*>) = ap + liftA2 = liftM2 + m *> k = m >>= \_ -> k + + instance Applicative (Either e) where + pure = Right + Left e <*> _ = Left e + Right f <*> r = fmap f r + + instance Monad Maybe where + (Just x) >>= k = k x + Nothing >>= _ = Nothing + + (>>) = (*>) + + instance Monad NonEmpty where + (a :| as) >>= f = b :| (bs ++ bs') + where b :| bs = f a + bs' = as >>= toList . f + toList (c :| cs) = c : cs + + instance Monad [] where + xs >>= f = foldr ((++) . f) [] xs + + instance Monad (Either e) where + Left l >>= _ = Left l + Right r >>= k = k r + + instance Alternative Maybe where + empty = Nothing + Nothing <|> r = r + l@(Just{}) <|> _ = l + + instance Alternative [] where + empty = [] + (<|>) = (++) + + instance MonadPlus Maybe + instance MonadPlus [] + |])
src/Control/Monad/Zip/Singletons.hs view
@@ -1,103 +1,103 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE DefaultSignatures #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE UndecidableInstances #-}---------------------------------------------------------------------------------- |--- Module : Control.Monad.Zip.Singletons--- Copyright : (C) 2018 Ryan Scott--- License : BSD-style (see LICENSE)--- Maintainer : Ryan Scott--- Stability : experimental--- Portability : non-portable------ Defines the promoted and singled versions of the 'MonadZip' type class.----------------------------------------------------------------------------------module Control.Monad.Zip.Singletons (- PMonadZip(..), SMonadZip(..),-- -- * Defunctionalization symbols- MzipSym0, MzipSym1, MzipSym2,- MzipWithSym0, MzipWithSym1, MzipWithSym2, MzipWithSym3,- MunzipSym0, MunzipSym1,- ) where--import Control.Monad.Singletons.Internal-import Data.Functor.Identity-import Data.Functor.Identity.Singletons-import Data.List.Singletons- ( ZipSym0, ZipWithSym0, UnzipSym0- , sZip, sZipWith, sUnzip )-import Data.Monoid-import Data.Monoid.Singletons ()-import Data.Proxy-import Data.Proxy.Singletons-import Data.Singletons.Base.Instances-import Data.Singletons.TH-import Data.Tuple.Singletons--$(singletonsOnly [d|- -- -| `MonadZip` type class. Minimal definition: `mzip` or `mzipWith`- --- -- Instances should satisfy the laws:- --- -- -* Naturality :- --- -- > liftM (f *** g) (mzip ma mb) = mzip (liftM f ma) (liftM g mb)- --- -- -* Information Preservation:- --- -- > liftM (const ()) ma = liftM (const ()) mb- -- > ==>- -- > munzip (mzip ma mb) = (ma, mb)- --- class Monad m => MonadZip m where- -- {-# MINIMAL mzip | mzipWith #-}-- mzip :: m a -> m b -> m (a,b)- mzip = mzipWith (,)-- mzipWith :: (a -> b -> c) -> m a -> m b -> m c- mzipWith f ma mb = liftM (uncurry f) (mzip ma mb)-- munzip :: m (a,b) -> (m a, m b)- munzip mab = (liftM fst mab, liftM snd mab)- -- munzip is a member of the class because sometimes- -- you can implement it more efficiently than the- -- above default code. See Trac #4370 comment by giorgidze-- instance MonadZip [] where- mzip = zip- mzipWith = zipWith- munzip = unzip-- instance MonadZip Identity where- mzipWith = liftM2- munzip (Identity (a, b)) = (Identity a, Identity b)-- instance MonadZip Dual where- -- Cannot use coerce, it's unsafe- mzipWith = liftM2-- instance MonadZip Sum where- mzipWith = liftM2-- instance MonadZip Product where- mzipWith = liftM2-- instance MonadZip Maybe where- mzipWith = liftM2-- instance MonadZip First where- mzipWith = liftM2-- instance MonadZip Last where- mzipWith = liftM2-- instance MonadZip Proxy where- mzipWith _ _ _ = Proxy- |])+{-# LANGUAGE DataKinds #-} +{-# LANGUAGE DefaultSignatures #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE UndecidableInstances #-} + +----------------------------------------------------------------------------- +-- | +-- Module : Control.Monad.Zip.Singletons +-- Copyright : (C) 2018 Ryan Scott +-- License : BSD-style (see LICENSE) +-- Maintainer : Ryan Scott +-- Stability : experimental +-- Portability : non-portable +-- +-- Defines the promoted and singled versions of the 'MonadZip' type class. +-- +---------------------------------------------------------------------------- + +module Control.Monad.Zip.Singletons ( + PMonadZip(..), SMonadZip(..), + + -- * Defunctionalization symbols + MzipSym0, MzipSym1, MzipSym2, + MzipWithSym0, MzipWithSym1, MzipWithSym2, MzipWithSym3, + MunzipSym0, MunzipSym1, + ) where + +import Control.Monad.Singletons.Internal +import Data.Functor.Identity +import Data.Functor.Identity.Singletons +import Data.List.Singletons + ( ZipSym0, ZipWithSym0, UnzipSym0 + , sZip, sZipWith, sUnzip ) +import Data.Monoid +import Data.Monoid.Singletons () +import Data.Proxy +import Data.Proxy.Singletons +import Data.Singletons.Base.Instances +import Data.Singletons.TH +import Data.Tuple.Singletons + +$(singletonsOnly [d| + -- -| `MonadZip` type class. Minimal definition: `mzip` or `mzipWith` + -- + -- Instances should satisfy the laws: + -- + -- -* Naturality : + -- + -- > liftM (f *** g) (mzip ma mb) = mzip (liftM f ma) (liftM g mb) + -- + -- -* Information Preservation: + -- + -- > liftM (const ()) ma = liftM (const ()) mb + -- > ==> + -- > munzip (mzip ma mb) = (ma, mb) + -- + class Monad m => MonadZip m where + -- {-# MINIMAL mzip | mzipWith #-} + + mzip :: m a -> m b -> m (a,b) + mzip = mzipWith (,) + + mzipWith :: (a -> b -> c) -> m a -> m b -> m c + mzipWith f ma mb = liftM (uncurry f) (mzip ma mb) + + munzip :: m (a,b) -> (m a, m b) + munzip mab = (liftM fst mab, liftM snd mab) + -- munzip is a member of the class because sometimes + -- you can implement it more efficiently than the + -- above default code. See Trac #4370 comment by giorgidze + + instance MonadZip [] where + mzip = zip + mzipWith = zipWith + munzip = unzip + + instance MonadZip Identity where + mzipWith = liftM2 + munzip (Identity (a, b)) = (Identity a, Identity b) + + instance MonadZip Dual where + -- Cannot use coerce, it's unsafe + mzipWith = liftM2 + + instance MonadZip Sum where + mzipWith = liftM2 + + instance MonadZip Product where + mzipWith = liftM2 + + instance MonadZip Maybe where + mzipWith = liftM2 + + instance MonadZip First where + mzipWith = liftM2 + + instance MonadZip Last where + mzipWith = liftM2 + + instance MonadZip Proxy where + mzipWith _ _ _ = Proxy + |])
src/Data/Bool/Singletons.hs view
@@ -1,114 +1,114 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE NoNamedWildCards #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE UndecidableInstances #-}---------------------------------------------------------------------------------- |--- Module : Data.Bool.Singletons--- Copyright : (C) 2013-2014 Richard Eisenberg, Jan Stolarek--- License : BSD-style (see LICENSE)--- Maintainer : Ryan Scott--- Stability : experimental--- Portability : non-portable------ Defines functions and datatypes relating to the singleton for 'Bool',--- including singled versions of all the definitions in @Data.Bool@.------ Because many of these definitions are produced by Template Haskell,--- it is not possible to create proper Haddock documentation. Please look--- up the corresponding operation in @Data.Bool@. Also, please excuse--- the apparent repeated variable names. This is due to an interaction--- between Template Haskell and Haddock.----------------------------------------------------------------------------------module Data.Bool.Singletons (- -- * The 'Bool' singleton- Sing, SBool(..),-- -- * Conditionals- If, sIf,-- -- * Singletons from @Data.Bool@- Not, sNot, type (&&), type (||), (%&&), (%||),-- -- | The following are derived from the function 'bool' in @Data.Bool@. The extra- -- underscore is to avoid name clashes with the type 'Bool'.- bool_, Bool_, sBool_, Otherwise, sOtherwise,-- -- * Defunctionalization symbols- TrueSym0, FalseSym0,-- IfSym0, IfSym1, IfSym2, IfSym3,- NotSym0, NotSym1,- type (&&@#@$), type (&&@#@$$), type (&&@#@$$$),- type (||@#@$), type (||@#@$$), type (||@#@$$$),- Bool_Sym0, Bool_Sym1, Bool_Sym2, Bool_Sym3,- OtherwiseSym0- ) where--import Data.Singletons-import Data.Singletons.Base.Instances-import Data.Singletons.TH-import Data.Type.Bool ( If, type (&&), type (||), Not )--$(singletons [d|- bool_ :: a -> a -> Bool -> a- bool_ fls _tru False = fls- bool_ _fls tru True = tru- |])--$(singletonsOnly [d|- otherwise :: Bool- otherwise = True- |])---- | Conjunction of singletons-(%&&) :: Sing a -> Sing b -> Sing (a && b)-SFalse %&& _ = SFalse-STrue %&& a = a-infixr 3 %&&-$(genDefunSymbols [''(&&)])-instance SingI (&&@#@$) where- sing = singFun2 (%&&)-instance SingI x => SingI ((&&@#@$$) x) where- sing = singFun1 (sing @x %&&)---- | Disjunction of singletons-(%||) :: Sing a -> Sing b -> Sing (a || b)-SFalse %|| a = a-STrue %|| _ = STrue-infixr 2 %||-$(genDefunSymbols [''(||)])-instance SingI (||@#@$) where- sing = singFun2 (%||)-instance SingI x => SingI ((||@#@$$) x) where- sing = singFun1 (sing @x %||)---- | Negation of a singleton-sNot :: Sing a -> Sing (Not a)-sNot SFalse = STrue-sNot STrue = SFalse-$(genDefunSymbols [''Not])-instance SingI NotSym0 where- sing = singFun1 sNot---- | Conditional over singletons-sIf :: Sing a -> Sing b -> Sing c -> Sing (If a b c)-sIf STrue b _ = b-sIf SFalse _ c = c-$(genDefunSymbols [''If])-instance SingI IfSym0 where- sing = singFun3 sIf-instance SingI c => SingI (IfSym1 c) where- sing = singFun2 $ sIf (sing @c)-instance (SingI c, SingI t) => SingI (IfSym2 c t) where- sing = singFun1 $ sIf (sing @c) (sing @t)-instance SingI1 IfSym1 where- liftSing s = singFun2 $ sIf s-instance SingI c => SingI1 (IfSym2 c) where- liftSing s = singFun1 $ sIf (sing @c) s-instance SingI2 IfSym2 where- liftSing2 s1 s2 = singFun1 $ sIf s1 s2+{-# LANGUAGE DataKinds #-} +{-# LANGUAGE NoNamedWildCards #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE UndecidableInstances #-} + +----------------------------------------------------------------------------- +-- | +-- Module : Data.Bool.Singletons +-- Copyright : (C) 2013-2014 Richard Eisenberg, Jan Stolarek +-- License : BSD-style (see LICENSE) +-- Maintainer : Ryan Scott +-- Stability : experimental +-- Portability : non-portable +-- +-- Defines functions and datatypes relating to the singleton for 'Bool', +-- including singled versions of all the definitions in @Data.Bool@. +-- +-- Because many of these definitions are produced by Template Haskell, +-- it is not possible to create proper Haddock documentation. Please look +-- up the corresponding operation in @Data.Bool@. Also, please excuse +-- the apparent repeated variable names. This is due to an interaction +-- between Template Haskell and Haddock. +-- +---------------------------------------------------------------------------- + +module Data.Bool.Singletons ( + -- * The 'Bool' singleton + Sing, SBool(..), + + -- * Conditionals + If, sIf, + + -- * Singletons from @Data.Bool@ + Not, sNot, type (&&), type (||), (%&&), (%||), + + -- | The following are derived from the function 'bool' in @Data.Bool@. The extra + -- underscore is to avoid name clashes with the type 'Bool'. + bool_, Bool_, sBool_, Otherwise, sOtherwise, + + -- * Defunctionalization symbols + TrueSym0, FalseSym0, + + IfSym0, IfSym1, IfSym2, IfSym3, + NotSym0, NotSym1, + type (&&@#@$), type (&&@#@$$), type (&&@#@$$$), + type (||@#@$), type (||@#@$$), type (||@#@$$$), + Bool_Sym0, Bool_Sym1, Bool_Sym2, Bool_Sym3, + OtherwiseSym0 + ) where + +import Data.Singletons +import Data.Singletons.Base.Instances +import Data.Singletons.TH +import Data.Type.Bool ( If, type (&&), type (||), Not ) + +$(singletons [d| + bool_ :: a -> a -> Bool -> a + bool_ fls _tru False = fls + bool_ _fls tru True = tru + |]) + +$(singletonsOnly [d| + otherwise :: Bool + otherwise = True + |]) + +-- | Conjunction of singletons +(%&&) :: Sing a -> Sing b -> Sing (a && b) +SFalse %&& _ = SFalse +STrue %&& a = a +infixr 3 %&& +$(genDefunSymbols [''(&&)]) +instance SingI (&&@#@$) where + sing = singFun2 (%&&) +instance SingI x => SingI ((&&@#@$$) x) where + sing = singFun1 (sing @x %&&) + +-- | Disjunction of singletons +(%||) :: Sing a -> Sing b -> Sing (a || b) +SFalse %|| a = a +STrue %|| _ = STrue +infixr 2 %|| +$(genDefunSymbols [''(||)]) +instance SingI (||@#@$) where + sing = singFun2 (%||) +instance SingI x => SingI ((||@#@$$) x) where + sing = singFun1 (sing @x %||) + +-- | Negation of a singleton +sNot :: Sing a -> Sing (Not a) +sNot SFalse = STrue +sNot STrue = SFalse +$(genDefunSymbols [''Not]) +instance SingI NotSym0 where + sing = singFun1 sNot + +-- | Conditional over singletons +sIf :: Sing a -> Sing b -> Sing c -> Sing (If a b c) +sIf STrue b _ = b +sIf SFalse _ c = c +$(genDefunSymbols [''If]) +instance SingI IfSym0 where + sing = singFun3 sIf +instance SingI c => SingI (IfSym1 c) where + sing = singFun2 $ sIf (sing @c) +instance (SingI c, SingI t) => SingI (IfSym2 c t) where + sing = singFun1 $ sIf (sing @c) (sing @t) +instance SingI1 IfSym1 where + liftSing s = singFun2 $ sIf s +instance SingI c => SingI1 (IfSym2 c) where + liftSing s = singFun1 $ sIf (sing @c) s +instance SingI2 IfSym2 where + liftSing2 s1 s2 = singFun1 $ sIf s1 s2
src/Data/Either/Singletons.hs view
@@ -1,105 +1,105 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE UndecidableInstances #-}---------------------------------------------------------------------------------- |--- Module : Data.Either.Singletons--- Copyright : (C) 2013-2014 Richard Eisenberg, Jan Stolarek--- License : BSD-style (see LICENSE)--- Maintainer : Ryan Scott--- Stability : experimental--- Portability : non-portable------ Defines functions and datatypes relating to the singleton for 'Either',--- including singled versions of all the definitions in @Data.Either@.------ Because many of these definitions are produced by Template Haskell,--- it is not possible to create proper Haddock documentation. Please look--- up the corresponding operation in @Data.Either@. Also, please excuse--- the apparent repeated variable names. This is due to an interaction--- between Template Haskell and Haddock.----------------------------------------------------------------------------------module Data.Either.Singletons (- -- * The 'Either' singleton- Sing, SEither(..),-- -- * Singletons from @Data.Either@- either_, Either_, sEither_,- -- | The preceding two definitions are derived from the function 'either' in- -- @Data.Either@. The extra underscore is to avoid name clashes with the type- -- 'Either'.-- Lefts, sLefts, Rights, sRights,- PartitionEithers, sPartitionEithers, IsLeft, sIsLeft, IsRight, sIsRight,-- -- * Defunctionalization symbols- LeftSym0, LeftSym1, RightSym0, RightSym1,-- Either_Sym0, Either_Sym1, Either_Sym2, Either_Sym3,- LeftsSym0, LeftsSym1, RightsSym0, RightsSym1,- IsLeftSym0, IsLeftSym1, IsRightSym0, IsRightSym1- ) where--import Data.Singletons.Base.Instances-import Data.Singletons.TH-import GHC.Base.Singletons---- NB: The haddock comments are disabled because TH can't deal with them.--$(singletons [d|- -- Renamed to avoid name clash- -- -| Case analysis for the 'Either' type.- -- If the value is @'Left' a@, apply the first function to @a@;- -- if it is @'Right' b@, apply the second function to @b@.- either_ :: (a -> c) -> (b -> c) -> Either a b -> c- either_ f _ (Left x) = f x- either_ _ g (Right y) = g y- |])--$(singletonsOnly [d|- -- -| Extracts from a list of 'Either' all the 'Left' elements- -- All the 'Left' elements are extracted in order.-- -- Modified to avoid list comprehensions- lefts :: [Either a b] -> [a]- lefts [] = []- lefts (Left x : xs) = x : lefts xs- lefts (Right _ : xs) = lefts xs-- -- -| Extracts from a list of 'Either' all the 'Right' elements- -- All the 'Right' elements are extracted in order.-- -- Modified to avoid list comprehensions- rights :: [Either a b] -> [b]- rights [] = []- rights (Left _ : xs) = rights xs- rights (Right x : xs) = x : rights xs-- -- -| Partitions a list of 'Either' into two lists- -- All the 'Left' elements are extracted, in order, to the first- -- component of the output. Similarly the 'Right' elements are extracted- -- to the second component of the output.- partitionEithers :: [Either a b] -> ([a],[b])- partitionEithers = foldr (either_ left right) ([],[])- where- left a (l, r) = (a:l, r)- right a (l, r) = (l, a:r)-- -- -| Return `True` if the given value is a `Left`-value, `False` otherwise.- --- -- /Since: 4.7.0.0/- isLeft :: Either a b -> Bool- isLeft (Left _) = True- isLeft (Right _) = False-- -- -| Return `True` if the given value is a `Right`-value, `False` otherwise.- --- -- /Since: 4.7.0.0/- isRight :: Either a b -> Bool- isRight (Left _) = False- isRight (Right _) = True- |])+{-# LANGUAGE DataKinds #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE UndecidableInstances #-} + +----------------------------------------------------------------------------- +-- | +-- Module : Data.Either.Singletons +-- Copyright : (C) 2013-2014 Richard Eisenberg, Jan Stolarek +-- License : BSD-style (see LICENSE) +-- Maintainer : Ryan Scott +-- Stability : experimental +-- Portability : non-portable +-- +-- Defines functions and datatypes relating to the singleton for 'Either', +-- including singled versions of all the definitions in @Data.Either@. +-- +-- Because many of these definitions are produced by Template Haskell, +-- it is not possible to create proper Haddock documentation. Please look +-- up the corresponding operation in @Data.Either@. Also, please excuse +-- the apparent repeated variable names. This is due to an interaction +-- between Template Haskell and Haddock. +-- +---------------------------------------------------------------------------- + +module Data.Either.Singletons ( + -- * The 'Either' singleton + Sing, SEither(..), + + -- * Singletons from @Data.Either@ + either_, Either_, sEither_, + -- | The preceding two definitions are derived from the function 'either' in + -- @Data.Either@. The extra underscore is to avoid name clashes with the type + -- 'Either'. + + Lefts, sLefts, Rights, sRights, + PartitionEithers, sPartitionEithers, IsLeft, sIsLeft, IsRight, sIsRight, + + -- * Defunctionalization symbols + LeftSym0, LeftSym1, RightSym0, RightSym1, + + Either_Sym0, Either_Sym1, Either_Sym2, Either_Sym3, + LeftsSym0, LeftsSym1, RightsSym0, RightsSym1, + IsLeftSym0, IsLeftSym1, IsRightSym0, IsRightSym1 + ) where + +import Data.Singletons.Base.Instances +import Data.Singletons.TH +import GHC.Base.Singletons + +-- NB: The haddock comments are disabled because TH can't deal with them. + +$(singletons [d| + -- Renamed to avoid name clash + -- -| Case analysis for the 'Either' type. + -- If the value is @'Left' a@, apply the first function to @a@; + -- if it is @'Right' b@, apply the second function to @b@. + either_ :: (a -> c) -> (b -> c) -> Either a b -> c + either_ f _ (Left x) = f x + either_ _ g (Right y) = g y + |]) + +$(singletonsOnly [d| + -- -| Extracts from a list of 'Either' all the 'Left' elements + -- All the 'Left' elements are extracted in order. + + -- Modified to avoid list comprehensions + lefts :: [Either a b] -> [a] + lefts [] = [] + lefts (Left x : xs) = x : lefts xs + lefts (Right _ : xs) = lefts xs + + -- -| Extracts from a list of 'Either' all the 'Right' elements + -- All the 'Right' elements are extracted in order. + + -- Modified to avoid list comprehensions + rights :: [Either a b] -> [b] + rights [] = [] + rights (Left _ : xs) = rights xs + rights (Right x : xs) = x : rights xs + + -- -| Partitions a list of 'Either' into two lists + -- All the 'Left' elements are extracted, in order, to the first + -- component of the output. Similarly the 'Right' elements are extracted + -- to the second component of the output. + partitionEithers :: [Either a b] -> ([a],[b]) + partitionEithers = foldr (either_ left right) ([],[]) + where + left a (l, r) = (a:l, r) + right a (l, r) = (l, a:r) + + -- -| Return `True` if the given value is a `Left`-value, `False` otherwise. + -- + -- /Since: 4.7.0.0/ + isLeft :: Either a b -> Bool + isLeft (Left _) = True + isLeft (Right _) = False + + -- -| Return `True` if the given value is a `Right`-value, `False` otherwise. + -- + -- /Since: 4.7.0.0/ + isRight :: Either a b -> Bool + isRight (Left _) = False + isRight (Right _) = True + |])
src/Data/Eq/Singletons.hs view
@@ -1,121 +1,121 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE DefaultSignatures #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE UndecidableInstances #-}---------------------------------------------------------------------------------- |--- Module : Data.Eq.Singletons--- Copyright : (C) 2013 Richard Eisenberg--- License : BSD-style (see LICENSE)--- Maintainer : Ryan Scott--- Stability : experimental--- Portability : non-portable------ Defines the promoted version of 'Eq', 'PEq', and the singleton version,--- 'SEq'. Also defines the 'DefaultEq' type family, which is useful for--- implementing boolean equality for non-inductively defined data types.-----------------------------------------------------------------------------------module Data.Eq.Singletons (- PEq(..), SEq(..),- DefaultEq,-- -- * Defunctionalization symbols- type (==@#@$), type (==@#@$$), type (==@#@$$$),- type (/=@#@$), type (/=@#@$$), type (/=@#@$$$),- DefaultEqSym0, DefaultEqSym1, DefaultEqSym2- ) where--import Data.Bool.Singletons-import Data.Singletons.Base.Instances-import Data.Singletons.Base.Util-import Data.Singletons.TH--- The imports below are only needed for Haddock purposes.-import qualified Data.Kind as Kind ()-import qualified Data.Type.Equality as DTE ()-import qualified GHC.TypeLits as Lit ()--$(singletonsOnly [d|- infix 4 ==, /=-- -- -| The 'Eq' class defines equality ('==') and inequality ('/=').- -- All the basic datatypes exported by the "Prelude" are instances of 'Eq',- -- and 'Eq' may be derived for any datatype whose constituents are also- -- instances of 'Eq'.- --- -- The Haskell Report defines no laws for 'Eq'. However, '==' is customarily- -- expected to implement an equivalence relationship where two values comparing- -- equal are indistinguishable by "public" functions, with a "public" function- -- being one not allowing to see implementation details. For example, for a- -- type representing non-normalised natural numbers modulo 100, a "public"- -- function doesn't make the difference between 1 and 201. It is expected to- -- have the following properties:- --- -- [__Reflexivity__]: @x == x@ = 'True'- -- [__Symmetry__]: @x == y@ = @y == x@- -- [__Transitivity__]: if @x == y && y == z@ = 'True', then @x == z@ = 'True'- -- [__Substitutivity__]: if @x == y@ = 'True' and @f@ is a "public" function- -- whose return type is an instance of 'Eq', then @f x == f y@ = 'True'- -- [__Negation__]: @x /= y@ = @not (x == y)@- --- -- Minimal complete definition: either '==' or '/='.- --- class Eq a where- (==), (/=) :: a -> a -> Bool-- {-# INLINE (/=) #-}- {-# INLINE (==) #-}- x /= y = not (x == y)- x == y = not (x /= y)- -- {-# MINIMAL (==) | (/=) #-}- |])---- | One way to compute Boolean equality for types of any kind. This will--- return 'True' if the two arguments are known to be the same type and 'False'--- if they are known to be apart. Examples:------ @--- >>> 'DefaultEq' 'Nothing' 'Nothing'--- 'True'--- >>> 'DefaultEq' 'Nothing' ('Just' a)--- 'False'--- >>> 'DefaultEq' a a--- 'True'--- @------ 'DefaultEq' is most suited for data types that are not inductively defined.--- Four concrete examples of this are 'Natural', 'Lit.Symbol', 'Lit.Char', and--- 'Kind.Type'. One cannot implement boolean equality for these types by--- pattern matching alone, so 'DefaultEq' is a good fit instead.------ The downside to 'DefaultEq' is that it can fail to reduce if it is unable--- to determine if two types are equal or apart. Here is one such example:------ @--- 'DefaultEq' ('Just' a) ('Just' b)--- @------ What should this reduce to? It depends on what @a@ and @b@ are. 'DefaultEq'--- has no way of knowing what these two types are, and as a result, this type--- will be stuck. This is a pitfall that you can run into if you use--- 'DefaultEq' to implement boolean equality for an inductive data type like--- 'Maybe'. For this reason, it is usually recommended to implement boolean--- equality for inductive data types using pattern matching and recursion, not--- 'DefaultEq'.------ Note that this definition is slightly different from the '(DTE.==)' type--- family from "Data.Type.Equality" in @base@, as '(DTE.==)' attempts to--- distinguish applications of type constructors from other types. As a result,--- @a == a@ does not reduce to 'True' for every @a@, but @'DefaultEq' a a@--- /does/ reduce to 'True' for every @a@. The latter behavior is more desirable--- for @singletons@' purposes, so we use it instead of '(DTE.==)'.-type DefaultEq :: k -> k -> Bool-type family DefaultEq (a :: k) (b :: k) :: Bool where- DefaultEq a a = 'True- DefaultEq a b = 'False-$(genDefunSymbols [''DefaultEq])--$(singEqInstances basicTypes)+{-# LANGUAGE DataKinds #-} +{-# LANGUAGE DefaultSignatures #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE UndecidableInstances #-} + +----------------------------------------------------------------------------- +-- | +-- Module : Data.Eq.Singletons +-- Copyright : (C) 2013 Richard Eisenberg +-- License : BSD-style (see LICENSE) +-- Maintainer : Ryan Scott +-- Stability : experimental +-- Portability : non-portable +-- +-- Defines the promoted version of 'Eq', 'PEq', and the singleton version, +-- 'SEq'. Also defines the 'DefaultEq' type family, which is useful for +-- implementing boolean equality for non-inductively defined data types. +-- +----------------------------------------------------------------------------- + +module Data.Eq.Singletons ( + PEq(..), SEq(..), + DefaultEq, + + -- * Defunctionalization symbols + type (==@#@$), type (==@#@$$), type (==@#@$$$), + type (/=@#@$), type (/=@#@$$), type (/=@#@$$$), + DefaultEqSym0, DefaultEqSym1, DefaultEqSym2 + ) where + +import Data.Bool.Singletons +import Data.Singletons.Base.Instances +import Data.Singletons.Base.Util +import Data.Singletons.TH +-- The imports below are only needed for Haddock purposes. +import qualified Data.Kind as Kind () +import qualified Data.Type.Equality as DTE () +import qualified GHC.TypeLits as Lit () + +$(singletonsOnly [d| + infix 4 ==, /= + + -- -| The 'Eq' class defines equality ('==') and inequality ('/='). + -- All the basic datatypes exported by the "Prelude" are instances of 'Eq', + -- and 'Eq' may be derived for any datatype whose constituents are also + -- instances of 'Eq'. + -- + -- The Haskell Report defines no laws for 'Eq'. However, '==' is customarily + -- expected to implement an equivalence relationship where two values comparing + -- equal are indistinguishable by "public" functions, with a "public" function + -- being one not allowing to see implementation details. For example, for a + -- type representing non-normalised natural numbers modulo 100, a "public" + -- function doesn't make the difference between 1 and 201. It is expected to + -- have the following properties: + -- + -- [__Reflexivity__]: @x == x@ = 'True' + -- [__Symmetry__]: @x == y@ = @y == x@ + -- [__Transitivity__]: if @x == y && y == z@ = 'True', then @x == z@ = 'True' + -- [__Substitutivity__]: if @x == y@ = 'True' and @f@ is a "public" function + -- whose return type is an instance of 'Eq', then @f x == f y@ = 'True' + -- [__Negation__]: @x /= y@ = @not (x == y)@ + -- + -- Minimal complete definition: either '==' or '/='. + -- + class Eq a where + (==), (/=) :: a -> a -> Bool + + {-# INLINE (/=) #-} + {-# INLINE (==) #-} + x /= y = not (x == y) + x == y = not (x /= y) + -- {-# MINIMAL (==) | (/=) #-} + |]) + +-- | One way to compute Boolean equality for types of any kind. This will +-- return 'True' if the two arguments are known to be the same type and 'False' +-- if they are known to be apart. Examples: +-- +-- @ +-- >>> 'DefaultEq' 'Nothing' 'Nothing' +-- 'True' +-- >>> 'DefaultEq' 'Nothing' ('Just' a) +-- 'False' +-- >>> 'DefaultEq' a a +-- 'True' +-- @ +-- +-- 'DefaultEq' is most suited for data types that are not inductively defined. +-- Four concrete examples of this are 'Natural', 'Lit.Symbol', 'Lit.Char', and +-- 'Kind.Type'. One cannot implement boolean equality for these types by +-- pattern matching alone, so 'DefaultEq' is a good fit instead. +-- +-- The downside to 'DefaultEq' is that it can fail to reduce if it is unable +-- to determine if two types are equal or apart. Here is one such example: +-- +-- @ +-- 'DefaultEq' ('Just' a) ('Just' b) +-- @ +-- +-- What should this reduce to? It depends on what @a@ and @b@ are. 'DefaultEq' +-- has no way of knowing what these two types are, and as a result, this type +-- will be stuck. This is a pitfall that you can run into if you use +-- 'DefaultEq' to implement boolean equality for an inductive data type like +-- 'Maybe'. For this reason, it is usually recommended to implement boolean +-- equality for inductive data types using pattern matching and recursion, not +-- 'DefaultEq'. +-- +-- Note that this definition is slightly different from the '(DTE.==)' type +-- family from "Data.Type.Equality" in @base@, as '(DTE.==)' attempts to +-- distinguish applications of type constructors from other types. As a result, +-- @a == a@ does not reduce to 'True' for every @a@, but @'DefaultEq' a a@ +-- /does/ reduce to 'True' for every @a@. The latter behavior is more desirable +-- for @singletons@' purposes, so we use it instead of '(DTE.==)'. +type DefaultEq :: k -> k -> Bool +type family DefaultEq (a :: k) (b :: k) :: Bool where + DefaultEq a a = 'True + DefaultEq a b = 'False +$(genDefunSymbols [''DefaultEq]) + +$(singEqInstances basicTypes)
src/Data/Foldable/Singletons.hs view
@@ -1,669 +1,662 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE DefaultSignatures #-}-{-# LANGUAGE NoNamedWildCards #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE UndecidableInstances #-}---------------------------------------------------------------------------------- |--- Module : Data.Foldable.Singletons--- Copyright : (C) 2018 Ryan Scott--- License : BSD-style (see LICENSE)--- Maintainer : Ryan Scott--- Stability : experimental--- Portability : non-portable------ Defines the promoted and singled versions of the 'Foldable' type class.----------------------------------------------------------------------------------module Data.Foldable.Singletons (- PFoldable(..), SFoldable(..),-- FoldrM, sFoldrM,- FoldlM, sFoldlM,-- Traverse_, sTraverse_,- For_, sFor_,- SequenceA_, sSequenceA_,- Asum, sAsum,-- MapM_, sMapM_,- ForM_, sForM_,- Sequence_, sSequence_,- Msum, sMsum,-- Concat, sConcat,- ConcatMap, sConcatMap,- And, sAnd,- Or, sOr,- Any, sAny,- All, sAll,- MaximumBy, sMaximumBy,- MinimumBy, sMinimumBy,-- NotElem, sNotElem,- Find, sFind,-- -- * Defunctionalization symbols- FoldSym0, FoldSym1,- FoldMapSym0, FoldMapSym1, FoldMapSym2,- FoldrSym0, FoldrSym1, FoldrSym2, FoldrSym3,- Foldr'Sym0, Foldr'Sym1, Foldr'Sym2, Foldr'Sym3,- FoldlSym0, FoldlSym1, FoldlSym2, FoldlSym3,- Foldl'Sym0, Foldl'Sym1, Foldl'Sym2, Foldl'Sym3,- Foldr1Sym0, Foldr1Sym1, Foldr1Sym2,- Foldl1Sym0, Foldl1Sym1, Foldl1Sym2,- ToListSym0, ToListSym1,- NullSym0, NullSym1,- LengthSym0, LengthSym1,- ElemSym0, ElemSym1, ElemSym2,- MaximumSym0, MaximumSym1,- MinimumSym0, MinimumSym1,- SumSym0, SumSym1,- ProductSym0, ProductSym1,-- FoldrMSym0, FoldrMSym1, FoldrMSym2, FoldrMSym3,- FoldlMSym0, FoldlMSym1, FoldlMSym2, FoldlMSym3,-- Traverse_Sym0, Traverse_Sym1, Traverse_Sym2,- For_Sym0, For_Sym1, For_Sym2,- SequenceA_Sym0, SequenceA_Sym1,- AsumSym0, AsumSym1,-- MapM_Sym0, MapM_Sym1, MapM_Sym2,- ForM_Sym0, ForM_Sym1, ForM_Sym2,- Sequence_Sym0, Sequence_Sym1,- MsumSym0, MsumSym1,-- ConcatSym0, ConcatSym1,- ConcatMapSym0, ConcatMapSym1, ConcatMapSym2,- AndSym0, AndSym1,- OrSym0, OrSym1,- AnySym0, AnySym1, AnySym2,- AllSym0, AllSym1, AllSym2,- MaximumBySym0, MaximumBySym1, MaximumBySym2,- MinimumBySym0, MinimumBySym1, MinimumBySym2,-- NotElemSym0, NotElemSym1, NotElemSym2,- FindSym0, FindSym1, FindSym2- ) where--import Control.Applicative-import Control.Monad-import Control.Monad.Singletons.Internal-import Data.Bool.Singletons-import Data.Either.Singletons-import Data.Eq.Singletons-import Data.Kind-import Data.List.NonEmpty (NonEmpty(..))-import Data.List.Singletons.Internal.Disambiguation-import Data.Maybe.Singletons-import Data.Monoid hiding (All(..), Any(..), Endo(..), Product(..), Sum(..))-import Data.Monoid.Singletons- hiding ( AllSym0, AllSym1- , AnySym0, AnySym1- , ProductSym0, ProductSym1- , SumSym0, SumSym1 )-import qualified Data.Monoid as Monoid (Product(..), Sum(..))-import Data.Ord.Singletons- hiding ( Max, MaxSym0, MaxSym1, MaxSym2, sMax- , Min, MinSym0, MinSym1, MinSym2, sMin )-import Data.Semigroup.Singletons.Internal- hiding ( AllSym0(..), AllSym1, SAll- , AnySym0(..), AnySym1, SAny- , FirstSym0, FirstSym1, SFirst- , GetFirstSym0, sGetFirst- , LastSym0, LastSym1, SLast- , ProductSym0(..), ProductSym1, SProduct- , SumSym0(..), SumSym1, SSum )-import Data.Semigroup.Singletons.Internal.Disambiguation-import Data.Singletons-import Data.Singletons.Base.Instances- hiding (Foldl, FoldlSym0(..), FoldlSym1(..), FoldlSym2(..), FoldlSym3, sFoldl)-import Data.Singletons.TH-import GHC.Base.Singletons- hiding (Foldr, FoldrSym0, FoldrSym1, FoldrSym2, FoldrSym3, sFoldr)-import GHC.Num.Singletons-import GHC.TypeLits.Singletons.Internal--type Endo :: Type -> Type-newtype Endo a = Endo (a ~> a)-type SEndo :: Endo a -> Type-data SEndo e where- SEndo :: Sing x -> SEndo ('Endo x)-type instance Sing = SEndo-type EndoSym0 :: (a ~> a) ~> Endo a-data EndoSym0 tf-type instance Apply EndoSym0 x = 'Endo x--$(singletonsOnly [d|- appEndo :: Endo a -> (a -> a)- appEndo (Endo x) = x-- instance Semigroup (Endo a) where- Endo x <> Endo y = Endo (x . y)-- instance Monoid (Endo a) where- mempty = Endo id- |])--$(singletons [d|- newtype MaxInternal a = MaxInternal { getMaxInternal :: Maybe a }- newtype MinInternal a = MinInternal { getMinInternal :: Maybe a }- |])--$(singletonsOnly [d|- instance Ord a => Semigroup (MaxInternal a) where- m <> MaxInternal Nothing = m- MaxInternal Nothing <> n = n- (MaxInternal m@(Just x)) <> (MaxInternal n@(Just y))- = if x >= y then MaxInternal m else MaxInternal n-- instance Ord a => Monoid (MaxInternal a) where- mempty = MaxInternal Nothing-- instance Ord a => Semigroup (MinInternal a) where- m <> MinInternal Nothing = m- MinInternal Nothing <> n = n- (MinInternal m@(Just x)) <> (MinInternal n@(Just y))- = if x <= y then MinInternal m else MinInternal n-- instance Ord a => Monoid (MinInternal a) where- mempty = MinInternal Nothing- |])--$(singletonsOnly [d|- -- -| Data structures that can be folded.- --- -- For example, given a data type- --- -- > data Tree a = Empty | Leaf a | Node (Tree a) a (Tree a)- --- -- a suitable instance would be- --- -- > instance Foldable Tree where- -- > foldMap f Empty = mempty- -- > foldMap f (Leaf x) = f x- -- > foldMap f (Node l k r) = foldMap f l `mappend` f k `mappend` foldMap f r- --- -- This is suitable even for abstract types, as the monoid is assumed- -- to satisfy the monoid laws. Alternatively, one could define @foldr@:- --- -- > instance Foldable Tree where- -- > foldr f z Empty = z- -- > foldr f z (Leaf x) = f x z- -- > foldr f z (Node l k r) = foldr f (f k (foldr f z r)) l- --- -- @Foldable@ instances are expected to satisfy the following laws:- --- -- > foldr f z t = appEndo (foldMap (Endo . f) t ) z- --- -- > foldl f z t = appEndo (getDual (foldMap (Dual . Endo . flip f) t)) z- --- -- > fold = foldMap id- --- -- > length = getSum . foldMap (Sum . const 1)- --- -- @sum@, @product@, @maximum@, and @minimum@ should all be essentially- -- equivalent to @foldMap@ forms, such as- --- -- > sum = getSum . foldMap Sum- --- -- but may be less defined.- --- -- If the type is also a 'Functor' instance, it should satisfy- --- -- > foldMap f = fold . fmap f- --- -- which implies that- --- -- > foldMap f . fmap g = foldMap (f . g)-- class Foldable t where- -- {-# MINIMAL foldMap | foldr #-}-- -- -| Combine the elements of a structure using a monoid.- fold :: Monoid m => t m -> m- fold = foldMap id-- -- -| Map each element of the structure to a monoid,- -- and combine the results.- foldMap :: Monoid m => (a -> m) -> t a -> m- foldMap f = foldr (mappend . f) mempty-- -- -| Right-associative fold of a structure.- --- -- In the case of lists, 'foldr', when applied to a binary operator, a- -- starting value (typically the right-identity of the operator), and a- -- list, reduces the list using the binary operator, from right to left:- --- -- > foldr f z [x1, x2, ..., xn] == x1 `f` (x2 `f` ... (xn `f` z)...)- --- -- Note that, since the head of the resulting expression is produced by- -- an application of the operator to the first element of the list,- -- 'foldr' can produce a terminating expression from an infinite list.- --- -- For a general 'Foldable' structure this should be semantically identical- -- to,- --- -- @foldr f z = 'List.foldr' f z . 'toList'@- --- foldr :: (a -> b -> b) -> b -> t a -> b- foldr f z t = appEndo (foldMap (Endo . f) t) z-- -- -| Right-associative fold of a structure, but with strict application of- -- the operator.- --- foldr' :: (a -> b -> b) -> b -> t a -> b- foldr' f z0 xs = foldl f' id xs z0- where f' k x z = k $! f x z-- -- -| Left-associative fold of a structure.- --- -- In the case of lists, 'foldl', when applied to a binary- -- operator, a starting value (typically the left-identity of the operator),- -- and a list, reduces the list using the binary operator, from left to- -- right:- --- -- > foldl f z [x1, x2, ..., xn] == (...((z `f` x1) `f` x2) `f`...) `f` xn- --- -- Note that to produce the outermost application of the operator the- -- entire input list must be traversed. This means that 'foldl'' will- -- diverge if given an infinite list.- --- -- Also note that if you want an efficient left-fold, you probably want to- -- use 'foldl'' instead of 'foldl'. The reason for this is that latter does- -- not force the "inner" results (e.g. @z `f` x1@ in the above example)- -- before applying them to the operator (e.g. to @(`f` x2)@). This results- -- in a thunk chain @O(n)@ elements long, which then must be evaluated from- -- the outside-in.- --- -- For a general 'Foldable' structure this should be semantically identical- -- to,- --- -- @foldl f z = 'List.foldl' f z . 'toList'@- --- foldl :: (b -> a -> b) -> b -> t a -> b- foldl f z t = appEndo (getDual (foldMap (Dual . Endo . flip f) t)) z- -- There's no point mucking around with coercions here,- -- because flip forces us to build a new function anyway.-- -- -| Left-associative fold of a structure but with strict application of- -- the operator.- --- -- This ensures that each step of the fold is forced to weak head normal- -- form before being applied, avoiding the collection of thunks that would- -- otherwise occur. This is often what you want to strictly reduce a finite- -- list to a single, monolithic result (e.g. 'length').- --- -- For a general 'Foldable' structure this should be semantically identical- -- to,- --- -- @foldl f z = 'List.foldl'' f z . 'toList'@- --- foldl' :: (b -> a -> b) -> b -> t a -> b- foldl' f z0 xs = foldr f' id xs z0- where f' x k z = k $! f z x-- -- -| A variant of 'foldr' that has no base case,- -- and thus may only be applied to non-empty structures.- --- -- @'foldr1' f = 'List.foldr1' f . 'toList'@- foldr1 :: (a -> a -> a) -> t a -> a- foldr1 f xs = fromMaybe (errorWithoutStackTrace "foldr1: empty structure")- (foldr mf Nothing xs)- where- mf x m = Just (case m of- Nothing -> x- Just y -> f x y)-- -- -| A variant of 'foldl' that has no base case,- -- and thus may only be applied to non-empty structures.- --- -- @'foldl1' f = 'List.foldl1' f . 'toList'@- foldl1 :: (a -> a -> a) -> t a -> a- foldl1 f xs = fromMaybe (errorWithoutStackTrace "foldl1: empty structure")- (foldl mf Nothing xs)- where- mf m y = Just (case m of- Nothing -> y- Just x -> f x y)-- -- -| List of elements of a structure, from left to right.- toList :: t a -> [a]- toList = foldr (:) []-- -- -| Test whether the structure is empty. The default implementation is- -- optimized for structures that are similar to cons-lists, because there- -- is no general way to do better.- null :: t a -> Bool- null = foldr (\_ _ -> False) True-- -- -| Returns the size/length of a finite structure as an 'Int'. The- -- default implementation is optimized for structures that are similar to- -- cons-lists, because there is no general way to do better.- length :: t a -> Natural- length = foldl' (\c _ -> c+1) 0-- -- -| Does the element occur in the structure?- elem :: Eq a => a -> t a -> Bool- elem = any . (==)-- -- -| The largest element of a non-empty structure.- maximum :: forall a . Ord a => t a -> a- maximum = fromMaybe (errorWithoutStackTrace "maximum: empty structure") .- getMaxInternal . foldMap (MaxInternal . mkJust)- where- mkJust :: a -> Maybe a- mkJust = Just-- -- -| The least element of a non-empty structure.- minimum :: forall a . Ord a => t a -> a- minimum = fromMaybe (errorWithoutStackTrace "minimum: empty structure") .- getMinInternal . foldMap (MinInternal . mkJust)- where- mkJust :: a -> Maybe a- mkJust = Just-- -- -| The 'sum' function computes the sum of the numbers of a structure.- sum :: Num a => t a -> a- sum = getSum . foldMap sum_-- -- -| The 'product' function computes the product of the numbers of a- -- structure.- product :: Num a => t a -> a- product = getProduct . foldMap product_-- -- instances for Prelude types-- instance Foldable Maybe where- foldMap = maybe_ mempty-- foldr _ z Nothing = z- foldr f z (Just x) = f x z-- foldl _ z Nothing = z- foldl f z (Just x) = f z x-- instance Foldable [] where- elem = listelem- foldl = listfoldl- foldl' = listfoldl'- foldl1 = listfoldl1- foldr = listfoldr- foldr1 = listfoldr1- length = listlength- maximum = listmaximum- minimum = listminimum- null = listnull- product = listproduct- sum = listsum- toList = id-- instance Foldable NonEmpty where- foldr f z (a :| as) = f a (listfoldr f z as)- foldl f z (a :| as) = listfoldl f (f z a) as- foldl1 f (a :| as) = listfoldl f a as-- -- GHC isn't clever enough to transform the default definition- -- into anything like this, so we'd end up shuffling a bunch of- -- Maybes around.- foldr1 f (p :| ps) = foldr go id ps p- where- go x r prev = f prev (r x)-- -- We used to say- --- -- length (_ :| as) = 1 + length as- --- -- but the default definition is better, counting from 1.- --- -- The default definition also works great for null and foldl'.- -- As usual for cons lists, foldr' is basically hopeless.-- foldMap f (a :| as) = f a `mappend` foldMap f as- fold (m :| ms) = m `mappend` fold ms- toList (a :| as) = a : as-- instance Foldable (Either a) where- foldMap _ (Left _) = mempty- foldMap f (Right y) = f y-- foldr _ z (Left _) = z- foldr f z (Right y) = f y z-- length (Left _) = 0- length (Right _) = 1-- null = isLeft-- instance Foldable Proxy where- foldMap _ _ = mempty- fold _ = mempty- foldr _ z _ = z- foldl _ z _ = z- foldl1 _ _ = errorWithoutStackTrace "foldl1: Proxy"- foldr1 _ _ = errorWithoutStackTrace "foldr1: Proxy"-- -- Why do we give length (and null) an instance signature here? If we- -- didn't, singletons-th would generate one for us when singling it:- --- -- instance SFoldable Proxy where- -- sLength :: forall a (x :: Proxy a). Sing x -> Sing (Length x)- -- sLength = ...- --- -- If you squint, you'll notice that that instance signature is actually- -- /too/ general. This is because GHC will infer that `a` should be- -- kind-polymorphic, but Length is only defined when `a` is of kind- -- `Type`! Ugh. To force GHC to come to its senses, we explicitly inform- -- it that `a :: Type` through our own instance signature.- length :: forall (a :: Type). Proxy a -> Natural- length _ = 0-- null :: forall (a :: Type). Proxy a -> Bool- null _ = True-- elem _ _ = False- sum _ = 0- product _ = 1-- instance Foldable Dual where- foldMap f (Dual x) = f x-- elem = (. getDual) . (==)- foldl f z (Dual x) = f z x- foldl' f z (Dual x) = f z x- foldl1 _ = getDual- foldr f z (Dual x) = f x z- foldr' = foldr- foldr1 _ = getDual- length _ = 1- maximum = getDual- minimum = getDual- null _ = False- product = getDual- sum = getDual- toList (Dual x) = [x]-- instance Foldable Monoid.Sum where- foldMap f (Monoid.Sum x) = f x-- elem = (. getSum) . (==)- foldl f z (Monoid.Sum x) = f z x- foldl' f z (Monoid.Sum x) = f z x- foldl1 _ = getSum- foldr f z (Monoid.Sum x) = f x z- foldr' = foldr- foldr1 _ = getSum- length _ = 1- maximum = getSum- minimum = getSum- null _ = False- product = getSum- sum = getSum- toList (Monoid.Sum x) = [x]-- instance Foldable Monoid.Product where- foldMap f (Monoid.Product x) = f x-- elem = (. getProduct) . (==)- foldl f z (Monoid.Product x) = f z x- foldl' f z (Monoid.Product x) = f z x- foldl1 _ = getProduct- foldr f z (Monoid.Product x) = f x z- foldr' = foldr- foldr1 _ = getProduct- length _ = 1- maximum = getProduct- minimum = getProduct- null _ = False- product = getProduct- sum = getProduct- toList (Monoid.Product x) = [x]-- -- -| Monadic fold over the elements of a structure,- -- associating to the right, i.e. from right to left.- foldrM :: (Foldable t, Monad m) => (a -> b -> m b) -> b -> t a -> m b- foldrM f z0 xs = foldl f' return xs z0- where f' k x z = f x z >>= k-- -- -| Monadic fold over the elements of a structure,- -- associating to the left, i.e. from left to right.- foldlM :: (Foldable t, Monad m) => (b -> a -> m b) -> b -> t a -> m b- foldlM f z0 xs = foldr f' return xs z0- where f' x k z = f z x >>= k-- -- -| Map each element of a structure to an action, evaluate these- -- actions from left to right, and ignore the results. For a version- -- that doesn't ignore the results see 'Data.Traversable.traverse'.- traverse_ :: (Foldable t, Applicative f) => (a -> f b) -> t a -> f ()- traverse_ f = foldr ((*>) . f) (pure ())-- -- -| 'for_' is 'traverse_' with its arguments flipped. For a version- -- that doesn't ignore the results see 'Data.Traversable.for'.- --- -- >>> for_ [1..4] print- -- 1- -- 2- -- 3- -- 4- for_ :: (Foldable t, Applicative f) => t a -> (a -> f b) -> f ()- for_ = flip traverse_-- -- -| Map each element of a structure to a monadic action, evaluate- -- these actions from left to right, and ignore the results. For a- -- version that doesn't ignore the results see- -- 'Data.Traversable.mapM'.- --- -- As of base 4.8.0.0, 'mapM_' is just 'traverse_', specialized to- -- 'Monad'.- mapM_ :: (Foldable t, Monad m) => (a -> m b) -> t a -> m ()- mapM_ f= foldr ((>>) . f) (return ())-- -- -| 'forM_' is 'mapM_' with its arguments flipped. For a version that- -- doesn't ignore the results see 'Data.Traversable.forM'.- --- -- As of base 4.8.0.0, 'forM_' is just 'for_', specialized to 'Monad'.- forM_ :: (Foldable t, Monad m) => t a -> (a -> m b) -> m ()- forM_ = flip mapM_-- -- -| Evaluate each action in the structure from left to right, and- -- ignore the results. For a version that doesn't ignore the results- -- see 'Data.Traversable.sequenceA'.- sequenceA_ :: (Foldable t, Applicative f) => t (f a) -> f ()- sequenceA_ = foldr (*>) (pure ())-- -- -| Evaluate each monadic action in the structure from left to right,- -- and ignore the results. For a version that doesn't ignore the- -- results see 'Data.Traversable.sequence'.- --- -- As of base 4.8.0.0, 'sequence_' is just 'sequenceA_', specialized- -- to 'Monad'.- sequence_ :: (Foldable t, Monad m) => t (m a) -> m ()- sequence_ = foldr (>>) (return ())-- -- -| The sum of a collection of actions, generalizing 'concat'.- --- -- asum [Just "Hello", Nothing, Just "World"]- -- Just "Hello"- asum :: (Foldable t, Alternative f) => t (f a) -> f a- asum = foldr (<|>) empty-- -- -| The sum of a collection of actions, generalizing 'concat'.- -- As of base 4.8.0.0, 'msum' is just 'asum', specialized to 'MonadPlus'.- msum :: (Foldable t, MonadPlus m) => t (m a) -> m a- msum = asum-- -- -| The concatenation of all the elements of a container of lists.- concat :: Foldable t => t [a] -> [a]- concat xs = foldr (\x y -> foldr (:) y x) [] xs-- -- -| Map a function over all the elements of a container and concatenate- -- the resulting lists.- concatMap :: Foldable t => (a -> [b]) -> t a -> [b]- concatMap f xs = foldr (\x b -> foldr (:) b (f x)) [] xs-- -- These use foldr rather than foldMap to avoid repeated concatenation.-- -- -| 'and' returns the conjunction of a container of Bools. For the- -- result to be 'True', the container must be finite; 'False', however,- -- results from a 'False' value finitely far from the left end.- and :: Foldable t => t Bool -> Bool- and = getAll . foldMap all_-- -- -| 'or' returns the disjunction of a container of Bools. For the- -- result to be 'False', the container must be finite; 'True', however,- -- results from a 'True' value finitely far from the left end.- or :: Foldable t => t Bool -> Bool- or = getAny . foldMap any_-- -- -| Determines whether any element of the structure satisfies the predicate.- any :: Foldable t => (a -> Bool) -> t a -> Bool- any p = getAny . foldMap (any_ . p)-- -- -| Determines whether all elements of the structure satisfy the predicate.- all :: Foldable t => (a -> Bool) -> t a -> Bool- all p = getAll . foldMap (all_ . p)-- -- -| The largest element of a non-empty structure with respect to the- -- given comparison function.-- -- See Note [maximumBy/minimumBy space usage]- maximumBy :: Foldable t => (a -> a -> Ordering) -> t a -> a- maximumBy cmp = foldl1 max'- where max' x y = case cmp x y of- GT -> x- LT -> y- EQ -> y-- -- -| The least element of a non-empty structure with respect to the- -- given comparison function.-- -- See Note [maximumBy/minimumBy space usage]- minimumBy :: Foldable t => (a -> a -> Ordering) -> t a -> a- minimumBy cmp = foldl1 min'- where min' x y = case cmp x y of- GT -> y- LT -> x- EQ -> x-- -- -| 'notElem' is the negation of 'elem'.- notElem :: (Foldable t, Eq a) => a -> t a -> Bool- notElem x = not . elem x-- -- -| The 'find' function takes a predicate and a structure and returns- -- the leftmost element of the structure matching the predicate, or- -- 'Nothing' if there is no such element.- find :: Foldable t => (a -> Bool) -> t a -> Maybe a- find p = getFirst . foldMap (\ x -> First (if p x then Just x else Nothing))- |])--$(singletonsOnly [d|- -- instances for Prelude types (part 2)-- deriving instance Foldable ((,) a)- deriving instance Foldable First- deriving instance Foldable Last- |])+{-# LANGUAGE DataKinds #-} +{-# LANGUAGE DefaultSignatures #-} +{-# LANGUAGE NoNamedWildCards #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE UndecidableInstances #-} + +----------------------------------------------------------------------------- +-- | +-- Module : Data.Foldable.Singletons +-- Copyright : (C) 2018 Ryan Scott +-- License : BSD-style (see LICENSE) +-- Maintainer : Ryan Scott +-- Stability : experimental +-- Portability : non-portable +-- +-- Defines the promoted and singled versions of the 'Foldable' type class. +-- +---------------------------------------------------------------------------- + +module Data.Foldable.Singletons ( + PFoldable(..), SFoldable(..), + + FoldrM, sFoldrM, + FoldlM, sFoldlM, + + Traverse_, sTraverse_, + For_, sFor_, + SequenceA_, sSequenceA_, + Asum, sAsum, + + MapM_, sMapM_, + ForM_, sForM_, + Sequence_, sSequence_, + Msum, sMsum, + + Concat, sConcat, + ConcatMap, sConcatMap, + And, sAnd, + Or, sOr, + Any, sAny, + All, sAll, + MaximumBy, sMaximumBy, + MinimumBy, sMinimumBy, + + NotElem, sNotElem, + Find, sFind, + + -- * Defunctionalization symbols + FoldSym0, FoldSym1, + FoldMapSym0, FoldMapSym1, FoldMapSym2, + FoldrSym0, FoldrSym1, FoldrSym2, FoldrSym3, + Foldr'Sym0, Foldr'Sym1, Foldr'Sym2, Foldr'Sym3, + FoldlSym0, FoldlSym1, FoldlSym2, FoldlSym3, + Foldl'Sym0, Foldl'Sym1, Foldl'Sym2, Foldl'Sym3, + Foldr1Sym0, Foldr1Sym1, Foldr1Sym2, + Foldl1Sym0, Foldl1Sym1, Foldl1Sym2, + ToListSym0, ToListSym1, + NullSym0, NullSym1, + LengthSym0, LengthSym1, + ElemSym0, ElemSym1, ElemSym2, + MaximumSym0, MaximumSym1, + MinimumSym0, MinimumSym1, + SumSym0, SumSym1, + ProductSym0, ProductSym1, + + FoldrMSym0, FoldrMSym1, FoldrMSym2, FoldrMSym3, + FoldlMSym0, FoldlMSym1, FoldlMSym2, FoldlMSym3, + + Traverse_Sym0, Traverse_Sym1, Traverse_Sym2, + For_Sym0, For_Sym1, For_Sym2, + SequenceA_Sym0, SequenceA_Sym1, + AsumSym0, AsumSym1, + + MapM_Sym0, MapM_Sym1, MapM_Sym2, + ForM_Sym0, ForM_Sym1, ForM_Sym2, + Sequence_Sym0, Sequence_Sym1, + MsumSym0, MsumSym1, + + ConcatSym0, ConcatSym1, + ConcatMapSym0, ConcatMapSym1, ConcatMapSym2, + AndSym0, AndSym1, + OrSym0, OrSym1, + AnySym0, AnySym1, AnySym2, + AllSym0, AllSym1, AllSym2, + MaximumBySym0, MaximumBySym1, MaximumBySym2, + MinimumBySym0, MinimumBySym1, MinimumBySym2, + + NotElemSym0, NotElemSym1, NotElemSym2, + FindSym0, FindSym1, FindSym2 + ) where + +import Control.Applicative +import Control.Monad +import Control.Monad.Singletons.Internal +import Data.Bool.Singletons +import Data.Either.Singletons +import Data.Eq.Singletons +import Data.Kind +import Data.List.NonEmpty (NonEmpty(..)) +import Data.List.Singletons.Internal.Disambiguation +import Data.Maybe.Singletons +import Data.Monoid hiding (All(..), Any(..), Endo(..), Product(..), Sum(..)) +import Data.Monoid.Singletons + hiding ( AllSym0, AllSym1 + , AnySym0, AnySym1 + , ProductSym0, ProductSym1 + , SumSym0, SumSym1 ) +import qualified Data.Monoid as Monoid (Product(..), Sum(..)) +import Data.Ord.Singletons + hiding ( Max, MaxSym0, MaxSym1, MaxSym2, sMax + , Min, MinSym0, MinSym1, MinSym2, sMin ) +import Data.Semigroup.Singletons.Internal.Classes +import Data.Semigroup.Singletons.Internal.Disambiguation +import Data.Singletons +import Data.Singletons.Base.Instances + hiding (Foldl, FoldlSym0(..), FoldlSym1(..), FoldlSym2(..), FoldlSym3, sFoldl) +import Data.Singletons.TH +import GHC.Base.Singletons + hiding (Foldr, FoldrSym0, FoldrSym1, FoldrSym2, FoldrSym3, sFoldr) +import GHC.Num.Singletons +import GHC.TypeLits.Singletons.Internal + +type Endo :: Type -> Type +newtype Endo a = Endo (a ~> a) +type SEndo :: Endo a -> Type +data SEndo e where + SEndo :: Sing x -> SEndo ('Endo x) +type instance Sing = SEndo +type EndoSym0 :: (a ~> a) ~> Endo a +data EndoSym0 tf +type instance Apply EndoSym0 x = 'Endo x + +$(singletonsOnly [d| + appEndo :: Endo a -> (a -> a) + appEndo (Endo x) = x + + instance Semigroup (Endo a) where + Endo x <> Endo y = Endo (x . y) + + instance Monoid (Endo a) where + mempty = Endo id + |]) + +$(singletons [d| + newtype MaxInternal a = MaxInternal { getMaxInternal :: Maybe a } + newtype MinInternal a = MinInternal { getMinInternal :: Maybe a } + |]) + +$(singletonsOnly [d| + instance Ord a => Semigroup (MaxInternal a) where + m <> MaxInternal Nothing = m + MaxInternal Nothing <> n = n + (MaxInternal m@(Just x)) <> (MaxInternal n@(Just y)) + = if x >= y then MaxInternal m else MaxInternal n + + instance Ord a => Monoid (MaxInternal a) where + mempty = MaxInternal Nothing + + instance Ord a => Semigroup (MinInternal a) where + m <> MinInternal Nothing = m + MinInternal Nothing <> n = n + (MinInternal m@(Just x)) <> (MinInternal n@(Just y)) + = if x <= y then MinInternal m else MinInternal n + + instance Ord a => Monoid (MinInternal a) where + mempty = MinInternal Nothing + |]) + +$(singletonsOnly [d| + -- -| Data structures that can be folded. + -- + -- For example, given a data type + -- + -- > data Tree a = Empty | Leaf a | Node (Tree a) a (Tree a) + -- + -- a suitable instance would be + -- + -- > instance Foldable Tree where + -- > foldMap f Empty = mempty + -- > foldMap f (Leaf x) = f x + -- > foldMap f (Node l k r) = foldMap f l `mappend` f k `mappend` foldMap f r + -- + -- This is suitable even for abstract types, as the monoid is assumed + -- to satisfy the monoid laws. Alternatively, one could define @foldr@: + -- + -- > instance Foldable Tree where + -- > foldr f z Empty = z + -- > foldr f z (Leaf x) = f x z + -- > foldr f z (Node l k r) = foldr f (f k (foldr f z r)) l + -- + -- @Foldable@ instances are expected to satisfy the following laws: + -- + -- > foldr f z t = appEndo (foldMap (Endo . f) t ) z + -- + -- > foldl f z t = appEndo (getDual (foldMap (Dual . Endo . flip f) t)) z + -- + -- > fold = foldMap id + -- + -- > length = getSum . foldMap (Sum . const 1) + -- + -- @sum@, @product@, @maximum@, and @minimum@ should all be essentially + -- equivalent to @foldMap@ forms, such as + -- + -- > sum = getSum . foldMap Sum + -- + -- but may be less defined. + -- + -- If the type is also a 'Functor' instance, it should satisfy + -- + -- > foldMap f = fold . fmap f + -- + -- which implies that + -- + -- > foldMap f . fmap g = foldMap (f . g) + + class Foldable t where + -- {-# MINIMAL foldMap | foldr #-} + + -- -| Combine the elements of a structure using a monoid. + fold :: Monoid m => t m -> m + fold = foldMap id + + -- -| Map each element of the structure to a monoid, + -- and combine the results. + foldMap :: Monoid m => (a -> m) -> t a -> m + foldMap f = foldr (mappend . f) mempty + + -- -| Right-associative fold of a structure. + -- + -- In the case of lists, 'foldr', when applied to a binary operator, a + -- starting value (typically the right-identity of the operator), and a + -- list, reduces the list using the binary operator, from right to left: + -- + -- > foldr f z [x1, x2, ..., xn] == x1 `f` (x2 `f` ... (xn `f` z)...) + -- + -- Note that, since the head of the resulting expression is produced by + -- an application of the operator to the first element of the list, + -- 'foldr' can produce a terminating expression from an infinite list. + -- + -- For a general 'Foldable' structure this should be semantically identical + -- to, + -- + -- @foldr f z = 'List.foldr' f z . 'toList'@ + -- + foldr :: (a -> b -> b) -> b -> t a -> b + foldr f z t = appEndo (foldMap (Endo . f) t) z + + -- -| Right-associative fold of a structure, but with strict application of + -- the operator. + -- + foldr' :: (a -> b -> b) -> b -> t a -> b + foldr' f z0 xs = foldl f' id xs z0 + where f' k x z = k $! f x z + + -- -| Left-associative fold of a structure. + -- + -- In the case of lists, 'foldl', when applied to a binary + -- operator, a starting value (typically the left-identity of the operator), + -- and a list, reduces the list using the binary operator, from left to + -- right: + -- + -- > foldl f z [x1, x2, ..., xn] == (...((z `f` x1) `f` x2) `f`...) `f` xn + -- + -- Note that to produce the outermost application of the operator the + -- entire input list must be traversed. This means that 'foldl'' will + -- diverge if given an infinite list. + -- + -- Also note that if you want an efficient left-fold, you probably want to + -- use 'foldl'' instead of 'foldl'. The reason for this is that latter does + -- not force the "inner" results (e.g. @z `f` x1@ in the above example) + -- before applying them to the operator (e.g. to @(`f` x2)@). This results + -- in a thunk chain @O(n)@ elements long, which then must be evaluated from + -- the outside-in. + -- + -- For a general 'Foldable' structure this should be semantically identical + -- to, + -- + -- @foldl f z = 'List.foldl' f z . 'toList'@ + -- + foldl :: (b -> a -> b) -> b -> t a -> b + foldl f z t = appEndo (getDual (foldMap (Dual . Endo . flip f) t)) z + -- There's no point mucking around with coercions here, + -- because flip forces us to build a new function anyway. + + -- -| Left-associative fold of a structure but with strict application of + -- the operator. + -- + -- This ensures that each step of the fold is forced to weak head normal + -- form before being applied, avoiding the collection of thunks that would + -- otherwise occur. This is often what you want to strictly reduce a finite + -- list to a single, monolithic result (e.g. 'length'). + -- + -- For a general 'Foldable' structure this should be semantically identical + -- to, + -- + -- @foldl f z = 'List.foldl'' f z . 'toList'@ + -- + foldl' :: (b -> a -> b) -> b -> t a -> b + foldl' f z0 xs = foldr f' id xs z0 + where f' x k z = k $! f z x + + -- -| A variant of 'foldr' that has no base case, + -- and thus may only be applied to non-empty structures. + -- + -- @'foldr1' f = 'List.foldr1' f . 'toList'@ + foldr1 :: (a -> a -> a) -> t a -> a + foldr1 f xs = fromMaybe (errorWithoutStackTrace "foldr1: empty structure") + (foldr mf Nothing xs) + where + mf x m = Just (case m of + Nothing -> x + Just y -> f x y) + + -- -| A variant of 'foldl' that has no base case, + -- and thus may only be applied to non-empty structures. + -- + -- @'foldl1' f = 'List.foldl1' f . 'toList'@ + foldl1 :: (a -> a -> a) -> t a -> a + foldl1 f xs = fromMaybe (errorWithoutStackTrace "foldl1: empty structure") + (foldl mf Nothing xs) + where + mf m y = Just (case m of + Nothing -> y + Just x -> f x y) + + -- -| List of elements of a structure, from left to right. + toList :: t a -> [a] + toList = foldr (:) [] + + -- -| Test whether the structure is empty. The default implementation is + -- optimized for structures that are similar to cons-lists, because there + -- is no general way to do better. + null :: t a -> Bool + null = foldr (\_ _ -> False) True + + -- -| Returns the size/length of a finite structure as an 'Int'. The + -- default implementation is optimized for structures that are similar to + -- cons-lists, because there is no general way to do better. + length :: t a -> Natural + length = foldl' (\c _ -> c+1) 0 + + -- -| Does the element occur in the structure? + elem :: Eq a => a -> t a -> Bool + elem = any . (==) + + -- -| The largest element of a non-empty structure. + maximum :: forall a . Ord a => t a -> a + maximum = fromMaybe (errorWithoutStackTrace "maximum: empty structure") . + getMaxInternal . foldMap (MaxInternal . mkJust) + where + mkJust :: a -> Maybe a + mkJust = Just + + -- -| The least element of a non-empty structure. + minimum :: forall a . Ord a => t a -> a + minimum = fromMaybe (errorWithoutStackTrace "minimum: empty structure") . + getMinInternal . foldMap (MinInternal . mkJust) + where + mkJust :: a -> Maybe a + mkJust = Just + + -- -| The 'sum' function computes the sum of the numbers of a structure. + sum :: Num a => t a -> a + sum = getSum . foldMap sum_ + + -- -| The 'product' function computes the product of the numbers of a + -- structure. + product :: Num a => t a -> a + product = getProduct . foldMap product_ + + -- instances for Prelude types + + instance Foldable Maybe where + foldMap = maybe_ mempty + + foldr _ z Nothing = z + foldr f z (Just x) = f x z + + foldl _ z Nothing = z + foldl f z (Just x) = f z x + + instance Foldable [] where + elem = listelem + foldl = listfoldl + foldl' = listfoldl' + foldl1 = listfoldl1 + foldr = listfoldr + foldr1 = listfoldr1 + length = listlength + maximum = listmaximum + minimum = listminimum + null = listnull + product = listproduct + sum = listsum + toList = id + + instance Foldable NonEmpty where + foldr f z (a :| as) = f a (listfoldr f z as) + foldl f z (a :| as) = listfoldl f (f z a) as + foldl1 f (a :| as) = listfoldl f a as + + -- GHC isn't clever enough to transform the default definition + -- into anything like this, so we'd end up shuffling a bunch of + -- Maybes around. + foldr1 f (p :| ps) = foldr go id ps p + where + go x r prev = f prev (r x) + + -- We used to say + -- + -- length (_ :| as) = 1 + length as + -- + -- but the default definition is better, counting from 1. + -- + -- The default definition also works great for null and foldl'. + -- As usual for cons lists, foldr' is basically hopeless. + + foldMap f (a :| as) = f a `mappend` foldMap f as + fold (m :| ms) = m `mappend` fold ms + toList (a :| as) = a : as + + instance Foldable (Either a) where + foldMap _ (Left _) = mempty + foldMap f (Right y) = f y + + foldr _ z (Left _) = z + foldr f z (Right y) = f y z + + length (Left _) = 0 + length (Right _) = 1 + + null = isLeft + + instance Foldable Proxy where + foldMap _ _ = mempty + fold _ = mempty + foldr _ z _ = z + foldl _ z _ = z + foldl1 _ _ = errorWithoutStackTrace "foldl1: Proxy" + foldr1 _ _ = errorWithoutStackTrace "foldr1: Proxy" + + -- Why do we give length (and null) an instance signature here? If we + -- didn't, singletons-th would generate one for us when singling it: + -- + -- instance SFoldable Proxy where + -- sLength :: forall a (x :: Proxy a). Sing x -> Sing (Length x) + -- sLength = ... + -- + -- If you squint, you'll notice that that instance signature is actually + -- /too/ general. This is because GHC will infer that `a` should be + -- kind-polymorphic, but Length is only defined when `a` is of kind + -- `Type`! Ugh. To force GHC to come to its senses, we explicitly inform + -- it that `a :: Type` through our own instance signature. + length :: forall (a :: Type). Proxy a -> Natural + length _ = 0 + + null :: forall (a :: Type). Proxy a -> Bool + null _ = True + + elem _ _ = False + sum _ = 0 + product _ = 1 + + instance Foldable Dual where + foldMap f (Dual x) = f x + + elem = (. getDual) . (==) + foldl f z (Dual x) = f z x + foldl' f z (Dual x) = f z x + foldl1 _ = getDual + foldr f z (Dual x) = f x z + foldr' = foldr + foldr1 _ = getDual + length _ = 1 + maximum = getDual + minimum = getDual + null _ = False + product = getDual + sum = getDual + toList (Dual x) = [x] + + instance Foldable Monoid.Sum where + foldMap f (Monoid.Sum x) = f x + + elem = (. getSum) . (==) + foldl f z (Monoid.Sum x) = f z x + foldl' f z (Monoid.Sum x) = f z x + foldl1 _ = getSum + foldr f z (Monoid.Sum x) = f x z + foldr' = foldr + foldr1 _ = getSum + length _ = 1 + maximum = getSum + minimum = getSum + null _ = False + product = getSum + sum = getSum + toList (Monoid.Sum x) = [x] + + instance Foldable Monoid.Product where + foldMap f (Monoid.Product x) = f x + + elem = (. getProduct) . (==) + foldl f z (Monoid.Product x) = f z x + foldl' f z (Monoid.Product x) = f z x + foldl1 _ = getProduct + foldr f z (Monoid.Product x) = f x z + foldr' = foldr + foldr1 _ = getProduct + length _ = 1 + maximum = getProduct + minimum = getProduct + null _ = False + product = getProduct + sum = getProduct + toList (Monoid.Product x) = [x] + + -- -| Monadic fold over the elements of a structure, + -- associating to the right, i.e. from right to left. + foldrM :: (Foldable t, Monad m) => (a -> b -> m b) -> b -> t a -> m b + foldrM f z0 xs = foldl f' return xs z0 + where f' k x z = f x z >>= k + + -- -| Monadic fold over the elements of a structure, + -- associating to the left, i.e. from left to right. + foldlM :: (Foldable t, Monad m) => (b -> a -> m b) -> b -> t a -> m b + foldlM f z0 xs = foldr f' return xs z0 + where f' x k z = f z x >>= k + + -- -| Map each element of a structure to an action, evaluate these + -- actions from left to right, and ignore the results. For a version + -- that doesn't ignore the results see 'Data.Traversable.traverse'. + traverse_ :: (Foldable t, Applicative f) => (a -> f b) -> t a -> f () + traverse_ f = foldr ((*>) . f) (pure ()) + + -- -| 'for_' is 'traverse_' with its arguments flipped. For a version + -- that doesn't ignore the results see 'Data.Traversable.for'. + -- + -- >>> for_ [1..4] print + -- 1 + -- 2 + -- 3 + -- 4 + for_ :: (Foldable t, Applicative f) => t a -> (a -> f b) -> f () + for_ = flip traverse_ + + -- -| Map each element of a structure to a monadic action, evaluate + -- these actions from left to right, and ignore the results. For a + -- version that doesn't ignore the results see + -- 'Data.Traversable.mapM'. + -- + -- As of base 4.8.0.0, 'mapM_' is just 'traverse_', specialized to + -- 'Monad'. + mapM_ :: (Foldable t, Monad m) => (a -> m b) -> t a -> m () + mapM_ f= foldr ((>>) . f) (return ()) + + -- -| 'forM_' is 'mapM_' with its arguments flipped. For a version that + -- doesn't ignore the results see 'Data.Traversable.forM'. + -- + -- As of base 4.8.0.0, 'forM_' is just 'for_', specialized to 'Monad'. + forM_ :: (Foldable t, Monad m) => t a -> (a -> m b) -> m () + forM_ = flip mapM_ + + -- -| Evaluate each action in the structure from left to right, and + -- ignore the results. For a version that doesn't ignore the results + -- see 'Data.Traversable.sequenceA'. + sequenceA_ :: (Foldable t, Applicative f) => t (f a) -> f () + sequenceA_ = foldr (*>) (pure ()) + + -- -| Evaluate each monadic action in the structure from left to right, + -- and ignore the results. For a version that doesn't ignore the + -- results see 'Data.Traversable.sequence'. + -- + -- As of base 4.8.0.0, 'sequence_' is just 'sequenceA_', specialized + -- to 'Monad'. + sequence_ :: (Foldable t, Monad m) => t (m a) -> m () + sequence_ = foldr (>>) (return ()) + + -- -| The sum of a collection of actions, generalizing 'concat'. + -- + -- asum [Just "Hello", Nothing, Just "World"] + -- Just "Hello" + asum :: (Foldable t, Alternative f) => t (f a) -> f a + asum = foldr (<|>) empty + + -- -| The sum of a collection of actions, generalizing 'concat'. + -- As of base 4.8.0.0, 'msum' is just 'asum', specialized to 'MonadPlus'. + msum :: (Foldable t, MonadPlus m) => t (m a) -> m a + msum = asum + + -- -| The concatenation of all the elements of a container of lists. + concat :: Foldable t => t [a] -> [a] + concat xs = foldr (\x y -> foldr (:) y x) [] xs + + -- -| Map a function over all the elements of a container and concatenate + -- the resulting lists. + concatMap :: Foldable t => (a -> [b]) -> t a -> [b] + concatMap f xs = foldr (\x b -> foldr (:) b (f x)) [] xs + + -- These use foldr rather than foldMap to avoid repeated concatenation. + + -- -| 'and' returns the conjunction of a container of Bools. For the + -- result to be 'True', the container must be finite; 'False', however, + -- results from a 'False' value finitely far from the left end. + and :: Foldable t => t Bool -> Bool + and = getAll . foldMap all_ + + -- -| 'or' returns the disjunction of a container of Bools. For the + -- result to be 'False', the container must be finite; 'True', however, + -- results from a 'True' value finitely far from the left end. + or :: Foldable t => t Bool -> Bool + or = getAny . foldMap any_ + + -- -| Determines whether any element of the structure satisfies the predicate. + any :: Foldable t => (a -> Bool) -> t a -> Bool + any p = getAny . foldMap (any_ . p) + + -- -| Determines whether all elements of the structure satisfy the predicate. + all :: Foldable t => (a -> Bool) -> t a -> Bool + all p = getAll . foldMap (all_ . p) + + -- -| The largest element of a non-empty structure with respect to the + -- given comparison function. + + -- See Note [maximumBy/minimumBy space usage] + maximumBy :: Foldable t => (a -> a -> Ordering) -> t a -> a + maximumBy cmp = foldl1 max' + where max' x y = case cmp x y of + GT -> x + LT -> y + EQ -> y + + -- -| The least element of a non-empty structure with respect to the + -- given comparison function. + + -- See Note [maximumBy/minimumBy space usage] + minimumBy :: Foldable t => (a -> a -> Ordering) -> t a -> a + minimumBy cmp = foldl1 min' + where min' x y = case cmp x y of + GT -> y + LT -> x + EQ -> x + + -- -| 'notElem' is the negation of 'elem'. + notElem :: (Foldable t, Eq a) => a -> t a -> Bool + notElem x = not . elem x + + -- -| The 'find' function takes a predicate and a structure and returns + -- the leftmost element of the structure matching the predicate, or + -- 'Nothing' if there is no such element. + find :: Foldable t => (a -> Bool) -> t a -> Maybe a + find p = getFirst . foldMap (\ x -> First (if p x then Just x else Nothing)) + |]) + +$(singletonsOnly [d| + -- instances for Prelude types (part 2) + + deriving instance Foldable ((,) a) + deriving instance Foldable First + deriving instance Foldable Last + |])
src/Data/Function/Singletons.hs view
@@ -1,117 +1,117 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE UndecidableInstances #-}---------------------------------------------------------------------------------- |--- Module : Data.Function.Singletons--- Copyright : (C) 2016 Richard Eisenberg--- License : BSD-style (see LICENSE)--- Maintainer : Ryan Scott--- Stability : experimental--- Portability : non-portable------ Defines singleton versions of the definitions in @Data.Function@.------ Because many of these definitions are produced by Template Haskell,--- it is not possible to create proper Haddock documentation. Please look--- up the corresponding operation in @Data.Function@. Also, please excuse--- the apparent repeated variable names. This is due to an interaction--- between Template Haskell and Haddock.----------------------------------------------------------------------------------module Data.Function.Singletons (- -- * "Prelude" re-exports- Id, sId, Const, sConst, type (.), (%.), Flip, sFlip, type ($), (%$)- -- * Other combinators- , type (&), (%&), On, sOn-- -- * Defunctionalization symbols- , IdSym0, IdSym1- , ConstSym0, ConstSym1, ConstSym2- , type (.@#@$), type (.@#@$$), type (.@#@$$$), type (.@#@$$$$)- , FlipSym0, FlipSym1, FlipSym2, FlipSym3- , type ($@#@$), type ($@#@$$), type ($@#@$$$)- , type (&@#@$), type (&@#@$$), type (&@#@$$$)- , OnSym0, OnSym1, OnSym2, OnSym3, OnSym4- ) where--import Data.Singletons.TH-import GHC.Base.Singletons--$(singletonsOnly [d|- {- GHC falls into a loop here. Not really a surprise.-- -- | @'fix' f@ is the least fixed point of the function @f@,- -- i.e. the least defined @x@ such that @f x = x@.- fix :: (a -> a) -> a- fix f = let x = f x in x- -}-- -- -| @(*) \`on\` f = \\x y -> f x * f y@.- --- -- Typical usage: @'Data.List.sortBy' ('compare' \`on\` 'fst')@.- --- -- Algebraic properties:- --- -- -* @(*) \`on\` 'id' = (*)@ (if @(*) ∉ {⊥, 'const' ⊥}@)- --- -- -* @((*) \`on\` f) \`on\` g = (*) \`on\` (f . g)@- --- -- -* @'flip' on f . 'flip' on g = 'flip' on (g . f)@-- -- Proofs (so that I don't have to edit the test-suite):-- -- (*) `on` id- -- =- -- \x y -> id x * id y- -- =- -- \x y -> x * y- -- = { If (*) /= _|_ or const _|_. }- -- (*)-- -- (*) `on` f `on` g- -- =- -- ((*) `on` f) `on` g- -- =- -- \x y -> ((*) `on` f) (g x) (g y)- -- =- -- \x y -> (\x y -> f x * f y) (g x) (g y)- -- =- -- \x y -> f (g x) * f (g y)- -- =- -- \x y -> (f . g) x * (f . g) y- -- =- -- (*) `on` (f . g)- -- =- -- (*) `on` f . g-- -- flip on f . flip on g- -- =- -- (\h (*) -> (*) `on` h) f . (\h (*) -> (*) `on` h) g- -- =- -- (\(*) -> (*) `on` f) . (\(*) -> (*) `on` g)- -- =- -- \(*) -> (*) `on` g `on` f- -- = { See above. }- -- \(*) -> (*) `on` g . f- -- =- -- (\h (*) -> (*) `on` h) (g . f)- -- =- -- flip on (g . f)-- on :: (b -> b -> c) -> (a -> b) -> a -> a -> c- (.*.) `on` f = \x y -> f x .*. f y- infixl 0 `on`-- -- -| '&' is a reverse application operator. This provides notational- -- convenience. Its precedence is one higher than that of the forward- -- application operator '$', which allows '&' to be nested in '$'.- --- -- @since 4.8.0.0- (&) :: a -> (a -> b) -> b- x & f = f x- infixl 1 &- |])+{-# LANGUAGE DataKinds #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE UndecidableInstances #-} + +----------------------------------------------------------------------------- +-- | +-- Module : Data.Function.Singletons +-- Copyright : (C) 2016 Richard Eisenberg +-- License : BSD-style (see LICENSE) +-- Maintainer : Ryan Scott +-- Stability : experimental +-- Portability : non-portable +-- +-- Defines singleton versions of the definitions in @Data.Function@. +-- +-- Because many of these definitions are produced by Template Haskell, +-- it is not possible to create proper Haddock documentation. Please look +-- up the corresponding operation in @Data.Function@. Also, please excuse +-- the apparent repeated variable names. This is due to an interaction +-- between Template Haskell and Haddock. +-- +---------------------------------------------------------------------------- + +module Data.Function.Singletons ( + -- * "Prelude" re-exports + Id, sId, Const, sConst, type (.), (%.), Flip, sFlip, type ($), (%$) + -- * Other combinators + , type (&), (%&), On, sOn + + -- * Defunctionalization symbols + , IdSym0, IdSym1 + , ConstSym0, ConstSym1, ConstSym2 + , type (.@#@$), type (.@#@$$), type (.@#@$$$), type (.@#@$$$$) + , FlipSym0, FlipSym1, FlipSym2, FlipSym3 + , type ($@#@$), type ($@#@$$), type ($@#@$$$) + , type (&@#@$), type (&@#@$$), type (&@#@$$$) + , OnSym0, OnSym1, OnSym2, OnSym3, OnSym4 + ) where + +import Data.Singletons.TH +import GHC.Base.Singletons + +$(singletonsOnly [d| + {- GHC falls into a loop here. Not really a surprise. + + -- | @'fix' f@ is the least fixed point of the function @f@, + -- i.e. the least defined @x@ such that @f x = x@. + fix :: (a -> a) -> a + fix f = let x = f x in x + -} + + -- -| @(*) \`on\` f = \\x y -> f x * f y@. + -- + -- Typical usage: @'Data.List.sortBy' ('compare' \`on\` 'fst')@. + -- + -- Algebraic properties: + -- + -- -* @(*) \`on\` 'id' = (*)@ (if @(*) ∉ {⊥, 'const' ⊥}@) + -- + -- -* @((*) \`on\` f) \`on\` g = (*) \`on\` (f . g)@ + -- + -- -* @'flip' on f . 'flip' on g = 'flip' on (g . f)@ + + -- Proofs (so that I don't have to edit the test-suite): + + -- (*) `on` id + -- = + -- \x y -> id x * id y + -- = + -- \x y -> x * y + -- = { If (*) /= _|_ or const _|_. } + -- (*) + + -- (*) `on` f `on` g + -- = + -- ((*) `on` f) `on` g + -- = + -- \x y -> ((*) `on` f) (g x) (g y) + -- = + -- \x y -> (\x y -> f x * f y) (g x) (g y) + -- = + -- \x y -> f (g x) * f (g y) + -- = + -- \x y -> (f . g) x * (f . g) y + -- = + -- (*) `on` (f . g) + -- = + -- (*) `on` f . g + + -- flip on f . flip on g + -- = + -- (\h (*) -> (*) `on` h) f . (\h (*) -> (*) `on` h) g + -- = + -- (\(*) -> (*) `on` f) . (\(*) -> (*) `on` g) + -- = + -- \(*) -> (*) `on` g `on` f + -- = { See above. } + -- \(*) -> (*) `on` g . f + -- = + -- (\h (*) -> (*) `on` h) (g . f) + -- = + -- flip on (g . f) + + on :: (b -> b -> c) -> (a -> b) -> a -> a -> c + (.*.) `on` f = \x y -> f x .*. f y + infixl 0 `on` + + -- -| '&' is a reverse application operator. This provides notational + -- convenience. Its precedence is one higher than that of the forward + -- application operator '$', which allows '&' to be nested in '$'. + -- + -- @since 4.8.0.0 + (&) :: a -> (a -> b) -> b + x & f = f x + infixl 1 & + |])
src/Data/Functor/Compose/Singletons.hs view
@@ -1,92 +1,92 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE UndecidableInstances #-}-{-# OPTIONS_GHC -Wno-orphans #-}---------------------------------------------------------------------------------- |--- Module : Data.Functor.Compose.Singletons--- Copyright : (C) 2021 Ryan Scott--- License : BSD-style (see LICENSE)--- Maintainer : Richard Eisenberg (rae@cs.brynmawr.edu)--- Stability : experimental--- Portability : non-portable------ Exports the promoted and singled versions of the 'Compose' data type.-----------------------------------------------------------------------------------module Data.Functor.Compose.Singletons (- -- * The 'Compose' singleton- Sing, SCompose(..), GetCompose, sGetCompose,-- -- * Defunctionalization symbols- ComposeSym0, ComposeSym1,- GetComposeSym0, GetComposeSym1- ) where--import Control.Applicative-import Control.Applicative.Singletons-import Data.Foldable.Singletons-import Data.Functor.Compose-import Data.Functor.Singletons-import Data.Kind-import Data.Singletons-import Data.Singletons.TH-import Data.Traversable.Singletons--{--In order to keep the type arguments to Compose poly-kinded and with inferred-specificities, we define the singleton version of Compose, as well as its-defunctionalization symbols, by hand. This is very much in the spirit of the-code in Data.Functor.Const.Singletons. (See the comments above SConst in that-module for more details on this choice.)--}-infixr 9 `SCompose`-type SCompose :: Compose f g a -> Type-data SCompose :: Compose f g a -> Type where- SCompose :: forall f g a (x :: f (g a)).- Sing x -> SCompose ('Compose @f @g @a x)-type instance Sing = SCompose-instance SingI x => SingI ('Compose x) where- sing = SCompose sing-instance SingI1 'Compose where- liftSing = SCompose--infixr 9 `ComposeSym0`-type ComposeSym0 :: f (g a) ~> Compose f g a-data ComposeSym0 z-type instance Apply ComposeSym0 x = 'Compose x-instance SingI ComposeSym0 where- sing = singFun1 SCompose--infixr 9 `ComposeSym1`-type ComposeSym1 :: f (g a) -> Compose f g a-type family ComposeSym1 x where- ComposeSym1 x = 'Compose x--$(singletonsOnly [d|- getCompose :: Compose f g a -> f (g a)- getCompose (Compose x) = x-- instance (Functor f, Functor g) => Functor (Compose f g) where- fmap f (Compose x) = Compose (fmap (fmap f) x)- a <$ (Compose x) = Compose (fmap (a <$) x)-- instance (Foldable f, Foldable g) => Foldable (Compose f g) where- foldMap f (Compose t) = foldMap (foldMap f) t-- instance (Traversable f, Traversable g) => Traversable (Compose f g) where- traverse f (Compose t) = Compose <$> traverse (traverse f) t-- instance (Applicative f, Applicative g) => Applicative (Compose f g) where- pure x = Compose (pure (pure x))- Compose f <*> Compose x = Compose (liftA2 (<*>) f x)- liftA2 f (Compose x) (Compose y) =- Compose (liftA2 (liftA2 f) x y)-- instance (Alternative f, Applicative g) => Alternative (Compose f g) where- empty = Compose empty- Compose x <|> Compose y = Compose (x <|> y)- |])+{-# LANGUAGE DataKinds #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE UndecidableInstances #-} +{-# OPTIONS_GHC -Wno-orphans #-} + +----------------------------------------------------------------------------- +-- | +-- Module : Data.Functor.Compose.Singletons +-- Copyright : (C) 2021 Ryan Scott +-- License : BSD-style (see LICENSE) +-- Maintainer : Richard Eisenberg (rae@cs.brynmawr.edu) +-- Stability : experimental +-- Portability : non-portable +-- +-- Exports the promoted and singled versions of the 'Compose' data type. +-- +----------------------------------------------------------------------------- + +module Data.Functor.Compose.Singletons ( + -- * The 'Compose' singleton + Sing, SCompose(..), GetCompose, sGetCompose, + + -- * Defunctionalization symbols + ComposeSym0, ComposeSym1, + GetComposeSym0, GetComposeSym1 + ) where + +import Control.Applicative +import Control.Applicative.Singletons +import Data.Foldable.Singletons +import Data.Functor.Compose +import Data.Functor.Singletons +import Data.Kind +import Data.Singletons +import Data.Singletons.TH +import Data.Traversable.Singletons + +{- +In order to keep the type arguments to Compose poly-kinded and with inferred +specificities, we define the singleton version of Compose, as well as its +defunctionalization symbols, by hand. This is very much in the spirit of the +code in Data.Functor.Const.Singletons. (See the comments above SConst in that +module for more details on this choice.) +-} +infixr 9 `SCompose` +type SCompose :: Compose f g a -> Type +data SCompose :: Compose f g a -> Type where + SCompose :: forall f g a (x :: f (g a)). + Sing x -> SCompose ('Compose @f @g @a x) +type instance Sing = SCompose +instance SingI x => SingI ('Compose x) where + sing = SCompose sing +instance SingI1 'Compose where + liftSing = SCompose + +infixr 9 `ComposeSym0` +type ComposeSym0 :: f (g a) ~> Compose f g a +data ComposeSym0 z +type instance Apply ComposeSym0 x = 'Compose x +instance SingI ComposeSym0 where + sing = singFun1 SCompose + +infixr 9 `ComposeSym1` +type ComposeSym1 :: f (g a) -> Compose f g a +type family ComposeSym1 x where + ComposeSym1 x = 'Compose x + +$(singletonsOnly [d| + getCompose :: Compose f g a -> f (g a) + getCompose (Compose x) = x + + instance (Functor f, Functor g) => Functor (Compose f g) where + fmap f (Compose x) = Compose (fmap (fmap f) x) + a <$ (Compose x) = Compose (fmap (a <$) x) + + instance (Foldable f, Foldable g) => Foldable (Compose f g) where + foldMap f (Compose t) = foldMap (foldMap f) t + + instance (Traversable f, Traversable g) => Traversable (Compose f g) where + traverse f (Compose t) = Compose <$> traverse (traverse f) t + + instance (Applicative f, Applicative g) => Applicative (Compose f g) where + pure x = Compose (pure (pure x)) + Compose f <*> Compose x = Compose (liftA2 (<*>) f x) + liftA2 f (Compose x) (Compose y) = + Compose (liftA2 (liftA2 f) x y) + + instance (Alternative f, Applicative g) => Alternative (Compose f g) where + empty = Compose empty + Compose x <|> Compose y = Compose (x <|> y) + |])
src/Data/Functor/Const/Singletons.hs view
@@ -1,146 +1,146 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE NoNamedWildCards #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE UndecidableInstances #-}-{-# OPTIONS_GHC -Wno-orphans #-}---------------------------------------------------------------------------------- |--- Module : Data.Functor.Const.Singletons--- Copyright : (C) 2018 Ryan Scott--- License : BSD-style (see LICENSE)--- Maintainer : Richard Eisenberg (rae@cs.brynmawr.edu)--- Stability : experimental--- Portability : non-portable------ Exports the promoted and singled versions of the 'Const' data type.-----------------------------------------------------------------------------------module Data.Functor.Const.Singletons (- -- * The 'Const' singleton- Sing, SConst(..), GetConst, sGetConst,-- -- * Defunctionalization symbols- ConstSym0, ConstSym1,- GetConstSym0, GetConstSym1- ) where--import Control.Applicative-import Control.Monad.Singletons.Internal-import Data.Eq.Singletons-import Data.Foldable.Singletons-import Data.Kind (Type)-import Data.Monoid.Singletons-import Data.Ord.Singletons-import Data.Semigroup.Singletons.Internal-import Data.Singletons-import Data.Singletons.Base.Instances hiding (FoldlSym0, sFoldl)-import Data.Singletons.Base.Enum-import Data.Singletons.TH-import GHC.Base.Singletons- hiding ( Const, ConstSym0, ConstSym1- , Foldr, FoldrSym0, sFoldr )-import GHC.Num.Singletons-import Text.Show.Singletons--{--Const's argument `b` is poly-kinded, and as a result, we have a choice as to-what singleton type to give it. We could use either--1. type SConst :: forall {k :: Type} (a :: Type) (b :: k). Const a b -> Type-2. type SConst :: forall (a :: Type) (b :: Type). Const a b -> Type--Option (1) is the more permissive one, so we opt for that. However, singletons-th's-TH machinery does not jive with this option, since the SingKind instance it-tries to generate:-- instance (SingKind a, SingKind b) => SingKind (Const a b) where- type Demote (Const a b) = Const (Demote a) (Demote b)--Assumes that `b` is of kind Type. Until we get a more reliable story for-poly-kinded Sing instances (see #150), we simply write the singleton type by-hand.--Note that we cannot use genSingletons to generate this code because we-would end up with the wrong specificity for the kind of `a` when singling the-Const constructor. See Note [Preserve the order of type variables during-singling] in D.S.TH.Single.Type, wrinkle 2. Similarly, we must define the-defunctionalization symbols for the Const data constructor by hand to get the-specificities right.--}-type SConst :: Const a b -> Type-data SConst :: Const a b -> Type where- SConst :: forall {k} a (b :: k) (x :: a).- Sing x -> SConst ('Const @a @b x)-type instance Sing = SConst-instance SingKind a => SingKind (Const a b) where- type Demote (Const a b) = Const (Demote a) b- fromSing (SConst sa) = Const (fromSing sa)- toSing (Const a) = withSomeSing a $ SomeSing . SConst-instance SingI a => SingI ('Const a) where- sing = SConst sing-instance SingI1 'Const where- liftSing = SConst--type ConstSym0 :: a ~> Const a b-data ConstSym0 z-type instance Apply ConstSym0 x = 'Const x-instance SingI ConstSym0 where- sing = singFun1 SConst--type ConstSym1 :: a -> Const a b-type family ConstSym1 x where- ConstSym1 x = 'Const x--$(singletonsOnly [d|- getConst :: Const a b -> a- getConst (Const x) = x-- deriving instance Bounded a => Bounded (Const a b)- deriving instance Eq a => Eq (Const a b)- deriving instance Ord a => Ord (Const a b)-- -- deriving instance Enum a => Enum (Const a b)- instance Enum a => Enum (Const a b) where- succ (Const x) = Const (succ x)- pred (Const x) = Const (pred x)- toEnum i = Const (toEnum i)- fromEnum (Const x) = fromEnum x- enumFromTo (Const x) (Const y) = map Const (enumFromTo x y)- enumFromThenTo (Const x) (Const y) (Const z) =- map Const (enumFromThenTo x y z)-- -- deriving instance Monoid a => Monoid (Const a b)- instance Monoid a => Monoid (Const a b) where- mempty = Const mempty-- -- deriving instance Num a => Num (Const a b)- instance Num a => Num (Const a b) where- Const x + Const y = Const (x + y)- Const x - Const y = Const (x - y)- Const x * Const y = Const (x * y)- negate (Const x) = Const (negate x)- abs (Const x) = Const (abs x)- signum (Const x) = Const (signum x)- fromInteger n = Const (fromInteger n)-- -- deriving instance Semigroup a => Semigroup (Const a b)- instance Semigroup a => Semigroup (Const a b) where- Const x <> Const y = Const (x <> y)-- -- -| This instance would be equivalent to the derived instances of the- -- 'Const' newtype if the 'runConst' field were removed- instance Show a => Show (Const a b) where- showsPrec d (Const x) = showParen (d > 10) $- showString "Const " . showsPrec 11 x-- deriving instance Functor (Const m)- deriving instance Foldable (Const m)-- instance Monoid m => Applicative (Const m) where- pure _ = Const mempty- liftA2 _ (Const x) (Const y) = Const (x `mappend` y)- Const x <*> Const y = Const (x `mappend` y)- |])+{-# LANGUAGE DataKinds #-} +{-# LANGUAGE NoNamedWildCards #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE UndecidableInstances #-} +{-# OPTIONS_GHC -Wno-orphans #-} + +----------------------------------------------------------------------------- +-- | +-- Module : Data.Functor.Const.Singletons +-- Copyright : (C) 2018 Ryan Scott +-- License : BSD-style (see LICENSE) +-- Maintainer : Richard Eisenberg (rae@cs.brynmawr.edu) +-- Stability : experimental +-- Portability : non-portable +-- +-- Exports the promoted and singled versions of the 'Const' data type. +-- +----------------------------------------------------------------------------- + +module Data.Functor.Const.Singletons ( + -- * The 'Const' singleton + Sing, SConst(..), GetConst, sGetConst, + + -- * Defunctionalization symbols + ConstSym0, ConstSym1, + GetConstSym0, GetConstSym1 + ) where + +import Control.Applicative +import Control.Monad.Singletons.Internal +import Data.Eq.Singletons +import Data.Foldable.Singletons +import Data.Kind (Type) +import Data.Monoid.Singletons +import Data.Ord.Singletons +import Data.Semigroup.Singletons.Internal.Classes +import Data.Singletons +import Data.Singletons.Base.Instances hiding (FoldlSym0, sFoldl) +import Data.Singletons.Base.Enum +import Data.Singletons.TH +import GHC.Base.Singletons + hiding ( Const, ConstSym0, ConstSym1 + , Foldr, FoldrSym0, sFoldr ) +import GHC.Num.Singletons +import Text.Show.Singletons + +{- +Const's argument `b` is poly-kinded, and as a result, we have a choice as to +what singleton type to give it. We could use either + +1. type SConst :: forall {k :: Type} (a :: Type) (b :: k). Const a b -> Type +2. type SConst :: forall (a :: Type) (b :: Type). Const a b -> Type + +Option (1) is the more permissive one, so we opt for that. However, singletons-th's +TH machinery does not jive with this option, since the SingKind instance it +tries to generate: + + instance (SingKind a, SingKind b) => SingKind (Const a b) where + type Demote (Const a b) = Const (Demote a) (Demote b) + +Assumes that `b` is of kind Type. Until we get a more reliable story for +poly-kinded Sing instances (see #150), we simply write the singleton type by +hand. + +Note that we cannot use genSingletons to generate this code because we +would end up with the wrong specificity for the kind of `a` when singling the +Const constructor. See Note [Preserve the order of type variables during +singling] in D.S.TH.Single.Type, wrinkle 2. Similarly, we must define the +defunctionalization symbols for the Const data constructor by hand to get the +specificities right. +-} +type SConst :: Const a b -> Type +data SConst :: Const a b -> Type where + SConst :: forall {k} a (b :: k) (x :: a). + Sing x -> SConst ('Const @a @b x) +type instance Sing = SConst +instance SingKind a => SingKind (Const a b) where + type Demote (Const a b) = Const (Demote a) b + fromSing (SConst sa) = Const (fromSing sa) + toSing (Const a) = withSomeSing a $ SomeSing . SConst +instance SingI a => SingI ('Const a) where + sing = SConst sing +instance SingI1 'Const where + liftSing = SConst + +type ConstSym0 :: a ~> Const a b +data ConstSym0 z +type instance Apply ConstSym0 x = 'Const x +instance SingI ConstSym0 where + sing = singFun1 SConst + +type ConstSym1 :: a -> Const a b +type family ConstSym1 x where + ConstSym1 x = 'Const x + +$(singletonsOnly [d| + getConst :: Const a b -> a + getConst (Const x) = x + + deriving instance Bounded a => Bounded (Const a b) + deriving instance Eq a => Eq (Const a b) + deriving instance Ord a => Ord (Const a b) + + -- deriving instance Enum a => Enum (Const a b) + instance Enum a => Enum (Const a b) where + succ (Const x) = Const (succ x) + pred (Const x) = Const (pred x) + toEnum i = Const (toEnum i) + fromEnum (Const x) = fromEnum x + enumFromTo (Const x) (Const y) = map Const (enumFromTo x y) + enumFromThenTo (Const x) (Const y) (Const z) = + map Const (enumFromThenTo x y z) + + -- deriving instance Monoid a => Monoid (Const a b) + instance Monoid a => Monoid (Const a b) where + mempty = Const mempty + + -- deriving instance Num a => Num (Const a b) + instance Num a => Num (Const a b) where + Const x + Const y = Const (x + y) + Const x - Const y = Const (x - y) + Const x * Const y = Const (x * y) + negate (Const x) = Const (negate x) + abs (Const x) = Const (abs x) + signum (Const x) = Const (signum x) + fromInteger n = Const (fromInteger n) + + -- deriving instance Semigroup a => Semigroup (Const a b) + instance Semigroup a => Semigroup (Const a b) where + Const x <> Const y = Const (x <> y) + + -- -| This instance would be equivalent to the derived instances of the + -- 'Const' newtype if the 'runConst' field were removed + instance Show a => Show (Const a b) where + showsPrec d (Const x) = showParen (d > 10) $ + showString "Const " . showsPrec 11 x + + deriving instance Functor (Const m) + deriving instance Foldable (Const m) + + instance Monoid m => Applicative (Const m) where + pure _ = Const mempty + liftA2 _ (Const x) (Const y) = Const (x `mappend` y) + Const x <*> Const y = Const (x `mappend` y) + |])
src/Data/Functor/Identity/Singletons.hs view
@@ -1,108 +1,107 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE NoNamedWildCards #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE UndecidableInstances #-}-{-# OPTIONS_GHC -Wno-orphans #-}---------------------------------------------------------------------------------- |--- Module : Data.Functor.Identity.Singletons--- Copyright : (C) 2018 Ryan Scott--- License : BSD-style (see LICENSE)--- Maintainer : Richard Eisenberg (rae@cs.brynmawr.edu)--- Stability : experimental--- Portability : non-portable------ Exports the promoted and singled versions of the 'Identity' data type.-----------------------------------------------------------------------------------module Data.Functor.Identity.Singletons (- -- * The 'Identity' singleton- Sing, SIdentity(..), RunIdentity, sRunIdentity,-- -- * Defunctionalization symbols- IdentitySym0, IdentitySym1,- RunIdentitySym0, RunIdentitySym1- ) where--import Control.Applicative-import Control.Monad.Singletons.Internal-import Data.Eq.Singletons-import Data.Foldable (Foldable(..))-import Data.Foldable.Singletons-import Data.Functor.Identity-import Data.Monoid.Singletons-import Data.Ord.Singletons-import Data.Semigroup.Singletons.Internal-import Data.Singletons.Base.Instances hiding (Foldl, sFoldl)-import Data.Singletons.Base.Enum-import Data.Singletons.TH-import GHC.Base.Singletons hiding (Foldr, FoldrSym0, sFoldr)-import GHC.Num.Singletons-import Text.Show.Singletons--$(singletonsOnly [d|- -- deriving instance Enum a => Enum (Identity a)- instance Enum a => Enum (Identity a) where- succ (Identity x) = Identity (succ x)- pred (Identity x) = Identity (pred x)- toEnum i = Identity (toEnum i)- fromEnum (Identity x) = fromEnum x- enumFromTo (Identity x) (Identity y) = map Identity (enumFromTo x y)- enumFromThenTo (Identity x) (Identity y) (Identity z) =- map Identity (enumFromThenTo x y z)-- -- deriving instance Monoid a => Monoid (Identity a)- instance Monoid a => Monoid (Identity a) where- mempty = Identity mempty-- -- deriving instance Num a => Num (Identity a)- instance Num a => Num (Identity a) where- Identity x + Identity y = Identity (x + y)- Identity x - Identity y = Identity (x - y)- Identity x * Identity y = Identity (x * y)- negate (Identity x) = Identity (negate x)- abs (Identity x) = Identity (abs x)- signum (Identity x) = Identity (signum x)- fromInteger n = Identity (fromInteger n)-- -- deriving instance Semigroup a => Semigroup (Identity a)- instance Semigroup a => Semigroup (Identity a) where- Identity x <> Identity y = Identity (x <> y)-- -- -| This instance would be equivalent to the derived instances of the- -- 'Identity' newtype if the 'runIdentity' field were removed- instance Show a => Show (Identity a) where- showsPrec d (Identity x) = showParen (d > 10) $- showString "Identity " . showsPrec 11 x-- deriving instance Functor Identity-- instance Foldable Identity where- foldMap f (Identity x) = f x-- elem x (Identity y) = x == y- foldl f z (Identity x) = f z x- foldl' f z (Identity x) = f z x- foldl1 _ (Identity x) = x- foldr f z (Identity x) = f x z- foldr' = foldr- foldr1 _ (Identity x) = x- length _ = 1- maximum (Identity x) = x- minimum (Identity x) = x- null _ = False- product (Identity x) = x- sum (Identity x) = x- toList (Identity x) = [x]-- instance Applicative Identity where- pure = Identity- Identity f <*> Identity x = Identity (f x)- liftA2 f (Identity x) (Identity y) = Identity (f x y)-- instance Monad Identity where- Identity m >>= k = k m- |])+{-# LANGUAGE DataKinds #-} +{-# LANGUAGE NoNamedWildCards #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE UndecidableInstances #-} +{-# OPTIONS_GHC -Wno-orphans #-} + +----------------------------------------------------------------------------- +-- | +-- Module : Data.Functor.Identity.Singletons +-- Copyright : (C) 2018 Ryan Scott +-- License : BSD-style (see LICENSE) +-- Maintainer : Richard Eisenberg (rae@cs.brynmawr.edu) +-- Stability : experimental +-- Portability : non-portable +-- +-- Exports the promoted and singled versions of the 'Identity' data type. +-- +----------------------------------------------------------------------------- + +module Data.Functor.Identity.Singletons ( + -- * The 'Identity' singleton + Sing, SIdentity(..), RunIdentity, sRunIdentity, + + -- * Defunctionalization symbols + IdentitySym0, IdentitySym1, + RunIdentitySym0, RunIdentitySym1 + ) where + +import Control.Monad.Singletons.Internal +import Data.Eq.Singletons +import Data.Foldable (Foldable(..)) +import Data.Foldable.Singletons +import Data.Functor.Identity +import Data.Monoid.Singletons +import Data.Ord.Singletons +import Data.Semigroup.Singletons.Internal.Classes +import Data.Singletons.Base.Instances hiding (Foldl, sFoldl) +import Data.Singletons.Base.Enum +import Data.Singletons.TH +import GHC.Base.Singletons hiding (Foldr, FoldrSym0, sFoldr) +import GHC.Num.Singletons +import Text.Show.Singletons + +$(singletonsOnly [d| + -- deriving instance Enum a => Enum (Identity a) + instance Enum a => Enum (Identity a) where + succ (Identity x) = Identity (succ x) + pred (Identity x) = Identity (pred x) + toEnum i = Identity (toEnum i) + fromEnum (Identity x) = fromEnum x + enumFromTo (Identity x) (Identity y) = map Identity (enumFromTo x y) + enumFromThenTo (Identity x) (Identity y) (Identity z) = + map Identity (enumFromThenTo x y z) + + -- deriving instance Monoid a => Monoid (Identity a) + instance Monoid a => Monoid (Identity a) where + mempty = Identity mempty + + -- deriving instance Num a => Num (Identity a) + instance Num a => Num (Identity a) where + Identity x + Identity y = Identity (x + y) + Identity x - Identity y = Identity (x - y) + Identity x * Identity y = Identity (x * y) + negate (Identity x) = Identity (negate x) + abs (Identity x) = Identity (abs x) + signum (Identity x) = Identity (signum x) + fromInteger n = Identity (fromInteger n) + + -- deriving instance Semigroup a => Semigroup (Identity a) + instance Semigroup a => Semigroup (Identity a) where + Identity x <> Identity y = Identity (x <> y) + + -- -| This instance would be equivalent to the derived instances of the + -- 'Identity' newtype if the 'runIdentity' field were removed + instance Show a => Show (Identity a) where + showsPrec d (Identity x) = showParen (d > 10) $ + showString "Identity " . showsPrec 11 x + + deriving instance Functor Identity + + instance Foldable Identity where + foldMap f (Identity x) = f x + + elem x (Identity y) = x == y + foldl f z (Identity x) = f z x + foldl' f z (Identity x) = f z x + foldl1 _ (Identity x) = x + foldr f z (Identity x) = f x z + foldr' = foldr + foldr1 _ (Identity x) = x + length _ = 1 + maximum (Identity x) = x + minimum (Identity x) = x + null _ = False + product (Identity x) = x + sum (Identity x) = x + toList (Identity x) = [x] + + instance Applicative Identity where + pure = Identity + Identity f <*> Identity x = Identity (f x) + liftA2 f (Identity x) (Identity y) = Identity (f x y) + + instance Monad Identity where + Identity m >>= k = k m + |])
src/Data/Functor/Product/Singletons.hs view
@@ -1,112 +1,112 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE UndecidableInstances #-}-{-# OPTIONS_GHC -Wno-orphans #-}---------------------------------------------------------------------------------- |--- Module : Data.Functor.Product.Singletons--- Copyright : (C) 2021 Ryan Scott--- License : BSD-style (see LICENSE)--- Maintainer : Richard Eisenberg (rae@cs.brynmawr.edu)--- Stability : experimental--- Portability : non-portable------ Exports the promoted and singled versions of the 'Product' data type.-----------------------------------------------------------------------------------module Data.Functor.Product.Singletons (- -- * The 'Product' singleton- Sing, SProduct(..),-- -- * Defunctionalization symbols- PairSym0, PairSym1, PairSym2- ) where--import Control.Applicative-import Control.Applicative.Singletons-import Control.Monad-import Control.Monad.Singletons-import Control.Monad.Zip-import Control.Monad.Zip.Singletons-import Data.Foldable.Singletons hiding (Product)-import Data.Function.Singletons-import Data.Functor.Product-import Data.Kind-import Data.Monoid.Singletons hiding (SProduct(..))-import Data.Singletons-import Data.Singletons.TH-import Data.Traversable.Singletons--{--In order to keep the type arguments to Product poly-kinded and with inferred-specificities, we define the singleton version of Product, as well as its-defunctionalization symbols, by hand. This is very much in the spirit of the-code in Data.Functor.Const.Singletons. (See the comments above SConst in that-module for more details on this choice.)--}-type SProduct :: Product f g a -> Type-data SProduct :: Product f g a -> Type where- SPair :: forall f g a (x :: f a) (y :: g a).- Sing x -> Sing y -> SProduct ('Pair @f @g @a x y)-type instance Sing = SProduct-instance (SingI x, SingI y) => SingI ('Pair x y) where- sing = SPair sing sing-instance SingI x => SingI1 ('Pair x) where- liftSing = SPair sing-instance SingI2 'Pair where- liftSing2 = SPair--type PairSym0 :: forall f g a. f a ~> g a ~> Product f g a-data PairSym0 z-type instance Apply PairSym0 x = PairSym1 x-instance SingI PairSym0 where- sing = singFun2 SPair--type PairSym1 :: forall f g a. f a -> g a ~> Product f g a-data PairSym1 fa z-type instance Apply (PairSym1 x) y = 'Pair x y-instance SingI x => SingI (PairSym1 x) where- sing = singFun1 $ SPair (sing @x)-instance SingI1 PairSym1 where- liftSing s = singFun1 $ SPair s--type PairSym2 :: forall f g a. f a -> g a -> Product f g a-type family PairSym2 x y where- PairSym2 x y = 'Pair x y--$(singletonsOnly [d|- instance (Functor f, Functor g) => Functor (Product f g) where- fmap f (Pair x y) = Pair (fmap f x) (fmap f y)- a <$ (Pair x y) = Pair (a <$ x) (a <$ y)-- instance (Foldable f, Foldable g) => Foldable (Product f g) where- foldMap f (Pair x y) = foldMap f x `mappend` foldMap f y-- instance (Traversable f, Traversable g) => Traversable (Product f g) where- traverse f (Pair x y) = liftA2 Pair (traverse f x) (traverse f y)-- instance (Applicative f, Applicative g) => Applicative (Product f g) where- pure x = Pair (pure x) (pure x)- Pair f g <*> Pair x y = Pair (f <*> x) (g <*> y)- liftA2 f (Pair a b) (Pair x y) = Pair (liftA2 f a x) (liftA2 f b y)-- instance (Alternative f, Alternative g) => Alternative (Product f g) where- empty = Pair empty empty- Pair x1 y1 <|> Pair x2 y2 = Pair (x1 <|> x2) (y1 <|> y2)-- instance (Monad f, Monad g) => Monad (Product f g) where- Pair m n >>= f = Pair (m >>= fstP . f) (n >>= sndP . f)- where- fstP (Pair a _) = a- sndP (Pair _ b) = b-- instance (MonadPlus f, MonadPlus g) => MonadPlus (Product f g) where- mzero = Pair mzero mzero- Pair x1 y1 `mplus` Pair x2 y2 = Pair (x1 `mplus` x2) (y1 `mplus` y2)-- instance (MonadZip f, MonadZip g) => MonadZip (Product f g) where- mzipWith f (Pair x1 y1) (Pair x2 y2) = Pair (mzipWith f x1 x2) (mzipWith f y1 y2)- |])+{-# LANGUAGE DataKinds #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE UndecidableInstances #-} +{-# OPTIONS_GHC -Wno-orphans #-} + +----------------------------------------------------------------------------- +-- | +-- Module : Data.Functor.Product.Singletons +-- Copyright : (C) 2021 Ryan Scott +-- License : BSD-style (see LICENSE) +-- Maintainer : Richard Eisenberg (rae@cs.brynmawr.edu) +-- Stability : experimental +-- Portability : non-portable +-- +-- Exports the promoted and singled versions of the 'Product' data type. +-- +----------------------------------------------------------------------------- + +module Data.Functor.Product.Singletons ( + -- * The 'Product' singleton + Sing, SProduct(..), + + -- * Defunctionalization symbols + PairSym0, PairSym1, PairSym2 + ) where + +import Control.Applicative +import Control.Applicative.Singletons +import Control.Monad +import Control.Monad.Singletons +import Control.Monad.Zip +import Control.Monad.Zip.Singletons +import Data.Foldable.Singletons hiding (Product) +import Data.Function.Singletons +import Data.Functor.Product +import Data.Kind +import Data.Monoid.Singletons hiding (SProduct(..)) +import Data.Singletons +import Data.Singletons.TH +import Data.Traversable.Singletons + +{- +In order to keep the type arguments to Product poly-kinded and with inferred +specificities, we define the singleton version of Product, as well as its +defunctionalization symbols, by hand. This is very much in the spirit of the +code in Data.Functor.Const.Singletons. (See the comments above SConst in that +module for more details on this choice.) +-} +type SProduct :: Product f g a -> Type +data SProduct :: Product f g a -> Type where + SPair :: forall f g a (x :: f a) (y :: g a). + Sing x -> Sing y -> SProduct ('Pair @f @g @a x y) +type instance Sing = SProduct +instance (SingI x, SingI y) => SingI ('Pair x y) where + sing = SPair sing sing +instance SingI x => SingI1 ('Pair x) where + liftSing = SPair sing +instance SingI2 'Pair where + liftSing2 = SPair + +type PairSym0 :: forall f g a. f a ~> g a ~> Product f g a +data PairSym0 z +type instance Apply PairSym0 x = PairSym1 x +instance SingI PairSym0 where + sing = singFun2 SPair + +type PairSym1 :: forall f g a. f a -> g a ~> Product f g a +data PairSym1 fa z +type instance Apply (PairSym1 x) y = 'Pair x y +instance SingI x => SingI (PairSym1 x) where + sing = singFun1 $ SPair (sing @x) +instance SingI1 PairSym1 where + liftSing s = singFun1 $ SPair s + +type PairSym2 :: forall f g a. f a -> g a -> Product f g a +type family PairSym2 x y where + PairSym2 x y = 'Pair x y + +$(singletonsOnly [d| + instance (Functor f, Functor g) => Functor (Product f g) where + fmap f (Pair x y) = Pair (fmap f x) (fmap f y) + a <$ (Pair x y) = Pair (a <$ x) (a <$ y) + + instance (Foldable f, Foldable g) => Foldable (Product f g) where + foldMap f (Pair x y) = foldMap f x `mappend` foldMap f y + + instance (Traversable f, Traversable g) => Traversable (Product f g) where + traverse f (Pair x y) = liftA2 Pair (traverse f x) (traverse f y) + + instance (Applicative f, Applicative g) => Applicative (Product f g) where + pure x = Pair (pure x) (pure x) + Pair f g <*> Pair x y = Pair (f <*> x) (g <*> y) + liftA2 f (Pair a b) (Pair x y) = Pair (liftA2 f a x) (liftA2 f b y) + + instance (Alternative f, Alternative g) => Alternative (Product f g) where + empty = Pair empty empty + Pair x1 y1 <|> Pair x2 y2 = Pair (x1 <|> x2) (y1 <|> y2) + + instance (Monad f, Monad g) => Monad (Product f g) where + Pair m n >>= f = Pair (m >>= fstP . f) (n >>= sndP . f) + where + fstP (Pair a _) = a + sndP (Pair _ b) = b + + instance (MonadPlus f, MonadPlus g) => MonadPlus (Product f g) where + mzero = Pair mzero mzero + Pair x1 y1 `mplus` Pair x2 y2 = Pair (x1 `mplus` x2) (y1 `mplus` y2) + + instance (MonadZip f, MonadZip g) => MonadZip (Product f g) where + mzipWith f (Pair x1 y1) (Pair x2 y2) = Pair (mzipWith f x1 x2) (mzipWith f y1 y2) + |])
src/Data/Functor/Singletons.hs view
@@ -1,194 +1,194 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE NoNamedWildCards #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE UndecidableInstances #-}-{-# OPTIONS_GHC -Wno-orphans #-}---------------------------------------------------------------------------------- |--- Module : Data.Functor.Singletons--- Copyright : (C) 2018 Ryan Scott--- License : BSD-style (see LICENSE)--- Maintainer : Ryan Scott--- Stability : experimental--- Portability : non-portable------ Defines the promoted and singled versions of the 'Functor' type class.----------------------------------------------------------------------------------module Data.Functor.Singletons (- PFunctor(..), SFunctor(..),- type ($>), (%$>),- type (<$>), (%<$>),- type (<&>), (%<&>),- Void, sVoid,-- -- * Defunctionalization symbols- FmapSym0, FmapSym1, FmapSym2,- type (<$@#@$), type (<$@#@$$), type (<$@#@$$$),- type ($>@#@$), type ($>@#@$$), type ($>@#@$$$),- type (<$>@#@$), type (<$>@#@$$), type (<$>@#@$$$),- type (<&>@#@$), type (<&>@#@$$), type (<&>@#@$$$),- VoidSym0, VoidSym1- ) where--import Control.Monad.Singletons.Internal-import Data.Ord (Down(..))-import Data.Ord.Singletons-import Data.Singletons.Base.Instances-import Data.Singletons.TH hiding (Void)-import GHC.Base.Singletons--$(singletonsOnly [d|- infixl 4 <$>-- -- -| An infix synonym for 'fmap'.- --- -- The name of this operator is an allusion to '$'.- -- Note the similarities between their types:- --- -- > ($) :: (a -> b) -> a -> b- -- > (<$>) :: Functor f => (a -> b) -> f a -> f b- --- -- Whereas '$' is function application, '<$>' is function- -- application lifted over a 'Functor'.- --- -- ==== __Examples__- --- -- Convert from a @'Maybe' 'Int'@ to a @'Maybe' 'String'@ using 'show':- --- -- >>> show <$> Nothing- -- Nothing- -- >>> show <$> Just 3- -- Just "3"- --- -- Convert from an @'Either' 'Int' 'Int'@ to an @'Either' 'Int'@- -- 'String' using 'show':- --- -- >>> show <$> Left 17- -- Left 17- -- >>> show <$> Right 17- -- Right "17"- --- -- Double each element of a list:- --- -- >>> (*2) <$> [1,2,3]- -- [2,4,6]- --- -- Apply 'even' to the second element of a pair:- --- -- >>> even <$> (2,2)- -- (2,True)- --- (<$>) :: Functor f => (a -> b) -> f a -> f b- (<$>) = fmap-- infixl 4 $>-- -- -| Flipped version of '<$>'.- --- -- @- -- ('<&>') = 'flip' 'fmap'- -- @- --- -- @since 4.11.0.0- --- -- ==== __Examples__- -- Apply @(+1)@ to a list, a 'Data.Maybe.Just' and a 'Data.Either.Right':- --- -- >>> Just 2 <&> (+1)- -- Just 3- --- -- >>> [1,2,3] <&> (+1)- -- [2,3,4]- --- -- >>> Right 3 <&> (+1)- -- Right 4- --- (<&>) :: Functor f => f a -> (a -> b) -> f b- as <&> f = f <$> as-- infixl 1 <&>-- -- -| Flipped version of '<$'.- --- -- @since 4.7.0.0- --- -- ==== __Examples__- --- -- Replace the contents of a @'Maybe' 'Int'@ with a constant 'String':- --- -- >>> Nothing $> "foo"- -- Nothing- -- >>> Just 90210 $> "foo"- -- Just "foo"- --- -- Replace the contents of an @'Either' 'Int' 'Int'@ with a constant- -- 'String', resulting in an @'Either' 'Int' 'String'@:- --- -- >>> Left 8675309 $> "foo"- -- Left 8675309- -- >>> Right 8675309 $> "foo"- -- Right "foo"- --- -- Replace each element of a list with a constant 'String':- --- -- >>> [1,2,3] $> "foo"- -- ["foo","foo","foo"]- --- -- Replace the second element of a pair with a constant 'String':- --- -- >>> (1,2) $> "foo"- -- (1,"foo")- --- ($>) :: Functor f => f a -> b -> f b- ($>) = flip (<$)-- -- -| @'void' value@ discards or ignores the result of evaluation, such- -- as the return value of an 'System.IO.IO' action.- --- -- ==== __Examples__- --- -- Replace the contents of a @'Maybe' 'Int'@ with unit:- --- -- >>> void Nothing- -- Nothing- -- >>> void (Just 3)- -- Just ()- --- -- Replace the contents of an @'Either' 'Int' 'Int'@ with unit,- -- resulting in an @'Either' 'Int' '()'@:- --- -- >>> void (Left 8675309)- -- Left 8675309- -- >>> void (Right 8675309)- -- Right ()- --- -- Replace every element of a list with unit:- --- -- >>> void [1,2,3]- -- [(),(),()]- --- -- Replace the second element of a pair with unit:- --- -- >>> void (1,2)- -- (1,())- --- -- Discard the result of an 'System.IO.IO' action:- --- -- >>> mapM print [1,2]- -- 1- -- 2- -- [(),()]- -- >>> void $ mapM print [1,2]- -- 1- -- 2- --- void :: Functor f => f a -> f ()- void x = () <$ x-- deriving instance Functor ((,) a)- deriving instance Functor Down- |])+{-# LANGUAGE DataKinds #-} +{-# LANGUAGE NoNamedWildCards #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE UndecidableInstances #-} +{-# OPTIONS_GHC -Wno-orphans #-} + +----------------------------------------------------------------------------- +-- | +-- Module : Data.Functor.Singletons +-- Copyright : (C) 2018 Ryan Scott +-- License : BSD-style (see LICENSE) +-- Maintainer : Ryan Scott +-- Stability : experimental +-- Portability : non-portable +-- +-- Defines the promoted and singled versions of the 'Functor' type class. +-- +---------------------------------------------------------------------------- + +module Data.Functor.Singletons ( + PFunctor(..), SFunctor(..), + type ($>), (%$>), + type (<$>), (%<$>), + type (<&>), (%<&>), + Void, sVoid, + + -- * Defunctionalization symbols + FmapSym0, FmapSym1, FmapSym2, + type (<$@#@$), type (<$@#@$$), type (<$@#@$$$), + type ($>@#@$), type ($>@#@$$), type ($>@#@$$$), + type (<$>@#@$), type (<$>@#@$$), type (<$>@#@$$$), + type (<&>@#@$), type (<&>@#@$$), type (<&>@#@$$$), + VoidSym0, VoidSym1 + ) where + +import Control.Monad.Singletons.Internal +import Data.Ord (Down(..)) +import Data.Ord.Singletons +import Data.Singletons.Base.Instances +import Data.Singletons.TH hiding (Void) +import GHC.Base.Singletons + +$(singletonsOnly [d| + infixl 4 <$> + + -- -| An infix synonym for 'fmap'. + -- + -- The name of this operator is an allusion to '$'. + -- Note the similarities between their types: + -- + -- > ($) :: (a -> b) -> a -> b + -- > (<$>) :: Functor f => (a -> b) -> f a -> f b + -- + -- Whereas '$' is function application, '<$>' is function + -- application lifted over a 'Functor'. + -- + -- ==== __Examples__ + -- + -- Convert from a @'Maybe' 'Int'@ to a @'Maybe' 'String'@ using 'show': + -- + -- >>> show <$> Nothing + -- Nothing + -- >>> show <$> Just 3 + -- Just "3" + -- + -- Convert from an @'Either' 'Int' 'Int'@ to an @'Either' 'Int'@ + -- 'String' using 'show': + -- + -- >>> show <$> Left 17 + -- Left 17 + -- >>> show <$> Right 17 + -- Right "17" + -- + -- Double each element of a list: + -- + -- >>> (*2) <$> [1,2,3] + -- [2,4,6] + -- + -- Apply 'even' to the second element of a pair: + -- + -- >>> even <$> (2,2) + -- (2,True) + -- + (<$>) :: Functor f => (a -> b) -> f a -> f b + (<$>) = fmap + + infixl 4 $> + + -- -| Flipped version of '<$>'. + -- + -- @ + -- ('<&>') = 'flip' 'fmap' + -- @ + -- + -- @since 4.11.0.0 + -- + -- ==== __Examples__ + -- Apply @(+1)@ to a list, a 'Data.Maybe.Just' and a 'Data.Either.Right': + -- + -- >>> Just 2 <&> (+1) + -- Just 3 + -- + -- >>> [1,2,3] <&> (+1) + -- [2,3,4] + -- + -- >>> Right 3 <&> (+1) + -- Right 4 + -- + (<&>) :: Functor f => f a -> (a -> b) -> f b + as <&> f = f <$> as + + infixl 1 <&> + + -- -| Flipped version of '<$'. + -- + -- @since 4.7.0.0 + -- + -- ==== __Examples__ + -- + -- Replace the contents of a @'Maybe' 'Int'@ with a constant 'String': + -- + -- >>> Nothing $> "foo" + -- Nothing + -- >>> Just 90210 $> "foo" + -- Just "foo" + -- + -- Replace the contents of an @'Either' 'Int' 'Int'@ with a constant + -- 'String', resulting in an @'Either' 'Int' 'String'@: + -- + -- >>> Left 8675309 $> "foo" + -- Left 8675309 + -- >>> Right 8675309 $> "foo" + -- Right "foo" + -- + -- Replace each element of a list with a constant 'String': + -- + -- >>> [1,2,3] $> "foo" + -- ["foo","foo","foo"] + -- + -- Replace the second element of a pair with a constant 'String': + -- + -- >>> (1,2) $> "foo" + -- (1,"foo") + -- + ($>) :: Functor f => f a -> b -> f b + ($>) = flip (<$) + + -- -| @'void' value@ discards or ignores the result of evaluation, such + -- as the return value of an 'System.IO.IO' action. + -- + -- ==== __Examples__ + -- + -- Replace the contents of a @'Maybe' 'Int'@ with unit: + -- + -- >>> void Nothing + -- Nothing + -- >>> void (Just 3) + -- Just () + -- + -- Replace the contents of an @'Either' 'Int' 'Int'@ with unit, + -- resulting in an @'Either' 'Int' '()'@: + -- + -- >>> void (Left 8675309) + -- Left 8675309 + -- >>> void (Right 8675309) + -- Right () + -- + -- Replace every element of a list with unit: + -- + -- >>> void [1,2,3] + -- [(),(),()] + -- + -- Replace the second element of a pair with unit: + -- + -- >>> void (1,2) + -- (1,()) + -- + -- Discard the result of an 'System.IO.IO' action: + -- + -- >>> mapM print [1,2] + -- 1 + -- 2 + -- [(),()] + -- >>> void $ mapM print [1,2] + -- 1 + -- 2 + -- + void :: Functor f => f a -> f () + void x = () <$ x + + deriving instance Functor ((,) a) + deriving instance Functor Down + |])
src/Data/Functor/Sum/Singletons.hs view
@@ -1,95 +1,95 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE UndecidableInstances #-}-{-# OPTIONS_GHC -Wno-orphans #-}---------------------------------------------------------------------------------- |--- Module : Data.Functor.Sum.Singletons--- Copyright : (C) 2021 Ryan Scott--- License : BSD-style (see LICENSE)--- Maintainer : Richard Eisenberg (rae@cs.brynmawr.edu)--- Stability : experimental--- Portability : non-portable------ Exports the promoted and singled versions of the 'Sum' data type.-----------------------------------------------------------------------------------module Data.Functor.Sum.Singletons (- -- * The 'Product' singleton- Sing, SSum(..),-- -- * Defunctionalization symbols- InLSym0, InLSym1,- InRSym0, InRSym1,- ) where--import Data.Foldable.Singletons hiding (Sum)-import Data.Functor.Singletons-import Data.Functor.Sum-import Data.Kind-import Data.Singletons-import Data.Singletons.TH-import Data.Traversable.Singletons--{--In order to keep the type arguments to Sum poly-kinded and with inferred-specificities, we define the singleton version of Sum, as well as its-defunctionalization symbols, by hand. This is very much in the spirit of the-code in Data.Functor.Const.Singletons. (See the comments above SConst in that-module for more details on this choice.)--}-type SSum :: Sum f g a -> Type-data SSum :: Sum f g a -> Type where- SInL :: forall f g a (x :: f a).- Sing x -> SSum ('InL @f @g @a x)- SInR :: forall f g a (y :: g a).- Sing y -> SSum ('InR @f @g @a y)-type instance Sing = SSum-instance SingI x => SingI ('InL x) where- sing = SInL sing-instance SingI1 'InL where- liftSing = SInL-instance SingI y => SingI ('InR y) where- sing = SInR sing-instance SingI1 'InR where- liftSing = SInR--type InLSym0 :: forall f g a. f a ~> Sum f g a-data InLSym0 z-type instance Apply InLSym0 x = 'InL x-instance SingI InLSym0 where- sing = singFun1 SInL--type InLSym1 :: forall f g a. f a -> Sum f g a-type family InLSym1 x where- InLSym1 x = 'InL x--type InRSym0 :: forall f g a. g a ~> Sum f g a-data InRSym0 z-type instance Apply InRSym0 y = 'InR y-instance SingI InRSym0 where- sing = singFun1 SInR--type InRSym1 :: forall f g a. g a -> Sum f g a-type family InRSym1 x where- InRSym1 y = 'InR y--$(singletonsOnly [d|- instance (Functor f, Functor g) => Functor (Sum f g) where- fmap f (InL x) = InL (fmap f x)- fmap f (InR y) = InR (fmap f y)-- a <$ (InL x) = InL (a <$ x)- a <$ (InR y) = InR (a <$ y)-- instance (Foldable f, Foldable g) => Foldable (Sum f g) where- foldMap f (InL x) = foldMap f x- foldMap f (InR y) = foldMap f y-- instance (Traversable f, Traversable g) => Traversable (Sum f g) where- traverse f (InL x) = InL <$> traverse f x- traverse f (InR y) = InR <$> traverse f y- |])+{-# LANGUAGE DataKinds #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE UndecidableInstances #-} +{-# OPTIONS_GHC -Wno-orphans #-} + +----------------------------------------------------------------------------- +-- | +-- Module : Data.Functor.Sum.Singletons +-- Copyright : (C) 2021 Ryan Scott +-- License : BSD-style (see LICENSE) +-- Maintainer : Richard Eisenberg (rae@cs.brynmawr.edu) +-- Stability : experimental +-- Portability : non-portable +-- +-- Exports the promoted and singled versions of the 'Sum' data type. +-- +----------------------------------------------------------------------------- + +module Data.Functor.Sum.Singletons ( + -- * The 'Product' singleton + Sing, SSum(..), + + -- * Defunctionalization symbols + InLSym0, InLSym1, + InRSym0, InRSym1, + ) where + +import Data.Foldable.Singletons hiding (Sum) +import Data.Functor.Singletons +import Data.Functor.Sum +import Data.Kind +import Data.Singletons +import Data.Singletons.TH +import Data.Traversable.Singletons + +{- +In order to keep the type arguments to Sum poly-kinded and with inferred +specificities, we define the singleton version of Sum, as well as its +defunctionalization symbols, by hand. This is very much in the spirit of the +code in Data.Functor.Const.Singletons. (See the comments above SConst in that +module for more details on this choice.) +-} +type SSum :: Sum f g a -> Type +data SSum :: Sum f g a -> Type where + SInL :: forall f g a (x :: f a). + Sing x -> SSum ('InL @f @g @a x) + SInR :: forall f g a (y :: g a). + Sing y -> SSum ('InR @f @g @a y) +type instance Sing = SSum +instance SingI x => SingI ('InL x) where + sing = SInL sing +instance SingI1 'InL where + liftSing = SInL +instance SingI y => SingI ('InR y) where + sing = SInR sing +instance SingI1 'InR where + liftSing = SInR + +type InLSym0 :: forall f g a. f a ~> Sum f g a +data InLSym0 z +type instance Apply InLSym0 x = 'InL x +instance SingI InLSym0 where + sing = singFun1 SInL + +type InLSym1 :: forall f g a. f a -> Sum f g a +type family InLSym1 x where + InLSym1 x = 'InL x + +type InRSym0 :: forall f g a. g a ~> Sum f g a +data InRSym0 z +type instance Apply InRSym0 y = 'InR y +instance SingI InRSym0 where + sing = singFun1 SInR + +type InRSym1 :: forall f g a. g a -> Sum f g a +type family InRSym1 x where + InRSym1 y = 'InR y + +$(singletonsOnly [d| + instance (Functor f, Functor g) => Functor (Sum f g) where + fmap f (InL x) = InL (fmap f x) + fmap f (InR y) = InR (fmap f y) + + a <$ (InL x) = InL (a <$ x) + a <$ (InR y) = InR (a <$ y) + + instance (Foldable f, Foldable g) => Foldable (Sum f g) where + foldMap f (InL x) = foldMap f x + foldMap f (InR y) = foldMap f y + + instance (Traversable f, Traversable g) => Traversable (Sum f g) where + traverse f (InL x) = InL <$> traverse f x + traverse f (InR y) = InR <$> traverse f y + |])
src/Data/List/NonEmpty/Singletons.hs view
@@ -1,519 +1,519 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE UndecidableInstances #-}-{-# OPTIONS_GHC -Wno-orphans #-}---------------------------------------------------------------------------------- |--- Module : Data.List.NonEmpty.Singletons--- Copyright : (C) 2016 Richard Eisenberg--- License : BSD-style (see LICENSE)--- Maintainer : Ryan Scott--- Stability : experimental--- Portability : non-portable------ Defines functions and datatypes relating to the singleton for 'NonEmpty',--- including singled versions of all the definitions in @Data.List.NonEmpty@.------ Because many of these definitions are produced by Template Haskell,--- it is not possible to create proper Haddock documentation. Please look--- up the corresponding operation in @Data.List.NonEmpty@. Also, please excuse--- the apparent repeated variable names. This is due to an interaction--- between Template Haskell and Haddock.----------------------------------------------------------------------------------module Data.List.NonEmpty.Singletons (- -- * The 'NonEmpty' singleton- Sing, SNonEmpty(..),-- -- * Non-empty stream transformations- Map, sMap,- Intersperse, sIntersperse,- Scanl, sScanl,- Scanr, sScanr,- Scanl1, sScanl1,- Scanr1, sScanr1,- Transpose, sTranspose,- SortBy, sSortBy,- SortWith, sSortWith,- Length, sLength,- Head, sHead,- Tail, sTail,- Last, sLast,- Init, sInit,- type (<|), (%<|),- Cons, sCons,- Uncons, sUncons,- Unfoldr, sUnfoldr,- Sort, sSort,- Reverse, sReverse,- Inits, sInits,- Tails, sTails,- Unfold, sUnfold,- Insert, sInsert,- Take, sTake,- Drop, sDrop,- SplitAt, sSplitAt,- TakeWhile, sTakeWhile,- DropWhile, sDropWhile,- Span, sSpan,- Break, sBreak,- Filter, sFilter,- Partition, sPartition,- Group, sGroup,- GroupBy, sGroupBy,- GroupWith, sGroupWith,- GroupAllWith, sGroupAllWith,- Group1, sGroup1,- GroupBy1, sGroupBy1,- GroupWith1, sGroupWith1,- GroupAllWith1, sGroupAllWith1,- IsPrefixOf, sIsPrefixOf,- Nub, sNub,- NubBy, sNubBy,- type (!!), (%!!),- Zip, sZip,- ZipWith, sZipWith,- Unzip, sUnzip,- FromList, sFromList,- ToList, sToList,- NonEmpty_, sNonEmpty_,- Xor, sXor,-- -- * Defunctionalization symbols- (:|@#@$), (:|@#@$$), (:|@#@$$$),- MapSym0, MapSym1, MapSym2,- IntersperseSym0, IntersperseSym1, IntersperseSym2,- ScanlSym0, ScanlSym1, ScanlSym2, ScanlSym3,- ScanrSym0, ScanrSym1, ScanrSym2, ScanrSym3,- Scanl1Sym0, Scanl1Sym1, Scanl1Sym2,- Scanr1Sym0, Scanr1Sym1, Scanr1Sym2,- TransposeSym0, TransposeSym1,- SortBySym0, SortBySym1, SortBySym2,- SortWithSym0, SortWithSym1, SortWithSym2,- LengthSym0, LengthSym1,- HeadSym0, HeadSym1,- TailSym0, TailSym1,- LastSym0, LastSym1,- InitSym0, InitSym1,- type (<|@#@$), type (<|@#@$$), type (<|@#@$$$),- ConsSym0, ConsSym1, ConsSym2,- UnconsSym0, UnconsSym1,- UnfoldrSym0, UnfoldrSym1, UnfoldrSym2,- SortSym0, SortSym1,- ReverseSym0, ReverseSym1,- InitsSym0, InitsSym1,- TailsSym0, TailsSym1,- UnfoldSym0, UnfoldSym1,- InsertSym0, InsertSym1, InsertSym2,- TakeSym0, TakeSym1, TakeSym2,- DropSym0, DropSym1, DropSym2,- SplitAtSym0, SplitAtSym1, SplitAtSym2,- TakeWhileSym0, TakeWhileSym1, TakeWhileSym2,- DropWhileSym0, DropWhileSym1, DropWhileSym2,- SpanSym0, SpanSym1, SpanSym2,- BreakSym0, BreakSym1, BreakSym2,- FilterSym0, FilterSym1, FilterSym2,- PartitionSym0, PartitionSym1, PartitionSym2,- GroupSym0, GroupSym1,- GroupBySym0, GroupBySym1, GroupBySym2,- GroupWithSym0, GroupWithSym1, GroupWithSym2,- GroupAllWithSym0, GroupAllWithSym1, GroupAllWithSym2,- Group1Sym0, Group1Sym1,- GroupBy1Sym0, GroupBy1Sym1, GroupBy1Sym2,- GroupWith1Sym0, GroupWith1Sym1, GroupWith1Sym2,- GroupAllWith1Sym0, GroupAllWith1Sym1, GroupAllWith1Sym2,- IsPrefixOfSym0, IsPrefixOfSym1, IsPrefixOfSym2,- NubSym0, NubSym1,- NubBySym0, NubBySym1, NubBySym2,- type (!!@#@$), type (!!@#@$$), type (!!@#@$$$),- ZipSym0, ZipSym1, ZipSym2,- ZipWithSym0, ZipWithSym1, ZipWithSym2, ZipWithSym3,- UnzipSym0, UnzipSym1,- FromListSym0, FromListSym1,- ToListSym0, ToListSym1,- NonEmpty_Sym0, NonEmpty_Sym1,- XorSym0, XorSym1- ) where--import Control.Monad.Zip-import Control.Monad.Zip.Singletons-import Data.Bool.Singletons-import Data.Eq.Singletons-import Data.Function.Singletons-import Data.List.NonEmpty-import Data.List.Singletons.Internal.Disambiguation-import Data.Maybe.Singletons-import Data.Ord.Singletons-import Data.Singletons.Base.Instances-import Data.Function-import Data.Ord-import Data.Singletons.TH-import GHC.Base.Singletons hiding ( MapSym0, MapSym1, MapSym2, Map, sMap )-import GHC.Num.Singletons-import GHC.TypeLits.Singletons--$(singletonsOnly [d|- {-- -- | @since 4.9.0.0- instance Exts.IsList (NonEmpty a) where- type Item (NonEmpty a) = a- fromList = fromList- toList = toList-- -- | @since 4.9.0.0- instance MonadFix NonEmpty where- mfix f = case fix (f . head) of- ~(x :| _) -> x :| mfix (tail . f)- -}-- instance MonadZip NonEmpty where- mzip = zip- mzipWith = zipWith- munzip = unzip-- -- needed to implement other functions- fmap :: (a -> b) -> NonEmpty a -> NonEmpty b- fmap f (x :| xs) = f x :| listmap f xs-- -- -| Number of elements in 'NonEmpty' list.- length :: NonEmpty a -> Natural- length (_ :| xs) = 1 + listlength xs-- -- -| Compute n-ary logic exclusive OR operation on 'NonEmpty' list.- xor :: NonEmpty Bool -> Bool- xor (x :| xs) = foldr xor' x xs- where xor' True y = not y- xor' False y = y-- -- -| 'unfold' produces a new stream by repeatedly applying the unfolding- -- function to the seed value to produce an element of type @b@ and a new- -- seed value. When the unfolding function returns 'Nothing' instead of- -- a new seed value, the stream ends.- unfold :: (a -> (b, Maybe a)) -> a -> NonEmpty b- unfold f a = case f a of- (b, Nothing) -> b :| []- (b, Just c) -> b <| unfold f c-- -- -| 'nonEmpty' efficiently turns a normal list into a 'NonEmpty' stream,- -- producing 'Nothing' if the input is empty.- nonEmpty_ :: [a] -> Maybe (NonEmpty a)- nonEmpty_ [] = Nothing- nonEmpty_ (a:as) = Just (a :| as)-- -- -| 'uncons' produces the first element of the stream, and a stream of the- -- remaining elements, if any.- uncons :: NonEmpty a -> (a, Maybe (NonEmpty a))- uncons (a :| as) = (a, nonEmpty_ as)-- -- -| The 'unfoldr' function is analogous to "Data.List"'s- -- 'Data.List.unfoldr' operation.- unfoldr :: (a -> (b, Maybe a)) -> a -> NonEmpty b- unfoldr f a = case f a of- (b, mc) -> b :| maybe_ [] go mc- where- go c = case f c of- (d, me) -> d : maybe_ [] go me-- -- -| Extract the first element of the stream.- head :: NonEmpty a -> a- head (a :| _) = a-- -- -| Extract the possibly-empty tail of the stream.- tail :: NonEmpty a -> [a]- tail (_ :| as) = as-- -- -| Extract the last element of the stream.- last :: NonEmpty a -> a- last (a :| as) = listlast (a : as)-- -- -| Extract everything except the last element of the stream.- init :: NonEmpty a -> [a]- init (a :| as) = listinit (a : as)-- -- -| Prepend an element to the stream.- (<|) :: a -> NonEmpty a -> NonEmpty a- a <| (b :| bs) = a :| b : bs-- -- -| Synonym for '<|'.- cons :: a -> NonEmpty a -> NonEmpty a- cons = (<|)-- -- -| Sort a stream.- sort :: Ord a => NonEmpty a -> NonEmpty a- sort = lift listsort-- -- -| Converts a normal list to a 'NonEmpty' stream.- --- -- Raises an error if given an empty list.- fromList :: [a] -> NonEmpty a- fromList (a:as) = a :| as- fromList [] = error "NonEmpty.fromList: empty list"-- -- -| Convert a stream to a normal list efficiently.- toList :: NonEmpty a -> [a]- toList (a :| as) = a : as-- -- -| Lift list operations to work on a 'NonEmpty' stream.- --- -- /Beware/: If the provided function returns an empty list,- -- this will raise an error.- lift :: ([a] -> [b]) -> NonEmpty a -> NonEmpty b- lift f = fromList . f . toList-- -- -| Map a function over a 'NonEmpty' stream.- map :: (a -> b) -> NonEmpty a -> NonEmpty b- map f (a :| as) = f a :| listmap f as-- -- -| The 'inits' function takes a stream @xs@ and returns all the- -- finite prefixes of @xs@.- inits :: [a] -> NonEmpty [a]- inits = fromList . listinits-- -- -| The 'tails' function takes a stream @xs@ and returns all the- -- suffixes of @xs@.- tails :: [a] -> NonEmpty [a]- tails = fromList . listtails-- -- -| @'insert' x xs@ inserts @x@ into the last position in @xs@ where it- -- is still less than or equal to the next element. In particular, if the- -- list is sorted beforehand, the result will also be sorted.- insert :: Ord a => a -> [a] -> NonEmpty a- insert a = fromList . listinsert a-- {-- -- | @'some1' x@ sequences @x@ one or more times.- some1 :: Alternative f => f a -> f (NonEmpty a)- some1 x = (:|) <$> x <*> many x- -}-- -- -| 'scanl' is similar to 'foldl', but returns a stream of successive- -- reduced values from the left:- --- -- > scanl f z [x1, x2, ...] == z :| [z `f` x1, (z `f` x1) `f` x2, ...]- --- -- Note that- --- -- > last (scanl f z xs) == foldl f z xs.- scanl :: (b -> a -> b) -> b -> [a] -> NonEmpty b- scanl f z = fromList . listscanl f z-- -- -| 'scanr' is the right-to-left dual of 'scanl'.- -- Note that- --- -- > head (scanr f z xs) == foldr f z xs.- scanr :: (a -> b -> b) -> b -> [a] -> NonEmpty b- scanr f z = fromList . listscanr f z-- -- -| 'scanl1' is a variant of 'scanl' that has no starting value argument:- --- -- > scanl1 f [x1, x2, ...] == x1 :| [x1 `f` x2, x1 `f` (x2 `f` x3), ...]- scanl1 :: (a -> a -> a) -> NonEmpty a -> NonEmpty a- scanl1 f (a :| as) = fromList (listscanl f a as)-- -- -| 'scanr1' is a variant of 'scanr' that has no starting value argument.- scanr1 :: (a -> a -> a) -> NonEmpty a -> NonEmpty a- scanr1 f (a :| as) = fromList (listscanr1 f (a:as))-- -- -| 'intersperse x xs' alternates elements of the list with copies of @x@.- --- -- > intersperse 0 (1 :| [2,3]) == 1 :| [0,2,0,3]- intersperse :: a -> NonEmpty a -> NonEmpty a- intersperse a (b :| bs) = b :| case bs of- [] -> []- _:_ -> a : listintersperse a bs-- {-- -- | @'iterate' f x@ produces the infinite sequence- -- of repeated applications of @f@ to @x@.- --- -- > iterate f x = x :| [f x, f (f x), ..]- iterate :: (a -> a) -> a -> NonEmpty a- iterate f a = a :| listiterate f (f a)-- -- | @'cycle' xs@ returns the infinite repetition of @xs@:- --- -- > cycle (1 :| [2,3]) = 1 :| [2,3,1,2,3,...]- cycle :: NonEmpty a -> NonEmpty a- cycle = fromList . listcycle . toList- -}-- -- -| 'reverse' a finite NonEmpty stream.- reverse :: NonEmpty a -> NonEmpty a- reverse = lift listreverse-- {-- -- | @'repeat' x@ returns a constant stream, where all elements are- -- equal to @x@.- repeat :: a -> NonEmpty a- repeat a = a :| listrepeat a- -}-- -- -| @'take' n xs@ returns the first @n@ elements of @xs@.- take :: Natural -> NonEmpty a -> [a]- take n = listtake n . toList-- -- -| @'drop' n xs@ drops the first @n@ elements off the front of- -- the sequence @xs@.- drop :: Natural -> NonEmpty a -> [a]- drop n = listdrop n . toList-- -- -| @'splitAt' n xs@ returns a pair consisting of the prefix of @xs@- -- of length @n@ and the remaining stream immediately following this prefix.- --- -- > 'splitAt' n xs == ('take' n xs, 'drop' n xs)- -- > xs == ys ++ zs where (ys, zs) = 'splitAt' n xs- splitAt :: Natural -> NonEmpty a -> ([a],[a])- splitAt n = listsplitAt n . toList-- -- -| @'takeWhile' p xs@ returns the longest prefix of the stream- -- @xs@ for which the predicate @p@ holds.- takeWhile :: (a -> Bool) -> NonEmpty a -> [a]- takeWhile p = listtakeWhile p . toList-- -- -| @'dropWhile' p xs@ returns the suffix remaining after- -- @'takeWhile' p xs@.- dropWhile :: (a -> Bool) -> NonEmpty a -> [a]- dropWhile p = listdropWhile p . toList-- -- -| @'span' p xs@ returns the longest prefix of @xs@ that satisfies- -- @p@, together with the remainder of the stream.- --- -- > 'span' p xs == ('takeWhile' p xs, 'dropWhile' p xs)- -- > xs == ys ++ zs where (ys, zs) = 'span' p xs- span :: (a -> Bool) -> NonEmpty a -> ([a], [a])- span p = listspan p . toList-- -- -| The @'break' p@ function is equivalent to @'span' (not . p)@.- break :: (a -> Bool) -> NonEmpty a -> ([a], [a])- break p = span (not . p)-- -- -| @'filter' p xs@ removes any elements from @xs@ that do not satisfy @p@.- filter :: (a -> Bool) -> NonEmpty a -> [a]- filter p = listfilter p . toList-- -- -| The 'partition' function takes a predicate @p@ and a stream- -- @xs@, and returns a pair of lists. The first list corresponds to the- -- elements of @xs@ for which @p@ holds; the second corresponds to the- -- elements of @xs@ for which @p@ does not hold.- --- -- > 'partition' p xs = ('filter' p xs, 'filter' (not . p) xs)- partition :: (a -> Bool) -> NonEmpty a -> ([a], [a])- partition p = listpartition p . toList-- -- -| The 'group' function takes a stream and returns a list of- -- streams such that flattening the resulting list is equal to the- -- argument. Moreover, each stream in the resulting list- -- contains only equal elements. For example, in list notation:- --- -- > 'group' $ 'cycle' "Mississippi"- -- > = "M" : "i" : "ss" : "i" : "ss" : "i" : "pp" : "i" : "M" : "i" : ...- group :: Eq a => [a] -> [NonEmpty a]- group = groupBy (==)-- -- -| 'groupBy' operates like 'group', but uses the provided equality- -- predicate instead of `==`.- groupBy :: (a -> a -> Bool) -> [a] -> [NonEmpty a]- groupBy eq0 = go eq0- where- go _ [] = []- go eq (x : xs) = (x :| ys) : groupBy eq zs- where (ys, zs) = listspan (eq x) xs-- -- -| 'groupWith' operates like 'group', but uses the provided projection when- -- comparing for equality- groupWith :: Eq b => (a -> b) -> [a] -> [NonEmpty a]- groupWith f = groupBy ((==) `on` f)-- -- -| 'groupAllWith' operates like 'groupWith', but sorts the list- -- first so that each equivalence class has, at most, one list in the- -- output- groupAllWith :: (Ord b) => (a -> b) -> [a] -> [NonEmpty a]- groupAllWith f = groupWith f . listsortBy (compare `on` f)-- -- -| 'group1' operates like 'group', but uses the knowledge that its- -- input is non-empty to produce guaranteed non-empty output.- group1 :: Eq a => NonEmpty a -> NonEmpty (NonEmpty a)- group1 = groupBy1 (==)-- -- -| 'groupBy1' is to 'group1' as 'groupBy' is to 'group'.- groupBy1 :: (a -> a -> Bool) -> NonEmpty a -> NonEmpty (NonEmpty a)- groupBy1 eq (x :| xs) = (x :| ys) :| groupBy eq zs- where (ys, zs) = listspan (eq x) xs-- -- -| 'groupWith1' is to 'group1' as 'groupWith' is to 'group'- groupWith1 :: (Eq b) => (a -> b) -> NonEmpty a -> NonEmpty (NonEmpty a)- groupWith1 f = groupBy1 ((==) `on` f)-- -- -| 'groupAllWith1' is to 'groupWith1' as 'groupAllWith' is to 'groupWith'- groupAllWith1 :: (Ord b) => (a -> b) -> NonEmpty a -> NonEmpty (NonEmpty a)- groupAllWith1 f = groupWith1 f . sortWith f-- -- -| The 'isPrefix' function returns @True@ if the first argument is- -- a prefix of the second.- isPrefixOf :: Eq a => [a] -> NonEmpty a -> Bool- isPrefixOf [] _ = True- isPrefixOf (y:ys) (x :| xs) = (y == x) && listisPrefixOf ys xs-- -- -| @xs !! n@ returns the element of the stream @xs@ at index- -- @n@. Note that the head of the stream has index 0.- --- -- /Beware/: a negative or out-of-bounds index will cause an error.- (!!) :: NonEmpty a -> Natural -> a- (!!) (x :| xs) n- | n == 0 = x- | n > 0 = xs `listindex` (n - 1)- | otherwise = error "NonEmpty.!! negative argument"-- -- -| The 'zip' function takes two streams and returns a stream of- -- corresponding pairs.- zip :: NonEmpty a -> NonEmpty b -> NonEmpty (a,b)- zip (x :| xs) (y :| ys) = (x, y) :| listzip xs ys-- -- -| The 'zipWith' function generalizes 'zip'. Rather than tupling- -- the elements, the elements are combined using the function- -- passed as the first argument.- zipWith :: (a -> b -> c) -> NonEmpty a -> NonEmpty b -> NonEmpty c- zipWith f (x :| xs) (y :| ys) = f x y :| listzipWith f xs ys-- -- -| The 'unzip' function is the inverse of the 'zip' function.- unzip :: NonEmpty (a,b) -> (NonEmpty a, NonEmpty b)- unzip ((a,b) :| asbs) = (a :| as, b :| bs)- where- (as, bs) = listunzip asbs-- -- -| The 'nub' function removes duplicate elements from a list. In- -- particular, it keeps only the first occurence of each element.- -- (The name 'nub' means \'essence\'.)- -- It is a special case of 'nubBy', which allows the programmer to- -- supply their own inequality test.- nub :: Eq a => NonEmpty a -> NonEmpty a- nub = nubBy (==)-- -- -| The 'nubBy' function behaves just like 'nub', except it uses a- -- user-supplied equality predicate instead of the overloaded '=='- -- function.- nubBy :: (a -> a -> Bool) -> NonEmpty a -> NonEmpty a- nubBy eq (a :| as) = a :| listnubBy eq (listfilter (\b -> not (eq a b)) as)-- -- -| 'transpose' for 'NonEmpty', behaves the same as 'Data.List.transpose'- -- The rows/columns need not be the same length, in which case- -- > transpose . transpose /= id- transpose :: NonEmpty (NonEmpty a) -> NonEmpty (NonEmpty a)- transpose = fmap fromList- . fromList . listtranspose . toList- . fmap toList-- -- -| 'sortBy' for 'NonEmpty', behaves the same as 'Data.List.sortBy'- sortBy :: (a -> a -> Ordering) -> NonEmpty a -> NonEmpty a- sortBy f = lift (listsortBy f)-- -- -| 'sortWith' for 'NonEmpty', behaves the same as:- --- -- > sortBy . comparing- sortWith :: Ord o => (a -> o) -> NonEmpty a -> NonEmpty a- sortWith = sortBy . comparing-- |])+{-# LANGUAGE DataKinds #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE UndecidableInstances #-} +{-# OPTIONS_GHC -Wno-orphans #-} + +----------------------------------------------------------------------------- +-- | +-- Module : Data.List.NonEmpty.Singletons +-- Copyright : (C) 2016 Richard Eisenberg +-- License : BSD-style (see LICENSE) +-- Maintainer : Ryan Scott +-- Stability : experimental +-- Portability : non-portable +-- +-- Defines functions and datatypes relating to the singleton for 'NonEmpty', +-- including singled versions of all the definitions in @Data.List.NonEmpty@. +-- +-- Because many of these definitions are produced by Template Haskell, +-- it is not possible to create proper Haddock documentation. Please look +-- up the corresponding operation in @Data.List.NonEmpty@. Also, please excuse +-- the apparent repeated variable names. This is due to an interaction +-- between Template Haskell and Haddock. +-- +---------------------------------------------------------------------------- + +module Data.List.NonEmpty.Singletons ( + -- * The 'NonEmpty' singleton + Sing, SNonEmpty(..), + + -- * Non-empty stream transformations + Map, sMap, + Intersperse, sIntersperse, + Scanl, sScanl, + Scanr, sScanr, + Scanl1, sScanl1, + Scanr1, sScanr1, + Transpose, sTranspose, + SortBy, sSortBy, + SortWith, sSortWith, + Length, sLength, + Head, sHead, + Tail, sTail, + Last, sLast, + Init, sInit, + type (<|), (%<|), + Cons, sCons, + Uncons, sUncons, + Unfoldr, sUnfoldr, + Sort, sSort, + Reverse, sReverse, + Inits, sInits, + Tails, sTails, + Unfold, sUnfold, + Insert, sInsert, + Take, sTake, + Drop, sDrop, + SplitAt, sSplitAt, + TakeWhile, sTakeWhile, + DropWhile, sDropWhile, + Span, sSpan, + Break, sBreak, + Filter, sFilter, + Partition, sPartition, + Group, sGroup, + GroupBy, sGroupBy, + GroupWith, sGroupWith, + GroupAllWith, sGroupAllWith, + Group1, sGroup1, + GroupBy1, sGroupBy1, + GroupWith1, sGroupWith1, + GroupAllWith1, sGroupAllWith1, + IsPrefixOf, sIsPrefixOf, + Nub, sNub, + NubBy, sNubBy, + type (!!), (%!!), + Zip, sZip, + ZipWith, sZipWith, + Unzip, sUnzip, + FromList, sFromList, + ToList, sToList, + NonEmpty_, sNonEmpty_, + Xor, sXor, + + -- * Defunctionalization symbols + (:|@#@$), (:|@#@$$), (:|@#@$$$), + MapSym0, MapSym1, MapSym2, + IntersperseSym0, IntersperseSym1, IntersperseSym2, + ScanlSym0, ScanlSym1, ScanlSym2, ScanlSym3, + ScanrSym0, ScanrSym1, ScanrSym2, ScanrSym3, + Scanl1Sym0, Scanl1Sym1, Scanl1Sym2, + Scanr1Sym0, Scanr1Sym1, Scanr1Sym2, + TransposeSym0, TransposeSym1, + SortBySym0, SortBySym1, SortBySym2, + SortWithSym0, SortWithSym1, SortWithSym2, + LengthSym0, LengthSym1, + HeadSym0, HeadSym1, + TailSym0, TailSym1, + LastSym0, LastSym1, + InitSym0, InitSym1, + type (<|@#@$), type (<|@#@$$), type (<|@#@$$$), + ConsSym0, ConsSym1, ConsSym2, + UnconsSym0, UnconsSym1, + UnfoldrSym0, UnfoldrSym1, UnfoldrSym2, + SortSym0, SortSym1, + ReverseSym0, ReverseSym1, + InitsSym0, InitsSym1, + TailsSym0, TailsSym1, + UnfoldSym0, UnfoldSym1, + InsertSym0, InsertSym1, InsertSym2, + TakeSym0, TakeSym1, TakeSym2, + DropSym0, DropSym1, DropSym2, + SplitAtSym0, SplitAtSym1, SplitAtSym2, + TakeWhileSym0, TakeWhileSym1, TakeWhileSym2, + DropWhileSym0, DropWhileSym1, DropWhileSym2, + SpanSym0, SpanSym1, SpanSym2, + BreakSym0, BreakSym1, BreakSym2, + FilterSym0, FilterSym1, FilterSym2, + PartitionSym0, PartitionSym1, PartitionSym2, + GroupSym0, GroupSym1, + GroupBySym0, GroupBySym1, GroupBySym2, + GroupWithSym0, GroupWithSym1, GroupWithSym2, + GroupAllWithSym0, GroupAllWithSym1, GroupAllWithSym2, + Group1Sym0, Group1Sym1, + GroupBy1Sym0, GroupBy1Sym1, GroupBy1Sym2, + GroupWith1Sym0, GroupWith1Sym1, GroupWith1Sym2, + GroupAllWith1Sym0, GroupAllWith1Sym1, GroupAllWith1Sym2, + IsPrefixOfSym0, IsPrefixOfSym1, IsPrefixOfSym2, + NubSym0, NubSym1, + NubBySym0, NubBySym1, NubBySym2, + type (!!@#@$), type (!!@#@$$), type (!!@#@$$$), + ZipSym0, ZipSym1, ZipSym2, + ZipWithSym0, ZipWithSym1, ZipWithSym2, ZipWithSym3, + UnzipSym0, UnzipSym1, + FromListSym0, FromListSym1, + ToListSym0, ToListSym1, + NonEmpty_Sym0, NonEmpty_Sym1, + XorSym0, XorSym1 + ) where + +import Control.Monad.Zip +import Control.Monad.Zip.Singletons +import Data.Bool.Singletons +import Data.Eq.Singletons +import Data.Function.Singletons +import Data.List.NonEmpty +import Data.List.Singletons.Internal.Disambiguation +import Data.Maybe.Singletons +import Data.Ord.Singletons +import Data.Singletons.Base.Instances +import Data.Function +import Data.Ord +import Data.Singletons.TH +import GHC.Base.Singletons hiding ( MapSym0, MapSym1, MapSym2, Map, sMap ) +import GHC.Num.Singletons +import GHC.TypeLits.Singletons + +$(singletonsOnly [d| + {- + -- | @since 4.9.0.0 + instance Exts.IsList (NonEmpty a) where + type Item (NonEmpty a) = a + fromList = fromList + toList = toList + + -- | @since 4.9.0.0 + instance MonadFix NonEmpty where + mfix f = case fix (f . head) of + ~(x :| _) -> x :| mfix (tail . f) + -} + + instance MonadZip NonEmpty where + mzip = zip + mzipWith = zipWith + munzip = unzip + + -- needed to implement other functions + fmap :: (a -> b) -> NonEmpty a -> NonEmpty b + fmap f (x :| xs) = f x :| listmap f xs + + -- -| Number of elements in 'NonEmpty' list. + length :: NonEmpty a -> Natural + length (_ :| xs) = 1 + listlength xs + + -- -| Compute n-ary logic exclusive OR operation on 'NonEmpty' list. + xor :: NonEmpty Bool -> Bool + xor (x :| xs) = foldr xor' x xs + where xor' True y = not y + xor' False y = y + + -- -| 'unfold' produces a new stream by repeatedly applying the unfolding + -- function to the seed value to produce an element of type @b@ and a new + -- seed value. When the unfolding function returns 'Nothing' instead of + -- a new seed value, the stream ends. + unfold :: (a -> (b, Maybe a)) -> a -> NonEmpty b + unfold f a = case f a of + (b, Nothing) -> b :| [] + (b, Just c) -> b <| unfold f c + + -- -| 'nonEmpty' efficiently turns a normal list into a 'NonEmpty' stream, + -- producing 'Nothing' if the input is empty. + nonEmpty_ :: [a] -> Maybe (NonEmpty a) + nonEmpty_ [] = Nothing + nonEmpty_ (a:as) = Just (a :| as) + + -- -| 'uncons' produces the first element of the stream, and a stream of the + -- remaining elements, if any. + uncons :: NonEmpty a -> (a, Maybe (NonEmpty a)) + uncons (a :| as) = (a, nonEmpty_ as) + + -- -| The 'unfoldr' function is analogous to "Data.List"'s + -- 'Data.List.unfoldr' operation. + unfoldr :: (a -> (b, Maybe a)) -> a -> NonEmpty b + unfoldr f a = case f a of + (b, mc) -> b :| maybe_ [] go mc + where + go c = case f c of + (d, me) -> d : maybe_ [] go me + + -- -| Extract the first element of the stream. + head :: NonEmpty a -> a + head (a :| _) = a + + -- -| Extract the possibly-empty tail of the stream. + tail :: NonEmpty a -> [a] + tail (_ :| as) = as + + -- -| Extract the last element of the stream. + last :: NonEmpty a -> a + last (a :| as) = listlast (a : as) + + -- -| Extract everything except the last element of the stream. + init :: NonEmpty a -> [a] + init (a :| as) = listinit (a : as) + + -- -| Prepend an element to the stream. + (<|) :: a -> NonEmpty a -> NonEmpty a + a <| (b :| bs) = a :| b : bs + + -- -| Synonym for '<|'. + cons :: a -> NonEmpty a -> NonEmpty a + cons = (<|) + + -- -| Sort a stream. + sort :: Ord a => NonEmpty a -> NonEmpty a + sort = lift listsort + + -- -| Converts a normal list to a 'NonEmpty' stream. + -- + -- Raises an error if given an empty list. + fromList :: [a] -> NonEmpty a + fromList (a:as) = a :| as + fromList [] = error "NonEmpty.fromList: empty list" + + -- -| Convert a stream to a normal list efficiently. + toList :: NonEmpty a -> [a] + toList (a :| as) = a : as + + -- -| Lift list operations to work on a 'NonEmpty' stream. + -- + -- /Beware/: If the provided function returns an empty list, + -- this will raise an error. + lift :: ([a] -> [b]) -> NonEmpty a -> NonEmpty b + lift f = fromList . f . toList + + -- -| Map a function over a 'NonEmpty' stream. + map :: (a -> b) -> NonEmpty a -> NonEmpty b + map f (a :| as) = f a :| listmap f as + + -- -| The 'inits' function takes a stream @xs@ and returns all the + -- finite prefixes of @xs@. + inits :: [a] -> NonEmpty [a] + inits = fromList . listinits + + -- -| The 'tails' function takes a stream @xs@ and returns all the + -- suffixes of @xs@. + tails :: [a] -> NonEmpty [a] + tails = fromList . listtails + + -- -| @'insert' x xs@ inserts @x@ into the last position in @xs@ where it + -- is still less than or equal to the next element. In particular, if the + -- list is sorted beforehand, the result will also be sorted. + insert :: Ord a => a -> [a] -> NonEmpty a + insert a = fromList . listinsert a + + {- + -- | @'some1' x@ sequences @x@ one or more times. + some1 :: Alternative f => f a -> f (NonEmpty a) + some1 x = (:|) <$> x <*> many x + -} + + -- -| 'scanl' is similar to 'foldl', but returns a stream of successive + -- reduced values from the left: + -- + -- > scanl f z [x1, x2, ...] == z :| [z `f` x1, (z `f` x1) `f` x2, ...] + -- + -- Note that + -- + -- > last (scanl f z xs) == foldl f z xs. + scanl :: (b -> a -> b) -> b -> [a] -> NonEmpty b + scanl f z = fromList . listscanl f z + + -- -| 'scanr' is the right-to-left dual of 'scanl'. + -- Note that + -- + -- > head (scanr f z xs) == foldr f z xs. + scanr :: (a -> b -> b) -> b -> [a] -> NonEmpty b + scanr f z = fromList . listscanr f z + + -- -| 'scanl1' is a variant of 'scanl' that has no starting value argument: + -- + -- > scanl1 f [x1, x2, ...] == x1 :| [x1 `f` x2, x1 `f` (x2 `f` x3), ...] + scanl1 :: (a -> a -> a) -> NonEmpty a -> NonEmpty a + scanl1 f (a :| as) = fromList (listscanl f a as) + + -- -| 'scanr1' is a variant of 'scanr' that has no starting value argument. + scanr1 :: (a -> a -> a) -> NonEmpty a -> NonEmpty a + scanr1 f (a :| as) = fromList (listscanr1 f (a:as)) + + -- -| 'intersperse x xs' alternates elements of the list with copies of @x@. + -- + -- > intersperse 0 (1 :| [2,3]) == 1 :| [0,2,0,3] + intersperse :: a -> NonEmpty a -> NonEmpty a + intersperse a (b :| bs) = b :| case bs of + [] -> [] + _:_ -> a : listintersperse a bs + + {- + -- | @'iterate' f x@ produces the infinite sequence + -- of repeated applications of @f@ to @x@. + -- + -- > iterate f x = x :| [f x, f (f x), ..] + iterate :: (a -> a) -> a -> NonEmpty a + iterate f a = a :| listiterate f (f a) + + -- | @'cycle' xs@ returns the infinite repetition of @xs@: + -- + -- > cycle (1 :| [2,3]) = 1 :| [2,3,1,2,3,...] + cycle :: NonEmpty a -> NonEmpty a + cycle = fromList . listcycle . toList + -} + + -- -| 'reverse' a finite NonEmpty stream. + reverse :: NonEmpty a -> NonEmpty a + reverse = lift listreverse + + {- + -- | @'repeat' x@ returns a constant stream, where all elements are + -- equal to @x@. + repeat :: a -> NonEmpty a + repeat a = a :| listrepeat a + -} + + -- -| @'take' n xs@ returns the first @n@ elements of @xs@. + take :: Natural -> NonEmpty a -> [a] + take n = listtake n . toList + + -- -| @'drop' n xs@ drops the first @n@ elements off the front of + -- the sequence @xs@. + drop :: Natural -> NonEmpty a -> [a] + drop n = listdrop n . toList + + -- -| @'splitAt' n xs@ returns a pair consisting of the prefix of @xs@ + -- of length @n@ and the remaining stream immediately following this prefix. + -- + -- > 'splitAt' n xs == ('take' n xs, 'drop' n xs) + -- > xs == ys ++ zs where (ys, zs) = 'splitAt' n xs + splitAt :: Natural -> NonEmpty a -> ([a],[a]) + splitAt n = listsplitAt n . toList + + -- -| @'takeWhile' p xs@ returns the longest prefix of the stream + -- @xs@ for which the predicate @p@ holds. + takeWhile :: (a -> Bool) -> NonEmpty a -> [a] + takeWhile p = listtakeWhile p . toList + + -- -| @'dropWhile' p xs@ returns the suffix remaining after + -- @'takeWhile' p xs@. + dropWhile :: (a -> Bool) -> NonEmpty a -> [a] + dropWhile p = listdropWhile p . toList + + -- -| @'span' p xs@ returns the longest prefix of @xs@ that satisfies + -- @p@, together with the remainder of the stream. + -- + -- > 'span' p xs == ('takeWhile' p xs, 'dropWhile' p xs) + -- > xs == ys ++ zs where (ys, zs) = 'span' p xs + span :: (a -> Bool) -> NonEmpty a -> ([a], [a]) + span p = listspan p . toList + + -- -| The @'break' p@ function is equivalent to @'span' (not . p)@. + break :: (a -> Bool) -> NonEmpty a -> ([a], [a]) + break p = span (not . p) + + -- -| @'filter' p xs@ removes any elements from @xs@ that do not satisfy @p@. + filter :: (a -> Bool) -> NonEmpty a -> [a] + filter p = listfilter p . toList + + -- -| The 'partition' function takes a predicate @p@ and a stream + -- @xs@, and returns a pair of lists. The first list corresponds to the + -- elements of @xs@ for which @p@ holds; the second corresponds to the + -- elements of @xs@ for which @p@ does not hold. + -- + -- > 'partition' p xs = ('filter' p xs, 'filter' (not . p) xs) + partition :: (a -> Bool) -> NonEmpty a -> ([a], [a]) + partition p = listpartition p . toList + + -- -| The 'group' function takes a stream and returns a list of + -- streams such that flattening the resulting list is equal to the + -- argument. Moreover, each stream in the resulting list + -- contains only equal elements. For example, in list notation: + -- + -- > 'group' $ 'cycle' "Mississippi" + -- > = "M" : "i" : "ss" : "i" : "ss" : "i" : "pp" : "i" : "M" : "i" : ... + group :: Eq a => [a] -> [NonEmpty a] + group = groupBy (==) + + -- -| 'groupBy' operates like 'group', but uses the provided equality + -- predicate instead of `==`. + groupBy :: (a -> a -> Bool) -> [a] -> [NonEmpty a] + groupBy eq0 = go eq0 + where + go _ [] = [] + go eq (x : xs) = (x :| ys) : groupBy eq zs + where (ys, zs) = listspan (eq x) xs + + -- -| 'groupWith' operates like 'group', but uses the provided projection when + -- comparing for equality + groupWith :: Eq b => (a -> b) -> [a] -> [NonEmpty a] + groupWith f = groupBy ((==) `on` f) + + -- -| 'groupAllWith' operates like 'groupWith', but sorts the list + -- first so that each equivalence class has, at most, one list in the + -- output + groupAllWith :: (Ord b) => (a -> b) -> [a] -> [NonEmpty a] + groupAllWith f = groupWith f . listsortBy (compare `on` f) + + -- -| 'group1' operates like 'group', but uses the knowledge that its + -- input is non-empty to produce guaranteed non-empty output. + group1 :: Eq a => NonEmpty a -> NonEmpty (NonEmpty a) + group1 = groupBy1 (==) + + -- -| 'groupBy1' is to 'group1' as 'groupBy' is to 'group'. + groupBy1 :: (a -> a -> Bool) -> NonEmpty a -> NonEmpty (NonEmpty a) + groupBy1 eq (x :| xs) = (x :| ys) :| groupBy eq zs + where (ys, zs) = listspan (eq x) xs + + -- -| 'groupWith1' is to 'group1' as 'groupWith' is to 'group' + groupWith1 :: (Eq b) => (a -> b) -> NonEmpty a -> NonEmpty (NonEmpty a) + groupWith1 f = groupBy1 ((==) `on` f) + + -- -| 'groupAllWith1' is to 'groupWith1' as 'groupAllWith' is to 'groupWith' + groupAllWith1 :: (Ord b) => (a -> b) -> NonEmpty a -> NonEmpty (NonEmpty a) + groupAllWith1 f = groupWith1 f . sortWith f + + -- -| The 'isPrefix' function returns @True@ if the first argument is + -- a prefix of the second. + isPrefixOf :: Eq a => [a] -> NonEmpty a -> Bool + isPrefixOf [] _ = True + isPrefixOf (y:ys) (x :| xs) = (y == x) && listisPrefixOf ys xs + + -- -| @xs !! n@ returns the element of the stream @xs@ at index + -- @n@. Note that the head of the stream has index 0. + -- + -- /Beware/: a negative or out-of-bounds index will cause an error. + (!!) :: NonEmpty a -> Natural -> a + (!!) (x :| xs) n + | n == 0 = x + | n > 0 = xs `listindex` (n - 1) + | otherwise = error "NonEmpty.!! negative argument" + + -- -| The 'zip' function takes two streams and returns a stream of + -- corresponding pairs. + zip :: NonEmpty a -> NonEmpty b -> NonEmpty (a,b) + zip (x :| xs) (y :| ys) = (x, y) :| listzip xs ys + + -- -| The 'zipWith' function generalizes 'zip'. Rather than tupling + -- the elements, the elements are combined using the function + -- passed as the first argument. + zipWith :: (a -> b -> c) -> NonEmpty a -> NonEmpty b -> NonEmpty c + zipWith f (x :| xs) (y :| ys) = f x y :| listzipWith f xs ys + + -- -| The 'unzip' function is the inverse of the 'zip' function. + unzip :: NonEmpty (a,b) -> (NonEmpty a, NonEmpty b) + unzip ((a,b) :| asbs) = (a :| as, b :| bs) + where + (as, bs) = listunzip asbs + + -- -| The 'nub' function removes duplicate elements from a list. In + -- particular, it keeps only the first occurence of each element. + -- (The name 'nub' means \'essence\'.) + -- It is a special case of 'nubBy', which allows the programmer to + -- supply their own inequality test. + nub :: Eq a => NonEmpty a -> NonEmpty a + nub = nubBy (==) + + -- -| The 'nubBy' function behaves just like 'nub', except it uses a + -- user-supplied equality predicate instead of the overloaded '==' + -- function. + nubBy :: (a -> a -> Bool) -> NonEmpty a -> NonEmpty a + nubBy eq (a :| as) = a :| listnubBy eq (listfilter (\b -> not (eq a b)) as) + + -- -| 'transpose' for 'NonEmpty', behaves the same as 'Data.List.transpose' + -- The rows/columns need not be the same length, in which case + -- > transpose . transpose /= id + transpose :: NonEmpty (NonEmpty a) -> NonEmpty (NonEmpty a) + transpose = fmap fromList + . fromList . listtranspose . toList + . fmap toList + + -- -| 'sortBy' for 'NonEmpty', behaves the same as 'Data.List.sortBy' + sortBy :: (a -> a -> Ordering) -> NonEmpty a -> NonEmpty a + sortBy f = lift (listsortBy f) + + -- -| 'sortWith' for 'NonEmpty', behaves the same as: + -- + -- > sortBy . comparing + sortWith :: Ord o => (a -> o) -> NonEmpty a -> NonEmpty a + sortWith = sortBy . comparing + + |])
src/Data/List/Singletons.hs view
@@ -1,281 +1,281 @@-{-# LANGUAGE ExplicitNamespaces #-}---------------------------------------------------------------------------------- |--- Module : Data.List.Singletons--- Copyright : (C) 2013-2014 Richard Eisenberg, Jan Stolarek--- License : BSD-style (see LICENSE)--- Maintainer : Ryan Scott--- Stability : experimental--- Portability : non-portable------ Defines functions and datatypes relating to the singleton for '[]',--- including singled versions of a few of the definitions in @Data.List@.------ Because many of these definitions are produced by Template Haskell,--- it is not possible to create proper Haddock documentation. Please look--- up the corresponding operation in @Data.List@. Also, please excuse--- the apparent repeated variable names. This is due to an interaction--- between Template Haskell and Haddock.----------------------------------------------------------------------------------module Data.List.Singletons (- -- * The singleton for lists- Sing, SList(..),-- -- * Basic functions- type (++), (%++), Head, sHead, Last, sLast, Tail, sTail, Init, sInit,- Null, sNull, Length, sLength,-- -- * List transformations- Map, sMap, Reverse, sReverse, Intersperse, sIntersperse,- Intercalate, sIntercalate, Transpose, sTranspose,- Subsequences, sSubsequences, Permutations, sPermutations,-- -- * Reducing lists (folds)- Foldl, sFoldl, Foldl', sFoldl', Foldl1, sFoldl1, Foldl1', sFoldl1',- Foldr, sFoldr, Foldr1, sFoldr1,-- -- ** Special folds- Concat, sConcat, ConcatMap, sConcatMap,- And, sAnd, Or, sOr, Any, sAny, All, sAll,- Sum, sSum, Product, sProduct, Maximum, sMaximum,- Minimum, sMinimum,-- -- * Building lists-- -- ** Scans- Scanl, sScanl, Scanl1, sScanl1, Scanr, sScanr, Scanr1, sScanr1,-- -- ** Accumulating maps- MapAccumL, sMapAccumL, MapAccumR, sMapAccumR,-- -- ** Cyclical lists- Replicate, sReplicate,-- -- ** Unfolding- Unfoldr, sUnfoldr,-- -- * Sublists-- -- ** Extracting sublists- Take, sTake, Drop, sDrop, SplitAt, sSplitAt,- TakeWhile, sTakeWhile, DropWhile, sDropWhile, DropWhileEnd, sDropWhileEnd,- Span, sSpan, Break, sBreak,- StripPrefix,- Group, sGroup,- Inits, sInits, Tails, sTails,-- -- ** Predicates- IsPrefixOf, sIsPrefixOf, IsSuffixOf, sIsSuffixOf, IsInfixOf, sIsInfixOf,-- -- * Searching lists-- -- ** Searching by equality- Elem, sElem, NotElem, sNotElem, Lookup, sLookup,-- -- ** Searching with a predicate- Find, sFind, Filter, sFilter, Partition, sPartition,-- -- * Indexing lists- type (!!), (%!!),- ElemIndex, sElemIndex, ElemIndices, sElemIndices,- FindIndex, sFindIndex, FindIndices, sFindIndices,-- -- * Zipping and unzipping lists- Zip, sZip, Zip3, sZip3,- Zip4, Zip5, Zip6, Zip7,- ZipWith, sZipWith, ZipWith3, sZipWith3,- ZipWith4, ZipWith5, ZipWith6, ZipWith7,- Unzip, sUnzip, Unzip3, sUnzip3, Unzip4, sUnzip4,- Unzip5, sUnzip5, Unzip6, sUnzip6, Unzip7, sUnzip7,-- -- * Special lists-- -- ** Functions on 'Symbol's- Unlines, sUnlines,- Unwords, sUnwords,-- -- ** \"Set\" operations- Nub, sNub, Delete, sDelete, type (\\), (%\\),- Union, sUnion, Intersect, sIntersect,-- -- ** Ordered lists- Insert, sInsert, Sort, sSort,-- -- * Generalized functions-- -- ** The \"@By@\" operations-- -- *** User-supplied equality (replacing an @Eq@ context)- -- | The predicate is assumed to define an equivalence.- NubBy, sNubBy,- DeleteBy, sDeleteBy, DeleteFirstsBy, sDeleteFirstsBy,- UnionBy, sUnionBy, IntersectBy, sIntersectBy,- GroupBy, sGroupBy,-- -- *** User-supplied comparison (replacing an @Ord@ context)- -- | The function is assumed to define a total ordering.- SortBy, sSortBy, InsertBy, sInsertBy,- MaximumBy, sMaximumBy, MinimumBy, sMinimumBy,-- -- ** The \"@generic@\" operations- -- | The prefix \`@generic@\' indicates an overloaded function that- -- is a generalized version of a "Prelude" function.- GenericLength, sGenericLength,-- -- * Defunctionalization symbols- NilSym0,- (:@#@$), (:@#@$$), (:@#@$$$),-- type (++@#@$$$), type (++@#@$$), type (++@#@$),- HeadSym0, HeadSym1, LastSym0, LastSym1,- TailSym0, TailSym1, InitSym0, InitSym1, NullSym0, NullSym1,- LengthSym0, LengthSym1,-- MapSym0, MapSym1, MapSym2, ReverseSym0, ReverseSym1,- IntersperseSym0, IntersperseSym1, IntersperseSym2,- IntercalateSym0, IntercalateSym1, IntercalateSym2,- TransposeSym0, TransposeSym1,- SubsequencesSym0, SubsequencesSym1,- PermutationsSym0, PermutationsSym1,-- FoldlSym0, FoldlSym1, FoldlSym2, FoldlSym3,- Foldl'Sym0, Foldl'Sym1, Foldl'Sym2, Foldl'Sym3,- Foldl1Sym0, Foldl1Sym1, Foldl1Sym2,- Foldl1'Sym0, Foldl1'Sym1, Foldl1'Sym2,- FoldrSym0, FoldrSym1, FoldrSym2, FoldrSym3,- Foldr1Sym0, Foldr1Sym1, Foldr1Sym2,-- ConcatSym0, ConcatSym1,- ConcatMapSym0, ConcatMapSym1, ConcatMapSym2,- AndSym0, AndSym1, OrSym0, OrSym1,- AnySym0, AnySym1, AnySym2,- AllSym0, AllSym1, AllSym2,- SumSym0, SumSym1,- ProductSym0, ProductSym1,- MaximumSym0, MaximumSym1,- MinimumSym0, MinimumSym1,-- ScanlSym0, ScanlSym1, ScanlSym2, ScanlSym3,- Scanl1Sym0, Scanl1Sym1, Scanl1Sym2,- ScanrSym0, ScanrSym1, ScanrSym2, ScanrSym3,- Scanr1Sym0, Scanr1Sym1, Scanr1Sym2,-- MapAccumLSym0, MapAccumLSym1, MapAccumLSym2, MapAccumLSym3,- MapAccumRSym0, MapAccumRSym1, MapAccumRSym2, MapAccumRSym3,-- ReplicateSym0, ReplicateSym1, ReplicateSym2,-- UnfoldrSym0, UnfoldrSym1, UnfoldrSym2,-- TakeSym0, TakeSym1, TakeSym2,- DropSym0, DropSym1, DropSym2,- SplitAtSym0, SplitAtSym1, SplitAtSym2,- TakeWhileSym0, TakeWhileSym1, TakeWhileSym2,- DropWhileSym0, DropWhileSym1, DropWhileSym2,- DropWhileEndSym0, DropWhileEndSym1, DropWhileEndSym2,- SpanSym0, SpanSym1, SpanSym2,- BreakSym0, BreakSym1, BreakSym2,- StripPrefixSym0, StripPrefixSym1, StripPrefixSym2,- GroupSym0, GroupSym1,- InitsSym0, InitsSym1, TailsSym0, TailsSym1,-- IsPrefixOfSym0, IsPrefixOfSym1, IsPrefixOfSym2,- IsSuffixOfSym0, IsSuffixOfSym1, IsSuffixOfSym2,- IsInfixOfSym0, IsInfixOfSym1, IsInfixOfSym2,-- ElemSym0, ElemSym1, ElemSym2,- NotElemSym0, NotElemSym1, NotElemSym2,- LookupSym0, LookupSym1, LookupSym2,-- FindSym0, FindSym1, FindSym2,- FilterSym0, FilterSym1, FilterSym2,- PartitionSym0, PartitionSym1, PartitionSym2,-- type (!!@#@$), type (!!@#@$$), type (!!@#@$$$),- ElemIndexSym0, ElemIndexSym1, ElemIndexSym2,- ElemIndicesSym0, ElemIndicesSym1, ElemIndicesSym2,- FindIndexSym0, FindIndexSym1, FindIndexSym2,- FindIndicesSym0, FindIndicesSym1, FindIndicesSym2,-- ZipSym0, ZipSym1, ZipSym2,- Zip3Sym0, Zip3Sym1, Zip3Sym2, Zip3Sym3,- Zip4Sym0, Zip4Sym1, Zip4Sym2, Zip4Sym3, Zip4Sym4,- Zip5Sym0, Zip5Sym1, Zip5Sym2, Zip5Sym3, Zip5Sym4, Zip5Sym5,- Zip6Sym0, Zip6Sym1, Zip6Sym2, Zip6Sym3, Zip6Sym4, Zip6Sym5, Zip6Sym6,- Zip7Sym0, Zip7Sym1, Zip7Sym2, Zip7Sym3, Zip7Sym4, Zip7Sym5, Zip7Sym6, Zip7Sym7,- ZipWithSym0, ZipWithSym1, ZipWithSym2, ZipWithSym3,- ZipWith3Sym0, ZipWith3Sym1, ZipWith3Sym2, ZipWith3Sym3, ZipWith3Sym4,- ZipWith4Sym0, ZipWith4Sym1, ZipWith4Sym2, ZipWith4Sym3, ZipWith4Sym4, ZipWith4Sym5,- ZipWith5Sym0, ZipWith5Sym1, ZipWith5Sym2, ZipWith5Sym3, ZipWith5Sym4, ZipWith5Sym5, ZipWith5Sym6,- ZipWith6Sym0, ZipWith6Sym1, ZipWith6Sym2, ZipWith6Sym3, ZipWith6Sym4, ZipWith6Sym5, ZipWith6Sym6, ZipWith6Sym7,- ZipWith7Sym0, ZipWith7Sym1, ZipWith7Sym2, ZipWith7Sym3, ZipWith7Sym4, ZipWith7Sym5, ZipWith7Sym6, ZipWith7Sym7, ZipWith7Sym8,- UnzipSym0, UnzipSym1,- Unzip3Sym0, Unzip3Sym1,- Unzip4Sym0, Unzip4Sym1,- Unzip5Sym0, Unzip5Sym1,- Unzip6Sym0, Unzip6Sym1,- Unzip7Sym0, Unzip7Sym1,-- UnlinesSym0, UnlinesSym1,- UnwordsSym0, UnwordsSym1,-- NubSym0, NubSym1,- DeleteSym0, DeleteSym1, DeleteSym2,- type (\\@#@$), type (\\@#@$$), type (\\@#@$$$),- UnionSym0, UnionSym1, UnionSym2,- IntersectSym0, IntersectSym1, IntersectSym2,-- InsertSym0, InsertSym1, InsertSym2,- SortSym0, SortSym1,-- NubBySym0, NubBySym1, NubBySym2,- DeleteBySym0, DeleteBySym1, DeleteBySym2, DeleteBySym3,- DeleteFirstsBySym0, DeleteFirstsBySym1, DeleteFirstsBySym2, DeleteFirstsBySym3,- UnionBySym0, UnionBySym1, UnionBySym2, UnionBySym3,- IntersectBySym0, IntersectBySym1, IntersectBySym2, IntersectBySym3,- GroupBySym0, GroupBySym1, GroupBySym2,-- SortBySym0, SortBySym1, SortBySym2,- InsertBySym0, InsertBySym1, InsertBySym2, InsertBySym3,- MaximumBySym0, MaximumBySym1, MaximumBySym2,- MinimumBySym0, MinimumBySym1, MinimumBySym2,-- GenericLengthSym0, GenericLengthSym1- ) where--import Data.Foldable.Singletons-import Data.Singletons.Base.Instances- (Sing, SList(..), NilSym0, type (:@#@$), type (:@#@$$), type (:@#@$$$))-import Data.Traversable.Singletons-import GHC.Base.Singletons- ( Map, MapSym0, MapSym1, MapSym2, sMap- , type (++), type (++@#@$), type (++@#@$$), type (++@#@$$$), (%++)- )--import Data.List.Singletons.Internal- hiding ( All, AllSym0, AllSym1, AllSym2, sAll- , And, AndSym0, AndSym1, sAnd- , Any, AnySym0, AnySym1, AnySym2, sAny- , Concat, ConcatSym0, ConcatSym1, sConcat- , ConcatMap, ConcatMapSym0, ConcatMapSym1, ConcatMapSym2, sConcatMap- , Elem, ElemSym0, ElemSym1, ElemSym2, sElem- , Find, FindSym0, FindSym1, FindSym2, sFind- , Foldl1, Foldl1Sym0, Foldl1Sym1, Foldl1Sym2, sFoldl1- , Foldl', Foldl'Sym0, Foldl'Sym1, Foldl'Sym2, Foldl'Sym3, sFoldl'- , Foldr1, Foldr1Sym0, Foldr1Sym1, Foldr1Sym2, sFoldr1- , MapAccumL, MapAccumLSym0, MapAccumLSym1, MapAccumLSym2, MapAccumLSym3, sMapAccumL- , MapAccumR, MapAccumRSym0, MapAccumRSym1, MapAccumRSym2, MapAccumRSym3, sMapAccumR- , Maximum, MaximumSym0, MaximumSym1, sMaximum- , MaximumBy, MaximumBySym0, MaximumBySym1, MaximumBySym2, sMaximumBy- , Minimum, MinimumSym0, MinimumSym1, sMinimum- , MinimumBy, MinimumBySym0, MinimumBySym1, MinimumBySym2, sMinimumBy- , Length, LengthSym0, LengthSym1, sLength- , NotElem, NotElemSym0, NotElemSym1, NotElemSym2, sNotElem- , Null, NullSym0, NullSym1, sNull- , Or, OrSym0, OrSym1, sOr- , Product, ProductSym0, ProductSym1, sProduct- , Sum, SumSym0, SumSym1, sSum- )+{-# LANGUAGE ExplicitNamespaces #-} + +----------------------------------------------------------------------------- +-- | +-- Module : Data.List.Singletons +-- Copyright : (C) 2013-2014 Richard Eisenberg, Jan Stolarek +-- License : BSD-style (see LICENSE) +-- Maintainer : Ryan Scott +-- Stability : experimental +-- Portability : non-portable +-- +-- Defines functions and datatypes relating to the singleton for '[]', +-- including singled versions of a few of the definitions in @Data.List@. +-- +-- Because many of these definitions are produced by Template Haskell, +-- it is not possible to create proper Haddock documentation. Please look +-- up the corresponding operation in @Data.List@. Also, please excuse +-- the apparent repeated variable names. This is due to an interaction +-- between Template Haskell and Haddock. +-- +---------------------------------------------------------------------------- + +module Data.List.Singletons ( + -- * The singleton for lists + Sing, SList(..), + + -- * Basic functions + type (++), (%++), Head, sHead, Last, sLast, Tail, sTail, Init, sInit, + Null, sNull, Length, sLength, + + -- * List transformations + Map, sMap, Reverse, sReverse, Intersperse, sIntersperse, + Intercalate, sIntercalate, Transpose, sTranspose, + Subsequences, sSubsequences, Permutations, sPermutations, + + -- * Reducing lists (folds) + Foldl, sFoldl, Foldl', sFoldl', Foldl1, sFoldl1, Foldl1', sFoldl1', + Foldr, sFoldr, Foldr1, sFoldr1, + + -- ** Special folds + Concat, sConcat, ConcatMap, sConcatMap, + And, sAnd, Or, sOr, Any, sAny, All, sAll, + Sum, sSum, Product, sProduct, Maximum, sMaximum, + Minimum, sMinimum, + + -- * Building lists + + -- ** Scans + Scanl, sScanl, Scanl1, sScanl1, Scanr, sScanr, Scanr1, sScanr1, + + -- ** Accumulating maps + MapAccumL, sMapAccumL, MapAccumR, sMapAccumR, + + -- ** Cyclical lists + Replicate, sReplicate, + + -- ** Unfolding + Unfoldr, sUnfoldr, + + -- * Sublists + + -- ** Extracting sublists + Take, sTake, Drop, sDrop, SplitAt, sSplitAt, + TakeWhile, sTakeWhile, DropWhile, sDropWhile, DropWhileEnd, sDropWhileEnd, + Span, sSpan, Break, sBreak, + StripPrefix, + Group, sGroup, + Inits, sInits, Tails, sTails, + + -- ** Predicates + IsPrefixOf, sIsPrefixOf, IsSuffixOf, sIsSuffixOf, IsInfixOf, sIsInfixOf, + + -- * Searching lists + + -- ** Searching by equality + Elem, sElem, NotElem, sNotElem, Lookup, sLookup, + + -- ** Searching with a predicate + Find, sFind, Filter, sFilter, Partition, sPartition, + + -- * Indexing lists + type (!!), (%!!), + ElemIndex, sElemIndex, ElemIndices, sElemIndices, + FindIndex, sFindIndex, FindIndices, sFindIndices, + + -- * Zipping and unzipping lists + Zip, sZip, Zip3, sZip3, + Zip4, Zip5, Zip6, Zip7, + ZipWith, sZipWith, ZipWith3, sZipWith3, + ZipWith4, ZipWith5, ZipWith6, ZipWith7, + Unzip, sUnzip, Unzip3, sUnzip3, Unzip4, sUnzip4, + Unzip5, sUnzip5, Unzip6, sUnzip6, Unzip7, sUnzip7, + + -- * Special lists + + -- ** Functions on 'Symbol's + Unlines, sUnlines, + Unwords, sUnwords, + + -- ** \"Set\" operations + Nub, sNub, Delete, sDelete, type (\\), (%\\), + Union, sUnion, Intersect, sIntersect, + + -- ** Ordered lists + Insert, sInsert, Sort, sSort, + + -- * Generalized functions + + -- ** The \"@By@\" operations + + -- *** User-supplied equality (replacing an @Eq@ context) + -- | The predicate is assumed to define an equivalence. + NubBy, sNubBy, + DeleteBy, sDeleteBy, DeleteFirstsBy, sDeleteFirstsBy, + UnionBy, sUnionBy, IntersectBy, sIntersectBy, + GroupBy, sGroupBy, + + -- *** User-supplied comparison (replacing an @Ord@ context) + -- | The function is assumed to define a total ordering. + SortBy, sSortBy, InsertBy, sInsertBy, + MaximumBy, sMaximumBy, MinimumBy, sMinimumBy, + + -- ** The \"@generic@\" operations + -- | The prefix \`@generic@\' indicates an overloaded function that + -- is a generalized version of a "Prelude" function. + GenericLength, sGenericLength, + + -- * Defunctionalization symbols + NilSym0, + (:@#@$), (:@#@$$), (:@#@$$$), + + type (++@#@$$$), type (++@#@$$), type (++@#@$), + HeadSym0, HeadSym1, LastSym0, LastSym1, + TailSym0, TailSym1, InitSym0, InitSym1, NullSym0, NullSym1, + LengthSym0, LengthSym1, + + MapSym0, MapSym1, MapSym2, ReverseSym0, ReverseSym1, + IntersperseSym0, IntersperseSym1, IntersperseSym2, + IntercalateSym0, IntercalateSym1, IntercalateSym2, + TransposeSym0, TransposeSym1, + SubsequencesSym0, SubsequencesSym1, + PermutationsSym0, PermutationsSym1, + + FoldlSym0, FoldlSym1, FoldlSym2, FoldlSym3, + Foldl'Sym0, Foldl'Sym1, Foldl'Sym2, Foldl'Sym3, + Foldl1Sym0, Foldl1Sym1, Foldl1Sym2, + Foldl1'Sym0, Foldl1'Sym1, Foldl1'Sym2, + FoldrSym0, FoldrSym1, FoldrSym2, FoldrSym3, + Foldr1Sym0, Foldr1Sym1, Foldr1Sym2, + + ConcatSym0, ConcatSym1, + ConcatMapSym0, ConcatMapSym1, ConcatMapSym2, + AndSym0, AndSym1, OrSym0, OrSym1, + AnySym0, AnySym1, AnySym2, + AllSym0, AllSym1, AllSym2, + SumSym0, SumSym1, + ProductSym0, ProductSym1, + MaximumSym0, MaximumSym1, + MinimumSym0, MinimumSym1, + + ScanlSym0, ScanlSym1, ScanlSym2, ScanlSym3, + Scanl1Sym0, Scanl1Sym1, Scanl1Sym2, + ScanrSym0, ScanrSym1, ScanrSym2, ScanrSym3, + Scanr1Sym0, Scanr1Sym1, Scanr1Sym2, + + MapAccumLSym0, MapAccumLSym1, MapAccumLSym2, MapAccumLSym3, + MapAccumRSym0, MapAccumRSym1, MapAccumRSym2, MapAccumRSym3, + + ReplicateSym0, ReplicateSym1, ReplicateSym2, + + UnfoldrSym0, UnfoldrSym1, UnfoldrSym2, + + TakeSym0, TakeSym1, TakeSym2, + DropSym0, DropSym1, DropSym2, + SplitAtSym0, SplitAtSym1, SplitAtSym2, + TakeWhileSym0, TakeWhileSym1, TakeWhileSym2, + DropWhileSym0, DropWhileSym1, DropWhileSym2, + DropWhileEndSym0, DropWhileEndSym1, DropWhileEndSym2, + SpanSym0, SpanSym1, SpanSym2, + BreakSym0, BreakSym1, BreakSym2, + StripPrefixSym0, StripPrefixSym1, StripPrefixSym2, + GroupSym0, GroupSym1, + InitsSym0, InitsSym1, TailsSym0, TailsSym1, + + IsPrefixOfSym0, IsPrefixOfSym1, IsPrefixOfSym2, + IsSuffixOfSym0, IsSuffixOfSym1, IsSuffixOfSym2, + IsInfixOfSym0, IsInfixOfSym1, IsInfixOfSym2, + + ElemSym0, ElemSym1, ElemSym2, + NotElemSym0, NotElemSym1, NotElemSym2, + LookupSym0, LookupSym1, LookupSym2, + + FindSym0, FindSym1, FindSym2, + FilterSym0, FilterSym1, FilterSym2, + PartitionSym0, PartitionSym1, PartitionSym2, + + type (!!@#@$), type (!!@#@$$), type (!!@#@$$$), + ElemIndexSym0, ElemIndexSym1, ElemIndexSym2, + ElemIndicesSym0, ElemIndicesSym1, ElemIndicesSym2, + FindIndexSym0, FindIndexSym1, FindIndexSym2, + FindIndicesSym0, FindIndicesSym1, FindIndicesSym2, + + ZipSym0, ZipSym1, ZipSym2, + Zip3Sym0, Zip3Sym1, Zip3Sym2, Zip3Sym3, + Zip4Sym0, Zip4Sym1, Zip4Sym2, Zip4Sym3, Zip4Sym4, + Zip5Sym0, Zip5Sym1, Zip5Sym2, Zip5Sym3, Zip5Sym4, Zip5Sym5, + Zip6Sym0, Zip6Sym1, Zip6Sym2, Zip6Sym3, Zip6Sym4, Zip6Sym5, Zip6Sym6, + Zip7Sym0, Zip7Sym1, Zip7Sym2, Zip7Sym3, Zip7Sym4, Zip7Sym5, Zip7Sym6, Zip7Sym7, + ZipWithSym0, ZipWithSym1, ZipWithSym2, ZipWithSym3, + ZipWith3Sym0, ZipWith3Sym1, ZipWith3Sym2, ZipWith3Sym3, ZipWith3Sym4, + ZipWith4Sym0, ZipWith4Sym1, ZipWith4Sym2, ZipWith4Sym3, ZipWith4Sym4, ZipWith4Sym5, + ZipWith5Sym0, ZipWith5Sym1, ZipWith5Sym2, ZipWith5Sym3, ZipWith5Sym4, ZipWith5Sym5, ZipWith5Sym6, + ZipWith6Sym0, ZipWith6Sym1, ZipWith6Sym2, ZipWith6Sym3, ZipWith6Sym4, ZipWith6Sym5, ZipWith6Sym6, ZipWith6Sym7, + ZipWith7Sym0, ZipWith7Sym1, ZipWith7Sym2, ZipWith7Sym3, ZipWith7Sym4, ZipWith7Sym5, ZipWith7Sym6, ZipWith7Sym7, ZipWith7Sym8, + UnzipSym0, UnzipSym1, + Unzip3Sym0, Unzip3Sym1, + Unzip4Sym0, Unzip4Sym1, + Unzip5Sym0, Unzip5Sym1, + Unzip6Sym0, Unzip6Sym1, + Unzip7Sym0, Unzip7Sym1, + + UnlinesSym0, UnlinesSym1, + UnwordsSym0, UnwordsSym1, + + NubSym0, NubSym1, + DeleteSym0, DeleteSym1, DeleteSym2, + type (\\@#@$), type (\\@#@$$), type (\\@#@$$$), + UnionSym0, UnionSym1, UnionSym2, + IntersectSym0, IntersectSym1, IntersectSym2, + + InsertSym0, InsertSym1, InsertSym2, + SortSym0, SortSym1, + + NubBySym0, NubBySym1, NubBySym2, + DeleteBySym0, DeleteBySym1, DeleteBySym2, DeleteBySym3, + DeleteFirstsBySym0, DeleteFirstsBySym1, DeleteFirstsBySym2, DeleteFirstsBySym3, + UnionBySym0, UnionBySym1, UnionBySym2, UnionBySym3, + IntersectBySym0, IntersectBySym1, IntersectBySym2, IntersectBySym3, + GroupBySym0, GroupBySym1, GroupBySym2, + + SortBySym0, SortBySym1, SortBySym2, + InsertBySym0, InsertBySym1, InsertBySym2, InsertBySym3, + MaximumBySym0, MaximumBySym1, MaximumBySym2, + MinimumBySym0, MinimumBySym1, MinimumBySym2, + + GenericLengthSym0, GenericLengthSym1 + ) where + +import Data.Foldable.Singletons +import Data.Singletons.Base.Instances + (Sing, SList(..), NilSym0, type (:@#@$), type (:@#@$$), type (:@#@$$$)) +import Data.Traversable.Singletons +import GHC.Base.Singletons + ( Map, MapSym0, MapSym1, MapSym2, sMap + , type (++), type (++@#@$), type (++@#@$$), type (++@#@$$$), (%++) + ) + +import Data.List.Singletons.Internal + hiding ( All, AllSym0, AllSym1, AllSym2, sAll + , And, AndSym0, AndSym1, sAnd + , Any, AnySym0, AnySym1, AnySym2, sAny + , Concat, ConcatSym0, ConcatSym1, sConcat + , ConcatMap, ConcatMapSym0, ConcatMapSym1, ConcatMapSym2, sConcatMap + , Elem, ElemSym0, ElemSym1, ElemSym2, sElem + , Find, FindSym0, FindSym1, FindSym2, sFind + , Foldl1, Foldl1Sym0, Foldl1Sym1, Foldl1Sym2, sFoldl1 + , Foldl', Foldl'Sym0, Foldl'Sym1, Foldl'Sym2, Foldl'Sym3, sFoldl' + , Foldr1, Foldr1Sym0, Foldr1Sym1, Foldr1Sym2, sFoldr1 + , MapAccumL, MapAccumLSym0, MapAccumLSym1, MapAccumLSym2, MapAccumLSym3, sMapAccumL + , MapAccumR, MapAccumRSym0, MapAccumRSym1, MapAccumRSym2, MapAccumRSym3, sMapAccumR + , Maximum, MaximumSym0, MaximumSym1, sMaximum + , MaximumBy, MaximumBySym0, MaximumBySym1, MaximumBySym2, sMaximumBy + , Minimum, MinimumSym0, MinimumSym1, sMinimum + , MinimumBy, MinimumBySym0, MinimumBySym1, MinimumBySym2, sMinimumBy + , Length, LengthSym0, LengthSym1, sLength + , NotElem, NotElemSym0, NotElemSym1, NotElemSym2, sNotElem + , Null, NullSym0, NullSym1, sNull + , Or, OrSym0, OrSym1, sOr + , Product, ProductSym0, ProductSym1, sProduct + , Sum, SumSym0, SumSym1, sSum + )
src/Data/List/Singletons/Internal.hs view
@@ -1,640 +1,641 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE NoNamedWildCards #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE UndecidableInstances #-}-{-# OPTIONS_GHC -O0 #-}---------------------------------------------------------------------------------- |--- Module : Data.List.Singletons.Internal--- Copyright : (C) 2013-2014 Richard Eisenberg, Jan Stolarek--- License : BSD-style (see LICENSE)--- Maintainer : Ryan Scott--- Stability : experimental--- Portability : non-portable------ Defines functions and datatypes relating to the singleton for '[]',--- including singled versions of a few of the definitions in @Data.List@.------ All of the functions defined in this module are specialized for lists,--- unlike "Data.List.Singletons", which uses 'Foldable' and--- 'Traversable' contexts when available.----------------------------------------------------------------------------------module Data.List.Singletons.Internal where--import Control.Monad.Singletons.Internal-import Data.Bool.Singletons-import Data.Eq.Singletons-import Data.Maybe-import Data.Maybe.Singletons-import Data.Ord.Singletons-import Data.Semigroup.Singletons.Internal (SSemigroup(..), type (<>@#@$))-import Data.Singletons.Base.Instances-import Data.Singletons.TH-import Data.Tuple.Singletons-import GHC.Base.Singletons-import GHC.Num.Singletons-import GHC.TypeLits.Singletons--$(singletonsOnly [d|- head :: [a] -> a- head (a : _) = a- head [] = error "Data.Singletons.List.head: empty list"-- last :: [a] -> a- last [] = error "Data.Singletons.List.last: empty list"- last [x] = x- last (_:x:xs) = last (x:xs)-- tail :: [a] -> [a]- tail (_ : t) = t- tail [] = error "Data.Singletons.List.tail: empty list"-- init :: [a] -> [a]- init [] = error "Data.Singletons.List.init: empty list"- init (x:xs) = init' x xs- where init' :: a -> [a] -> [a]- init' _ [] = []- init' y (z:zs) = y : init' z zs-- null :: [a] -> Bool- null [] = True- null (_:_) = False-- reverse :: [a] -> [a]- reverse l = rev l []- where- rev :: [a] -> [a] -> [a]- rev [] a = a- rev (x:xs) a = rev xs (x:a)-- intersperse :: a -> [a] -> [a]- intersperse _ [] = []- intersperse sep (x:xs) = x : prependToAll sep xs-- intercalate :: [a] -> [[a]] -> [a]- intercalate xs xss = concat (intersperse xs xss)-- subsequences :: [a] -> [[a]]- subsequences xs = [] : nonEmptySubsequences xs-- nonEmptySubsequences :: [a] -> [[a]]- nonEmptySubsequences [] = []- nonEmptySubsequences (x:xs) = [x] : foldr f [] (nonEmptySubsequences xs)- where f ys r = ys : (x : ys) : r-- prependToAll :: a -> [a] -> [a]- prependToAll _ [] = []- prependToAll sep (x:xs) = sep : x : prependToAll sep xs-- permutations :: forall a. [a] -> [[a]]- permutations xs0 = xs0 : perms xs0 []- where- perms [] _ = []- perms (t:ts) is = foldr interleave (perms ts (t:is)) (permutations is)- where interleave xs r = let (_,zs) = interleave' id xs r in zs-- interleave' _ [] r = (ts, r)- interleave' f (y:ys) r = let (us,zs) = interleave' (f . (y:)) ys r- in (y:us, f (t:y:us) : zs)-- foldl' :: forall a b. (b -> a -> b) -> b -> [a] -> b- foldl' f z0 xs0 = lgo z0 xs0- where lgo :: b -> [a] -> b- lgo z [] = z- lgo z (x:xs) = let z' = f z x in z' `seq` lgo z' xs-- foldl1 :: (a -> a -> a) -> [a] -> a- foldl1 f (x:xs) = foldl f x xs- foldl1 _ [] = error "Data.Singletons.List.foldl1: empty list"-- foldl1' :: (a -> a -> a) -> [a] -> a- foldl1' f (x:xs) = foldl' f x xs- foldl1' _ [] = error "Data.Singletons.List.foldl1': empty list"-- foldr1 :: (a -> a -> a) -> [a] -> a- foldr1 _ [x] = x- foldr1 f (x:xs@(_:_)) = f x (foldr1 f xs)- foldr1 _ [] = error "Data.Singletons.List.foldr1: empty list"-- concat :: [[a]] -> [a]- concat = foldr (++) []-- concatMap :: (a -> [b]) -> [a] -> [b]- concatMap f = foldr ((++) . f) []-- and :: [Bool] -> Bool- and [] = True- and (x:xs) = x && and xs-- or :: [Bool] -> Bool- or [] = False- or (x:xs) = x || or xs-- all :: (a -> Bool) -> [a] -> Bool- all _ [] = True- all p (x:xs) = p x && all p xs-- any :: (a -> Bool) -> [a] -> Bool- any _ [] = False- any p (x:xs) = p x || any p xs-- scanl :: (b -> a -> b) -> b -> [a] -> [b]- scanl f q ls = q : (case ls of- [] -> []- x:xs -> scanl f (f q x) xs)- scanl1 :: (a -> a -> a) -> [a] -> [a]- scanl1 f (x:xs) = scanl f x xs- scanl1 _ [] = []-- scanr :: (a -> b -> b) -> b -> [a] -> [b]- scanr _ q0 [] = [q0]- scanr f q0 (x:xs) = case scanr f q0 xs of- [] -> error "Data.Singletons.List.scanr: empty list"- (q:qs) -> f x q : (q:qs)-- scanr1 :: (a -> a -> a) -> [a] -> [a]- scanr1 _ [] = []- scanr1 _ [x] = [x]- scanr1 f (x:xs@(_:_)) = case scanr1 f xs of- [] -> error "Data.Singletons.List.scanr1: empty list"- (q:qs) -> f x q : (q:qs)-- mapAccumL :: (acc -> x -> (acc, y))- -> acc- -> [x]- -> (acc, [y])- mapAccumL _ s [] = (s, [])- mapAccumL f s (x:xs) = (s'',y:ys)- where (s', y ) = f s x- (s'',ys) = mapAccumL f s' xs-- mapAccumR :: (acc -> x -> (acc, y))- -> acc- -> [x]- -> (acc, [y])- mapAccumR _ s [] = (s, [])- mapAccumR f s (x:xs) = (s'', y:ys)- where (s'',y ) = f s' x- (s', ys) = mapAccumR f s xs-- unfoldr :: (b -> Maybe (a, b)) -> b -> [a]- unfoldr f b =- case f b of- Just (a,new_b) -> a : unfoldr f new_b- Nothing -> []-- inits :: [a] -> [[a]]- inits xs = [] : case xs of- [] -> []- x : xs' -> map (x :) (inits xs')-- tails :: [a] -> [[a]]- tails xs = xs : case xs of- [] -> []- _ : xs' -> tails xs'-- isPrefixOf :: (Eq a) => [a] -> [a] -> Bool- isPrefixOf [] [] = True- isPrefixOf [] (_:_) = True- isPrefixOf (_:_) [] = False- isPrefixOf (x:xs) (y:ys)= x == y && isPrefixOf xs ys-- isSuffixOf :: (Eq a) => [a] -> [a] -> Bool- isSuffixOf x y = reverse x `isPrefixOf` reverse y-- isInfixOf :: (Eq a) => [a] -> [a] -> Bool- isInfixOf needle haystack = any (isPrefixOf needle) (tails haystack)-- elem :: (Eq a) => a -> [a] -> Bool- elem _ [] = False- elem x (y:ys) = x==y || elem x ys- infix 4 `elem`-- notElem :: (Eq a) => a -> [a] -> Bool- notElem _ [] = True- notElem x (y:ys) = x /= y && notElem x ys- infix 4 `notElem`-- zip :: [a] -> [b] -> [(a,b)]- zip (x:xs) (y:ys) = (x,y) : zip xs ys- zip [] [] = []- zip (_:_) [] = []- zip [] (_:_) = []-- zip3 :: [a] -> [b] -> [c] -> [(a,b,c)]- zip3 (a:as) (b:bs) (c:cs) = (a,b,c) : zip3 as bs cs- zip3 [] [] [] = []- zip3 [] [] (_:_) = []- zip3 [] (_:_) [] = []- zip3 [] (_:_) (_:_) = []- zip3 (_:_) [] [] = []- zip3 (_:_) [] (_:_) = []- zip3 (_:_) (_:_) [] = []-- zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]- zipWith f (x:xs) (y:ys) = f x y : zipWith f xs ys- zipWith _ [] [] = []- zipWith _ (_:_) [] = []- zipWith _ [] (_:_) = []-- zipWith3 :: (a->b->c->d) -> [a]->[b]->[c]->[d]- zipWith3 z (a:as) (b:bs) (c:cs) = z a b c : zipWith3 z as bs cs- zipWith3 _ [] [] [] = []- zipWith3 _ [] [] (_:_) = []- zipWith3 _ [] (_:_) [] = []- zipWith3 _ [] (_:_) (_:_) = []- zipWith3 _ (_:_) [] [] = []- zipWith3 _ (_:_) [] (_:_) = []- zipWith3 _ (_:_) (_:_) [] = []-- unzip :: [(a,b)] -> ([a],[b])- unzip xs = foldr (\(a,b) (as,bs) -> (a:as,b:bs)) ([],[]) xs-- -- Lazy patterns removed from unzip- unzip3 :: [(a,b,c)] -> ([a],[b],[c])- unzip3 xs = foldr (\(a,b,c) (as,bs,cs) -> (a:as,b:bs,c:cs))- ([],[],[]) xs-- unzip4 :: [(a,b,c,d)] -> ([a],[b],[c],[d])- unzip4 xs = foldr (\(a,b,c,d) (as,bs,cs,ds) ->- (a:as,b:bs,c:cs,d:ds))- ([],[],[],[]) xs-- unzip5 :: [(a,b,c,d,e)] -> ([a],[b],[c],[d],[e])- unzip5 xs = foldr (\(a,b,c,d,e) (as,bs,cs,ds,es) ->- (a:as,b:bs,c:cs,d:ds,e:es))- ([],[],[],[],[]) xs-- unzip6 :: [(a,b,c,d,e,f)] -> ([a],[b],[c],[d],[e],[f])- unzip6 xs = foldr (\(a,b,c,d,e,f) (as,bs,cs,ds,es,fs) ->- (a:as,b:bs,c:cs,d:ds,e:es,f:fs))- ([],[],[],[],[],[]) xs-- unzip7 :: [(a,b,c,d,e,f,g)] -> ([a],[b],[c],[d],[e],[f],[g])- unzip7 xs = foldr (\(a,b,c,d,e,f,g) (as,bs,cs,ds,es,fs,gs) ->- (a:as,b:bs,c:cs,d:ds,e:es,f:fs,g:gs))- ([],[],[],[],[],[],[]) xs---- We can't promote any of these functions because at the type level--- String literals are no longer considered to be lists of Chars, so--- there is mismatch between term-level and type-level semantics--- lines :: String -> [String]--- lines "" = []--- lines s = cons (case break (== '\n') s of--- (l, s') -> (l, case s' of--- [] -> []--- _:s'' -> lines s''))--- where--- cons ~(h, t) = h : t------ words :: String -> [String]--- words s = case dropWhile isSpace s of--- "" -> []--- s' -> w : words s''--- where (w, s'') =--- break isSpace s'-- unlines :: [Symbol] -> Symbol- unlines [] = ""- unlines (l:ls) = l <> "\n" <> unlines ls-- unwords :: [Symbol] -> Symbol- unwords [] = ""- unwords (w:ws) = w <> go ws- where- go [] = ""- go (v:vs) = " " <> (v <> go vs)-- delete :: (Eq a) => a -> [a] -> [a]- delete = deleteBy (==)-- (\\) :: (Eq a) => [a] -> [a] -> [a]- (\\) = foldl (flip delete)- infix 5 \\ -- This comment is necessary so CPP doesn't treat the- -- trailing backslash as a line splice. Urgh.-- deleteBy :: (a -> a -> Bool) -> a -> [a] -> [a]- deleteBy _ _ [] = []- deleteBy eq x (y:ys) = if x `eq` y then ys else y : deleteBy eq x ys-- deleteFirstsBy :: (a -> a -> Bool) -> [a] -> [a] -> [a]- deleteFirstsBy eq = foldl (flip (deleteBy eq))-- sortBy :: (a -> a -> Ordering) -> [a] -> [a]- sortBy cmp = foldr (insertBy cmp) []-- insertBy :: (a -> a -> Ordering) -> a -> [a] -> [a]- insertBy _ x [] = [x]- insertBy cmp x ys@(y:ys')- = case cmp x y of- GT -> y : insertBy cmp x ys'- LT -> x : ys- EQ -> x : ys-- maximumBy :: (a -> a -> Ordering) -> [a] -> a- maximumBy _ [] = error "Data.Singletons.List.maximumBy: empty list"- maximumBy cmp xs@(_:_) = foldl1 maxBy xs- where- maxBy x y = case cmp x y of- GT -> x- EQ -> y- LT -> y-- minimumBy :: (a -> a -> Ordering) -> [a] -> a- minimumBy _ [] = error "Data.Singletons.List.minimumBy: empty list"- minimumBy cmp xs@(_:_) = foldl1 minBy xs- where- minBy x y = case cmp x y of- GT -> y- EQ -> x- LT -> x-- filter :: (a -> Bool) -> [a] -> [a]- filter _p [] = []- filter p (x:xs) = if p x then x : filter p xs else filter p xs-- find :: (a -> Bool) -> [a] -> Maybe a- find p = listToMaybe . filter p---- These three rely on findIndices, which does not promote.--- Since we have our own implementation of findIndices these are perfectly valid- elemIndex :: Eq a => a -> [a] -> Maybe Natural- elemIndex x = findIndex (x==)-- elemIndices :: Eq a => a -> [a] -> [Natural]- elemIndices x = findIndices (x==)-- findIndex :: (a -> Bool) -> [a] -> Maybe Natural- findIndex p = listToMaybe . findIndices p---- Uses infinite lists and and Ints--- findIndices :: (a -> Bool) -> [a] -> [Int]--- findIndices p xs = [ i | (x,i) <- zip xs [0..], p x]-- findIndices :: (a -> Bool) -> [a] -> [Natural]- findIndices p xs = map snd (filter (\(x,_) -> p x)- (zip xs (buildList 0 xs)))- where buildList :: Natural -> [b] -> [Natural]- buildList _ [] = []- buildList a (_:rest) = a : buildList (a+1) rest-- intersect :: (Eq a) => [a] -> [a] -> [a]- intersect = intersectBy (==)-- intersectBy :: (a -> a -> Bool) -> [a] -> [a] -> [a]- intersectBy _ [] [] = []- intersectBy _ [] (_:_) = []- intersectBy _ (_:_) [] = []- intersectBy eq xs@(_:_) ys@(_:_) = [x | x <- xs, any (eq x) ys]-- takeWhile :: (a -> Bool) -> [a] -> [a]- takeWhile _ [] = []- takeWhile p (x:xs) = if p x then x : takeWhile p xs else []-- dropWhile :: (a -> Bool) -> [a] -> [a]- dropWhile _ [] = []- dropWhile p xs@(x:xs') = if p x then dropWhile p xs' else xs-- dropWhileEnd :: (a -> Bool) -> [a] -> [a]- dropWhileEnd p = foldr (\x xs -> if p x && null xs then [] else x : xs) []-- span :: (a -> Bool) -> [a] -> ([a],[a])- span _ xs@[] = (xs, xs)- span p xs@(x:xs') = if p x then let (ys,zs) = span p xs' in (x:ys,zs)- else ([], xs)-- break :: (a -> Bool) -> [a] -> ([a],[a])- break _ xs@[] = (xs, xs)- break p xs@(x:xs') = if p x then ([],xs)- else let (ys,zs) = break p xs' in (x:ys,zs)---- Can't be promoted because of limitations of Int promotion--- Below is a re-implementation using Nat--- take :: Int -> [a] -> [a]--- take n _ | n <= 0 = []--- take _ [] = []--- take n (x:xs) = x : take (n-1) xs---- drop :: Int -> [a] -> [a]--- drop n xs | n <= 0 = xs--- drop _ [] = []--- drop n (_:xs) = drop (n-1) xs---- splitAt :: Int -> [a] -> ([a],[a])--- splitAt n xs = (take n xs, drop n xs)-- take :: Natural -> [a] -> [a]- take _ [] = []- take n (x:xs) = if n == 0 then [] else x : take (n-1) xs-- drop :: Natural -> [a] -> [a]- drop _ [] = []- drop n (x:xs) = if n == 0 then x:xs else drop (n-1) xs-- splitAt :: Natural -> [a] -> ([a],[a])- splitAt n xs = (take n xs, drop n xs)-- group :: Eq a => [a] -> [[a]]- group xs = groupBy (==) xs-- maximum :: (Ord a) => [a] -> a- maximum [] = error "Data.Singletons.List.maximum: empty list"- maximum xs@(_:_) = foldl1 max xs-- minimum :: (Ord a) => [a] -> a- minimum [] = error "Data.Singletons.List.minimum: empty list"- minimum xs@(_:_) = foldl1 min xs-- insert :: Ord a => a -> [a] -> [a]- insert e ls = insertBy (compare) e ls-- sort :: (Ord a) => [a] -> [a]- sort = sortBy compare-- groupBy :: (a -> a -> Bool) -> [a] -> [[a]]- groupBy _ [] = []- groupBy eq (x:xs) = (x:ys) : groupBy eq zs- where (ys,zs) = span (eq x) xs-- lookup :: (Eq a) => a -> [(a,b)] -> Maybe b- lookup _key [] = Nothing- lookup key ((x,y):xys) = if key == x then Just y else lookup key xys-- partition :: (a -> Bool) -> [a] -> ([a],[a])- partition p xs = foldr (select p) ([],[]) xs-- -- Lazy pattern removed from select- select :: (a -> Bool) -> a -> ([a], [a]) -> ([a], [a])- select p x (ts,fs) = if p x then (x:ts,fs) else (ts, x:fs)---- Can't be promoted because of limitations of Int promotion--- Below is a re-implementation using Nat--- sum :: (Num a) => [a] -> a--- sum l = sum' l 0--- where--- sum' [] a = a--- sum' (x:xs) a = sum' xs (a+x)------ product :: (Num a) => [a] -> a--- product l = prod l 1--- where--- prod [] a = a--- prod (x:xs) a = prod xs (a*x)-- sum :: forall a. Num a => [a] -> a- sum l = sum' l 0- where- sum' :: [a] -> a -> a- sum' [] a = a- sum' (x:xs) a = sum' xs (a+x)-- product :: forall a. Num a => [a] -> a- product l = prod l 1- where- prod :: [a] -> a -> a- prod [] a = a- prod (x:xs) a = prod xs (a*x)----- Can't be promoted because of limitations of Int promotion--- Below is a re-implementation using Nat--- length :: [a] -> Int--- length l = lenAcc l 0#------ lenAcc :: [a] -> Int# -> Int--- lenAcc [] a# = I# a#--- lenAcc (_:xs) a# = lenAcc xs (a# +# 1#)------ incLen :: a -> (Int# -> Int) -> Int# -> Int--- incLen _ g x = g (x +# 1#)-- length :: [a] -> Natural- length [] = 0- length (_:xs) = 1 + length xs---- Functions working on infinite lists don't promote because they create--- infinite types. replicate also uses integers, but luckily it can be rewritten--- iterate :: (a -> a) -> a -> [a]--- iterate f x = x : iterate f (f x)------ repeat :: a -> [a]--- repeat x = xs where xs = x : xs------ replicate :: Int -> a -> [a]--- replicate n x = take n (repeat x)------ cycle :: [a] -> [a]--- cycle [] = error "Data.Singletons.List.cycle: empty list"--- cycle xs = xs' where xs' = xs ++ xs'-- replicate :: Natural -> a -> [a]- replicate n x = if n == 0 then [] else x : replicate (n-1) x---- Uses partial pattern-matching in a list comprehension--- (see https://github.com/goldfirere/singletons/issues/340)--- transpose :: [[a]] -> [[a]]--- transpose [] = []--- transpose ([] : xss) = transpose xss--- transpose ((x:xs) : xss) = (x : [h | (h:_) <- xss]) : transpose (xs : [ t | (_:t) <- xss])-- transpose :: [[a]] -> [[a]]- transpose [] = []- transpose ([] : xss) = transpose xss- transpose ((x:xs) : xss) = (x : (map head xss)) : transpose (xs : (map tail xss))---- Can't be promoted because of limitations of Int promotion.--- Below is a re-implementation using Nat--- (!!) :: [a] -> Int -> a--- xs !! n | n < 0 = error "Data.Singletons.List.!!: negative index"--- [] !! _ = error "Data.Singletons.List.!!: index too large"--- (x:_) !! 0 = x--- (_:xs) !! n = xs !! (n-1)-- (!!) :: [a] -> Natural -> a- [] !! _ = error "Data.Singletons.List.!!: index too large"- (x:xs) !! n = if n == 0 then x else xs !! (n-1)- infixl 9 !!-- nub :: forall a. (Eq a) => [a] -> [a]- nub l = nub' l []- where- nub' :: [a] -> [a] -> [a]- nub' [] _ = []- nub' (x:xs) ls = if x `elem` ls then nub' xs ls else x : nub' xs (x:ls)-- nubBy :: (a -> a -> Bool) -> [a] -> [a]- nubBy eq l = nubBy' l []- where- nubBy' [] _ = []- nubBy' (y:ys) xs = if elem_by eq y xs then nubBy' ys xs else y : nubBy' ys (y:xs)-- elem_by :: (a -> a -> Bool) -> a -> [a] -> Bool- elem_by _ _ [] = False- elem_by eq y (x:xs) = y `eq` x || elem_by eq y xs-- unionBy :: (a -> a -> Bool) -> [a] -> [a] -> [a]- unionBy eq xs ys = xs ++ foldl (flip (deleteBy eq)) (nubBy eq ys) xs-- union :: (Eq a) => [a] -> [a] -> [a]- union = unionBy (==)-- genericLength :: (Num i) => [a] -> i- genericLength [] = 0- genericLength (_:xs) = 1 + genericLength xs-- |])---- The following functions are supported for promotion only.-$(promoteOnly [d|-- -- Overlapping patterns don't singletonize- stripPrefix :: Eq a => [a] -> [a] -> Maybe [a]- stripPrefix [] ys = Just ys- stripPrefix (x:xs) (y:ys)- | x == y = stripPrefix xs ys- stripPrefix _ _ = Nothing-- -- To singletonize these we would need to rewrite all patterns- -- as non-overlapping. This means 2^7 equations for zipWith7.-- zip4 :: [a] -> [b] -> [c] -> [d] -> [(a,b,c,d)]- zip4 = zipWith4 (,,,)-- zip5 :: [a] -> [b] -> [c] -> [d] -> [e] -> [(a,b,c,d,e)]- zip5 = zipWith5 (,,,,)-- zip6 :: [a] -> [b] -> [c] -> [d] -> [e] -> [f] ->- [(a,b,c,d,e,f)]- zip6 = zipWith6 (,,,,,)-- zip7 :: [a] -> [b] -> [c] -> [d] -> [e] -> [f] ->- [g] -> [(a,b,c,d,e,f,g)]- zip7 = zipWith7 (,,,,,,)-- zipWith4 :: (a->b->c->d->e) -> [a]->[b]->[c]->[d]->[e]- zipWith4 z (a:as) (b:bs) (c:cs) (d:ds)- = z a b c d : zipWith4 z as bs cs ds- zipWith4 _ _ _ _ _ = []-- zipWith5 :: (a->b->c->d->e->f) ->- [a]->[b]->[c]->[d]->[e]->[f]- zipWith5 z (a:as) (b:bs) (c:cs) (d:ds) (e:es)- = z a b c d e : zipWith5 z as bs cs ds es- zipWith5 _ _ _ _ _ _ = []-- zipWith6 :: (a->b->c->d->e->f->g) ->- [a]->[b]->[c]->[d]->[e]->[f]->[g]- zipWith6 z (a:as) (b:bs) (c:cs) (d:ds) (e:es) (f:fs)- = z a b c d e f : zipWith6 z as bs cs ds es fs- zipWith6 _ _ _ _ _ _ _ = []-- zipWith7 :: (a->b->c->d->e->f->g->h) ->- [a]->[b]->[c]->[d]->[e]->[f]->[g]->[h]- zipWith7 z (a:as) (b:bs) (c:cs) (d:ds) (e:es) (f:fs) (g:gs)- = z a b c d e f g : zipWith7 z as bs cs ds es fs gs- zipWith7 _ _ _ _ _ _ _ _ = []- |])+{-# LANGUAGE DataKinds #-} +{-# LANGUAGE NoNamedWildCards #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE UndecidableInstances #-} +{-# OPTIONS_GHC -O0 #-} + +----------------------------------------------------------------------------- +-- | +-- Module : Data.List.Singletons.Internal +-- Copyright : (C) 2013-2014 Richard Eisenberg, Jan Stolarek +-- License : BSD-style (see LICENSE) +-- Maintainer : Ryan Scott +-- Stability : experimental +-- Portability : non-portable +-- +-- Defines functions and datatypes relating to the singleton for '[]', +-- including singled versions of a few of the definitions in @Data.List@. +-- +-- All of the functions defined in this module are specialized for lists, +-- unlike "Data.List.Singletons", which uses 'Foldable' and +-- 'Traversable' contexts when available. +-- +---------------------------------------------------------------------------- + +module Data.List.Singletons.Internal where + +import Control.Monad.Singletons.Internal +import Data.Bool.Singletons +import Data.Eq.Singletons +import Data.Maybe +import Data.Maybe.Singletons +import Data.Ord.Singletons +import Data.Semigroup.Singletons.Internal.Classes (SSemigroup(..), type (<>@#@$)) +import Data.Semigroup.Singletons.Internal.Wrappers () +import Data.Singletons.Base.Instances +import Data.Singletons.TH +import Data.Tuple.Singletons +import GHC.Base.Singletons +import GHC.Num.Singletons +import GHC.TypeLits.Singletons + +$(singletonsOnly [d| + head :: [a] -> a + head (a : _) = a + head [] = error "Data.Singletons.List.head: empty list" + + last :: [a] -> a + last [] = error "Data.Singletons.List.last: empty list" + last [x] = x + last (_:x:xs) = last (x:xs) + + tail :: [a] -> [a] + tail (_ : t) = t + tail [] = error "Data.Singletons.List.tail: empty list" + + init :: [a] -> [a] + init [] = error "Data.Singletons.List.init: empty list" + init (x:xs) = init' x xs + where init' :: a -> [a] -> [a] + init' _ [] = [] + init' y (z:zs) = y : init' z zs + + null :: [a] -> Bool + null [] = True + null (_:_) = False + + reverse :: [a] -> [a] + reverse l = rev l [] + where + rev :: [a] -> [a] -> [a] + rev [] a = a + rev (x:xs) a = rev xs (x:a) + + intersperse :: a -> [a] -> [a] + intersperse _ [] = [] + intersperse sep (x:xs) = x : prependToAll sep xs + + intercalate :: [a] -> [[a]] -> [a] + intercalate xs xss = concat (intersperse xs xss) + + subsequences :: [a] -> [[a]] + subsequences xs = [] : nonEmptySubsequences xs + + nonEmptySubsequences :: [a] -> [[a]] + nonEmptySubsequences [] = [] + nonEmptySubsequences (x:xs) = [x] : foldr f [] (nonEmptySubsequences xs) + where f ys r = ys : (x : ys) : r + + prependToAll :: a -> [a] -> [a] + prependToAll _ [] = [] + prependToAll sep (x:xs) = sep : x : prependToAll sep xs + + permutations :: forall a. [a] -> [[a]] + permutations xs0 = xs0 : perms xs0 [] + where + perms [] _ = [] + perms (t:ts) is = foldr interleave (perms ts (t:is)) (permutations is) + where interleave xs r = let (_,zs) = interleave' id xs r in zs + + interleave' _ [] r = (ts, r) + interleave' f (y:ys) r = let (us,zs) = interleave' (f . (y:)) ys r + in (y:us, f (t:y:us) : zs) + + foldl' :: forall a b. (b -> a -> b) -> b -> [a] -> b + foldl' f z0 xs0 = lgo z0 xs0 + where lgo :: b -> [a] -> b + lgo z [] = z + lgo z (x:xs) = let z' = f z x in z' `seq` lgo z' xs + + foldl1 :: (a -> a -> a) -> [a] -> a + foldl1 f (x:xs) = foldl f x xs + foldl1 _ [] = error "Data.Singletons.List.foldl1: empty list" + + foldl1' :: (a -> a -> a) -> [a] -> a + foldl1' f (x:xs) = foldl' f x xs + foldl1' _ [] = error "Data.Singletons.List.foldl1': empty list" + + foldr1 :: (a -> a -> a) -> [a] -> a + foldr1 _ [x] = x + foldr1 f (x:xs@(_:_)) = f x (foldr1 f xs) + foldr1 _ [] = error "Data.Singletons.List.foldr1: empty list" + + concat :: [[a]] -> [a] + concat = foldr (++) [] + + concatMap :: (a -> [b]) -> [a] -> [b] + concatMap f = foldr ((++) . f) [] + + and :: [Bool] -> Bool + and [] = True + and (x:xs) = x && and xs + + or :: [Bool] -> Bool + or [] = False + or (x:xs) = x || or xs + + all :: (a -> Bool) -> [a] -> Bool + all _ [] = True + all p (x:xs) = p x && all p xs + + any :: (a -> Bool) -> [a] -> Bool + any _ [] = False + any p (x:xs) = p x || any p xs + + scanl :: (b -> a -> b) -> b -> [a] -> [b] + scanl f q ls = q : (case ls of + [] -> [] + x:xs -> scanl f (f q x) xs) + scanl1 :: (a -> a -> a) -> [a] -> [a] + scanl1 f (x:xs) = scanl f x xs + scanl1 _ [] = [] + + scanr :: (a -> b -> b) -> b -> [a] -> [b] + scanr _ q0 [] = [q0] + scanr f q0 (x:xs) = case scanr f q0 xs of + [] -> error "Data.Singletons.List.scanr: empty list" + (q:qs) -> f x q : (q:qs) + + scanr1 :: (a -> a -> a) -> [a] -> [a] + scanr1 _ [] = [] + scanr1 _ [x] = [x] + scanr1 f (x:xs@(_:_)) = case scanr1 f xs of + [] -> error "Data.Singletons.List.scanr1: empty list" + (q:qs) -> f x q : (q:qs) + + mapAccumL :: (acc -> x -> (acc, y)) + -> acc + -> [x] + -> (acc, [y]) + mapAccumL _ s [] = (s, []) + mapAccumL f s (x:xs) = (s'',y:ys) + where (s', y ) = f s x + (s'',ys) = mapAccumL f s' xs + + mapAccumR :: (acc -> x -> (acc, y)) + -> acc + -> [x] + -> (acc, [y]) + mapAccumR _ s [] = (s, []) + mapAccumR f s (x:xs) = (s'', y:ys) + where (s'',y ) = f s' x + (s', ys) = mapAccumR f s xs + + unfoldr :: (b -> Maybe (a, b)) -> b -> [a] + unfoldr f b = + case f b of + Just (a,new_b) -> a : unfoldr f new_b + Nothing -> [] + + inits :: [a] -> [[a]] + inits xs = [] : case xs of + [] -> [] + x : xs' -> map (x :) (inits xs') + + tails :: [a] -> [[a]] + tails xs = xs : case xs of + [] -> [] + _ : xs' -> tails xs' + + isPrefixOf :: (Eq a) => [a] -> [a] -> Bool + isPrefixOf [] [] = True + isPrefixOf [] (_:_) = True + isPrefixOf (_:_) [] = False + isPrefixOf (x:xs) (y:ys)= x == y && isPrefixOf xs ys + + isSuffixOf :: (Eq a) => [a] -> [a] -> Bool + isSuffixOf x y = reverse x `isPrefixOf` reverse y + + isInfixOf :: (Eq a) => [a] -> [a] -> Bool + isInfixOf needle haystack = any (isPrefixOf needle) (tails haystack) + + elem :: (Eq a) => a -> [a] -> Bool + elem _ [] = False + elem x (y:ys) = x==y || elem x ys + infix 4 `elem` + + notElem :: (Eq a) => a -> [a] -> Bool + notElem _ [] = True + notElem x (y:ys) = x /= y && notElem x ys + infix 4 `notElem` + + zip :: [a] -> [b] -> [(a,b)] + zip (x:xs) (y:ys) = (x,y) : zip xs ys + zip [] [] = [] + zip (_:_) [] = [] + zip [] (_:_) = [] + + zip3 :: [a] -> [b] -> [c] -> [(a,b,c)] + zip3 (a:as) (b:bs) (c:cs) = (a,b,c) : zip3 as bs cs + zip3 [] [] [] = [] + zip3 [] [] (_:_) = [] + zip3 [] (_:_) [] = [] + zip3 [] (_:_) (_:_) = [] + zip3 (_:_) [] [] = [] + zip3 (_:_) [] (_:_) = [] + zip3 (_:_) (_:_) [] = [] + + zipWith :: (a -> b -> c) -> [a] -> [b] -> [c] + zipWith f (x:xs) (y:ys) = f x y : zipWith f xs ys + zipWith _ [] [] = [] + zipWith _ (_:_) [] = [] + zipWith _ [] (_:_) = [] + + zipWith3 :: (a->b->c->d) -> [a]->[b]->[c]->[d] + zipWith3 z (a:as) (b:bs) (c:cs) = z a b c : zipWith3 z as bs cs + zipWith3 _ [] [] [] = [] + zipWith3 _ [] [] (_:_) = [] + zipWith3 _ [] (_:_) [] = [] + zipWith3 _ [] (_:_) (_:_) = [] + zipWith3 _ (_:_) [] [] = [] + zipWith3 _ (_:_) [] (_:_) = [] + zipWith3 _ (_:_) (_:_) [] = [] + + unzip :: [(a,b)] -> ([a],[b]) + unzip xs = foldr (\(a,b) (as,bs) -> (a:as,b:bs)) ([],[]) xs + + -- Lazy patterns removed from unzip + unzip3 :: [(a,b,c)] -> ([a],[b],[c]) + unzip3 xs = foldr (\(a,b,c) (as,bs,cs) -> (a:as,b:bs,c:cs)) + ([],[],[]) xs + + unzip4 :: [(a,b,c,d)] -> ([a],[b],[c],[d]) + unzip4 xs = foldr (\(a,b,c,d) (as,bs,cs,ds) -> + (a:as,b:bs,c:cs,d:ds)) + ([],[],[],[]) xs + + unzip5 :: [(a,b,c,d,e)] -> ([a],[b],[c],[d],[e]) + unzip5 xs = foldr (\(a,b,c,d,e) (as,bs,cs,ds,es) -> + (a:as,b:bs,c:cs,d:ds,e:es)) + ([],[],[],[],[]) xs + + unzip6 :: [(a,b,c,d,e,f)] -> ([a],[b],[c],[d],[e],[f]) + unzip6 xs = foldr (\(a,b,c,d,e,f) (as,bs,cs,ds,es,fs) -> + (a:as,b:bs,c:cs,d:ds,e:es,f:fs)) + ([],[],[],[],[],[]) xs + + unzip7 :: [(a,b,c,d,e,f,g)] -> ([a],[b],[c],[d],[e],[f],[g]) + unzip7 xs = foldr (\(a,b,c,d,e,f,g) (as,bs,cs,ds,es,fs,gs) -> + (a:as,b:bs,c:cs,d:ds,e:es,f:fs,g:gs)) + ([],[],[],[],[],[],[]) xs + +-- We can't promote any of these functions because at the type level +-- String literals are no longer considered to be lists of Chars, so +-- there is mismatch between term-level and type-level semantics +-- lines :: String -> [String] +-- lines "" = [] +-- lines s = cons (case break (== '\n') s of +-- (l, s') -> (l, case s' of +-- [] -> [] +-- _:s'' -> lines s'')) +-- where +-- cons ~(h, t) = h : t +-- +-- words :: String -> [String] +-- words s = case dropWhile isSpace s of +-- "" -> [] +-- s' -> w : words s'' +-- where (w, s'') = +-- break isSpace s' + + unlines :: [Symbol] -> Symbol + unlines [] = "" + unlines (l:ls) = l <> "\n" <> unlines ls + + unwords :: [Symbol] -> Symbol + unwords [] = "" + unwords (w:ws) = w <> go ws + where + go [] = "" + go (v:vs) = " " <> (v <> go vs) + + delete :: (Eq a) => a -> [a] -> [a] + delete = deleteBy (==) + + (\\) :: (Eq a) => [a] -> [a] -> [a] + (\\) = foldl (flip delete) + infix 5 \\ -- This comment is necessary so CPP doesn't treat the + -- trailing backslash as a line splice. Urgh. + + deleteBy :: (a -> a -> Bool) -> a -> [a] -> [a] + deleteBy _ _ [] = [] + deleteBy eq x (y:ys) = if x `eq` y then ys else y : deleteBy eq x ys + + deleteFirstsBy :: (a -> a -> Bool) -> [a] -> [a] -> [a] + deleteFirstsBy eq = foldl (flip (deleteBy eq)) + + sortBy :: (a -> a -> Ordering) -> [a] -> [a] + sortBy cmp = foldr (insertBy cmp) [] + + insertBy :: (a -> a -> Ordering) -> a -> [a] -> [a] + insertBy _ x [] = [x] + insertBy cmp x ys@(y:ys') + = case cmp x y of + GT -> y : insertBy cmp x ys' + LT -> x : ys + EQ -> x : ys + + maximumBy :: (a -> a -> Ordering) -> [a] -> a + maximumBy _ [] = error "Data.Singletons.List.maximumBy: empty list" + maximumBy cmp xs@(_:_) = foldl1 maxBy xs + where + maxBy x y = case cmp x y of + GT -> x + EQ -> y + LT -> y + + minimumBy :: (a -> a -> Ordering) -> [a] -> a + minimumBy _ [] = error "Data.Singletons.List.minimumBy: empty list" + minimumBy cmp xs@(_:_) = foldl1 minBy xs + where + minBy x y = case cmp x y of + GT -> y + EQ -> x + LT -> x + + filter :: (a -> Bool) -> [a] -> [a] + filter _p [] = [] + filter p (x:xs) = if p x then x : filter p xs else filter p xs + + find :: (a -> Bool) -> [a] -> Maybe a + find p = listToMaybe . filter p + +-- These three rely on findIndices, which does not promote. +-- Since we have our own implementation of findIndices these are perfectly valid + elemIndex :: Eq a => a -> [a] -> Maybe Natural + elemIndex x = findIndex (x==) + + elemIndices :: Eq a => a -> [a] -> [Natural] + elemIndices x = findIndices (x==) + + findIndex :: (a -> Bool) -> [a] -> Maybe Natural + findIndex p = listToMaybe . findIndices p + +-- Uses infinite lists and and Ints +-- findIndices :: (a -> Bool) -> [a] -> [Int] +-- findIndices p xs = [ i | (x,i) <- zip xs [0..], p x] + + findIndices :: (a -> Bool) -> [a] -> [Natural] + findIndices p xs = map snd (filter (\(x,_) -> p x) + (zip xs (buildList 0 xs))) + where buildList :: Natural -> [b] -> [Natural] + buildList _ [] = [] + buildList a (_:rest) = a : buildList (a+1) rest + + intersect :: (Eq a) => [a] -> [a] -> [a] + intersect = intersectBy (==) + + intersectBy :: (a -> a -> Bool) -> [a] -> [a] -> [a] + intersectBy _ [] [] = [] + intersectBy _ [] (_:_) = [] + intersectBy _ (_:_) [] = [] + intersectBy eq xs@(_:_) ys@(_:_) = [x | x <- xs, any (eq x) ys] + + takeWhile :: (a -> Bool) -> [a] -> [a] + takeWhile _ [] = [] + takeWhile p (x:xs) = if p x then x : takeWhile p xs else [] + + dropWhile :: (a -> Bool) -> [a] -> [a] + dropWhile _ [] = [] + dropWhile p xs@(x:xs') = if p x then dropWhile p xs' else xs + + dropWhileEnd :: (a -> Bool) -> [a] -> [a] + dropWhileEnd p = foldr (\x xs -> if p x && null xs then [] else x : xs) [] + + span :: (a -> Bool) -> [a] -> ([a],[a]) + span _ xs@[] = (xs, xs) + span p xs@(x:xs') = if p x then let (ys,zs) = span p xs' in (x:ys,zs) + else ([], xs) + + break :: (a -> Bool) -> [a] -> ([a],[a]) + break _ xs@[] = (xs, xs) + break p xs@(x:xs') = if p x then ([],xs) + else let (ys,zs) = break p xs' in (x:ys,zs) + +-- Can't be promoted because of limitations of Int promotion +-- Below is a re-implementation using Nat +-- take :: Int -> [a] -> [a] +-- take n _ | n <= 0 = [] +-- take _ [] = [] +-- take n (x:xs) = x : take (n-1) xs + +-- drop :: Int -> [a] -> [a] +-- drop n xs | n <= 0 = xs +-- drop _ [] = [] +-- drop n (_:xs) = drop (n-1) xs + +-- splitAt :: Int -> [a] -> ([a],[a]) +-- splitAt n xs = (take n xs, drop n xs) + + take :: Natural -> [a] -> [a] + take _ [] = [] + take n (x:xs) = if n == 0 then [] else x : take (n-1) xs + + drop :: Natural -> [a] -> [a] + drop _ [] = [] + drop n (x:xs) = if n == 0 then x:xs else drop (n-1) xs + + splitAt :: Natural -> [a] -> ([a],[a]) + splitAt n xs = (take n xs, drop n xs) + + group :: Eq a => [a] -> [[a]] + group xs = groupBy (==) xs + + maximum :: (Ord a) => [a] -> a + maximum [] = error "Data.Singletons.List.maximum: empty list" + maximum xs@(_:_) = foldl1 max xs + + minimum :: (Ord a) => [a] -> a + minimum [] = error "Data.Singletons.List.minimum: empty list" + minimum xs@(_:_) = foldl1 min xs + + insert :: Ord a => a -> [a] -> [a] + insert e ls = insertBy (compare) e ls + + sort :: (Ord a) => [a] -> [a] + sort = sortBy compare + + groupBy :: (a -> a -> Bool) -> [a] -> [[a]] + groupBy _ [] = [] + groupBy eq (x:xs) = (x:ys) : groupBy eq zs + where (ys,zs) = span (eq x) xs + + lookup :: (Eq a) => a -> [(a,b)] -> Maybe b + lookup _key [] = Nothing + lookup key ((x,y):xys) = if key == x then Just y else lookup key xys + + partition :: (a -> Bool) -> [a] -> ([a],[a]) + partition p xs = foldr (select p) ([],[]) xs + + -- Lazy pattern removed from select + select :: (a -> Bool) -> a -> ([a], [a]) -> ([a], [a]) + select p x (ts,fs) = if p x then (x:ts,fs) else (ts, x:fs) + +-- Can't be promoted because of limitations of Int promotion +-- Below is a re-implementation using Nat +-- sum :: (Num a) => [a] -> a +-- sum l = sum' l 0 +-- where +-- sum' [] a = a +-- sum' (x:xs) a = sum' xs (a+x) +-- +-- product :: (Num a) => [a] -> a +-- product l = prod l 1 +-- where +-- prod [] a = a +-- prod (x:xs) a = prod xs (a*x) + + sum :: forall a. Num a => [a] -> a + sum l = sum' l 0 + where + sum' :: [a] -> a -> a + sum' [] a = a + sum' (x:xs) a = sum' xs (a+x) + + product :: forall a. Num a => [a] -> a + product l = prod l 1 + where + prod :: [a] -> a -> a + prod [] a = a + prod (x:xs) a = prod xs (a*x) + + +-- Can't be promoted because of limitations of Int promotion +-- Below is a re-implementation using Nat +-- length :: [a] -> Int +-- length l = lenAcc l 0# +-- +-- lenAcc :: [a] -> Int# -> Int +-- lenAcc [] a# = I# a# +-- lenAcc (_:xs) a# = lenAcc xs (a# +# 1#) +-- +-- incLen :: a -> (Int# -> Int) -> Int# -> Int +-- incLen _ g x = g (x +# 1#) + + length :: [a] -> Natural + length [] = 0 + length (_:xs) = 1 + length xs + +-- Functions working on infinite lists don't promote because they create +-- infinite types. replicate also uses integers, but luckily it can be rewritten +-- iterate :: (a -> a) -> a -> [a] +-- iterate f x = x : iterate f (f x) +-- +-- repeat :: a -> [a] +-- repeat x = xs where xs = x : xs +-- +-- replicate :: Int -> a -> [a] +-- replicate n x = take n (repeat x) +-- +-- cycle :: [a] -> [a] +-- cycle [] = error "Data.Singletons.List.cycle: empty list" +-- cycle xs = xs' where xs' = xs ++ xs' + + replicate :: Natural -> a -> [a] + replicate n x = if n == 0 then [] else x : replicate (n-1) x + +-- Uses partial pattern-matching in a list comprehension +-- (see https://github.com/goldfirere/singletons/issues/340) +-- transpose :: [[a]] -> [[a]] +-- transpose [] = [] +-- transpose ([] : xss) = transpose xss +-- transpose ((x:xs) : xss) = (x : [h | (h:_) <- xss]) : transpose (xs : [ t | (_:t) <- xss]) + + transpose :: [[a]] -> [[a]] + transpose [] = [] + transpose ([] : xss) = transpose xss + transpose ((x:xs) : xss) = (x : (map head xss)) : transpose (xs : (map tail xss)) + +-- Can't be promoted because of limitations of Int promotion. +-- Below is a re-implementation using Nat +-- (!!) :: [a] -> Int -> a +-- xs !! n | n < 0 = error "Data.Singletons.List.!!: negative index" +-- [] !! _ = error "Data.Singletons.List.!!: index too large" +-- (x:_) !! 0 = x +-- (_:xs) !! n = xs !! (n-1) + + (!!) :: [a] -> Natural -> a + [] !! _ = error "Data.Singletons.List.!!: index too large" + (x:xs) !! n = if n == 0 then x else xs !! (n-1) + infixl 9 !! + + nub :: forall a. (Eq a) => [a] -> [a] + nub l = nub' l [] + where + nub' :: [a] -> [a] -> [a] + nub' [] _ = [] + nub' (x:xs) ls = if x `elem` ls then nub' xs ls else x : nub' xs (x:ls) + + nubBy :: (a -> a -> Bool) -> [a] -> [a] + nubBy eq l = nubBy' l [] + where + nubBy' [] _ = [] + nubBy' (y:ys) xs = if elem_by eq y xs then nubBy' ys xs else y : nubBy' ys (y:xs) + + elem_by :: (a -> a -> Bool) -> a -> [a] -> Bool + elem_by _ _ [] = False + elem_by eq y (x:xs) = y `eq` x || elem_by eq y xs + + unionBy :: (a -> a -> Bool) -> [a] -> [a] -> [a] + unionBy eq xs ys = xs ++ foldl (flip (deleteBy eq)) (nubBy eq ys) xs + + union :: (Eq a) => [a] -> [a] -> [a] + union = unionBy (==) + + genericLength :: (Num i) => [a] -> i + genericLength [] = 0 + genericLength (_:xs) = 1 + genericLength xs + + |]) + +-- The following functions are supported for promotion only. +$(promoteOnly [d| + + -- Overlapping patterns don't singletonize + stripPrefix :: Eq a => [a] -> [a] -> Maybe [a] + stripPrefix [] ys = Just ys + stripPrefix (x:xs) (y:ys) + | x == y = stripPrefix xs ys + stripPrefix _ _ = Nothing + + -- To singletonize these we would need to rewrite all patterns + -- as non-overlapping. This means 2^7 equations for zipWith7. + + zip4 :: [a] -> [b] -> [c] -> [d] -> [(a,b,c,d)] + zip4 = zipWith4 (,,,) + + zip5 :: [a] -> [b] -> [c] -> [d] -> [e] -> [(a,b,c,d,e)] + zip5 = zipWith5 (,,,,) + + zip6 :: [a] -> [b] -> [c] -> [d] -> [e] -> [f] -> + [(a,b,c,d,e,f)] + zip6 = zipWith6 (,,,,,) + + zip7 :: [a] -> [b] -> [c] -> [d] -> [e] -> [f] -> + [g] -> [(a,b,c,d,e,f,g)] + zip7 = zipWith7 (,,,,,,) + + zipWith4 :: (a->b->c->d->e) -> [a]->[b]->[c]->[d]->[e] + zipWith4 z (a:as) (b:bs) (c:cs) (d:ds) + = z a b c d : zipWith4 z as bs cs ds + zipWith4 _ _ _ _ _ = [] + + zipWith5 :: (a->b->c->d->e->f) -> + [a]->[b]->[c]->[d]->[e]->[f] + zipWith5 z (a:as) (b:bs) (c:cs) (d:ds) (e:es) + = z a b c d e : zipWith5 z as bs cs ds es + zipWith5 _ _ _ _ _ _ = [] + + zipWith6 :: (a->b->c->d->e->f->g) -> + [a]->[b]->[c]->[d]->[e]->[f]->[g] + zipWith6 z (a:as) (b:bs) (c:cs) (d:ds) (e:es) (f:fs) + = z a b c d e f : zipWith6 z as bs cs ds es fs + zipWith6 _ _ _ _ _ _ _ = [] + + zipWith7 :: (a->b->c->d->e->f->g->h) -> + [a]->[b]->[c]->[d]->[e]->[f]->[g]->[h] + zipWith7 z (a:as) (b:bs) (c:cs) (d:ds) (e:es) (f:fs) (g:gs) + = z a b c d e f g : zipWith7 z as bs cs ds es fs gs + zipWith7 _ _ _ _ _ _ _ _ = [] + |])
src/Data/List/Singletons/Internal/Disambiguation.hs view
@@ -1,171 +1,171 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE UndecidableInstances #-}---------------------------------------------------------------------------------- |--- Module : Data.List.Singletons.Internal.Disambiguation--- Copyright : (C) 2016 Richard Eisenberg--- License : BSD-style (see LICENSE)--- Maintainer : Ryan Scott--- Stability : experimental--- Portability : non-portable------ Renames a bunch of List functions because singletons can't support qualified--- names. :(----------------------------------------------------------------------------------module Data.List.Singletons.Internal.Disambiguation where--import Data.Eq.Singletons-import Data.List ( foldl', inits, insert, intersperse, isPrefixOf- , nubBy, partition, sort, sortBy, tails, transpose )-import Data.List.Singletons.Internal-import Data.Ord.Singletons-import Data.Singletons.Base.Instances-import Data.Singletons.TH-import GHC.Base.Singletons-import GHC.Num.Singletons-import GHC.TypeLits---- singletons doesn't support qualified names :(-$(singletons [d|- listlast :: [a] -> a- listlast = last-- listinit :: [a] -> [a]- listinit = init-- listsort :: Ord a => [a] -> [a]- listsort = sort-- listinits :: [a] -> [[a]]- listinits = inits-- listtails :: [a] -> [[a]]- listtails = tails-- listinsert :: Ord a => a -> [a] -> [a]- listinsert = insert-- listscanl :: (b -> a -> b) -> b -> [a] -> [b]- listscanl = scanl-- listscanr :: (a -> b -> b) -> b -> [a] -> [b]- listscanr = scanr-- listscanr1 :: (a -> a -> a) -> [a] -> [a]- listscanr1 = scanr1-- listintersperse :: a -> [a] -> [a]- listintersperse = intersperse-- listreverse :: [a] -> [a]- listreverse = reverse-- listtakeWhile :: (a -> Bool) -> [a] -> [a]- listtakeWhile = takeWhile-- listdropWhile :: (a -> Bool) -> [a] -> [a]- listdropWhile = dropWhile-- listspan :: (a -> Bool) -> [a] -> ([a], [a])- listspan = span-- listfilter :: (a -> Bool) -> [a] -> [a]- listfilter = filter-- listpartition :: (a -> Bool) -> [a] -> ([a], [a])- listpartition = partition-- listsortBy :: (a -> a -> Ordering) -> [a] -> [a]- listsortBy = sortBy-- listisPrefixOf :: Eq a => [a] -> [a] -> Bool- listisPrefixOf = isPrefixOf-- listzip :: [a] -> [b] -> [(a, b)]- listzip = zip-- listzipWith :: (a -> b -> c) -> [a] -> [b] -> [c]- listzipWith = zipWith-- listnubBy :: (a -> a -> Bool) -> [a] -> [a]- listnubBy = nubBy-- listtranspose :: [[a]] -> [[a]]- listtranspose = transpose-- listunzip :: [(a,b)] -> ([a],[b])- listunzip = unzip-- listmap :: (a -> b) -> [a] -> [b]- listmap = map-- listelem :: Eq a => a -> [a] -> Bool- listelem = elem-- listfoldl :: (b -> a -> b) -> b -> [a] -> b- listfoldl = foldl-- listfoldl' :: (b -> a -> b) -> b -> [a] -> b- listfoldl' = foldl'-- listfoldl1 :: (a -> a -> a) -> [a] -> a- listfoldl1 = foldl1-- listfoldr :: (a -> b -> b) -> b -> [a] -> b- listfoldr = foldr-- listfoldr1 :: (a -> a -> a) -> [a] -> a- listfoldr1 = foldr1-- listmaximum :: Ord a => [a] -> a- listmaximum = maximum-- listminimum :: Ord a => [a] -> a- listminimum = minimum-- listnull :: [a] -> Bool- listnull = null-- listproduct :: Num a => [a] -> a- listproduct = product-- listsum :: Num a => [a] -> a- listsum = sum- |])--$(singletonsOnly [d|- listtake :: Natural -> [a] -> [a]- listtake = take-- listdrop :: Natural -> [a] -> [a]- listdrop = drop-- listsplitAt :: Natural -> [a] -> ([a], [a])- listsplitAt = splitAt-- listindex :: [a] -> Natural -> a- listindex = (!!)-- listlength :: [a] -> Nat- listlength = length- |])--listtake :: Natural -> [a] -> [a]-listtake = undefined--listdrop :: Natural -> [a] -> [a]-listdrop = undefined--listsplitAt :: Natural -> [a] -> ([a], [a])-listsplitAt = undefined--listindex :: [a] -> Natural -> a-listindex = undefined--listlength :: [a] -> Nat-listlength = undefined+{-# LANGUAGE DataKinds #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE UndecidableInstances #-} + +----------------------------------------------------------------------------- +-- | +-- Module : Data.List.Singletons.Internal.Disambiguation +-- Copyright : (C) 2016 Richard Eisenberg +-- License : BSD-style (see LICENSE) +-- Maintainer : Ryan Scott +-- Stability : experimental +-- Portability : non-portable +-- +-- Renames a bunch of List functions because singletons can't support qualified +-- names. :( +-- +---------------------------------------------------------------------------- + +module Data.List.Singletons.Internal.Disambiguation where + +import Data.Eq.Singletons +import Data.List ( foldl', inits, insert, intersperse, isPrefixOf + , nubBy, partition, sort, sortBy, tails, transpose ) +import Data.List.Singletons.Internal +import Data.Ord.Singletons +import Data.Singletons.Base.Instances +import Data.Singletons.TH +import GHC.Base.Singletons +import GHC.Num.Singletons +import GHC.TypeLits + +-- singletons doesn't support qualified names :( +$(singletons [d| + listlast :: [a] -> a + listlast = last + + listinit :: [a] -> [a] + listinit = init + + listsort :: Ord a => [a] -> [a] + listsort = sort + + listinits :: [a] -> [[a]] + listinits = inits + + listtails :: [a] -> [[a]] + listtails = tails + + listinsert :: Ord a => a -> [a] -> [a] + listinsert = insert + + listscanl :: (b -> a -> b) -> b -> [a] -> [b] + listscanl = scanl + + listscanr :: (a -> b -> b) -> b -> [a] -> [b] + listscanr = scanr + + listscanr1 :: (a -> a -> a) -> [a] -> [a] + listscanr1 = scanr1 + + listintersperse :: a -> [a] -> [a] + listintersperse = intersperse + + listreverse :: [a] -> [a] + listreverse = reverse + + listtakeWhile :: (a -> Bool) -> [a] -> [a] + listtakeWhile = takeWhile + + listdropWhile :: (a -> Bool) -> [a] -> [a] + listdropWhile = dropWhile + + listspan :: (a -> Bool) -> [a] -> ([a], [a]) + listspan = span + + listfilter :: (a -> Bool) -> [a] -> [a] + listfilter = filter + + listpartition :: (a -> Bool) -> [a] -> ([a], [a]) + listpartition = partition + + listsortBy :: (a -> a -> Ordering) -> [a] -> [a] + listsortBy = sortBy + + listisPrefixOf :: Eq a => [a] -> [a] -> Bool + listisPrefixOf = isPrefixOf + + listzip :: [a] -> [b] -> [(a, b)] + listzip = zip + + listzipWith :: (a -> b -> c) -> [a] -> [b] -> [c] + listzipWith = zipWith + + listnubBy :: (a -> a -> Bool) -> [a] -> [a] + listnubBy = nubBy + + listtranspose :: [[a]] -> [[a]] + listtranspose = transpose + + listunzip :: [(a,b)] -> ([a],[b]) + listunzip = unzip + + listmap :: (a -> b) -> [a] -> [b] + listmap = map + + listelem :: Eq a => a -> [a] -> Bool + listelem = elem + + listfoldl :: (b -> a -> b) -> b -> [a] -> b + listfoldl = foldl + + listfoldl' :: (b -> a -> b) -> b -> [a] -> b + listfoldl' = foldl' + + listfoldl1 :: (a -> a -> a) -> [a] -> a + listfoldl1 = foldl1 + + listfoldr :: (a -> b -> b) -> b -> [a] -> b + listfoldr = foldr + + listfoldr1 :: (a -> a -> a) -> [a] -> a + listfoldr1 = foldr1 + + listmaximum :: Ord a => [a] -> a + listmaximum = maximum + + listminimum :: Ord a => [a] -> a + listminimum = minimum + + listnull :: [a] -> Bool + listnull = null + + listproduct :: Num a => [a] -> a + listproduct = product + + listsum :: Num a => [a] -> a + listsum = sum + |]) + +$(singletonsOnly [d| + listtake :: Natural -> [a] -> [a] + listtake = take + + listdrop :: Natural -> [a] -> [a] + listdrop = drop + + listsplitAt :: Natural -> [a] -> ([a], [a]) + listsplitAt = splitAt + + listindex :: [a] -> Natural -> a + listindex = (!!) + + listlength :: [a] -> Nat + listlength = length + |]) + +listtake :: Natural -> [a] -> [a] +listtake = undefined + +listdrop :: Natural -> [a] -> [a] +listdrop = undefined + +listsplitAt :: Natural -> [a] -> ([a], [a]) +listsplitAt = undefined + +listindex :: [a] -> Natural -> a +listindex = undefined + +listlength :: [a] -> Nat +listlength = undefined
src/Data/Maybe/Singletons.hs view
@@ -1,122 +1,122 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE UndecidableInstances #-}---------------------------------------------------------------------------------- |--- Module : Data.Maybe.Singletons--- Copyright : (C) 2013-2014 Richard Eisenberg, Jan Stolarek--- License : BSD-style (see LICENSE)--- Maintainer : Ryan Scott--- Stability : experimental--- Portability : non-portable------ Defines functions and datatypes relating to the singleton for 'Maybe',--- including singled versions of all the definitions in @Data.Maybe@.------ Because many of these definitions are produced by Template Haskell,--- it is not possible to create proper Haddock documentation. Please look--- up the corresponding operation in @Data.Maybe@. Also, please excuse--- the apparent repeated variable names. This is due to an interaction--- between Template Haskell and Haddock.-----------------------------------------------------------------------------------module Data.Maybe.Singletons (- -- The 'Maybe' singleton- Sing, SMaybe(..),-- -- * Singletons from @Data.Maybe@- maybe_, Maybe_, sMaybe_,- -- | The preceding two definitions are derived from the function 'maybe' in- -- @Data.Maybe@. The extra underscore is to avoid name clashes with the type- -- 'Maybe'.-- IsJust, sIsJust, IsNothing, sIsNothing,- FromJust, sFromJust, FromMaybe, sFromMaybe, ListToMaybe, sListToMaybe,- MaybeToList, sMaybeToList, CatMaybes, sCatMaybes, MapMaybe, sMapMaybe,-- -- * Defunctionalization symbols- NothingSym0, JustSym0, JustSym1,-- Maybe_Sym0, Maybe_Sym1, Maybe_Sym2, Maybe_Sym3,- IsJustSym0, IsJustSym1, IsNothingSym0, IsNothingSym1,- FromJustSym0, FromJustSym1, FromMaybeSym0, FromMaybeSym1, FromMaybeSym2,- ListToMaybeSym0, ListToMaybeSym1, MaybeToListSym0, MaybeToListSym1,- CatMaybesSym0, CatMaybesSym1, MapMaybeSym0, MapMaybeSym1, MapMaybeSym2- ) where--import Data.Singletons.Base.Instances-import Data.Singletons.TH-import GHC.TypeLits.Singletons--$(singletons [d|- -- Renamed to avoid name clash- -- -| The 'maybe' function takes a default value, a function, and a 'Maybe'- -- value. If the 'Maybe' value is 'Nothing', the function returns the- -- default value. Otherwise, it applies the function to the value inside- -- the 'Just' and returns the result.- maybe_ :: b -> (a -> b) -> Maybe a -> b- maybe_ n _ Nothing = n- maybe_ _ f (Just x) = f x- |])--$(singletonsOnly [d|- -- -| The 'isJust' function returns 'True' iff its argument is of the- -- form @Just _@.- isJust :: Maybe a -> Bool- isJust Nothing = False- isJust (Just _) = True-- -- -| The 'isNothing' function returns 'True' iff its argument is 'Nothing'.- isNothing :: Maybe a -> Bool- isNothing Nothing = True- isNothing (Just _) = False-- -- -| The 'fromJust' function extracts the element out of a 'Just' and- -- throws an error if its argument is 'Nothing'.- fromJust :: Maybe a -> a- fromJust Nothing = error "Maybe.fromJust: Nothing" -- yuck- fromJust (Just x) = x-- -- -| The 'fromMaybe' function takes a default value and and 'Maybe'- -- value. If the 'Maybe' is 'Nothing', it returns the default values;- -- otherwise, it returns the value contained in the 'Maybe'.- fromMaybe :: a -> Maybe a -> a- fromMaybe d x = case x of {Nothing -> d;Just v -> v}-- -- -| The 'maybeToList' function returns an empty list when given- -- 'Nothing' or a singleton list when not given 'Nothing'.- maybeToList :: Maybe a -> [a]- maybeToList Nothing = []- maybeToList (Just x) = [x]-- -- -| The 'listToMaybe' function returns 'Nothing' on an empty list- -- or @'Just' a@ where @a@ is the first element of the list.- listToMaybe :: [a] -> Maybe a- listToMaybe [] = Nothing- listToMaybe (a:_) = Just a-- -- Modified to avoid list comprehensions- -- -| The 'catMaybes' function takes a list of 'Maybe's and returns- -- a list of all the 'Just' values.- catMaybes :: [Maybe a] -> [a]- catMaybes [] = []- catMaybes (Just x : xs) = x : catMaybes xs- catMaybes (Nothing : xs) = catMaybes xs-- -- -| The 'mapMaybe' function is a version of 'map' which can throw- -- out elements. In particular, the functional argument returns- -- something of type @'Maybe' b@. If this is 'Nothing', no element- -- is added on to the result list. If it just @'Just' b@, then @b@ is- -- included in the result list.- mapMaybe :: (a -> Maybe b) -> [a] -> [b]- mapMaybe _ [] = []- mapMaybe f (x:xs) =- let rs = mapMaybe f xs in- case f x of- Nothing -> rs- Just r -> r:rs- |])+{-# LANGUAGE DataKinds #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE UndecidableInstances #-} + +----------------------------------------------------------------------------- +-- | +-- Module : Data.Maybe.Singletons +-- Copyright : (C) 2013-2014 Richard Eisenberg, Jan Stolarek +-- License : BSD-style (see LICENSE) +-- Maintainer : Ryan Scott +-- Stability : experimental +-- Portability : non-portable +-- +-- Defines functions and datatypes relating to the singleton for 'Maybe', +-- including singled versions of all the definitions in @Data.Maybe@. +-- +-- Because many of these definitions are produced by Template Haskell, +-- it is not possible to create proper Haddock documentation. Please look +-- up the corresponding operation in @Data.Maybe@. Also, please excuse +-- the apparent repeated variable names. This is due to an interaction +-- between Template Haskell and Haddock. +-- +---------------------------------------------------------------------------- + + +module Data.Maybe.Singletons ( + -- The 'Maybe' singleton + Sing, SMaybe(..), + + -- * Singletons from @Data.Maybe@ + maybe_, Maybe_, sMaybe_, + -- | The preceding two definitions are derived from the function 'maybe' in + -- @Data.Maybe@. The extra underscore is to avoid name clashes with the type + -- 'Maybe'. + + IsJust, sIsJust, IsNothing, sIsNothing, + FromJust, sFromJust, FromMaybe, sFromMaybe, ListToMaybe, sListToMaybe, + MaybeToList, sMaybeToList, CatMaybes, sCatMaybes, MapMaybe, sMapMaybe, + + -- * Defunctionalization symbols + NothingSym0, JustSym0, JustSym1, + + Maybe_Sym0, Maybe_Sym1, Maybe_Sym2, Maybe_Sym3, + IsJustSym0, IsJustSym1, IsNothingSym0, IsNothingSym1, + FromJustSym0, FromJustSym1, FromMaybeSym0, FromMaybeSym1, FromMaybeSym2, + ListToMaybeSym0, ListToMaybeSym1, MaybeToListSym0, MaybeToListSym1, + CatMaybesSym0, CatMaybesSym1, MapMaybeSym0, MapMaybeSym1, MapMaybeSym2 + ) where + +import Data.Singletons.Base.Instances +import Data.Singletons.TH +import GHC.TypeLits.Singletons + +$(singletons [d| + -- Renamed to avoid name clash + -- -| The 'maybe' function takes a default value, a function, and a 'Maybe' + -- value. If the 'Maybe' value is 'Nothing', the function returns the + -- default value. Otherwise, it applies the function to the value inside + -- the 'Just' and returns the result. + maybe_ :: b -> (a -> b) -> Maybe a -> b + maybe_ n _ Nothing = n + maybe_ _ f (Just x) = f x + |]) + +$(singletonsOnly [d| + -- -| The 'isJust' function returns 'True' iff its argument is of the + -- form @Just _@. + isJust :: Maybe a -> Bool + isJust Nothing = False + isJust (Just _) = True + + -- -| The 'isNothing' function returns 'True' iff its argument is 'Nothing'. + isNothing :: Maybe a -> Bool + isNothing Nothing = True + isNothing (Just _) = False + + -- -| The 'fromJust' function extracts the element out of a 'Just' and + -- throws an error if its argument is 'Nothing'. + fromJust :: Maybe a -> a + fromJust Nothing = error "Maybe.fromJust: Nothing" -- yuck + fromJust (Just x) = x + + -- -| The 'fromMaybe' function takes a default value and and 'Maybe' + -- value. If the 'Maybe' is 'Nothing', it returns the default values; + -- otherwise, it returns the value contained in the 'Maybe'. + fromMaybe :: a -> Maybe a -> a + fromMaybe d x = case x of {Nothing -> d;Just v -> v} + + -- -| The 'maybeToList' function returns an empty list when given + -- 'Nothing' or a singleton list when not given 'Nothing'. + maybeToList :: Maybe a -> [a] + maybeToList Nothing = [] + maybeToList (Just x) = [x] + + -- -| The 'listToMaybe' function returns 'Nothing' on an empty list + -- or @'Just' a@ where @a@ is the first element of the list. + listToMaybe :: [a] -> Maybe a + listToMaybe [] = Nothing + listToMaybe (a:_) = Just a + + -- Modified to avoid list comprehensions + -- -| The 'catMaybes' function takes a list of 'Maybe's and returns + -- a list of all the 'Just' values. + catMaybes :: [Maybe a] -> [a] + catMaybes [] = [] + catMaybes (Just x : xs) = x : catMaybes xs + catMaybes (Nothing : xs) = catMaybes xs + + -- -| The 'mapMaybe' function is a version of 'map' which can throw + -- out elements. In particular, the functional argument returns + -- something of type @'Maybe' b@. If this is 'Nothing', no element + -- is added on to the result list. If it just @'Just' b@, then @b@ is + -- included in the result list. + mapMaybe :: (a -> Maybe b) -> [a] -> [b] + mapMaybe _ [] = [] + mapMaybe f (x:xs) = + let rs = mapMaybe f xs in + case f x of + Nothing -> rs + Just r -> r:rs + |])
src/Data/Monoid/Singletons.hs view
@@ -1,204 +1,205 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE DefaultSignatures #-}-{-# LANGUAGE NoNamedWildCards #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE UndecidableInstances #-}-{-# OPTIONS_GHC -Wno-orphans #-}---------------------------------------------------------------------------------- |--- Module : Data.Monoid.Singletons--- Copyright : (C) 2018 Ryan Scott--- License : BSD-style (see LICENSE)--- Maintainer : Ryan Scott--- Stability : experimental--- Portability : non-portable------ Defines the promoted version of 'Monoid', 'PMonoid', and the--- singleton version, 'SMonoid'.----------------------------------------------------------------------------------module Data.Monoid.Singletons (- PMonoid(..), SMonoid(..),-- Sing, SDual(..), SAll(..), SAny(..),- SSum(..), SProduct(..), SFirst(..), SLast(..),- GetDual, GetAll, GetAny, GetSum, GetProduct, GetFirst, GetLast,- sGetDual, sGetAll, sGetAny, sGetSum, sGetProduct, sGetFirst, sGetLast,-- -- ** Defunctionalization symbols- MemptySym0,- MappendSym0, MappendSym1, MappendSym2,- MconcatSym0, MconcatSym1,- DualSym0, DualSym1, GetDualSym0, GetDualSym1,- AllSym0, AllSym1, GetAllSym0, GetAllSym1,- AnySym0, AnySym1, GetAnySym0, GetAnySym1,- SumSym0, SumSym1, GetSumSym0, GetSumSym1,- ProductSym0, ProductSym1, GetProductSym0, GetProductSym1,- FirstSym0, FirstSym1, GetFirstSym0, GetFirstSym1,- LastSym0, LastSym1, GetLastSym0, GetLastSym1- ) where--import Control.Monad.Singletons.Internal-import Data.Eq.Singletons-import Data.Monoid (First(..), Last(..))-import Data.Ord (Down(..))-import Data.Ord.Singletons-import Data.Semigroup hiding (First(..), Last(..))-import Data.Semigroup.Singletons.Internal hiding- (SFirst, SLast,- FirstSym0, FirstSym1, FirstSym0KindInference,- LastSym0, LastSym1, LastSym0KindInference,- GetFirst, sGetFirst, GetFirstSym0, GetFirstSym1, GetFirstSym0KindInference,- GetLast, sGetLast, GetLastSym0, GetLastSym1, GetLastSym0KindInference)-import Data.Singletons.Base.Instances-import Data.Singletons.Base.Util-import Data.Singletons.TH-import GHC.Base.Singletons-import GHC.Num.Singletons-import GHC.TypeLits (Symbol)-import Text.Show.Singletons--$(singletonsOnly [d|- -- -| The class of monoids (types with an associative binary operation that- -- has an identity). Instances should satisfy the following laws:- --- -- * @x '<>' 'mempty' = x@- --- -- * @'mempty' '<>' x = x@- --- -- * @x '<>' (y '<>' z) = (x '<>' y) '<>' z@ ('Semigroup' law)- --- -- * @'mconcat' = 'foldr' '(<>)' 'mempty'@- --- -- The method names refer to the monoid of lists under concatenation,- -- but there are many other instances.- --- -- Some types can be viewed as a monoid in more than one way,- -- e.g. both addition and multiplication on numbers.- -- In such cases we often define @newtype@s and make those instances- -- of 'Monoid', e.g. 'Sum' and 'Product'.- class Semigroup a => Monoid a where- -- -| Identity of 'mappend'- mempty :: a-- -- -| An associative operation- --- -- __NOTE__: This method is redundant and has the default- -- implementation @'mappend' = '(<>)'@.- mappend :: a -> a -> a- mappend = (<>)-- -- -| Fold a list using the monoid.- --- -- For most types, the default definition for 'mconcat' will be- -- used, but the function is included in the class definition so- -- that an optimized version can be provided for specific types.- mconcat :: [a] -> a- mconcat = foldr mappend mempty-- instance Monoid [a] where- mempty = []- -- mconcat xss = [x | xs <- xss, x <- xs]-- instance Monoid b => Monoid (a -> b) where- mempty _ = mempty-- instance Monoid () where- -- Should it be strict?- mempty = ()- mconcat _ = ()-- instance (Monoid a, Monoid b) => Monoid (a,b) where- mempty = (mempty, mempty)-- instance (Monoid a, Monoid b, Monoid c) => Monoid (a,b,c) where- mempty = (mempty, mempty, mempty)-- instance (Monoid a, Monoid b, Monoid c, Monoid d) => Monoid (a,b,c,d) where- mempty = (mempty, mempty, mempty, mempty)-- instance (Monoid a, Monoid b, Monoid c, Monoid d, Monoid e) =>- Monoid (a,b,c,d,e) where- mempty = (mempty, mempty, mempty, mempty, mempty)-- -- lexicographical ordering- instance Monoid Ordering where- mempty = EQ-- -- -| Lift a semigroup into 'Maybe' forming a 'Monoid' according to- -- <http://en.wikipedia.org/wiki/Monoid>: \"Any semigroup @S@ may be- -- turned into a monoid simply by adjoining an element @e@ not in @S@- -- and defining @e*e = e@ and @e*s = s = s*e@ for all @s ∈ S@.\"- instance Semigroup a => Monoid (Maybe a) where- mempty = Nothing-- instance Monoid Symbol where- mempty = ""- |])--$(genSingletons monoidBasicTypes)-$(showSingInstances monoidBasicTypes)-$(singEqInstances monoidBasicTypes)-$(singDecideInstances monoidBasicTypes)-$(singOrdInstances monoidBasicTypes)-$(singShowInstances monoidBasicTypes)--$(singletonsOnly [d|- instance Monoid a => Monoid (Dual a) where- mempty = Dual mempty-- instance Monoid All where- mempty = All True-- instance Monoid Any where- mempty = Any False-- instance Num a => Monoid (Sum a) where- mempty = Sum 0-- instance Num a => Monoid (Product a) where- mempty = Product 1-- -- deriving newtype instance Monoid a => Monoid (Down a)- instance Monoid a => Monoid (Down a) where- mempty = Down mempty-- -- deriving newtype instance Applicative First- instance Applicative First where- pure = First . pure- First f <*> First x = First (f <*> x)-- deriving instance Functor First-- -- deriving newtype instance Monad First- instance Monad First where- First a >>= k = First (a >>= \x -> case k x of First y -> y)-- instance Semigroup (First a) where- First Nothing <> b = b- a@(First Just{}) <> _ = a-- instance Monoid (First a) where- mempty = First Nothing-- -- deriving newtype instance Applicative Last- instance Applicative Last where- pure = Last . pure- Last f <*> Last x = Last (f <*> x)-- deriving instance Functor Last-- -- deriving newtype instance Monad Last- instance Monad Last where- Last a >>= k = Last (a >>= \x -> case k x of Last y -> y)-- instance Semigroup (Last a) where- a <> Last Nothing = a- _ <> b@(Last Just {}) = b-- instance Monoid (Last a) where- mempty = Last Nothing- |])+{-# LANGUAGE DataKinds #-} +{-# LANGUAGE DefaultSignatures #-} +{-# LANGUAGE NoNamedWildCards #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE UndecidableInstances #-} +{-# OPTIONS_GHC -Wno-orphans #-} + +----------------------------------------------------------------------------- +-- | +-- Module : Data.Monoid.Singletons +-- Copyright : (C) 2018 Ryan Scott +-- License : BSD-style (see LICENSE) +-- Maintainer : Ryan Scott +-- Stability : experimental +-- Portability : non-portable +-- +-- Defines the promoted version of 'Monoid', 'PMonoid', and the +-- singleton version, 'SMonoid'. +-- +---------------------------------------------------------------------------- + +module Data.Monoid.Singletons ( + PMonoid(..), SMonoid(..), + + Sing, SDual(..), SAll(..), SAny(..), + SSum(..), SProduct(..), SFirst(..), SLast(..), + GetDual, GetAll, GetAny, GetSum, GetProduct, GetFirst, GetLast, + sGetDual, sGetAll, sGetAny, sGetSum, sGetProduct, sGetFirst, sGetLast, + + -- ** Defunctionalization symbols + MemptySym0, + MappendSym0, MappendSym1, MappendSym2, + MconcatSym0, MconcatSym1, + DualSym0, DualSym1, GetDualSym0, GetDualSym1, + AllSym0, AllSym1, GetAllSym0, GetAllSym1, + AnySym0, AnySym1, GetAnySym0, GetAnySym1, + SumSym0, SumSym1, GetSumSym0, GetSumSym1, + ProductSym0, ProductSym1, GetProductSym0, GetProductSym1, + FirstSym0, FirstSym1, GetFirstSym0, GetFirstSym1, + LastSym0, LastSym1, GetLastSym0, GetLastSym1 + ) where + +import Control.Monad.Singletons.Internal +import Data.Eq.Singletons +import Data.Monoid (First(..), Last(..)) +import Data.Ord (Down(..)) +import Data.Ord.Singletons +import Data.Semigroup hiding (First(..), Last(..)) +import Data.Semigroup.Singletons.Internal.Classes +import Data.Semigroup.Singletons.Internal.Wrappers hiding + (SFirst, SLast, + FirstSym0, FirstSym1, FirstSym0KindInference, + LastSym0, LastSym1, LastSym0KindInference, + GetFirst, sGetFirst, GetFirstSym0, GetFirstSym1, GetFirstSym0KindInference, + GetLast, sGetLast, GetLastSym0, GetLastSym1, GetLastSym0KindInference) +import Data.Singletons.Base.Instances +import Data.Singletons.Base.Util +import Data.Singletons.TH +import GHC.Base.Singletons +import GHC.Num.Singletons +import GHC.TypeLits (Symbol) +import Text.Show.Singletons + +$(singletonsOnly [d| + -- -| The class of monoids (types with an associative binary operation that + -- has an identity). Instances should satisfy the following laws: + -- + -- * @x '<>' 'mempty' = x@ + -- + -- * @'mempty' '<>' x = x@ + -- + -- * @x '<>' (y '<>' z) = (x '<>' y) '<>' z@ ('Semigroup' law) + -- + -- * @'mconcat' = 'foldr' '(<>)' 'mempty'@ + -- + -- The method names refer to the monoid of lists under concatenation, + -- but there are many other instances. + -- + -- Some types can be viewed as a monoid in more than one way, + -- e.g. both addition and multiplication on numbers. + -- In such cases we often define @newtype@s and make those instances + -- of 'Monoid', e.g. 'Sum' and 'Product'. + class Semigroup a => Monoid a where + -- -| Identity of 'mappend' + mempty :: a + + -- -| An associative operation + -- + -- __NOTE__: This method is redundant and has the default + -- implementation @'mappend' = '(<>)'@. + mappend :: a -> a -> a + mappend = (<>) + + -- -| Fold a list using the monoid. + -- + -- For most types, the default definition for 'mconcat' will be + -- used, but the function is included in the class definition so + -- that an optimized version can be provided for specific types. + mconcat :: [a] -> a + mconcat = foldr mappend mempty + + instance Monoid [a] where + mempty = [] + -- mconcat xss = [x | xs <- xss, x <- xs] + + instance Monoid b => Monoid (a -> b) where + mempty _ = mempty + + instance Monoid () where + -- Should it be strict? + mempty = () + mconcat _ = () + + instance (Monoid a, Monoid b) => Monoid (a,b) where + mempty = (mempty, mempty) + + instance (Monoid a, Monoid b, Monoid c) => Monoid (a,b,c) where + mempty = (mempty, mempty, mempty) + + instance (Monoid a, Monoid b, Monoid c, Monoid d) => Monoid (a,b,c,d) where + mempty = (mempty, mempty, mempty, mempty) + + instance (Monoid a, Monoid b, Monoid c, Monoid d, Monoid e) => + Monoid (a,b,c,d,e) where + mempty = (mempty, mempty, mempty, mempty, mempty) + + -- lexicographical ordering + instance Monoid Ordering where + mempty = EQ + + -- -| Lift a semigroup into 'Maybe' forming a 'Monoid' according to + -- <http://en.wikipedia.org/wiki/Monoid>: \"Any semigroup @S@ may be + -- turned into a monoid simply by adjoining an element @e@ not in @S@ + -- and defining @e*e = e@ and @e*s = s = s*e@ for all @s ∈ S@.\" + instance Semigroup a => Monoid (Maybe a) where + mempty = Nothing + + instance Monoid Symbol where + mempty = "" + |]) + +$(genSingletons monoidBasicTypes) +$(showSingInstances monoidBasicTypes) +$(singEqInstances monoidBasicTypes) +$(singDecideInstances monoidBasicTypes) +$(singOrdInstances monoidBasicTypes) +$(singShowInstances monoidBasicTypes) + +$(singletonsOnly [d| + instance Monoid a => Monoid (Dual a) where + mempty = Dual mempty + + instance Monoid All where + mempty = All True + + instance Monoid Any where + mempty = Any False + + instance Num a => Monoid (Sum a) where + mempty = Sum 0 + + instance Num a => Monoid (Product a) where + mempty = Product 1 + + -- deriving newtype instance Monoid a => Monoid (Down a) + instance Monoid a => Monoid (Down a) where + mempty = Down mempty + + -- deriving newtype instance Applicative First + instance Applicative First where + pure = First . pure + First f <*> First x = First (f <*> x) + + deriving instance Functor First + + -- deriving newtype instance Monad First + instance Monad First where + First a >>= k = First (a >>= \x -> case k x of First y -> y) + + instance Semigroup (First a) where + First Nothing <> b = b + a@(First Just{}) <> _ = a + + instance Monoid (First a) where + mempty = First Nothing + + -- deriving newtype instance Applicative Last + instance Applicative Last where + pure = Last . pure + Last f <*> Last x = Last (f <*> x) + + deriving instance Functor Last + + -- deriving newtype instance Monad Last + instance Monad Last where + Last a >>= k = Last (a >>= \x -> case k x of Last y -> y) + + instance Semigroup (Last a) where + a <> Last Nothing = a + _ <> b@(Last Just {}) = b + + instance Monoid (Last a) where + mempty = Last Nothing + |])
src/Data/Ord/Singletons.hs view
@@ -1,108 +1,102 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE DefaultSignatures #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE UndecidableInstances #-}-{-# OPTIONS_GHC -Wno-orphans #-}---------------------------------------------------------------------------------- |--- Module : Data.Ord.Singletons--- Copyright : (C) 2013 Richard Eisenberg--- License : BSD-style (see LICENSE)--- Maintainer : Ryan Scott--- Stability : experimental--- Portability : non-portable------ Defines the promoted version of Ord, 'POrd', and the singleton version,--- 'SOrd'.-----------------------------------------------------------------------------------module Data.Ord.Singletons (- POrd(..), SOrd(..),-- Comparing, sComparing,-- -- | 'thenCmp' returns its second argument if its first is 'EQ'; otherwise,- -- it returns its first argument.- thenCmp, ThenCmp, sThenCmp,-- Sing, SOrdering(..), SDown(..), GetDown, sGetDown,-- -- ** Defunctionalization symbols- ThenCmpSym0, ThenCmpSym1, ThenCmpSym2,- LTSym0, EQSym0, GTSym0,- CompareSym0, CompareSym1, CompareSym2,- type (<@#@$), type (<@#@$$), type (<@#@$$$),- type (<=@#@$), type (<=@#@$$), type (<=@#@$$$),- type (>@#@$), type (>@#@$$), type (>@#@$$$),- type (>=@#@$), type (>=@#@$$), type (>=@#@$$$),- MaxSym0, MaxSym1, MaxSym2,- MinSym0, MinSym1, MinSym2,- ComparingSym0, ComparingSym1, ComparingSym2, ComparingSym3,- DownSym0, DownSym1,- GetDownSym0, GetDownSym1- ) where--import Data.Eq.Singletons-import Data.Ord (Down(..))-import Data.Singletons.Base.Instances-import Data.Singletons.Base.Util-import Data.Singletons.TH-import Language.Haskell.TH.Syntax (thenCmp)--$(singletonsOnly [d|- class (Eq a) => Ord a where- compare :: a -> a -> Ordering- (<), (<=), (>), (>=) :: a -> a -> Bool- infix 4 <=- infix 4 <- infix 4 >- infix 4 >=- max, min :: a -> a -> a-- compare x y = if x == y then EQ- -- NB: must be '<=' not '<' to validate the- -- above claim about the minimal things that- -- can be defined for an instance of Ord:- else if x <= y then LT- else GT-- x < y = case compare x y of { LT -> True; EQ -> False; GT -> False }- x <= y = case compare x y of { LT -> True; EQ -> True; GT -> False }- x > y = case compare x y of { LT -> False; EQ -> False; GT -> True }- x >= y = case compare x y of { LT -> False; EQ -> True; GT -> True }-- -- These two default methods use '<=' rather than 'compare'- -- because the latter is often more expensive- max x y = if x <= y then y else x- min x y = if x <= y then x else y- -- Not handled by TH: {-# MINIMAL compare | (<=) #-}-- -- -|- -- > comparing p x y = compare (p x) (p y)- --- -- Useful combinator for use in conjunction with the @xxxBy@ family- -- of functions from "Data.List", for example:- --- -- > ... sortBy (comparing fst) ...- comparing :: (Ord a) => (b -> a) -> b -> b -> Ordering- comparing p x y = compare (p x) (p y)-- thenCmp :: Ordering -> Ordering -> Ordering- thenCmp EQ x = x- thenCmp LT _ = LT- thenCmp GT _ = GT- |])--$(genSingletons [''Down])--$(singletonsOnly [d|- deriving instance Eq a => Eq (Down a)-- instance Ord a => Ord (Down a) where- compare (Down x) (Down y) = y `compare` x- |])--$(singOrdInstances basicTypes)+{-# LANGUAGE DataKinds #-} +{-# LANGUAGE DefaultSignatures #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE UndecidableInstances #-} +{-# OPTIONS_GHC -Wno-orphans #-} + +----------------------------------------------------------------------------- +-- | +-- Module : Data.Ord.Singletons +-- Copyright : (C) 2013 Richard Eisenberg +-- License : BSD-style (see LICENSE) +-- Maintainer : Ryan Scott +-- Stability : experimental +-- Portability : non-portable +-- +-- Defines the promoted version of Ord, 'POrd', and the singleton version, +-- 'SOrd'. +-- +----------------------------------------------------------------------------- + +module Data.Ord.Singletons ( + POrd(..), SOrd(..), + + Comparing, sComparing, + + Sing, SOrdering(..), SDown(..), GetDown, sGetDown, + + -- ** Defunctionalization symbols + LTSym0, EQSym0, GTSym0, + CompareSym0, CompareSym1, CompareSym2, + type (<@#@$), type (<@#@$$), type (<@#@$$$), + type (<=@#@$), type (<=@#@$$), type (<=@#@$$$), + type (>@#@$), type (>@#@$$), type (>@#@$$$), + type (>=@#@$), type (>=@#@$$), type (>=@#@$$$), + MaxSym0, MaxSym1, MaxSym2, + MinSym0, MinSym1, MinSym2, + ComparingSym0, ComparingSym1, ComparingSym2, ComparingSym3, + DownSym0, DownSym1, + GetDownSym0, GetDownSym1 + ) where + +import Data.Eq.Singletons +import Data.Ord (Down(..)) +import Data.Semigroup.Singletons.Internal.Classes +import Data.Singletons.Base.Instances +import Data.Singletons.Base.Util +import Data.Singletons.TH + +$(singletonsOnly [d| + class (Eq a) => Ord a where + compare :: a -> a -> Ordering + (<), (<=), (>), (>=) :: a -> a -> Bool + infix 4 <= + infix 4 < + infix 4 > + infix 4 >= + max, min :: a -> a -> a + + compare x y = if x == y then EQ + -- NB: must be '<=' not '<' to validate the + -- above claim about the minimal things that + -- can be defined for an instance of Ord: + else if x <= y then LT + else GT + + x < y = case compare x y of { LT -> True; EQ -> False; GT -> False } + x <= y = case compare x y of { LT -> True; EQ -> True; GT -> False } + x > y = case compare x y of { LT -> False; EQ -> False; GT -> True } + x >= y = case compare x y of { LT -> False; EQ -> True; GT -> True } + + -- These two default methods use '<=' rather than 'compare' + -- because the latter is often more expensive + max x y = if x <= y then y else x + min x y = if x <= y then x else y + -- Not handled by TH: {-# MINIMAL compare | (<=) #-} + + -- -| + -- > comparing p x y = compare (p x) (p y) + -- + -- Useful combinator for use in conjunction with the @xxxBy@ family + -- of functions from "Data.List", for example: + -- + -- > ... sortBy (comparing fst) ... + comparing :: (Ord a) => (b -> a) -> b -> b -> Ordering + comparing p x y = compare (p x) (p y) + |]) + +$(genSingletons [''Down]) + +$(singletonsOnly [d| + deriving instance Eq a => Eq (Down a) + + instance Ord a => Ord (Down a) where + compare (Down x) (Down y) = y `compare` x + + -- deriving newtype instance Semigroup a => Semigroup (Down a) + instance Semigroup a => Semigroup (Down a) where + Down a <> Down b = Down (a <> b) + |]) + +$(singOrdInstances basicTypes)
src/Data/Ord/Singletons/Disambiguation.hs view
@@ -1,33 +1,33 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE UndecidableInstances #-}---------------------------------------------------------------------------------- |--- Module : Data.Ord.Singletons.Disambiguation--- Copyright : (C) 2019 Ryan Scott--- License : BSD-style (see LICENSE)--- Maintainer : Ryan Scott--- Stability : experimental--- Portability : non-portable------ Provides aliases for 'Min' and 'Max' that do not clash with the data--- types of the same names in "Data.Semigroup.Singletons".----------------------------------------------------------------------------------module Data.Ord.Singletons.Disambiguation where--import Data.Ord.Singletons-import Data.Singletons.TH---- We need these in Data.Semigroup.Singletons, as we need to promote--- code that simultaneously uses the Min/Max constructors and the min/max--- functions, which have clashing defunctionalization symbol names. Our--- workaround is to simply define synonyms for min/max and use those instead.-$(singletons [d|- min_, max_ :: Ord a => a -> a -> a- min_ = min- max_ = max- |])+{-# LANGUAGE DataKinds #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE UndecidableInstances #-} + +----------------------------------------------------------------------------- +-- | +-- Module : Data.Ord.Singletons.Disambiguation +-- Copyright : (C) 2019 Ryan Scott +-- License : BSD-style (see LICENSE) +-- Maintainer : Ryan Scott +-- Stability : experimental +-- Portability : non-portable +-- +-- Provides aliases for 'Min' and 'Max' that do not clash with the data +-- types of the same names in "Data.Semigroup.Singletons". +-- +---------------------------------------------------------------------------- + +module Data.Ord.Singletons.Disambiguation where + +import Data.Ord.Singletons +import Data.Singletons.TH + +-- We need these in Data.Semigroup.Singletons, as we need to promote +-- code that simultaneously uses the Min/Max constructors and the min/max +-- functions, which have clashing defunctionalization symbol names. Our +-- workaround is to simply define synonyms for min/max and use those instead. +$(singletons [d| + min_, max_ :: Ord a => a -> a -> a + min_ = min + max_ = max + |])
src/Data/Proxy/Singletons.hs view
@@ -1,159 +1,159 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE UndecidableInstances #-}-{-# OPTIONS_GHC -Wno-orphans #-}---------------------------------------------------------------------------------- |--- Module : Data.Proxy.Singletons--- Copyright : (C) 2020 Ryan Scott--- License : BSD-style (see LICENSE)--- Maintainer : Richard Eisenberg (rae@cs.brynmawr.edu)--- Stability : experimental--- Portability : non-portable------ Exports promoted and singled versions of the definitions in "Data.Proxy".-----------------------------------------------------------------------------------module Data.Proxy.Singletons (- -- * The 'Proxy' singleton- Sing, SProxy(..)- , AsProxyTypeOf, sAsProxyTypeOf-- -- * Defunctionalization symbols- , ProxySym0- , AsProxyTypeOfSym0, AsProxyTypeOfSym1, AsProxyTypeOfSym2- ) where--import Control.Applicative-import Control.Monad-import Control.Monad.Singletons.Internal-import Data.Eq.Singletons-import Data.Kind-import Data.Monoid.Singletons-import Data.Ord.Singletons-import Data.Proxy-import Data.Semigroup (Semigroup(..))-import Data.Semigroup.Singletons.Internal-import Data.Singletons.Decide-import Data.Singletons-import Data.Singletons.Base.Enum-import Data.Singletons.Base.Instances-import Data.Singletons.TH-import Data.Type.Coercion-import Data.Type.Equality hiding (type (==))-import GHC.Base.Singletons-import GHC.Num.Singletons-import GHC.TypeLits.Singletons.Internal-import Text.Show.Singletons--{--In order to keep the type argument to Proxy poly-kinded and with an inferred-specificity, we define the singleton version of Proxy, as well as its-defunctionalization symbols, by hand. This is very much in the spirit of the-code in Data.Functor.Const.Singletons. (See the comments above SConst in that-module for more details on this choice.)--}-type SProxy :: Proxy t -> Type-data SProxy :: Proxy t -> Type where- SProxy :: forall t. SProxy ('Proxy @t)-type instance Sing = SProxy-instance SingKind (Proxy t) where- type Demote (Proxy t) = Proxy t- fromSing SProxy = Proxy- toSing Proxy = SomeSing SProxy-instance SingI 'Proxy where- sing = SProxy--type ProxySym0 :: Proxy t-type family ProxySym0 where- ProxySym0 = 'Proxy--instance SDecide (Proxy t) where- SProxy %~ SProxy = Proved Refl--instance TestEquality SProxy where- testEquality = decideEquality--instance TestCoercion SProxy where- testCoercion = decideCoercion--instance Show (SProxy z) where- showsPrec _ _ = showString "SProxy"--$(singletonsOnly [d|- deriving instance Bounded (Proxy s)-- -- It's common to use (undefined :: Proxy t) and (Proxy :: Proxy t)- -- interchangeably, so all of these instances are hand-written to be- -- lazy in Proxy arguments.-- instance Eq (Proxy s) where- _ == _ = True-- instance Ord (Proxy s) where- compare _ _ = EQ-- instance Show (Proxy s) where- showsPrec _ _ = showString "Proxy"-- instance Enum (Proxy s) where- succ _ = errorWithoutStackTrace "Proxy.succ"- pred _ = errorWithoutStackTrace "Proxy.pred"- fromEnum _ = 0- -- toEnum 0 = Proxy- -- toEnum _ = errorWithoutStackTrace "Proxy.toEnum: 0 expected"- toEnum n = if n == 0- then Proxy- else errorWithoutStackTrace "Proxy.toEnum: 0 expected"- -- enumFrom _ = [Proxy]- -- enumFromThen _ _ = [Proxy]- enumFromThenTo _ _ _ = [Proxy]- enumFromTo _ _ = [Proxy]-- instance Semigroup (Proxy s) where- _ <> _ = Proxy- sconcat _ = Proxy- -- stimes _ _ = Proxy-- instance Monoid (Proxy s) where- mempty = Proxy- mconcat _ = Proxy-- instance Functor Proxy where- fmap _ _ = Proxy-- instance Applicative Proxy where- pure _ = Proxy- _ <*> _ = Proxy-- instance Alternative Proxy where- empty = Proxy- _ <|> _ = Proxy-- instance Monad Proxy where- _ >>= _ = Proxy-- instance MonadPlus Proxy-- -- -| 'asProxyTypeOf' is a type-restricted version of 'const'.- -- It is usually used as an infix operator, and its typing forces its first- -- argument (which is usually overloaded) to have the same type as the tag- -- of the second.- --- -- >>> import Data.Word- -- >>> :type asProxyTypeOf 123 (Proxy :: Proxy Word8)- -- asProxyTypeOf 123 (Proxy :: Proxy Word8) :: Word8- --- -- Note the lower-case @proxy@ in the definition. This allows any type- -- constructor with just one argument to be passed to the function, for example- -- we could also write- --- -- >>> import Data.Word- -- >>> :type asProxyTypeOf 123 (Just (undefined :: Word8))- -- asProxyTypeOf 123 (Just (undefined :: Word8)) :: Word8- asProxyTypeOf :: a -> proxy a -> a- asProxyTypeOf = const- |])+{-# LANGUAGE DataKinds #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE UndecidableInstances #-} +{-# OPTIONS_GHC -Wno-orphans #-} + +----------------------------------------------------------------------------- +-- | +-- Module : Data.Proxy.Singletons +-- Copyright : (C) 2020 Ryan Scott +-- License : BSD-style (see LICENSE) +-- Maintainer : Richard Eisenberg (rae@cs.brynmawr.edu) +-- Stability : experimental +-- Portability : non-portable +-- +-- Exports promoted and singled versions of the definitions in "Data.Proxy". +-- +----------------------------------------------------------------------------- + +module Data.Proxy.Singletons ( + -- * The 'Proxy' singleton + Sing, SProxy(..) + , AsProxyTypeOf, sAsProxyTypeOf + + -- * Defunctionalization symbols + , ProxySym0 + , AsProxyTypeOfSym0, AsProxyTypeOfSym1, AsProxyTypeOfSym2 + ) where + +import Control.Applicative +import Control.Monad +import Control.Monad.Singletons.Internal +import Data.Eq.Singletons +import Data.Kind +import Data.Monoid.Singletons +import Data.Ord.Singletons +import Data.Proxy +import Data.Semigroup (Semigroup(..)) +import Data.Semigroup.Singletons.Internal.Classes +import Data.Singletons.Decide +import Data.Singletons +import Data.Singletons.Base.Enum +import Data.Singletons.Base.Instances +import Data.Singletons.TH +import Data.Type.Coercion +import Data.Type.Equality hiding (type (==)) +import GHC.Base.Singletons +import GHC.Num.Singletons +import GHC.TypeLits.Singletons.Internal +import Text.Show.Singletons + +{- +In order to keep the type argument to Proxy poly-kinded and with an inferred +specificity, we define the singleton version of Proxy, as well as its +defunctionalization symbols, by hand. This is very much in the spirit of the +code in Data.Functor.Const.Singletons. (See the comments above SConst in that +module for more details on this choice.) +-} +type SProxy :: Proxy t -> Type +data SProxy :: Proxy t -> Type where + SProxy :: forall t. SProxy ('Proxy @t) +type instance Sing = SProxy +instance SingKind (Proxy t) where + type Demote (Proxy t) = Proxy t + fromSing SProxy = Proxy + toSing Proxy = SomeSing SProxy +instance SingI 'Proxy where + sing = SProxy + +type ProxySym0 :: Proxy t +type family ProxySym0 where + ProxySym0 = 'Proxy + +instance SDecide (Proxy t) where + SProxy %~ SProxy = Proved Refl + +instance TestEquality SProxy where + testEquality = decideEquality + +instance TestCoercion SProxy where + testCoercion = decideCoercion + +instance Show (SProxy z) where + showsPrec _ _ = showString "SProxy" + +$(singletonsOnly [d| + deriving instance Bounded (Proxy s) + + -- It's common to use (undefined :: Proxy t) and (Proxy :: Proxy t) + -- interchangeably, so all of these instances are hand-written to be + -- lazy in Proxy arguments. + + instance Eq (Proxy s) where + _ == _ = True + + instance Ord (Proxy s) where + compare _ _ = EQ + + instance Show (Proxy s) where + showsPrec _ _ = showString "Proxy" + + instance Enum (Proxy s) where + succ _ = errorWithoutStackTrace "Proxy.succ" + pred _ = errorWithoutStackTrace "Proxy.pred" + fromEnum _ = 0 + -- toEnum 0 = Proxy + -- toEnum _ = errorWithoutStackTrace "Proxy.toEnum: 0 expected" + toEnum n = if n == 0 + then Proxy + else errorWithoutStackTrace "Proxy.toEnum: 0 expected" + -- enumFrom _ = [Proxy] + -- enumFromThen _ _ = [Proxy] + enumFromThenTo _ _ _ = [Proxy] + enumFromTo _ _ = [Proxy] + + instance Semigroup (Proxy s) where + _ <> _ = Proxy + sconcat _ = Proxy + -- stimes _ _ = Proxy + + instance Monoid (Proxy s) where + mempty = Proxy + mconcat _ = Proxy + + instance Functor Proxy where + fmap _ _ = Proxy + + instance Applicative Proxy where + pure _ = Proxy + _ <*> _ = Proxy + + instance Alternative Proxy where + empty = Proxy + _ <|> _ = Proxy + + instance Monad Proxy where + _ >>= _ = Proxy + + instance MonadPlus Proxy + + -- -| 'asProxyTypeOf' is a type-restricted version of 'const'. + -- It is usually used as an infix operator, and its typing forces its first + -- argument (which is usually overloaded) to have the same type as the tag + -- of the second. + -- + -- >>> import Data.Word + -- >>> :type asProxyTypeOf 123 (Proxy :: Proxy Word8) + -- asProxyTypeOf 123 (Proxy :: Proxy Word8) :: Word8 + -- + -- Note the lower-case @proxy@ in the definition. This allows any type + -- constructor with just one argument to be passed to the function, for example + -- we could also write + -- + -- >>> import Data.Word + -- >>> :type asProxyTypeOf 123 (Just (undefined :: Word8)) + -- asProxyTypeOf 123 (Just (undefined :: Word8)) :: Word8 + asProxyTypeOf :: a -> proxy a -> a + asProxyTypeOf = const + |])
src/Data/Semigroup/Singletons.hs view
@@ -1,247 +1,247 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE NoNamedWildCards #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE UndecidableInstances #-}-{-# OPTIONS_GHC -Wno-orphans #-}---------------------------------------------------------------------------------- |--- Module : Data.Semigroup.Singletons--- Copyright : (C) 2018 Ryan Scott--- License : BSD-style (see LICENSE)--- Maintainer : Ryan Scott--- Stability : experimental--- Portability : non-portable------ Defines the promoted version of 'Semigroup', 'PSemigroup', and the--- singleton version, 'SSemigroup'.----------------------------------------------------------------------------------module Data.Semigroup.Singletons (- PSemigroup(..), SSemigroup(..),-- Sing, SMin(..), SMax(..), SFirst(..), SLast(..),- SWrappedMonoid(..), SDual(..), SAll(..), SAny(..),- SSum(..), SProduct(..), SArg(..),- GetMin, GetMax, GetFirst, GetLast, UnwrapMonoid, GetDual,- GetAll, GetAny, GetSum, GetProduct,- sGetMin, sGetMax, sGetFirst, sGetLast, sUnwrapMonoid, sGetDual,- sGetAll, sGetAny, sGetSum, sGetProduct,-- -- ** Defunctionalization symbols- type (<>@#@$), type (<>@#@$$), type (<>@#@$$$),- SconcatSym0, SconcatSym1,- MinSym0, MinSym1, GetMinSym0, GetMinSym1,- MaxSym0, MaxSym1, GetMaxSym0, GetMaxSym1,- FirstSym0, FirstSym1, GetFirstSym0, GetFirstSym1,- LastSym0, LastSym1, GetLastSym0, GetLastSym1,- WrapMonoidSym0, WrapMonoidSym1, UnwrapMonoidSym0, UnwrapMonoidSym1,- DualSym0, DualSym1, GetDualSym0, GetDualSym1,- AllSym0, AllSym1, GetAllSym0, GetAllSym1,- AnySym0, AnySym1, GetAnySym0, GetAnySym1,- SumSym0, SumSym1, GetSumSym0, GetSumSym1,- ProductSym0, ProductSym1, GetProductSym0, GetProductSym1,- ArgSym0, ArgSym1, ArgSym2- ) where--import Control.Applicative-import Control.Monad.Singletons.Internal-import Data.Eq.Singletons-import Data.Foldable.Singletons hiding- ( All, AllSym0, AllSym1- , Any, AnySym0, AnySym1- , Product, ProductSym0, ProductSym1- , Sum, SumSym0, SumSym1 )-import Data.Monoid.Singletons hiding- (SFirst(..), SLast(..),- FirstSym0, FirstSym1, LastSym0, LastSym1,- GetFirst, sGetFirst, GetFirstSym0, GetFirstSym1,- GetLast, sGetLast, GetLastSym0, GetLastSym1)-import Data.Ord.Singletons hiding- (MinSym0, MinSym1, MaxSym0, MaxSym1)-import Data.Ord.Singletons.Disambiguation-import qualified Data.Semigroup as Semi (Min(..), Max(..))-import Data.Semigroup (First(..), Last(..), WrappedMonoid(..), Arg(..))-import Data.Semigroup.Singletons.Internal-import Data.Singletons.Base.Enum-import Data.Singletons.Base.Instances-import Data.Singletons.Base.Util-import Data.Singletons.TH-import Data.Traversable.Singletons-import GHC.Base.Singletons hiding- (Foldr, FoldrSym0, FoldrSym1, FoldrSym2, FoldrSym3, sFoldr)-import GHC.Num.Singletons-import Text.Show.Singletons--$(genSingletons [''Arg])-$(showSingInstances semigroupBasicTypes)-$(singShowInstances semigroupBasicTypes)--$(singletonsOnly [d|- instance Applicative Semi.Min where- pure = Semi.Min- a <* _ = a- _ *> a = a- Semi.Min f <*> Semi.Min x = Semi.Min (f x)- liftA2 f (Semi.Min a) (Semi.Min b) = Semi.Min (f a b)-- instance Enum a => Enum (Semi.Min a) where- succ (Semi.Min a) = Semi.Min (succ a)- pred (Semi.Min a) = Semi.Min (pred a)- toEnum = Semi.Min . toEnum- fromEnum (Semi.Min a) = fromEnum a- enumFromTo (Semi.Min a) (Semi.Min b) = Semi.Min `map` enumFromTo a b- enumFromThenTo (Semi.Min a) (Semi.Min b) (Semi.Min c) = Semi.Min `map` enumFromThenTo a b c-- deriving instance Functor Semi.Min-- instance Monad Semi.Min where- (>>) = (*>)- Semi.Min a >>= f = f a-- instance Ord a => Semigroup (Semi.Min a) where- Semi.Min a <> Semi.Min b = Semi.Min (a `min_` b)-- instance (Ord a, Bounded a) => Monoid (Semi.Min a) where- mempty = maxBound-- instance Num a => Num (Semi.Min a) where- (Semi.Min a) + (Semi.Min b) = Semi.Min (a + b)- (Semi.Min a) * (Semi.Min b) = Semi.Min (a * b)- (Semi.Min a) - (Semi.Min b) = Semi.Min (a - b)- negate (Semi.Min a) = Semi.Min (negate a)- abs (Semi.Min a) = Semi.Min (abs a)- signum (Semi.Min a) = Semi.Min (signum a)- fromInteger = Semi.Min . fromInteger-- deriving instance Foldable Semi.Min- deriving instance Traversable Semi.Min-- instance Applicative Semi.Max where- pure = Semi.Max- a <* _ = a- _ *> a = a- Semi.Max f <*> Semi.Max x = Semi.Max (f x)- liftA2 f (Semi.Max a) (Semi.Max b) = Semi.Max (f a b)-- instance Enum a => Enum (Semi.Max a) where- succ (Semi.Max a) = Semi.Max (succ a)- pred (Semi.Max a) = Semi.Max (pred a)- toEnum = Semi.Max . toEnum- fromEnum (Semi.Max a) = fromEnum a- enumFromTo (Semi.Max a) (Semi.Max b) = Semi.Max `map` enumFromTo a b- enumFromThenTo (Semi.Max a) (Semi.Max b) (Semi.Max c) = Semi.Max `map` enumFromThenTo a b c-- deriving instance Functor Semi.Max-- instance Monad Semi.Max where- (>>) = (*>)- Semi.Max a >>= f = f a-- instance Ord a => Semigroup (Semi.Max a) where- Semi.Max a <> Semi.Max b = Semi.Max (a `max_` b)-- instance (Ord a, Bounded a) => Monoid (Semi.Max a) where- mempty = minBound-- instance Num a => Num (Semi.Max a) where- (Semi.Max a) + (Semi.Max b) = Semi.Max (a + b)- (Semi.Max a) * (Semi.Max b) = Semi.Max (a * b)- (Semi.Max a) - (Semi.Max b) = Semi.Max (a - b)- negate (Semi.Max a) = Semi.Max (negate a)- abs (Semi.Max a) = Semi.Max (abs a)- signum (Semi.Max a) = Semi.Max (signum a)- fromInteger = Semi.Max . fromInteger-- deriving instance Foldable Semi.Max- deriving instance Traversable Semi.Max-- instance Eq a => Eq (Arg a b) where- Arg a _ == Arg b _ = a == b-- deriving instance Functor (Arg a)-- instance Ord a => Ord (Arg a b) where- Arg a _ `compare` Arg b _ = compare a b- min x@(Arg a _) y@(Arg b _)- | a <= b = x- | otherwise = y- max x@(Arg a _) y@(Arg b _)- | a >= b = x- | otherwise = y-- deriving instance (Show a, Show b) => Show (Arg a b)- deriving instance Foldable (Arg a)- deriving instance Traversable (Arg a)-- instance Applicative First where- pure x = First x- a <* _ = a- _ *> a = a- First f <*> First x = First (f x)- liftA2 f (First a) (First b) = First (f a b)-- instance Enum a => Enum (First a) where- succ (First a) = First (succ a)- pred (First a) = First (pred a)- toEnum = First . toEnum- fromEnum (First a) = fromEnum a- enumFromTo (First a) (First b) = First `map` enumFromTo a b- enumFromThenTo (First a) (First b) (First c) = First `map` enumFromThenTo a b c-- deriving instance Functor First-- instance Monad First where- (>>) = (*>)- First a >>= f = f a-- instance Semigroup (First a) where- a <> _ = a-- deriving instance Foldable First- deriving instance Traversable First-- instance Applicative Last where- pure x = Last x- a <* _ = a- _ *> a = a- Last f <*> Last x = Last (f x)- liftA2 f (Last a) (Last b) = Last (f a b)-- instance Enum a => Enum (Last a) where- succ (Last a) = Last (succ a)- pred (Last a) = Last (pred a)- toEnum = Last . toEnum- fromEnum (Last a) = fromEnum a- enumFromTo (Last a) (Last b) = Last `map` enumFromTo a b- enumFromThenTo (Last a) (Last b) (Last c) = Last `map` enumFromThenTo a b c-- deriving instance Functor Last-- instance Monad Last where- (>>) = (*>)- Last a >>= f = f a-- instance Semigroup (Last a) where- _ <> b = b-- deriving instance Foldable Last- deriving instance Traversable Last-- instance Monoid m => Semigroup (WrappedMonoid m) where- WrapMonoid a <> WrapMonoid b = WrapMonoid (a `mappend` b)-- instance Monoid m => Monoid (WrappedMonoid m) where- mempty = WrapMonoid mempty-- instance Enum a => Enum (WrappedMonoid a) where- succ (WrapMonoid a) = WrapMonoid (succ a)- pred (WrapMonoid a) = WrapMonoid (pred a)- toEnum = WrapMonoid . toEnum- fromEnum (WrapMonoid a) = fromEnum a- enumFromTo (WrapMonoid a) (WrapMonoid b) = WrapMonoid `map` enumFromTo a b- enumFromThenTo (WrapMonoid a) (WrapMonoid b) (WrapMonoid c) =- WrapMonoid `map` enumFromThenTo a b c- |])+{-# LANGUAGE DataKinds #-} +{-# LANGUAGE NoNamedWildCards #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE UndecidableInstances #-} +{-# OPTIONS_GHC -Wno-orphans #-} + +----------------------------------------------------------------------------- +-- | +-- Module : Data.Semigroup.Singletons +-- Copyright : (C) 2018 Ryan Scott +-- License : BSD-style (see LICENSE) +-- Maintainer : Ryan Scott +-- Stability : experimental +-- Portability : non-portable +-- +-- Defines the promoted version of 'Semigroup', 'PSemigroup', and the +-- singleton version, 'SSemigroup'. +-- +---------------------------------------------------------------------------- + +module Data.Semigroup.Singletons ( + PSemigroup(..), SSemigroup(..), + + Sing, SMin(..), SMax(..), SFirst(..), SLast(..), + SWrappedMonoid(..), SDual(..), SAll(..), SAny(..), + SSum(..), SProduct(..), SArg(..), + GetMin, GetMax, GetFirst, GetLast, UnwrapMonoid, GetDual, + GetAll, GetAny, GetSum, GetProduct, + sGetMin, sGetMax, sGetFirst, sGetLast, sUnwrapMonoid, sGetDual, + sGetAll, sGetAny, sGetSum, sGetProduct, + + -- ** Defunctionalization symbols + type (<>@#@$), type (<>@#@$$), type (<>@#@$$$), + SconcatSym0, SconcatSym1, + MinSym0, MinSym1, GetMinSym0, GetMinSym1, + MaxSym0, MaxSym1, GetMaxSym0, GetMaxSym1, + FirstSym0, FirstSym1, GetFirstSym0, GetFirstSym1, + LastSym0, LastSym1, GetLastSym0, GetLastSym1, + WrapMonoidSym0, WrapMonoidSym1, UnwrapMonoidSym0, UnwrapMonoidSym1, + DualSym0, DualSym1, GetDualSym0, GetDualSym1, + AllSym0, AllSym1, GetAllSym0, GetAllSym1, + AnySym0, AnySym1, GetAnySym0, GetAnySym1, + SumSym0, SumSym1, GetSumSym0, GetSumSym1, + ProductSym0, ProductSym1, GetProductSym0, GetProductSym1, + ArgSym0, ArgSym1, ArgSym2 + ) where + +import Control.Monad.Singletons.Internal +import Data.Eq.Singletons +import Data.Foldable.Singletons hiding + ( All, AllSym0, AllSym1 + , Any, AnySym0, AnySym1 + , Product, ProductSym0, ProductSym1 + , Sum, SumSym0, SumSym1 ) +import Data.Monoid.Singletons hiding + (SFirst(..), SLast(..), + FirstSym0, FirstSym1, LastSym0, LastSym1, + GetFirst, sGetFirst, GetFirstSym0, GetFirstSym1, + GetLast, sGetLast, GetLastSym0, GetLastSym1) +import Data.Ord.Singletons hiding + (MinSym0, MinSym1, MaxSym0, MaxSym1) +import Data.Ord.Singletons.Disambiguation +import qualified Data.Semigroup as Semi (Min(..), Max(..)) +import Data.Semigroup (First(..), Last(..), WrappedMonoid(..), Arg(..)) +import Data.Semigroup.Singletons.Internal.Classes +import Data.Semigroup.Singletons.Internal.Wrappers +import Data.Singletons.Base.Enum +import Data.Singletons.Base.Instances +import Data.Singletons.Base.Util +import Data.Singletons.TH +import Data.Traversable.Singletons +import GHC.Base.Singletons hiding + (Foldr, FoldrSym0, FoldrSym1, FoldrSym2, FoldrSym3, sFoldr) +import GHC.Num.Singletons +import Text.Show.Singletons + +$(genSingletons [''Arg]) +$(showSingInstances semigroupBasicTypes) +$(singShowInstances semigroupBasicTypes) + +$(singletonsOnly [d| + instance Applicative Semi.Min where + pure = Semi.Min + a <* _ = a + _ *> a = a + Semi.Min f <*> Semi.Min x = Semi.Min (f x) + liftA2 f (Semi.Min a) (Semi.Min b) = Semi.Min (f a b) + + instance Enum a => Enum (Semi.Min a) where + succ (Semi.Min a) = Semi.Min (succ a) + pred (Semi.Min a) = Semi.Min (pred a) + toEnum = Semi.Min . toEnum + fromEnum (Semi.Min a) = fromEnum a + enumFromTo (Semi.Min a) (Semi.Min b) = Semi.Min `map` enumFromTo a b + enumFromThenTo (Semi.Min a) (Semi.Min b) (Semi.Min c) = Semi.Min `map` enumFromThenTo a b c + + deriving instance Functor Semi.Min + + instance Monad Semi.Min where + (>>) = (*>) + Semi.Min a >>= f = f a + + instance Ord a => Semigroup (Semi.Min a) where + Semi.Min a <> Semi.Min b = Semi.Min (a `min_` b) + + instance (Ord a, Bounded a) => Monoid (Semi.Min a) where + mempty = maxBound + + instance Num a => Num (Semi.Min a) where + (Semi.Min a) + (Semi.Min b) = Semi.Min (a + b) + (Semi.Min a) * (Semi.Min b) = Semi.Min (a * b) + (Semi.Min a) - (Semi.Min b) = Semi.Min (a - b) + negate (Semi.Min a) = Semi.Min (negate a) + abs (Semi.Min a) = Semi.Min (abs a) + signum (Semi.Min a) = Semi.Min (signum a) + fromInteger = Semi.Min . fromInteger + + deriving instance Foldable Semi.Min + deriving instance Traversable Semi.Min + + instance Applicative Semi.Max where + pure = Semi.Max + a <* _ = a + _ *> a = a + Semi.Max f <*> Semi.Max x = Semi.Max (f x) + liftA2 f (Semi.Max a) (Semi.Max b) = Semi.Max (f a b) + + instance Enum a => Enum (Semi.Max a) where + succ (Semi.Max a) = Semi.Max (succ a) + pred (Semi.Max a) = Semi.Max (pred a) + toEnum = Semi.Max . toEnum + fromEnum (Semi.Max a) = fromEnum a + enumFromTo (Semi.Max a) (Semi.Max b) = Semi.Max `map` enumFromTo a b + enumFromThenTo (Semi.Max a) (Semi.Max b) (Semi.Max c) = Semi.Max `map` enumFromThenTo a b c + + deriving instance Functor Semi.Max + + instance Monad Semi.Max where + (>>) = (*>) + Semi.Max a >>= f = f a + + instance Ord a => Semigroup (Semi.Max a) where + Semi.Max a <> Semi.Max b = Semi.Max (a `max_` b) + + instance (Ord a, Bounded a) => Monoid (Semi.Max a) where + mempty = minBound + + instance Num a => Num (Semi.Max a) where + (Semi.Max a) + (Semi.Max b) = Semi.Max (a + b) + (Semi.Max a) * (Semi.Max b) = Semi.Max (a * b) + (Semi.Max a) - (Semi.Max b) = Semi.Max (a - b) + negate (Semi.Max a) = Semi.Max (negate a) + abs (Semi.Max a) = Semi.Max (abs a) + signum (Semi.Max a) = Semi.Max (signum a) + fromInteger = Semi.Max . fromInteger + + deriving instance Foldable Semi.Max + deriving instance Traversable Semi.Max + + instance Eq a => Eq (Arg a b) where + Arg a _ == Arg b _ = a == b + + deriving instance Functor (Arg a) + + instance Ord a => Ord (Arg a b) where + Arg a _ `compare` Arg b _ = compare a b + min x@(Arg a _) y@(Arg b _) + | a <= b = x + | otherwise = y + max x@(Arg a _) y@(Arg b _) + | a >= b = x + | otherwise = y + + deriving instance (Show a, Show b) => Show (Arg a b) + deriving instance Foldable (Arg a) + deriving instance Traversable (Arg a) + + instance Applicative First where + pure x = First x + a <* _ = a + _ *> a = a + First f <*> First x = First (f x) + liftA2 f (First a) (First b) = First (f a b) + + instance Enum a => Enum (First a) where + succ (First a) = First (succ a) + pred (First a) = First (pred a) + toEnum = First . toEnum + fromEnum (First a) = fromEnum a + enumFromTo (First a) (First b) = First `map` enumFromTo a b + enumFromThenTo (First a) (First b) (First c) = First `map` enumFromThenTo a b c + + deriving instance Functor First + + instance Monad First where + (>>) = (*>) + First a >>= f = f a + + instance Semigroup (First a) where + a <> _ = a + + deriving instance Foldable First + deriving instance Traversable First + + instance Applicative Last where + pure x = Last x + a <* _ = a + _ *> a = a + Last f <*> Last x = Last (f x) + liftA2 f (Last a) (Last b) = Last (f a b) + + instance Enum a => Enum (Last a) where + succ (Last a) = Last (succ a) + pred (Last a) = Last (pred a) + toEnum = Last . toEnum + fromEnum (Last a) = fromEnum a + enumFromTo (Last a) (Last b) = Last `map` enumFromTo a b + enumFromThenTo (Last a) (Last b) (Last c) = Last `map` enumFromThenTo a b c + + deriving instance Functor Last + + instance Monad Last where + (>>) = (*>) + Last a >>= f = f a + + instance Semigroup (Last a) where + _ <> b = b + + deriving instance Foldable Last + deriving instance Traversable Last + + instance Monoid m => Semigroup (WrappedMonoid m) where + WrapMonoid a <> WrapMonoid b = WrapMonoid (a `mappend` b) + + instance Monoid m => Monoid (WrappedMonoid m) where + mempty = WrapMonoid mempty + + instance Enum a => Enum (WrappedMonoid a) where + succ (WrapMonoid a) = WrapMonoid (succ a) + pred (WrapMonoid a) = WrapMonoid (pred a) + toEnum = WrapMonoid . toEnum + fromEnum (WrapMonoid a) = fromEnum a + enumFromTo (WrapMonoid a) (WrapMonoid b) = WrapMonoid `map` enumFromTo a b + enumFromThenTo (WrapMonoid a) (WrapMonoid b) (WrapMonoid c) = + WrapMonoid `map` enumFromThenTo a b c + |])
− src/Data/Semigroup/Singletons/Internal.hs
@@ -1,219 +0,0 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE DefaultSignatures #-}-{-# LANGUAGE NoNamedWildCards #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE UndecidableInstances #-}-{-# OPTIONS_GHC -Wno-orphans #-}---------------------------------------------------------------------------------- |--- Module : Data.Semigroup.Singletons.Internal--- Copyright : (C) 2018 Ryan Scott--- License : BSD-style (see LICENSE)--- Maintainer : Ryan Scott--- Stability : experimental--- Portability : non-portable------ Defines the promoted version of 'Semigroup', 'PSemigroup'; the--- singleton version, 'SSemigroup'; and some @newtype@ wrappers, all--- of which are reexported from the "Data.Semigroup" module or--- imported directly by some other modules.------ This module exists to avoid import cycles with--- "Data.Monoid.Singletons".----------------------------------------------------------------------------------module Data.Semigroup.Singletons.Internal where--import Control.Monad.Singletons.Internal-import Data.Bool.Singletons-import Data.Eq.Singletons-import Data.List.NonEmpty (NonEmpty(..))-import Data.Ord (Down(..))-import Data.Ord.Singletons hiding (MinSym0, MinSym1, MaxSym0, MaxSym1)-import Data.Proxy-import Data.Semigroup (Dual(..), All(..), Any(..), Sum(..), Product(..))-import Data.Singletons-import Data.Singletons.Base.Enum-import Data.Singletons.Base.Instances-import Data.Singletons.Base.Util-import Data.Singletons.TH-import qualified Data.Text as T-import GHC.Base.Singletons-import GHC.Num.Singletons-import GHC.TypeLits (AppendSymbol, SomeSymbol(..), someSymbolVal)-import GHC.TypeLits.Singletons.Internal-import Unsafe.Coerce--$(singletonsOnly [d|- -- -| The class of semigroups (types with an associative binary operation).- --- -- Instances should satisfy the associativity law:- --- -- * @x '<>' (y '<>' z) = (x '<>' y) '<>' z@- class Semigroup a where- -- -| An associative operation.- (<>) :: a -> a -> a- infixr 6 <>-- -- -| Reduce a non-empty list with @\<\>@- --- -- The default definition should be sufficient, but this can be- -- overridden for efficiency.- --- sconcat :: NonEmpty a -> a- sconcat (a :| as) = go a as where- go :: a -> [a] -> a- go b (c:cs) = b <> go c cs- go b [] = b-- {-- Can't single 'stimes', since there's no singled 'Integral' class.-- -- -| Repeat a value @n@ times.- --- -- Given that this works on a 'Semigroup' it is allowed to fail if- -- you request 0 or fewer repetitions, and the default definition- -- will do so.- --- -- By making this a member of the class, idempotent semigroups- -- and monoids can upgrade this to execute in /O(1)/ by- -- picking @stimes = 'stimesIdempotent'@ or @stimes =- -- 'stimesIdempotentMonoid'@ respectively.- stimes :: Integral b => b -> a -> a- stimes = stimesDefault- -}--- instance Semigroup [a] where- (<>) = (++)-- instance Semigroup (NonEmpty a) where- (a :| as) <> (b :| bs) = a :| (as ++ b : bs)-- instance Semigroup b => Semigroup (a -> b) where- f <> g = \x -> f x <> g x-- instance Semigroup () where- _ <> _ = ()- sconcat _ = ()-- instance (Semigroup a, Semigroup b) => Semigroup (a, b) where- (a,b) <> (a',b') = (a<>a',b<>b')-- instance (Semigroup a, Semigroup b, Semigroup c) => Semigroup (a, b, c) where- (a,b,c) <> (a',b',c') = (a<>a',b<>b',c<>c')-- instance (Semigroup a, Semigroup b, Semigroup c, Semigroup d)- => Semigroup (a, b, c, d) where- (a,b,c,d) <> (a',b',c',d') = (a<>a',b<>b',c<>c',d<>d')-- instance (Semigroup a, Semigroup b, Semigroup c, Semigroup d, Semigroup e)- => Semigroup (a, b, c, d, e) where- (a,b,c,d,e) <> (a',b',c',d',e') = (a<>a',b<>b',c<>c',d<>d',e<>e')-- instance Semigroup Ordering where- LT <> _ = LT- EQ <> y = y- GT <> _ = GT-- instance Semigroup a => Semigroup (Maybe a) where- Nothing <> b = b- a <> Nothing = a- Just a <> Just b = Just (a <> b)-- instance Semigroup (Either a b) where- Left _ <> b = b- -- a <> _ = a- a@Right{} <> _ = a-- instance Semigroup Void where- a <> _ = a-- -- deriving newtype instance Semigroup a => Semigroup (Down a)- instance Semigroup a => Semigroup (Down a) where- Down a <> Down b = Down (a <> b)- |])--$(genSingletons semigroupBasicTypes)-$(singBoundedInstances semigroupBasicTypes)-$(singEqInstances semigroupBasicTypes)-$(singDecideInstances semigroupBasicTypes)-$(singOrdInstances semigroupBasicTypes)--$(singletonsOnly [d|- instance Applicative Dual where- pure = Dual- Dual f <*> Dual x = Dual (f x)-- deriving instance Functor Dual-- instance Monad Dual where- Dual a >>= k = k a-- instance Semigroup a => Semigroup (Dual a) where- Dual a <> Dual b = Dual (b <> a)-- instance Semigroup All where- All a <> All b = All (a && b)-- instance Semigroup Any where- Any a <> Any b = Any (a || b)-- instance Applicative Sum where- pure = Sum- Sum f <*> Sum x = Sum (f x)-- deriving instance Functor Sum-- instance Monad Sum where- Sum a >>= k = k a-- instance Num a => Semigroup (Sum a) where- Sum a <> Sum b = Sum (a + b)-- -- deriving newtype instance Num a => Num (Sum a)- instance Num a => Num (Sum a) where- Sum a + Sum b = Sum (a + b)- Sum a - Sum b = Sum (a - b)- Sum a * Sum b = Sum (a * b)- negate (Sum a) = Sum (negate a)- abs (Sum a) = Sum (abs a)- signum (Sum a) = Sum (signum a)- fromInteger n = Sum (fromInteger n)-- instance Applicative Product where- pure = Product- Product f <*> Product x = Product (f x)-- deriving instance Functor Product-- instance Monad Product where- Product a >>= k = k a-- instance Num a => Semigroup (Product a) where- Product a <> Product b = Product (a * b)-- -- deriving newtype instance Num a => Num (Product a)- instance Num a => Num (Product a) where- Product a + Product b = Product (a + b)- Product a - Product b = Product (a - b)- Product a * Product b = Product (a * b)- negate (Product a) = Product (negate a)- abs (Product a) = Product (abs a)- signum (Product a) = Product (signum a)- fromInteger n = Product (fromInteger n)- |])--instance PSemigroup Symbol where- type a <> b = AppendSymbol a b--instance SSemigroup Symbol where- sa %<> sb =- let a = fromSing sa- b = fromSing sb- ex = someSymbolVal $ T.unpack $ a <> b- in case ex of- SomeSymbol (_ :: Proxy ab) -> unsafeCoerce (SSym :: Sing ab)
+ src/Data/Semigroup/Singletons/Internal/Classes.hs view
@@ -0,0 +1,117 @@+{-# LANGUAGE DataKinds #-} +{-# LANGUAGE DefaultSignatures #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE UndecidableInstances #-} + +----------------------------------------------------------------------------- +-- | +-- Module : Data.Semigroup.Singletons.Internal.Classes +-- Copyright : (C) 2018 Ryan Scott +-- License : BSD-style (see LICENSE) +-- Maintainer : Ryan Scott +-- Stability : experimental +-- Portability : non-portable +-- +-- Defines the promoted version of 'Semigroup', 'PSemigroup'; the +-- singleton version, 'SSemigroup'; and instances thereof for various data +-- types in @base@. These are reexported from the "Data.Semigroup" module or +-- imported directly by some other modules. +-- +-- This module exists to avoid import cycles with +-- "Data.Ord.Singletons". +-- +---------------------------------------------------------------------------- + +module Data.Semigroup.Singletons.Internal.Classes where + +import Data.List.NonEmpty (NonEmpty(..)) +import Data.Singletons.Base.Instances +import Data.Singletons.TH +import GHC.Base.Singletons + +$(singletonsOnly [d| + -- -| The class of semigroups (types with an associative binary operation). + -- + -- Instances should satisfy the associativity law: + -- + -- * @x '<>' (y '<>' z) = (x '<>' y) '<>' z@ + class Semigroup a where + -- -| An associative operation. + (<>) :: a -> a -> a + infixr 6 <> + + -- -| Reduce a non-empty list with @\<\>@ + -- + -- The default definition should be sufficient, but this can be + -- overridden for efficiency. + -- + sconcat :: NonEmpty a -> a + sconcat (a :| as) = go a as where + go :: a -> [a] -> a + go b (c:cs) = b <> go c cs + go b [] = b + + {- + Can't single 'stimes', since there's no singled 'Integral' class. + + -- -| Repeat a value @n@ times. + -- + -- Given that this works on a 'Semigroup' it is allowed to fail if + -- you request 0 or fewer repetitions, and the default definition + -- will do so. + -- + -- By making this a member of the class, idempotent semigroups + -- and monoids can upgrade this to execute in /O(1)/ by + -- picking @stimes = 'stimesIdempotent'@ or @stimes = + -- 'stimesIdempotentMonoid'@ respectively. + stimes :: Integral b => b -> a -> a + stimes = stimesDefault + -} + + + instance Semigroup [a] where + (<>) = (++) + + instance Semigroup (NonEmpty a) where + (a :| as) <> (b :| bs) = a :| (as ++ b : bs) + + instance Semigroup b => Semigroup (a -> b) where + f <> g = \x -> f x <> g x + + instance Semigroup () where + _ <> _ = () + sconcat _ = () + + instance (Semigroup a, Semigroup b) => Semigroup (a, b) where + (a,b) <> (a',b') = (a<>a',b<>b') + + instance (Semigroup a, Semigroup b, Semigroup c) => Semigroup (a, b, c) where + (a,b,c) <> (a',b',c') = (a<>a',b<>b',c<>c') + + instance (Semigroup a, Semigroup b, Semigroup c, Semigroup d) + => Semigroup (a, b, c, d) where + (a,b,c,d) <> (a',b',c',d') = (a<>a',b<>b',c<>c',d<>d') + + instance (Semigroup a, Semigroup b, Semigroup c, Semigroup d, Semigroup e) + => Semigroup (a, b, c, d, e) where + (a,b,c,d,e) <> (a',b',c',d',e') = (a<>a',b<>b',c<>c',d<>d',e<>e') + + instance Semigroup Ordering where + LT <> _ = LT + EQ <> y = y + GT <> _ = GT + + instance Semigroup a => Semigroup (Maybe a) where + Nothing <> b = b + a <> Nothing = a + Just a <> Just b = Just (a <> b) + + instance Semigroup (Either a b) where + Left _ <> b = b + -- a <> _ = a + a@Right{} <> _ = a + + instance Semigroup Void where + a <> _ = a + |])
src/Data/Semigroup/Singletons/Internal/Disambiguation.hs view
@@ -1,44 +1,44 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE UndecidableInstances #-}---------------------------------------------------------------------------------- |--- Module : Data.Semigroup.Singletons.Internal.Disambiguation--- Copyright : (C) 2019 Ryan Scott--- License : BSD-style (see LICENSE)--- Maintainer : Ryan Scott--- Stability : experimental--- Portability : non-portable------ Provides aliases for 'All', 'Any', 'Sum', and 'Product' that do not clash--- with the promoted functions of the same names in--- Data.Foldable.Singletons.----------------------------------------------------------------------------------module Data.Semigroup.Singletons.Internal.Disambiguation where--import Data.Semigroup-import Data.Semigroup.Singletons.Internal-import Data.Singletons.TH---- We need these in Data.Foldable.Singletons, as we need to promote--- code that simultaneously uses the All/Any/Sum/Product constructors and the--- all/any/sum/product functions, which have clashing defunctionalization--- symbol names. Our workaround is to simply define synonyms for--- all/any/sum/product and use those instead.-$(singletons [d|- all_ :: Bool -> All- all_ = All-- any_ :: Bool -> Any- any_ = Any-- sum_ :: a -> Sum a- sum_ = Sum-- product_ :: a -> Product a- product_ = Product- |])+{-# LANGUAGE DataKinds #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE UndecidableInstances #-} + +----------------------------------------------------------------------------- +-- | +-- Module : Data.Semigroup.Singletons.Internal.Disambiguation +-- Copyright : (C) 2019 Ryan Scott +-- License : BSD-style (see LICENSE) +-- Maintainer : Ryan Scott +-- Stability : experimental +-- Portability : non-portable +-- +-- Provides aliases for 'All', 'Any', 'Sum', and 'Product' that do not clash +-- with the promoted functions of the same names in +-- Data.Foldable.Singletons. +-- +---------------------------------------------------------------------------- + +module Data.Semigroup.Singletons.Internal.Disambiguation where + +import Data.Semigroup +import Data.Semigroup.Singletons.Internal.Wrappers +import Data.Singletons.TH + +-- We need these in Data.Foldable.Singletons, as we need to promote +-- code that simultaneously uses the All/Any/Sum/Product constructors and the +-- all/any/sum/product functions, which have clashing defunctionalization +-- symbol names. Our workaround is to simply define synonyms for +-- all/any/sum/product and use those instead. +$(singletons [d| + all_ :: Bool -> All + all_ = All + + any_ :: Bool -> Any + any_ = Any + + sum_ :: a -> Sum a + sum_ = Sum + + product_ :: a -> Product a + product_ = Product + |])
+ src/Data/Semigroup/Singletons/Internal/Wrappers.hs view
@@ -0,0 +1,108 @@+{-# LANGUAGE DataKinds #-} +{-# LANGUAGE NoNamedWildCards #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE UndecidableInstances #-} +{-# OPTIONS_GHC -Wno-orphans #-} + +----------------------------------------------------------------------------- +-- | +-- Module : Data.Semigroup.Singletons.Internal.Wrappers +-- Copyright : (C) 2018 Ryan Scott +-- License : BSD-style (see LICENSE) +-- Maintainer : Ryan Scott +-- Stability : experimental +-- Portability : non-portable +-- +-- Defines the promoted and singled versions of the @newtype@ wrappers from +-- "Data.Semigroup", all of which are reexported from the "Data.Semigroup" +-- module or imported directly by some other modules. +-- +-- This module exists to avoid import cycles with +-- "Data.Monoid.Singletons". +-- +---------------------------------------------------------------------------- + +module Data.Semigroup.Singletons.Internal.Wrappers where + +import Control.Monad.Singletons.Internal +import Data.Bool.Singletons +import Data.Eq.Singletons +import Data.Ord.Singletons hiding (MinSym0, MinSym1, MaxSym0, MaxSym1) +import Data.Semigroup (Dual(..), All(..), Any(..), Sum(..), Product(..)) +import Data.Semigroup.Singletons.Internal.Classes +import Data.Singletons.Base.Enum +import Data.Singletons.Base.Instances +import Data.Singletons.Base.Util +import Data.Singletons.TH +import GHC.Num.Singletons + +$(genSingletons semigroupBasicTypes) +$(singBoundedInstances semigroupBasicTypes) +$(singEqInstances semigroupBasicTypes) +$(singDecideInstances semigroupBasicTypes) +$(singOrdInstances semigroupBasicTypes) + +$(singletonsOnly [d| + instance Applicative Dual where + pure = Dual + Dual f <*> Dual x = Dual (f x) + + deriving instance Functor Dual + + instance Monad Dual where + Dual a >>= k = k a + + instance Semigroup a => Semigroup (Dual a) where + Dual a <> Dual b = Dual (b <> a) + + instance Semigroup All where + All a <> All b = All (a && b) + + instance Semigroup Any where + Any a <> Any b = Any (a || b) + + instance Applicative Sum where + pure = Sum + Sum f <*> Sum x = Sum (f x) + + deriving instance Functor Sum + + instance Monad Sum where + Sum a >>= k = k a + + instance Num a => Semigroup (Sum a) where + Sum a <> Sum b = Sum (a + b) + + -- deriving newtype instance Num a => Num (Sum a) + instance Num a => Num (Sum a) where + Sum a + Sum b = Sum (a + b) + Sum a - Sum b = Sum (a - b) + Sum a * Sum b = Sum (a * b) + negate (Sum a) = Sum (negate a) + abs (Sum a) = Sum (abs a) + signum (Sum a) = Sum (signum a) + fromInteger n = Sum (fromInteger n) + + instance Applicative Product where + pure = Product + Product f <*> Product x = Product (f x) + + deriving instance Functor Product + + instance Monad Product where + Product a >>= k = k a + + instance Num a => Semigroup (Product a) where + Product a <> Product b = Product (a * b) + + -- deriving newtype instance Num a => Num (Product a) + instance Num a => Num (Product a) where + Product a + Product b = Product (a + b) + Product a - Product b = Product (a - b) + Product a * Product b = Product (a * b) + negate (Product a) = Product (negate a) + abs (Product a) = Product (abs a) + signum (Product a) = Product (signum a) + fromInteger n = Product (fromInteger n) + |])
src/Data/Singletons/Base/CustomStar.hs view
@@ -1,32 +1,32 @@--------------------------------------------------------------------------------- |--- Module : Data.Singletons.Base.CustomStar--- Copyright : (C) 2013 Richard Eisenberg--- License : BSD-style (see LICENSE)--- Maintainer : Ryan Scott--- Stability : experimental--- Portability : non-portable------ This file implements 'singletonStar', which generates a datatype @Rep@ and associated--- singleton from a list of types. The promoted version of @Rep@ is kind @*@ and the--- Haskell types themselves. This is still very experimental, so expect unusual--- results!------ See also "Data.Singletons.TH.CustomStar" from @singletons-th@, a--- more minimal version of this module that does not re-export anything from--- "Prelude.Singletons".----------------------------------------------------------------------------------module Data.Singletons.Base.CustomStar (- singletonStar,-- module Data.Bool.Singletons,- module Data.Eq.Singletons,- module Data.Singletons.Base.TH- ) where--import Data.Bool.Singletons-import Data.Eq.Singletons-import Data.Singletons.Base.TH-import Data.Singletons.TH.CustomStar+----------------------------------------------------------------------------- +-- | +-- Module : Data.Singletons.Base.CustomStar +-- Copyright : (C) 2013 Richard Eisenberg +-- License : BSD-style (see LICENSE) +-- Maintainer : Ryan Scott +-- Stability : experimental +-- Portability : non-portable +-- +-- This file implements 'singletonStar', which generates a datatype @Rep@ and associated +-- singleton from a list of types. The promoted version of @Rep@ is kind @*@ and the +-- Haskell types themselves. This is still very experimental, so expect unusual +-- results! +-- +-- See also "Data.Singletons.TH.CustomStar" from @singletons-th@, a +-- more minimal version of this module that does not re-export anything from +-- "Prelude.Singletons". +-- +---------------------------------------------------------------------------- + +module Data.Singletons.Base.CustomStar ( + singletonStar, + + module Data.Bool.Singletons, + module Data.Eq.Singletons, + module Data.Singletons.Base.TH + ) where + +import Data.Bool.Singletons +import Data.Eq.Singletons +import Data.Singletons.Base.TH +import Data.Singletons.TH.CustomStar
src/Data/Singletons/Base/Enum.hs view
@@ -1,152 +1,152 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE DefaultSignatures #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE UndecidableInstances #-}---------------------------------------------------------------------------------- |--- Module : Data.Singletons.Base.Enum--- Copyright : (C) 2014 Jan Stolarek, Richard Eisenberg--- License : BSD-style (see LICENSE)--- Maintainer : Jan Stolarek (jan.stolarek@p.lodz.pl)--- Stability : experimental--- Portability : non-portable------ Defines the promoted and singleton version of the 'Bounded' and 'Enum' type--- classes.------ While "Prelude.Singletons" re-exports the promoted and singled versions of--- 'Enum', it deliberately avoids re-exporting 'Succ' and 'Pred', as these are--- names are likely to clash with code that deals with unary natural numbers.--- As a result, this module exists to provide 'Succ' and 'Pred' for those who--- want them.-----------------------------------------------------------------------------------module Data.Singletons.Base.Enum (- PBounded(..), SBounded(..),- PEnum(..), SEnum(..),-- -- ** Defunctionalization symbols- MinBoundSym0,- MaxBoundSym0,- SuccSym0, SuccSym1,- PredSym0, PredSym1,- ToEnumSym0, ToEnumSym1,- FromEnumSym0, FromEnumSym1,- EnumFromToSym0, EnumFromToSym1, EnumFromToSym2,- EnumFromThenToSym0, EnumFromThenToSym1, EnumFromThenToSym2,- EnumFromThenToSym3-- ) where--import Data.Eq.Singletons-import Data.Ord.Singletons-import Data.Singletons.Base.Instances-import Data.Singletons.Base.Util-import Data.Singletons.TH-import GHC.Base.Singletons-import GHC.Num.Singletons-import GHC.TypeLits.Singletons--$(singletonsOnly [d|- class Bounded a where- minBound, maxBound :: a-- instance Bounded Char where- minBound = '\0'- maxBound = '\x10FFFF'- |])--$(singBoundedInstances boundedBasicTypes)--$(singletonsOnly [d|- class Enum a where- -- | the successor of a value. For numeric types, 'succ' adds 1.- succ :: a -> a- -- | the predecessor of a value. For numeric types, 'pred' subtracts 1.- pred :: a -> a- -- | Convert from a 'Natural'.- toEnum :: Natural -> a- -- | Convert to a 'Natural'.- fromEnum :: a -> Natural-- -- The following use infinite lists, and are not promotable:- -- -- | Used in Haskell's translation of @[n..]@.- -- enumFrom :: a -> [a]- -- -- | Used in Haskell's translation of @[n,n'..]@.- -- enumFromThen :: a -> a -> [a]-- -- | Used in Haskell's translation of @[n..m]@.- enumFromTo :: a -> a -> [a]- -- | Used in Haskell's translation of @[n,n'..m]@.- enumFromThenTo :: a -> a -> a -> [a]-- succ = toEnum . (+1) . fromEnum- pred = toEnum . (subtract 1) . fromEnum- -- enumFrom x = map toEnum [fromEnum x ..]- -- enumFromThen x y = map toEnum [fromEnum x, fromEnum y ..]- enumFromTo x y = map toEnum [fromEnum x .. fromEnum y]- enumFromThenTo x1 x2 y = map toEnum [fromEnum x1, fromEnum x2 .. fromEnum y]-- -- Natural instance for Enum- eftNat :: Natural -> Natural -> [Natural]- -- [x1..x2]- eftNat x0 y | (x0 > y) = []- | otherwise = go x0- where- go x = x : if (x == y) then [] else go (x + 1)-- efdtNat :: Natural -> Natural -> Natural -> [Natural]- -- [x1,x2..y]- efdtNat x1 x2 y- | x2 >= x1 = efdtNatUp x1 x2 y- | otherwise = efdtNatDn x1 x2 y-- -- Requires x2 >= x1- efdtNatUp :: Natural -> Natural -> Natural -> [Natural]- efdtNatUp x1 x2 y -- Be careful about overflow!- | y < x2 = if y < x1 then [] else [x1]- | otherwise = -- Common case: x1 <= x2 <= y- let delta = x2 - x1 -- >= 0- y' = y - delta -- x1 <= y' <= y; hence y' is representable-- -- Invariant: x <= y- -- Note that: z <= y' => z + delta won't overflow- -- so we are guaranteed not to overflow if/when we recurse- go_up x | x > y' = [x]- | otherwise = x : go_up (x + delta)- in x1 : go_up x2-- -- Requires x2 <= x1- efdtNatDn :: Natural -> Natural -> Natural -> [Natural]- efdtNatDn x1 x2 y -- Be careful about underflow!- | y > x2 = if y > x1 then [] else [x1]- | otherwise = -- Common case: x1 >= x2 >= y- let delta = x2 - x1 -- <= 0- y' = y - delta -- y <= y' <= x1; hence y' is representable-- -- Invariant: x >= y- -- Note that: z >= y' => z + delta won't underflow- -- so we are guaranteed not to underflow if/when we recurse- go_dn x | x < y' = [x]- | otherwise = x : go_dn (x + delta)- in x1 : go_dn x2-- instance Enum Natural where- succ x = x + 1- pred x = x - 1-- toEnum x = x- fromEnum x = x-- enumFromTo = eftNat- enumFromThenTo = efdtNat-- instance Enum Char where- toEnum = natToChar- fromEnum = charToNat- |])--$(singEnumInstances enumBasicTypes)+{-# LANGUAGE DataKinds #-} +{-# LANGUAGE DefaultSignatures #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE UndecidableInstances #-} + +----------------------------------------------------------------------------- +-- | +-- Module : Data.Singletons.Base.Enum +-- Copyright : (C) 2014 Jan Stolarek, Richard Eisenberg +-- License : BSD-style (see LICENSE) +-- Maintainer : Jan Stolarek (jan.stolarek@p.lodz.pl) +-- Stability : experimental +-- Portability : non-portable +-- +-- Defines the promoted and singleton version of the 'Bounded' and 'Enum' type +-- classes. +-- +-- While "Prelude.Singletons" re-exports the promoted and singled versions of +-- 'Enum', it deliberately avoids re-exporting 'Succ' and 'Pred', as these are +-- names are likely to clash with code that deals with unary natural numbers. +-- As a result, this module exists to provide 'Succ' and 'Pred' for those who +-- want them. +-- +----------------------------------------------------------------------------- + +module Data.Singletons.Base.Enum ( + PBounded(..), SBounded(..), + PEnum(..), SEnum(..), + + -- ** Defunctionalization symbols + MinBoundSym0, + MaxBoundSym0, + SuccSym0, SuccSym1, + PredSym0, PredSym1, + ToEnumSym0, ToEnumSym1, + FromEnumSym0, FromEnumSym1, + EnumFromToSym0, EnumFromToSym1, EnumFromToSym2, + EnumFromThenToSym0, EnumFromThenToSym1, EnumFromThenToSym2, + EnumFromThenToSym3 + + ) where + +import Data.Eq.Singletons +import Data.Ord.Singletons +import Data.Singletons.Base.Instances +import Data.Singletons.Base.Util +import Data.Singletons.TH +import GHC.Base.Singletons +import GHC.Num.Singletons +import GHC.TypeLits.Singletons + +$(singletonsOnly [d| + class Bounded a where + minBound, maxBound :: a + + instance Bounded Char where + minBound = '\0' + maxBound = '\x10FFFF' + |]) + +$(singBoundedInstances boundedBasicTypes) + +$(singletonsOnly [d| + class Enum a where + -- | the successor of a value. For numeric types, 'succ' adds 1. + succ :: a -> a + -- | the predecessor of a value. For numeric types, 'pred' subtracts 1. + pred :: a -> a + -- | Convert from a 'Natural'. + toEnum :: Natural -> a + -- | Convert to a 'Natural'. + fromEnum :: a -> Natural + + -- The following use infinite lists, and are not promotable: + -- -- | Used in Haskell's translation of @[n..]@. + -- enumFrom :: a -> [a] + -- -- | Used in Haskell's translation of @[n,n'..]@. + -- enumFromThen :: a -> a -> [a] + + -- | Used in Haskell's translation of @[n..m]@. + enumFromTo :: a -> a -> [a] + -- | Used in Haskell's translation of @[n,n'..m]@. + enumFromThenTo :: a -> a -> a -> [a] + + succ = toEnum . (+1) . fromEnum + pred = toEnum . (subtract 1) . fromEnum + -- enumFrom x = map toEnum [fromEnum x ..] + -- enumFromThen x y = map toEnum [fromEnum x, fromEnum y ..] + enumFromTo x y = map toEnum [fromEnum x .. fromEnum y] + enumFromThenTo x1 x2 y = map toEnum [fromEnum x1, fromEnum x2 .. fromEnum y] + + -- Natural instance for Enum + eftNat :: Natural -> Natural -> [Natural] + -- [x1..x2] + eftNat x0 y | (x0 > y) = [] + | otherwise = go x0 + where + go x = x : if (x == y) then [] else go (x + 1) + + efdtNat :: Natural -> Natural -> Natural -> [Natural] + -- [x1,x2..y] + efdtNat x1 x2 y + | x2 >= x1 = efdtNatUp x1 x2 y + | otherwise = efdtNatDn x1 x2 y + + -- Requires x2 >= x1 + efdtNatUp :: Natural -> Natural -> Natural -> [Natural] + efdtNatUp x1 x2 y -- Be careful about overflow! + | y < x2 = if y < x1 then [] else [x1] + | otherwise = -- Common case: x1 <= x2 <= y + let delta = x2 - x1 -- >= 0 + y' = y - delta -- x1 <= y' <= y; hence y' is representable + + -- Invariant: x <= y + -- Note that: z <= y' => z + delta won't overflow + -- so we are guaranteed not to overflow if/when we recurse + go_up x | x > y' = [x] + | otherwise = x : go_up (x + delta) + in x1 : go_up x2 + + -- Requires x2 <= x1 + efdtNatDn :: Natural -> Natural -> Natural -> [Natural] + efdtNatDn x1 x2 y -- Be careful about underflow! + | y > x2 = if y > x1 then [] else [x1] + | otherwise = -- Common case: x1 >= x2 >= y + let delta = x2 - x1 -- <= 0 + y' = y - delta -- y <= y' <= x1; hence y' is representable + + -- Invariant: x >= y + -- Note that: z >= y' => z + delta won't underflow + -- so we are guaranteed not to underflow if/when we recurse + go_dn x | x < y' = [x] + | otherwise = x : go_dn (x + delta) + in x1 : go_dn x2 + + instance Enum Natural where + succ x = x + 1 + pred x = x - 1 + + toEnum x = x + fromEnum x = x + + enumFromTo = eftNat + enumFromThenTo = efdtNat + + instance Enum Char where + toEnum = natToChar + fromEnum = charToNat + |]) + +$(singEnumInstances enumBasicTypes)
src/Data/Singletons/Base/Instances.hs view
@@ -1,40 +1,40 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE UndecidableInstances #-}-{-# OPTIONS_GHC -Wno-orphans #-}--{- Data/Singletons/Base/Instances.hs--(c) Richard Eisenberg 2013-rae@cs.brynmawr.edu--This (internal) module contains the main class definitions for singletons-base,-re-exported from various places.---}--module Data.Singletons.Base.Instances (- module Data.Singletons.Base.Instances- , Sing- ) where--import Data.Singletons-import Data.Singletons.Base.Util-import Data.Singletons.TH---- some useful singletons-$(genSingletons basicTypes)-$(singDecideInstances basicTypes)-$(showSingInstances basicTypes)---- basic definitions we need right away--$(singletonsOnly [d|- foldl :: forall a b. (b -> a -> b) -> b -> [a] -> b- foldl f z0 xs0 = lgo z0 xs0- where- lgo :: b -> [a] -> b- lgo z [] = z- lgo z (x:xs) = lgo (f z x) xs- |])+{-# LANGUAGE DataKinds #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE UndecidableInstances #-} +{-# OPTIONS_GHC -Wno-orphans #-} + +{- Data/Singletons/Base/Instances.hs + +(c) Richard Eisenberg 2013 +rae@cs.brynmawr.edu + +This (internal) module contains the main class definitions for singletons-base, +re-exported from various places. + +-} + +module Data.Singletons.Base.Instances ( + module Data.Singletons.Base.Instances + , Sing + ) where + +import Data.Singletons +import Data.Singletons.Base.Util +import Data.Singletons.TH + +-- some useful singletons +$(genSingletons basicTypes) +$(singDecideInstances basicTypes) +$(showSingInstances basicTypes) + +-- basic definitions we need right away + +$(singletonsOnly [d| + foldl :: forall a b. (b -> a -> b) -> b -> [a] -> b + foldl f z0 xs0 = lgo z0 xs0 + where + lgo :: b -> [a] -> b + lgo z [] = z + lgo z (x:xs) = lgo (f z x) xs + |])
+ src/Data/Singletons/Base/PolyError.hs view
@@ -0,0 +1,28 @@+{-# LANGUAGE DataKinds #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE UndecidableInstances #-} + +----------------------------------------------------------------------------- +-- | +-- Module : Data.Singletons.Base.TypeError +-- Copyright : (C) 2023 Ryan Scott +-- License : BSD-style (see LICENSE) +-- Maintainer : Ryan Scott +-- Stability : experimental +-- Portability : non-portable +-- +-- Defines a replacement for the promoted @Error@ function whose argument is +-- kind-polymorphic. +-- +---------------------------------------------------------------------------- +module Data.Singletons.Base.PolyError (PolyError) where + +import Data.Singletons.TH + +-- | Like @Error@ from "GHC.TypeLits.Singletons", but with an argument that is +-- generalized to be kind-polymorphic. This allows passing additional +-- information to the error besides raw @Symbol@s. +type PolyError :: a -> b +type family PolyError (arg :: a) :: b where {} +$(genDefunSymbols [''PolyError])
src/Data/Singletons/Base/SomeSing.hs view
@@ -1,83 +1,83 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE GADTs #-}-{-# OPTIONS_GHC -Wno-orphans #-}---------------------------------------------------------------------------------- |--- Module : Data.Singletons.Base.SomeSing--- Copyright : (C) 2013 Richard Eisenberg--- License : BSD-style (see LICENSE)--- Maintainer : Ryan Scott--- Stability : experimental--- Portability : non-portable------ Provides the 'SomeSing' data type along with instances of 'Eq', 'Ord', etc.,--- which are defined as orphans due to 'SomeSing' originally being defined in--- a separate library (@singletons@).---------------------------------------------------------------------------------module Data.Singletons.Base.SomeSing (SomeSing(..)) where--import Data.Eq.Singletons-import Data.Monoid.Singletons-import Data.Ord.Singletons-import Data.Semigroup.Singletons-import Data.Singletons-import Data.Singletons.Base.Enum-import Data.Singletons.Base.Instances-import Data.Singletons.ShowSing-import Data.String-import Data.String.Singletons-import qualified Data.Text as T (pack)-import GHC.Num.Singletons--instance SEq k => Eq (SomeSing k) where- SomeSing a == SomeSing b = fromSing (a %== b)- SomeSing a /= SomeSing b = fromSing (a %/= b)--instance SOrd k => Ord (SomeSing k) where- SomeSing a `compare` SomeSing b = fromSing (a `sCompare` b)- SomeSing a < SomeSing b = fromSing (a %< b)- SomeSing a <= SomeSing b = fromSing (a %<= b)- SomeSing a > SomeSing b = fromSing (a %> b)- SomeSing a >= SomeSing b = fromSing (a %>= b)--instance SBounded k => Bounded (SomeSing k) where- minBound = SomeSing sMinBound- maxBound = SomeSing sMaxBound--instance SEnum k => Enum (SomeSing k) where- succ (SomeSing a) = SomeSing (sSucc a)- pred (SomeSing a) = SomeSing (sPred a)- toEnum n = withSomeSing (fromIntegral n) (SomeSing . sToEnum)- fromEnum (SomeSing a) = fromIntegral (fromSing (sFromEnum a))- enumFromTo (SomeSing from) (SomeSing to) =- listFromSingShallow (sEnumFromTo from to)- enumFromThenTo (SomeSing from) (SomeSing then_) (SomeSing to) =- listFromSingShallow (sEnumFromThenTo from then_ to)---- Like the 'fromSing' implementation for lists, but bottoms out at--- 'SomeSing' instead of recursively invoking 'fromSing'.-listFromSingShallow :: SList (x :: [a]) -> [SomeSing a]-listFromSingShallow SNil = []-listFromSingShallow (SCons x xs) = SomeSing x : listFromSingShallow xs--instance SNum k => Num (SomeSing k) where- SomeSing a + SomeSing b = SomeSing (a %+ b)- SomeSing a - SomeSing b = SomeSing (a %- b)- SomeSing a * SomeSing b = SomeSing (a %* b)- negate (SomeSing a) = SomeSing (sNegate a)- abs (SomeSing a) = SomeSing (sAbs a)- signum (SomeSing a) = SomeSing (sSignum a)- fromInteger n = withSomeSing (fromIntegral n) (SomeSing . sFromInteger)--deriving instance ShowSing k => Show (SomeSing k)--instance SSemigroup k => Semigroup (SomeSing k) where- SomeSing a <> SomeSing b = SomeSing (a %<> b)--instance SMonoid k => Monoid (SomeSing k) where- mempty = SomeSing sMempty--instance SIsString k => IsString (SomeSing k) where- fromString s = withSomeSing (T.pack s) (SomeSing . sFromString)+{-# LANGUAGE DataKinds #-} +{-# LANGUAGE GADTs #-} +{-# OPTIONS_GHC -Wno-orphans #-} + +----------------------------------------------------------------------------- +-- | +-- Module : Data.Singletons.Base.SomeSing +-- Copyright : (C) 2013 Richard Eisenberg +-- License : BSD-style (see LICENSE) +-- Maintainer : Ryan Scott +-- Stability : experimental +-- Portability : non-portable +-- +-- Provides the 'SomeSing' data type along with instances of 'Eq', 'Ord', etc., +-- which are defined as orphans due to 'SomeSing' originally being defined in +-- a separate library (@singletons@). +-- +---------------------------------------------------------------------------- +module Data.Singletons.Base.SomeSing (SomeSing(..)) where + +import Data.Eq.Singletons +import Data.Monoid.Singletons +import Data.Ord.Singletons +import Data.Semigroup.Singletons +import Data.Singletons +import Data.Singletons.Base.Enum +import Data.Singletons.Base.Instances +import Data.Singletons.ShowSing +import Data.String +import Data.String.Singletons +import qualified Data.Text as T (pack) +import GHC.Num.Singletons + +instance SEq k => Eq (SomeSing k) where + SomeSing a == SomeSing b = fromSing (a %== b) + SomeSing a /= SomeSing b = fromSing (a %/= b) + +instance SOrd k => Ord (SomeSing k) where + SomeSing a `compare` SomeSing b = fromSing (a `sCompare` b) + SomeSing a < SomeSing b = fromSing (a %< b) + SomeSing a <= SomeSing b = fromSing (a %<= b) + SomeSing a > SomeSing b = fromSing (a %> b) + SomeSing a >= SomeSing b = fromSing (a %>= b) + +instance SBounded k => Bounded (SomeSing k) where + minBound = SomeSing sMinBound + maxBound = SomeSing sMaxBound + +instance SEnum k => Enum (SomeSing k) where + succ (SomeSing a) = SomeSing (sSucc a) + pred (SomeSing a) = SomeSing (sPred a) + toEnum n = withSomeSing (fromIntegral n) (SomeSing . sToEnum) + fromEnum (SomeSing a) = fromIntegral (fromSing (sFromEnum a)) + enumFromTo (SomeSing from) (SomeSing to) = + listFromSingShallow (sEnumFromTo from to) + enumFromThenTo (SomeSing from) (SomeSing then_) (SomeSing to) = + listFromSingShallow (sEnumFromThenTo from then_ to) + +-- Like the 'fromSing' implementation for lists, but bottoms out at +-- 'SomeSing' instead of recursively invoking 'fromSing'. +listFromSingShallow :: SList (x :: [a]) -> [SomeSing a] +listFromSingShallow SNil = [] +listFromSingShallow (SCons x xs) = SomeSing x : listFromSingShallow xs + +instance SNum k => Num (SomeSing k) where + SomeSing a + SomeSing b = SomeSing (a %+ b) + SomeSing a - SomeSing b = SomeSing (a %- b) + SomeSing a * SomeSing b = SomeSing (a %* b) + negate (SomeSing a) = SomeSing (sNegate a) + abs (SomeSing a) = SomeSing (sAbs a) + signum (SomeSing a) = SomeSing (sSignum a) + fromInteger n = withSomeSing (fromIntegral n) (SomeSing . sFromInteger) + +deriving instance ShowSing k => Show (SomeSing k) + +instance SSemigroup k => Semigroup (SomeSing k) where + SomeSing a <> SomeSing b = SomeSing (a %<> b) + +instance SMonoid k => Monoid (SomeSing k) where + mempty = SomeSing sMempty + +instance SIsString k => IsString (SomeSing k) where + fromString s = withSomeSing (T.pack s) (SomeSing . sFromString)
src/Data/Singletons/Base/TH.hs view
@@ -1,139 +1,144 @@-{-# LANGUAGE ExplicitNamespaces #-}---------------------------------------------------------------------------------- |--- Module : Data.Singletons.Base.TH--- Copyright : (C) 2013 Richard Eisenberg--- License : BSD-style (see LICENSE)--- Maintainer : Ryan Scott--- Stability : experimental--- Portability : non-portable------ This module contains everything you need to derive your own singletons via--- Template Haskell, exporting both Template Haskell functionality and--- definitions that are likely to be mentioned in promoted or singled code.--- For a version of this module that only contains the Template Haskell--- functionality and nothing else, see "Data.Singletons.TH" from the--- @singletons-th@ library.----------------------------------------------------------------------------------module Data.Singletons.Base.TH (- -- * Primary Template Haskell generation functions- singletons, singletonsOnly, genSingletons,- promote, promoteOnly, genDefunSymbols, genPromotions,-- -- ** Functions to generate equality instances- promoteEqInstances, promoteEqInstance,- singEqInstances, singEqInstance,- singDecideInstances, singDecideInstance,-- -- ** Functions to generate 'Ord' instances- promoteOrdInstances, promoteOrdInstance,- singOrdInstances, singOrdInstance,-- -- ** Functions to generate 'Bounded' instances- promoteBoundedInstances, promoteBoundedInstance,- singBoundedInstances, singBoundedInstance,-- -- ** Functions to generate 'Enum' instances- promoteEnumInstances, promoteEnumInstance,- singEnumInstances, singEnumInstance,-- -- ** Functions to generate 'Show' instances- promoteShowInstances, promoteShowInstance,- singShowInstances, singShowInstance,- showSingInstances, showSingInstance,-- -- ** Utility functions- singITyConInstances, singITyConInstance,- cases, sCases,-- -- * Basic singleton definitions- SList(..), SBool(..), STuple0(..), STuple2(..), STuple3(..), STuple4(..),- STuple5(..), STuple6(..), STuple7(..), SOrdering(..),- module Data.Singletons,-- -- * Auxiliary definitions- -- | These definitions might be mentioned in code generated by Template Haskell,- -- so they must be in scope.-- PEq(..), If, sIf, type (&&), (%&&), SEq(..),- POrd(..), SOrd(..), ThenCmp, sThenCmp,- SDecide(..), (:~:)(..), Void, Refuted, Decision(..),- PBounded(..), SBounded(..),- PEnum(FromEnum, ToEnum), SEnum(sFromEnum, sToEnum),- PShow(..), SShow(..), PIsString(..), SIsString(..),- ShowString, sShowString, ShowParen, sShowParen, ShowSpace, sShowSpace,- ShowChar, sShowChar, ShowCommaSpace, sShowCommaSpace,- FromInteger, sFromInteger, Negate, sNegate,- PFunctor(..), SFunctor(..),- PFoldable(..), SFoldable(..), PMonoid(..), SMonoid(..),- PTraversable(..), STraversable(..), PApplicative(..), SApplicative(..),- type (.), (%.),-- Error, sError, ErrorSym0, ErrorSym1,- Undefined, sUndefined, UndefinedSym0,- TrueSym0, FalseSym0,- type (==@#@$), type (==@#@$$), type (==@#@$$$),- type (>@#@$), type (>@#@$$), type (>@#@$$$),- IfSym0, IfSym1, IfSym2, IfSym3,- type (&&@#@$), type (&&@#@$$), type (&&@#@$$$),- LTSym0, EQSym0, GTSym0,- Tuple0Sym0,- Tuple2Sym0, Tuple2Sym1, Tuple2Sym2,- Tuple3Sym0, Tuple3Sym1, Tuple3Sym2, Tuple3Sym3,- Tuple4Sym0, Tuple4Sym1, Tuple4Sym2, Tuple4Sym3, Tuple4Sym4,- Tuple5Sym0, Tuple5Sym1, Tuple5Sym2, Tuple5Sym3, Tuple5Sym4, Tuple5Sym5,- Tuple6Sym0, Tuple6Sym1, Tuple6Sym2, Tuple6Sym3, Tuple6Sym4, Tuple6Sym5, Tuple6Sym6,- Tuple7Sym0, Tuple7Sym1, Tuple7Sym2, Tuple7Sym3, Tuple7Sym4, Tuple7Sym5, Tuple7Sym6, Tuple7Sym7,- CompareSym0, CompareSym1, CompareSym2,- ThenCmpSym0, ThenCmpSym1, ThenCmpSym2,- FoldlSym0, FoldlSym1, FoldlSym2, FoldlSym3,- MinBoundSym0, MaxBoundSym0,- ShowsPrecSym0, ShowsPrecSym1, ShowsPrecSym2, ShowsPrecSym3,- ShowStringSym0, ShowStringSym1, ShowStringSym2,- ShowParenSym0, ShowParenSym1, ShowParenSym2,- ShowSpaceSym0, ShowSpaceSym1,- ShowCharSym0, ShowCharSym1, ShowCharSym2,- ShowCommaSpaceSym0, ShowCommaSpaceSym1,- FromIntegerSym0, FromIntegerSym1,- NegateSym0, NegateSym1,- FromStringSym0, FromStringSym1,- FmapSym0, FmapSym1, FmapSym2,- type (<$@#@$), type (<$@#@$$), type (<$@#@$$$),- FoldMapSym0, FoldMapSym1, FoldMapSym2,- MemptySym0,- MappendSym0, MappendSym1, MappendSym2,- FoldrSym0, FoldrSym1, FoldrSym2, FoldrSym3,- TraverseSym0, TraverseSym1, TraverseSym2,- PureSym0, PureSym1,- type (<*>@#@$), type (<*>@#@$$), type (<*>@#@$$$),- LiftA2Sym0, LiftA2Sym1, LiftA2Sym2, LiftA2Sym3,- type (.@#@$), type (.@#@$$), type (.@#@$$$), type (.@#@$$$$),- NilSym0, (:@#@$), (:@#@$$), (:@#@$$$),-- SuppressUnusedWarnings(..)-- ) where--import Control.Applicative.Singletons-import Data.Bool.Singletons-import Data.Eq.Singletons-import Data.Foldable.Singletons-import Data.Functor.Singletons hiding (Void)-import Data.Monoid.Singletons-import Data.Ord.Singletons-import Data.Singletons-import Data.Singletons.Base.Enum-import Data.Singletons.Base.Instances- hiding (Foldl, FoldlSym0, FoldlSym1, FoldlSym2, FoldlSym3, sFoldl)-import Data.Singletons.Decide-import Data.Singletons.TH-import Data.String.Singletons-import Data.Traversable.Singletons-import GHC.Base.Singletons- hiding (Foldr, FoldrSym0, FoldrSym1, FoldrSym2, FoldrSym3, sFoldr)-import GHC.Num.Singletons-import GHC.TypeLits.Singletons-import Text.Show.Singletons+{-# LANGUAGE ExplicitNamespaces #-} + +----------------------------------------------------------------------------- +-- | +-- Module : Data.Singletons.Base.TH +-- Copyright : (C) 2013 Richard Eisenberg +-- License : BSD-style (see LICENSE) +-- Maintainer : Ryan Scott +-- Stability : experimental +-- Portability : non-portable +-- +-- This module contains everything you need to derive your own singletons via +-- Template Haskell, exporting both Template Haskell functionality and +-- definitions that are likely to be mentioned in promoted or singled code. +-- For a version of this module that only contains the Template Haskell +-- functionality and nothing else, see "Data.Singletons.TH" from the +-- @singletons-th@ library. +-- +---------------------------------------------------------------------------- + +module Data.Singletons.Base.TH ( + -- * Primary Template Haskell generation functions + singletons, singletonsOnly, genSingletons, + promote, promoteOnly, genDefunSymbols, genPromotions, + + -- ** Functions to generate equality instances + promoteEqInstances, promoteEqInstance, + singEqInstances, singEqInstance, + singDecideInstances, singDecideInstance, + + -- ** Functions to generate 'Ord' instances + promoteOrdInstances, promoteOrdInstance, + singOrdInstances, singOrdInstance, + + -- ** Functions to generate 'Bounded' instances + promoteBoundedInstances, promoteBoundedInstance, + singBoundedInstances, singBoundedInstance, + + -- ** Functions to generate 'Enum' instances + promoteEnumInstances, promoteEnumInstance, + singEnumInstances, singEnumInstance, + + -- ** Functions to generate 'Show' instances + promoteShowInstances, promoteShowInstance, + singShowInstances, singShowInstance, + showSingInstances, showSingInstance, + + -- ** Utility functions + singITyConInstances, singITyConInstance, + cases, sCases, + + -- * Basic singleton definitions + SList(..), SBool(..), STuple0(..), STuple2(..), STuple3(..), STuple4(..), + STuple5(..), STuple6(..), STuple7(..), SOrdering(..), + module Data.Singletons, + + -- * Auxiliary definitions + -- | These definitions might be mentioned in code generated by Template Haskell, + -- so they must be in scope. + + PEq(..), If, sIf, type (&&), (%&&), SEq(..), + POrd(..), SOrd(..), + SDecide(..), (:~:)(..), Void, Refuted, Decision(..), + PBounded(..), SBounded(..), + PEnum(FromEnum, ToEnum), SEnum(sFromEnum, sToEnum), + PShow(..), SShow(..), PIsString(..), SIsString(..), + ShowString, sShowString, ShowParen, sShowParen, ShowSpace, sShowSpace, + ShowChar, sShowChar, ShowCommaSpace, sShowCommaSpace, + FromInteger, sFromInteger, Negate, sNegate, + PFunctor(..), SFunctor(..), + PFoldable(..), SFoldable(..), + PSemigroup(..), SSemigroup(..), + PMonoid(..), SMonoid(..), + PTraversable(..), STraversable(..), PApplicative(..), SApplicative(..), + type (.), (%.), + + Error, sError, ErrorSym0, ErrorSym1, + Undefined, sUndefined, UndefinedSym0, + TrueSym0, FalseSym0, + type (==@#@$), type (==@#@$$), type (==@#@$$$), + type (>@#@$), type (>@#@$$), type (>@#@$$$), + IfSym0, IfSym1, IfSym2, IfSym3, + type (&&@#@$), type (&&@#@$$), type (&&@#@$$$), + LTSym0, EQSym0, GTSym0, + Tuple0Sym0, + Tuple2Sym0, Tuple2Sym1, Tuple2Sym2, + Tuple3Sym0, Tuple3Sym1, Tuple3Sym2, Tuple3Sym3, + Tuple4Sym0, Tuple4Sym1, Tuple4Sym2, Tuple4Sym3, Tuple4Sym4, + Tuple5Sym0, Tuple5Sym1, Tuple5Sym2, Tuple5Sym3, Tuple5Sym4, Tuple5Sym5, + Tuple6Sym0, Tuple6Sym1, Tuple6Sym2, Tuple6Sym3, Tuple6Sym4, Tuple6Sym5, Tuple6Sym6, + Tuple7Sym0, Tuple7Sym1, Tuple7Sym2, Tuple7Sym3, Tuple7Sym4, Tuple7Sym5, Tuple7Sym6, Tuple7Sym7, + CompareSym0, CompareSym1, CompareSym2, + FoldlSym0, FoldlSym1, FoldlSym2, FoldlSym3, + MinBoundSym0, MaxBoundSym0, + ShowsPrecSym0, ShowsPrecSym1, ShowsPrecSym2, ShowsPrecSym3, + ShowStringSym0, ShowStringSym1, ShowStringSym2, + ShowParenSym0, ShowParenSym1, ShowParenSym2, + ShowSpaceSym0, ShowSpaceSym1, + ShowCharSym0, ShowCharSym1, ShowCharSym2, + ShowCommaSpaceSym0, ShowCommaSpaceSym1, + FromIntegerSym0, FromIntegerSym1, + NegateSym0, NegateSym1, + FromStringSym0, FromStringSym1, + FmapSym0, FmapSym1, FmapSym2, + type (<$@#@$), type (<$@#@$$), type (<$@#@$$$), + FoldMapSym0, FoldMapSym1, FoldMapSym2, + type (<>@#@$), type (<>@#@$$), type (<>@#@$$$), + MemptySym0, + MappendSym0, MappendSym1, MappendSym2, + FoldrSym0, FoldrSym1, FoldrSym2, FoldrSym3, + TraverseSym0, TraverseSym1, TraverseSym2, + PureSym0, PureSym1, + type (<*>@#@$), type (<*>@#@$$), type (<*>@#@$$$), + LiftA2Sym0, LiftA2Sym1, LiftA2Sym2, LiftA2Sym3, + type (.@#@$), type (.@#@$$), type (.@#@$$$), type (.@#@$$$$), + NilSym0, (:@#@$), (:@#@$$), (:@#@$$$), + + SuppressUnusedWarnings(..) + + ) where + +import Control.Applicative.Singletons +import Data.Bool.Singletons +import Data.Eq.Singletons +import Data.Foldable.Singletons +import Data.Functor.Singletons hiding (Void) +import Data.Monoid.Singletons +import Data.Ord.Singletons +import Data.Semigroup.Singletons + ( PSemigroup(..), SSemigroup(..) + , type (<>@#@$), type (<>@#@$$), type (<>@#@$$$) ) +import Data.Singletons +import Data.Singletons.Base.Enum +import Data.Singletons.Base.Instances + hiding (Foldl, FoldlSym0, FoldlSym1, FoldlSym2, FoldlSym3, sFoldl) +import Data.Singletons.Decide +import Data.Singletons.TH +import Data.String.Singletons +import Data.Traversable.Singletons +import GHC.Base.Singletons + hiding (Foldr, FoldrSym0, FoldrSym1, FoldrSym2, FoldrSym3, sFoldr) +import GHC.Num.Singletons +import GHC.TypeLits.Singletons +import Text.Show.Singletons
src/Data/Singletons/Base/TypeError.hs view
@@ -1,188 +1,188 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE UndecidableInstances #-}---------------------------------------------------------------------------------- |--- Module : Data.Singletons.Base.TypeError--- Copyright : (C) 2018 Ryan Scott--- License : BSD-style (see LICENSE)--- Maintainer : Ryan Scott--- Stability : experimental--- Portability : non-portable------ Defines a drop-in replacement for 'TL.TypeError' (from "GHC.TypeLits")--- that can be used at the value level as well. Since this is a drop-in--- replacement, it is not recommended to import all of "GHC.TypeLits"--- and "Data.Singletons.Base.TypeError" at the same time, as many of the--- definitions in the latter deliberately clash with the former.---------------------------------------------------------------------------------module Data.Singletons.Base.TypeError (- TypeError, sTypeError, typeError,- ErrorMessage'(..), ErrorMessage, PErrorMessage,- Sing, SErrorMessage(..),- ConvertPErrorMessage, showErrorMessage,-- -- * Defunctionalization symbols- TextSym0, TextSym1,- ShowTypeSym0, ShowTypeSym1,- type (:<>:@#@$), type (:<>:@#@$$), type (:<>:@#@$$$),- type (:$$:@#@$), type (:$$:@#@$$), type (:$$:@#@$$$),- TypeErrorSym0, TypeErrorSym1- ) where--import Data.Kind-import Data.Singletons.TH-import qualified Data.Text as Text-import qualified GHC.TypeLits as TL (ErrorMessage(..), TypeError)-import GHC.Stack (HasCallStack)-import GHC.TypeLits.Singletons.Internal-import Prelude hiding ((<>))-import Text.PrettyPrint (Doc, text, (<>), ($$))---- | A description of a custom type error.------ This is a variation on 'TL.ErrorMessage' that is parameterized over what--- text type is used in the 'Text' constructor. Instantiating it with--- 'Text.Text' gives you 'ErrorMessage', and instantiating it with 'Symbol'--- gives you 'PErrorMessage'.-type ErrorMessage' :: Type -> Type-data ErrorMessage' s- = Text s- -- ^ Show the text as is.- | forall t. ShowType t- -- ^ Pretty print the type.- -- @ShowType :: k -> ErrorMessage@- | ErrorMessage' s :<>: ErrorMessage' s- -- ^ Put two pieces of error message next- -- to each other.- | ErrorMessage' s :$$: ErrorMessage' s- -- ^ Stack two pieces of error message on top- -- of each other.-infixl 6 :<>:-infixl 5 :$$:---- | A value-level `ErrorMessage'` which uses 'Text.Text' as its text type.-type ErrorMessage :: Type-type ErrorMessage = ErrorMessage' Text.Text---- | A type-level `ErrorMessage'` which uses 'Symbol' as its text kind.-type PErrorMessage :: Type-type PErrorMessage = ErrorMessage' Symbol--type SErrorMessage :: PErrorMessage -> Type-data SErrorMessage :: PErrorMessage -> Type where- SText :: Sing t -> SErrorMessage ('Text t)- SShowType :: Sing ty -> SErrorMessage ('ShowType ty)- (:%<>:) :: Sing e1 -> Sing e2 -> SErrorMessage (e1 ':<>: e2)- (:%$$:) :: Sing e1 -> Sing e2 -> SErrorMessage (e1 ':$$: e2)-infixl 6 :%<>:-infixl 5 :%$$:--type instance Sing = SErrorMessage--instance SingKind PErrorMessage where- type Demote PErrorMessage = ErrorMessage- fromSing (SText t) = Text (fromSing t)- fromSing (SShowType{}) = ShowType (error "Can't single ShowType")- fromSing (e1 :%<>: e2) = fromSing e1 :<>: fromSing e2- fromSing (e1 :%$$: e2) = fromSing e1 :$$: fromSing e2- toSing (Text t) = withSomeSing t $ SomeSing . SText- toSing (ShowType{}) = SomeSing $ SShowType (error "Can't single ShowType")- toSing (e1 :<>: e2) = withSomeSing e1 $ \sE1 ->- withSomeSing e2 $ \sE2 ->- SomeSing (sE1 :%<>: sE2)- toSing (e1 :$$: e2) = withSomeSing e1 $ \sE1 ->- withSomeSing e2 $ \sE2 ->- SomeSing (sE1 :%$$: sE2)--instance SingI t => SingI ('Text t :: PErrorMessage) where- sing = SText sing-instance SingI1 ('Text :: Symbol -> PErrorMessage) where- liftSing = SText--instance SingI ty => SingI ('ShowType ty :: PErrorMessage) where- sing = SShowType sing-instance SingI1 ('ShowType :: t -> PErrorMessage) where- liftSing = SShowType--instance (SingI e1, SingI e2) => SingI (e1 ':<>: e2 :: PErrorMessage) where- sing = sing :%<>: sing-instance SingI e1 => SingI1 ('(:<>:) e1 :: PErrorMessage -> PErrorMessage) where- liftSing s = sing :%<>: s-instance SingI2 ('(:<>:) :: PErrorMessage -> PErrorMessage -> PErrorMessage) where- liftSing2 s1 s2 = s1 :%<>: s2--instance (SingI e1, SingI e2) => SingI (e1 ':$$: e2 :: PErrorMessage) where- sing = sing :%$$: sing-instance SingI e1 => SingI1 ('(:$$:) e1 :: PErrorMessage -> PErrorMessage) where- liftSing s = sing :%$$: s-instance SingI2 ('(:$$:) :: PErrorMessage -> PErrorMessage -> PErrorMessage) where- liftSing2 s1 s2 = s1 :%$$: s2---- | Convert an 'ErrorMessage' into a human-readable 'String'.-showErrorMessage :: ErrorMessage -> String-showErrorMessage = show . go- where- go :: ErrorMessage -> Doc- go (Text t) = text (Text.unpack t)- go (ShowType _) = text "<type>" -- Not much we can do here- go (e1 :<>: e2) = go e1 <> go e2- go (e1 :$$: e2) = go e1 $$ go e2---- | The value-level counterpart to 'TypeError'.------ Note that this is not quite as expressive as 'TypeError', as it is unable--- to print the contents of 'ShowType' constructors (it will simply print--- @\"\<type\>\"@ in their place).-typeError :: HasCallStack => ErrorMessage -> a-typeError = error . showErrorMessage---- | Convert a 'PErrorMessage' to a 'TL.ErrorMessage' from "GHC.TypeLits".-type ConvertPErrorMessage :: PErrorMessage -> TL.ErrorMessage-type family ConvertPErrorMessage (a :: PErrorMessage) :: TL.ErrorMessage where- ConvertPErrorMessage ('Text t) = 'TL.Text t- ConvertPErrorMessage ('ShowType ty) = 'TL.ShowType ty- ConvertPErrorMessage (e1 ':<>: e2) = ConvertPErrorMessage e1 'TL.:<>: ConvertPErrorMessage e2- ConvertPErrorMessage (e1 ':$$: e2) = ConvertPErrorMessage e1 'TL.:$$: ConvertPErrorMessage e2---- | A drop-in replacement for 'TL.TypeError'. This also exists at the--- value-level as 'typeError'.-type TypeError :: PErrorMessage -> a-type family TypeError (x :: PErrorMessage) :: a where- -- We cannot define this as a type synonym due to Trac #12048.- TypeError x = TL.TypeError (ConvertPErrorMessage x)---- | The singleton for 'typeError'.------ Note that this is not quite as expressive as 'TypeError', as it is unable--- to handle 'ShowType' constructors at all.-sTypeError :: HasCallStack => Sing err -> Sing (TypeError err)-sTypeError = typeError . fromSing--$(genDefunSymbols [''ErrorMessage', ''TypeError])--instance SingI (TextSym0 :: Symbol ~> PErrorMessage) where- sing = singFun1 SText--instance SingI (ShowTypeSym0 :: t ~> PErrorMessage) where- sing = singFun1 SShowType--instance SingI ((:<>:@#@$) :: PErrorMessage ~> PErrorMessage ~> PErrorMessage) where- sing = singFun2 (:%<>:)-instance SingI x => SingI ((:<>:@#@$$) x :: PErrorMessage ~> PErrorMessage) where- sing = singFun1 (sing @x :%<>:)-instance SingI1 ((:<>:@#@$$) :: PErrorMessage -> PErrorMessage ~> PErrorMessage) where- liftSing s = singFun1 (s :%<>:)--instance SingI ((:$$:@#@$) :: PErrorMessage ~> PErrorMessage ~> PErrorMessage) where- sing = singFun2 (:%$$:)-instance SingI x => SingI ((:$$:@#@$$) x :: PErrorMessage ~> PErrorMessage) where- sing = singFun1 (sing @x :%$$:)-instance SingI1 ((:$$:@#@$$) :: PErrorMessage -> PErrorMessage ~> PErrorMessage) where- liftSing s = singFun1 (s :%$$:)--instance SingI TypeErrorSym0 where- sing = singFun1 sTypeError+{-# LANGUAGE DataKinds #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE UndecidableInstances #-} + +----------------------------------------------------------------------------- +-- | +-- Module : Data.Singletons.Base.TypeError +-- Copyright : (C) 2018 Ryan Scott +-- License : BSD-style (see LICENSE) +-- Maintainer : Ryan Scott +-- Stability : experimental +-- Portability : non-portable +-- +-- Defines a drop-in replacement for 'TL.TypeError' (from "GHC.TypeLits") +-- that can be used at the value level as well. Since this is a drop-in +-- replacement, it is not recommended to import all of "GHC.TypeLits" +-- and "Data.Singletons.Base.TypeError" at the same time, as many of the +-- definitions in the latter deliberately clash with the former. +-- +---------------------------------------------------------------------------- +module Data.Singletons.Base.TypeError ( + TypeError, sTypeError, typeError, + ErrorMessage'(..), ErrorMessage, PErrorMessage, + Sing, SErrorMessage(..), + ConvertPErrorMessage, showErrorMessage, + + -- * Defunctionalization symbols + TextSym0, TextSym1, + ShowTypeSym0, ShowTypeSym1, + type (:<>:@#@$), type (:<>:@#@$$), type (:<>:@#@$$$), + type (:$$:@#@$), type (:$$:@#@$$), type (:$$:@#@$$$), + TypeErrorSym0, TypeErrorSym1 + ) where + +import Data.Kind +import Data.Singletons.TH +import qualified Data.Text as Text +import qualified GHC.TypeLits as TL (ErrorMessage(..), TypeError) +import GHC.Stack (HasCallStack) +import GHC.TypeLits.Singletons.Internal +import Prelude hiding ((<>)) +import Text.PrettyPrint (Doc, text, (<>), ($$)) + +-- | A description of a custom type error. +-- +-- This is a variation on 'TL.ErrorMessage' that is parameterized over what +-- text type is used in the 'Text' constructor. Instantiating it with +-- 'Text.Text' gives you 'ErrorMessage', and instantiating it with 'Symbol' +-- gives you 'PErrorMessage'. +type ErrorMessage' :: Type -> Type +data ErrorMessage' s + = Text s + -- ^ Show the text as is. + | forall t. ShowType t + -- ^ Pretty print the type. + -- @ShowType :: k -> ErrorMessage@ + | ErrorMessage' s :<>: ErrorMessage' s + -- ^ Put two pieces of error message next + -- to each other. + | ErrorMessage' s :$$: ErrorMessage' s + -- ^ Stack two pieces of error message on top + -- of each other. +infixl 6 :<>: +infixl 5 :$$: + +-- | A value-level `ErrorMessage'` which uses 'Text.Text' as its text type. +type ErrorMessage :: Type +type ErrorMessage = ErrorMessage' Text.Text + +-- | A type-level `ErrorMessage'` which uses 'Symbol' as its text kind. +type PErrorMessage :: Type +type PErrorMessage = ErrorMessage' Symbol + +type SErrorMessage :: PErrorMessage -> Type +data SErrorMessage :: PErrorMessage -> Type where + SText :: Sing t -> SErrorMessage ('Text t) + SShowType :: Sing ty -> SErrorMessage ('ShowType ty) + (:%<>:) :: Sing e1 -> Sing e2 -> SErrorMessage (e1 ':<>: e2) + (:%$$:) :: Sing e1 -> Sing e2 -> SErrorMessage (e1 ':$$: e2) +infixl 6 :%<>: +infixl 5 :%$$: + +type instance Sing = SErrorMessage + +instance SingKind PErrorMessage where + type Demote PErrorMessage = ErrorMessage + fromSing (SText t) = Text (fromSing t) + fromSing (SShowType{}) = ShowType (error "Can't single ShowType") + fromSing (e1 :%<>: e2) = fromSing e1 :<>: fromSing e2 + fromSing (e1 :%$$: e2) = fromSing e1 :$$: fromSing e2 + toSing (Text t) = withSomeSing t $ SomeSing . SText + toSing (ShowType{}) = SomeSing $ SShowType (error "Can't single ShowType") + toSing (e1 :<>: e2) = withSomeSing e1 $ \sE1 -> + withSomeSing e2 $ \sE2 -> + SomeSing (sE1 :%<>: sE2) + toSing (e1 :$$: e2) = withSomeSing e1 $ \sE1 -> + withSomeSing e2 $ \sE2 -> + SomeSing (sE1 :%$$: sE2) + +instance SingI t => SingI ('Text t :: PErrorMessage) where + sing = SText sing +instance SingI1 ('Text :: Symbol -> PErrorMessage) where + liftSing = SText + +instance SingI ty => SingI ('ShowType ty :: PErrorMessage) where + sing = SShowType sing +instance SingI1 ('ShowType :: t -> PErrorMessage) where + liftSing = SShowType + +instance (SingI e1, SingI e2) => SingI (e1 ':<>: e2 :: PErrorMessage) where + sing = sing :%<>: sing +instance SingI e1 => SingI1 ('(:<>:) e1 :: PErrorMessage -> PErrorMessage) where + liftSing s = sing :%<>: s +instance SingI2 ('(:<>:) :: PErrorMessage -> PErrorMessage -> PErrorMessage) where + liftSing2 s1 s2 = s1 :%<>: s2 + +instance (SingI e1, SingI e2) => SingI (e1 ':$$: e2 :: PErrorMessage) where + sing = sing :%$$: sing +instance SingI e1 => SingI1 ('(:$$:) e1 :: PErrorMessage -> PErrorMessage) where + liftSing s = sing :%$$: s +instance SingI2 ('(:$$:) :: PErrorMessage -> PErrorMessage -> PErrorMessage) where + liftSing2 s1 s2 = s1 :%$$: s2 + +-- | Convert an 'ErrorMessage' into a human-readable 'String'. +showErrorMessage :: ErrorMessage -> String +showErrorMessage = show . go + where + go :: ErrorMessage -> Doc + go (Text t) = text (Text.unpack t) + go (ShowType _) = text "<type>" -- Not much we can do here + go (e1 :<>: e2) = go e1 <> go e2 + go (e1 :$$: e2) = go e1 $$ go e2 + +-- | The value-level counterpart to 'TypeError'. +-- +-- Note that this is not quite as expressive as 'TypeError', as it is unable +-- to print the contents of 'ShowType' constructors (it will simply print +-- @\"\<type\>\"@ in their place). +typeError :: HasCallStack => ErrorMessage -> a +typeError = error . showErrorMessage + +-- | Convert a 'PErrorMessage' to a 'TL.ErrorMessage' from "GHC.TypeLits". +type ConvertPErrorMessage :: PErrorMessage -> TL.ErrorMessage +type family ConvertPErrorMessage (a :: PErrorMessage) :: TL.ErrorMessage where + ConvertPErrorMessage ('Text t) = 'TL.Text t + ConvertPErrorMessage ('ShowType ty) = 'TL.ShowType ty + ConvertPErrorMessage (e1 ':<>: e2) = ConvertPErrorMessage e1 'TL.:<>: ConvertPErrorMessage e2 + ConvertPErrorMessage (e1 ':$$: e2) = ConvertPErrorMessage e1 'TL.:$$: ConvertPErrorMessage e2 + +-- | A drop-in replacement for 'TL.TypeError'. This also exists at the +-- value-level as 'typeError'. +type TypeError :: PErrorMessage -> a +type family TypeError (x :: PErrorMessage) :: a where + -- We cannot define this as a type synonym due to Trac #12048. + TypeError x = TL.TypeError (ConvertPErrorMessage x) + +-- | The singleton for 'typeError'. +-- +-- Note that this is not quite as expressive as 'TypeError', as it is unable +-- to handle 'ShowType' constructors at all. +sTypeError :: HasCallStack => Sing err -> Sing (TypeError err) +sTypeError = typeError . fromSing + +$(genDefunSymbols [''ErrorMessage', ''TypeError]) + +instance SingI (TextSym0 :: Symbol ~> PErrorMessage) where + sing = singFun1 SText + +instance SingI (ShowTypeSym0 :: t ~> PErrorMessage) where + sing = singFun1 SShowType + +instance SingI ((:<>:@#@$) :: PErrorMessage ~> PErrorMessage ~> PErrorMessage) where + sing = singFun2 (:%<>:) +instance SingI x => SingI ((:<>:@#@$$) x :: PErrorMessage ~> PErrorMessage) where + sing = singFun1 (sing @x :%<>:) +instance SingI1 ((:<>:@#@$$) :: PErrorMessage -> PErrorMessage ~> PErrorMessage) where + liftSing s = singFun1 (s :%<>:) + +instance SingI ((:$$:@#@$) :: PErrorMessage ~> PErrorMessage ~> PErrorMessage) where + sing = singFun2 (:%$$:) +instance SingI x => SingI ((:$$:@#@$$) x :: PErrorMessage ~> PErrorMessage) where + sing = singFun1 (sing @x :%$$:) +instance SingI1 ((:$$:@#@$$) :: PErrorMessage -> PErrorMessage ~> PErrorMessage) where + liftSing s = singFun1 (s :%$$:) + +instance SingI TypeErrorSym0 where + sing = singFun1 sTypeError
src/Data/Singletons/Base/TypeRepTYPE.hs view
@@ -1,97 +1,97 @@-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE UndecidableInstances #-}-{-# OPTIONS_GHC -Wno-orphans #-}---------------------------------------------------------------------------------- |--- Module : Data.Singletons.Base.TypeRepTYPE--- Copyright : (C) 2013 Richard Eisenberg--- License : BSD-style (see LICENSE)--- Maintainer : Ryan Scott--- Stability : experimental--- Portability : non-portable------ This module defines singleton instances making 'TypeRep' the singleton for--- the kind @'TYPE' rep@ (for some 'RuntimeRep' @rep@), an instantiation of--- which is the famous kind 'Type'. The definitions don't fully line up with--- what is expected within the singletons library, so expect unusual results!----------------------------------------------------------------------------------module Data.Singletons.Base.TypeRepTYPE (- Sing,- -- | Here is the definition of the singleton for @'TYPE' rep@:- --- -- > type instance Sing \@(TYPE rep) = TypeRep- --- -- Instances for 'SingI', 'SingKind', 'SEq', 'SDecide', and- -- 'TestCoercion' are also supplied.-- SomeTypeRepTYPE(..)- ) where--import Data.Eq.Singletons-import Data.Kind (Type)-import Data.Singletons-import Data.Singletons.Base.Instances-import Data.Singletons.Decide-import GHC.Exts (RuntimeRep, TYPE)-import Type.Reflection-import Type.Reflection.Unsafe-import Unsafe.Coerce---- | A choice of singleton for the kind @'TYPE' rep@ (for some 'RuntimeRep'--- @rep@), an instantiation of which is the famous kind 'Type'.------ Conceivably, one could generalize this instance to `Sing \@k` for--- /any/ kind @k@, and remove all other 'Sing' instances. We don't adopt this--- design, however, since it is far more convenient in practice to work with--- explicit singleton values than 'TypeRep's (for instance, 'TypeRep's are--- more difficult to pattern match on, and require extra runtime checks).------ We cannot produce explicit singleton values for everything in @'TYPE' rep@,--- however, since it is an open kind, so we reach for 'TypeRep' in this one--- particular case.-type instance Sing @(TYPE rep) = TypeRep---- | A variant of 'SomeTypeRep' whose underlying 'TypeRep' is restricted to--- kind @'TYPE' rep@ (for some 'RuntimeRep' @rep@).-type SomeTypeRepTYPE :: RuntimeRep -> Type-data SomeTypeRepTYPE :: RuntimeRep -> Type where- SomeTypeRepTYPE :: forall (rep :: RuntimeRep) (a :: TYPE rep). !(TypeRep a) -> SomeTypeRepTYPE rep--instance Eq (SomeTypeRepTYPE rep) where- SomeTypeRepTYPE a == SomeTypeRepTYPE b =- case eqTypeRep a b of- Just HRefl -> True- Nothing -> False--instance Ord (SomeTypeRepTYPE rep) where- SomeTypeRepTYPE a `compare` SomeTypeRepTYPE b =- typeRepFingerprint a `compare` typeRepFingerprint b--instance Show (SomeTypeRepTYPE rep) where- showsPrec p (SomeTypeRepTYPE ty) = showsPrec p ty--instance Typeable a => SingI (a :: TYPE rep) where- sing = typeRep-instance SingKind (TYPE rep) where- type Demote (TYPE rep) = SomeTypeRepTYPE rep- fromSing = SomeTypeRepTYPE- toSing (SomeTypeRepTYPE tr) = SomeSing tr--instance PEq (TYPE rep) where- type x == y = DefaultEq x y-instance SEq (TYPE rep) where- tra %== trb =- case eqTypeRep tra trb of- Just HRefl -> STrue- Nothing -> unsafeCoerce SFalse- -- the Data.Typeable interface isn't strong enough- -- to enable us to define this without unsafeCoerce--instance SDecide (TYPE rep) where- tra %~ trb =- case eqTypeRep tra trb of- Just HRefl -> Proved Refl- Nothing -> Disproved (\Refl -> error "Type.Reflection.eqTypeRep failed")+{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE UndecidableInstances #-} +{-# OPTIONS_GHC -Wno-orphans #-} + +----------------------------------------------------------------------------- +-- | +-- Module : Data.Singletons.Base.TypeRepTYPE +-- Copyright : (C) 2013 Richard Eisenberg +-- License : BSD-style (see LICENSE) +-- Maintainer : Ryan Scott +-- Stability : experimental +-- Portability : non-portable +-- +-- This module defines singleton instances making 'TypeRep' the singleton for +-- the kind @'TYPE' rep@ (for some 'RuntimeRep' @rep@), an instantiation of +-- which is the famous kind 'Type'. The definitions don't fully line up with +-- what is expected within the singletons library, so expect unusual results! +-- +---------------------------------------------------------------------------- + +module Data.Singletons.Base.TypeRepTYPE ( + Sing, + -- | Here is the definition of the singleton for @'TYPE' rep@: + -- + -- > type instance Sing \@(TYPE rep) = TypeRep + -- + -- Instances for 'SingI', 'SingKind', 'SEq', 'SDecide', and + -- 'TestCoercion' are also supplied. + + SomeTypeRepTYPE(..) + ) where + +import Data.Eq.Singletons +import Data.Kind (Type) +import Data.Singletons +import Data.Singletons.Base.Instances +import Data.Singletons.Decide +import GHC.Exts (RuntimeRep, TYPE) +import Type.Reflection +import Type.Reflection.Unsafe +import Unsafe.Coerce + +-- | A choice of singleton for the kind @'TYPE' rep@ (for some 'RuntimeRep' +-- @rep@), an instantiation of which is the famous kind 'Type'. +-- +-- Conceivably, one could generalize this instance to `Sing \@k` for +-- /any/ kind @k@, and remove all other 'Sing' instances. We don't adopt this +-- design, however, since it is far more convenient in practice to work with +-- explicit singleton values than 'TypeRep's (for instance, 'TypeRep's are +-- more difficult to pattern match on, and require extra runtime checks). +-- +-- We cannot produce explicit singleton values for everything in @'TYPE' rep@, +-- however, since it is an open kind, so we reach for 'TypeRep' in this one +-- particular case. +type instance Sing @(TYPE rep) = TypeRep + +-- | A variant of 'SomeTypeRep' whose underlying 'TypeRep' is restricted to +-- kind @'TYPE' rep@ (for some 'RuntimeRep' @rep@). +type SomeTypeRepTYPE :: RuntimeRep -> Type +data SomeTypeRepTYPE :: RuntimeRep -> Type where + SomeTypeRepTYPE :: forall (rep :: RuntimeRep) (a :: TYPE rep). !(TypeRep a) -> SomeTypeRepTYPE rep + +instance Eq (SomeTypeRepTYPE rep) where + SomeTypeRepTYPE a == SomeTypeRepTYPE b = + case eqTypeRep a b of + Just HRefl -> True + Nothing -> False + +instance Ord (SomeTypeRepTYPE rep) where + SomeTypeRepTYPE a `compare` SomeTypeRepTYPE b = + typeRepFingerprint a `compare` typeRepFingerprint b + +instance Show (SomeTypeRepTYPE rep) where + showsPrec p (SomeTypeRepTYPE ty) = showsPrec p ty + +instance Typeable a => SingI (a :: TYPE rep) where + sing = typeRep +instance SingKind (TYPE rep) where + type Demote (TYPE rep) = SomeTypeRepTYPE rep + fromSing = SomeTypeRepTYPE + toSing (SomeTypeRepTYPE tr) = SomeSing tr + +instance PEq (TYPE rep) where + type x == y = DefaultEq x y +instance SEq (TYPE rep) where + tra %== trb = + case eqTypeRep tra trb of + Just HRefl -> STrue + Nothing -> unsafeCoerce SFalse + -- the Data.Typeable interface isn't strong enough + -- to enable us to define this without unsafeCoerce + +instance SDecide (TYPE rep) where + tra %~ trb = + case eqTypeRep tra trb of + Just HRefl -> Proved Refl + Nothing -> Disproved (\Refl -> error "Type.Reflection.eqTypeRep failed")
src/Data/Singletons/Base/Util.hs view
@@ -1,67 +1,67 @@-{-# LANGUAGE TemplateHaskellQuotes #-}--{- Data/Singletons/Prelude/Util.hs--(c) Richard Eisenberg 2013-rae@cs.brynmawr.edu--This file contains helper functions internal to the singletons-base package.-Users of the package should not need to consult this file.--}--module Data.Singletons.Base.Util where--import Data.Functor.Identity-import Data.List.NonEmpty (NonEmpty(..))-import qualified Data.Monoid as Monoid-import Data.Semigroup as Semigroup-import Data.Void-import Language.Haskell.TH---- The list of types that singletons-base processes by default-basicTypes :: [Name]-basicTypes = [ ''Maybe- , ''[]- , ''Either- , ''NonEmpty- , ''Void- ] ++ boundedBasicTypes--boundedBasicTypes :: [Name]-boundedBasicTypes =- [ ''(,)- , ''(,,)- , ''(,,,)- , ''(,,,,)- , ''(,,,,,)- , ''(,,,,,,)- , ''Identity- ] ++ enumBasicTypes--enumBasicTypes :: [Name]-enumBasicTypes = [ ''Bool, ''Ordering, ''() ]--semigroupBasicTypes :: [Name]-semigroupBasicTypes- = [ ''Dual- , ''All- , ''Any- , ''Sum- , ''Product- -- , ''Endo see https://github.com/goldfirere/singletons/issues/82- {- , ''Alt singletons-th doesn't support higher kinds :(- see https://github.com/goldfirere/singletons/issues/150- -}-- , ''Min- , ''Max- , ''Semigroup.First- , ''Semigroup.Last- , ''WrappedMonoid- ]--monoidBasicTypes :: [Name]-monoidBasicTypes- = [ ''Monoid.First- , ''Monoid.Last- ]+{-# LANGUAGE TemplateHaskellQuotes #-} + +{- Data/Singletons/Prelude/Util.hs + +(c) Richard Eisenberg 2013 +rae@cs.brynmawr.edu + +This file contains helper functions internal to the singletons-base package. +Users of the package should not need to consult this file. +-} + +module Data.Singletons.Base.Util where + +import Data.Functor.Identity +import Data.List.NonEmpty (NonEmpty(..)) +import qualified Data.Monoid as Monoid +import Data.Semigroup as Semigroup +import Data.Void +import Language.Haskell.TH + +-- The list of types that singletons-base processes by default +basicTypes :: [Name] +basicTypes = [ ''Maybe + , ''[] + , ''Either + , ''NonEmpty + , ''Void + ] ++ boundedBasicTypes + +boundedBasicTypes :: [Name] +boundedBasicTypes = + [ ''(,) + , ''(,,) + , ''(,,,) + , ''(,,,,) + , ''(,,,,,) + , ''(,,,,,,) + , ''Identity + ] ++ enumBasicTypes + +enumBasicTypes :: [Name] +enumBasicTypes = [ ''Bool, ''Ordering, ''() ] + +semigroupBasicTypes :: [Name] +semigroupBasicTypes + = [ ''Dual + , ''All + , ''Any + , ''Sum + , ''Product + -- , ''Endo see https://github.com/goldfirere/singletons/issues/82 + {- , ''Alt singletons-th doesn't support higher kinds :( + see https://github.com/goldfirere/singletons/issues/150 + -} + + , ''Min + , ''Max + , ''Semigroup.First + , ''Semigroup.Last + , ''WrappedMonoid + ] + +monoidBasicTypes :: [Name] +monoidBasicTypes + = [ ''Monoid.First + , ''Monoid.Last + ]
src/Data/String/Singletons.hs view
@@ -1,55 +1,55 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE UndecidableInstances #-}---------------------------------------------------------------------------------- |--- Module : Data.String.Singletons--- Copyright : (C) 2017 Ryan Scott--- License : BSD-style (see LICENSE)--- Maintainer : Ryan Scott--- Stability : experimental--- Portability : non-portable------ Defines and exports a promoted and singled version of the 'IsString'--- type class from "Data.String".-------------------------------------------------------------------------------module Data.String.Singletons (- PIsString(..), SIsString(..),-- -- ** Defunctionalization symbols- FromStringSym0, FromStringSym1- ) where--import Data.Functor.Const-import Data.Functor.Const.Singletons-import Data.Functor.Identity-import Data.Functor.Identity.Singletons-import Data.Singletons.TH-import GHC.TypeLits (Symbol)-import GHC.TypeLits.Singletons () -- for the IsString instance!--$(singletonsOnly [d|- -- -| Class for string-like datastructures; used by the overloaded string- -- extension (-XOverloadedStrings in GHC).- class IsString a where- fromString :: Symbol -> a-- -- deriving instance IsString a => IsString (Const a (b :: k))- instance IsString a => IsString (Const a (b :: k)) where- fromString x = Const (fromString x)-- -- deriving instance IsString a => IsString (Identity a)- instance IsString a => IsString (Identity a) where- fromString x = Identity (fromString x)- |])---- PIsString instance-instance PIsString Symbol where- type FromString a = a---- SIsString instance-instance SIsString Symbol where- sFromString x = x+{-# LANGUAGE DataKinds #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE UndecidableInstances #-} + +----------------------------------------------------------------------------- +-- | +-- Module : Data.String.Singletons +-- Copyright : (C) 2017 Ryan Scott +-- License : BSD-style (see LICENSE) +-- Maintainer : Ryan Scott +-- Stability : experimental +-- Portability : non-portable +-- +-- Defines and exports a promoted and singled version of the 'IsString' +-- type class from "Data.String". +---------------------------------------------------------------------------- + +module Data.String.Singletons ( + PIsString(..), SIsString(..), + + -- ** Defunctionalization symbols + FromStringSym0, FromStringSym1 + ) where + +import Data.Functor.Const +import Data.Functor.Const.Singletons +import Data.Functor.Identity +import Data.Functor.Identity.Singletons +import Data.Singletons.TH +import GHC.TypeLits (Symbol) +import GHC.TypeLits.Singletons () -- for the IsString instance! + +$(singletonsOnly [d| + -- -| Class for string-like datastructures; used by the overloaded string + -- extension (-XOverloadedStrings in GHC). + class IsString a where + fromString :: Symbol -> a + + -- deriving instance IsString a => IsString (Const a (b :: k)) + instance IsString a => IsString (Const a (b :: k)) where + fromString x = Const (fromString x) + + -- deriving instance IsString a => IsString (Identity a) + instance IsString a => IsString (Identity a) where + fromString x = Identity (fromString x) + |]) + +-- PIsString instance +instance PIsString Symbol where + type FromString a = a + +-- SIsString instance +instance SIsString Symbol where + sFromString x = x
src/Data/Traversable/Singletons.hs view
@@ -1,303 +1,303 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE DefaultSignatures #-}-{-# LANGUAGE NoNamedWildCards #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE UndecidableInstances #-}---------------------------------------------------------------------------------- |--- Module : Data.Traversable.Singletons--- Copyright : (C) 2018 Ryan Scott--- License : BSD-style (see LICENSE)--- Maintainer : Ryan Scott--- Stability : experimental--- Portability : non-portable------ Defines the promoted and singled versions of the 'Traversable' type class.----------------------------------------------------------------------------------module Data.Traversable.Singletons (- PTraversable(..), STraversable(..),- For, sFor,- ForM, sForM,- MapAccumL, sMapAccumL,- MapAccumR, sMapAccumR,- FmapDefault, sFmapDefault,- FoldMapDefault, sFoldMapDefault,-- -- * Defunctionalization symbols- TraverseSym0, TraverseSym1, TraverseSym2,- SequenceASym0, SequenceASym1,- MapMSym0, MapMSym1, MapMSym2,- SequenceSym0, SequenceSym1,-- ForSym0, ForSym1, ForSym2,- ForMSym0, ForMSym1, ForMSym2,- MapAccumLSym0, MapAccumLSym1, MapAccumLSym2, MapAccumLSym3,- MapAccumRSym0, MapAccumRSym1, MapAccumRSym2, MapAccumRSym3,- FmapDefaultSym0, FmapDefaultSym1, FmapDefaultSym2,- FoldMapDefaultSym0, FoldMapDefaultSym1, FoldMapDefaultSym2- ) where--import Control.Applicative-import Control.Monad.Singletons.Internal-import Data.Foldable.Singletons (SFoldable)-import Data.Functor.Const.Singletons-import Data.Functor.Identity-import Data.Functor.Identity.Singletons-import Data.Functor.Singletons ()-import Data.Kind-import Data.List.NonEmpty (NonEmpty(..))-import Data.Monoid-import Data.Monoid.Singletons-import Data.Proxy.Singletons-import Data.Singletons-import Data.Singletons.Base.Instances-import Data.Singletons.TH-import GHC.Base.Singletons hiding (Const, ConstSym0)--type StateL :: Type -> Type -> Type-newtype StateL s a = StateL (s ~> (s, a))-type SStateL :: forall s a. StateL s a -> Type-data SStateL state where- SStateL :: Sing x -> SStateL ('StateL x)-type instance Sing = SStateL-type StateLSym0 :: forall s a. (s ~> (s, a)) ~> StateL s a-data StateLSym0 z-type instance Apply StateLSym0 x = 'StateL x--type StateR :: Type -> Type -> Type-newtype StateR s a = StateR (s ~> (s, a))-type SStateR :: forall s a. StateR s a -> Type-data SStateR state where- SStateR :: Sing x -> SStateR ('StateR x)-type instance Sing = SStateR-type StateRSym0 :: forall s a. (s ~> (s, a)) ~> StateR s a-data StateRSym0 z-type instance Apply StateRSym0 x = 'StateR x--$(singletonsOnly [d|- runStateL :: StateL s a -> (s -> (s, a))- runStateL (StateL x) = x-- runStateR :: StateR s a -> (s -> (s, a))- runStateR (StateR x) = x- |])--$(singletonsOnly [d|- -- -| Functors representing data structures that can be traversed from- -- left to right.- --- -- A definition of 'traverse' must satisfy the following laws:- --- -- [/naturality/]- -- @t . 'traverse' f = 'traverse' (t . f)@- -- for every applicative transformation @t@- --- -- [/identity/]- -- @'traverse' Identity = Identity@- --- -- [/composition/]- -- @'traverse' (Compose . 'fmap' g . f) = Compose . 'fmap' ('traverse' g) . 'traverse' f@- --- -- A definition of 'sequenceA' must satisfy the following laws:- --- -- [/naturality/]- -- @t . 'sequenceA' = 'sequenceA' . 'fmap' t@- -- for every applicative transformation @t@- --- -- [/identity/]- -- @'sequenceA' . 'fmap' Identity = Identity@- --- -- [/composition/]- -- @'sequenceA' . 'fmap' Compose = Compose . 'fmap' 'sequenceA' . 'sequenceA'@- --- -- where an /applicative transformation/ is a function- --- -- @t :: (Applicative f, Applicative g) => f a -> g a@- --- -- preserving the 'Applicative' operations, i.e.- --- -- * @t ('pure' x) = 'pure' x@- --- -- * @t (x '<*>' y) = t x '<*>' t y@- --- -- and the identity functor @Identity@ and composition of functors @Compose@- -- are defined as- --- -- > newtype Identity a = Identity a- -- >- -- > instance Functor Identity where- -- > fmap f (Identity x) = Identity (f x)- -- >- -- > instance Applicative Identity where- -- > pure x = Identity x- -- > Identity f <*> Identity x = Identity (f x)- -- >- -- > newtype Compose f g a = Compose (f (g a))- -- >- -- > instance (Functor f, Functor g) => Functor (Compose f g) where- -- > fmap f (Compose x) = Compose (fmap (fmap f) x)- -- >- -- > instance (Applicative f, Applicative g) => Applicative (Compose f g) where- -- > pure x = Compose (pure (pure x))- -- > Compose f <*> Compose x = Compose ((<*>) <$> f <*> x)- --- -- (The naturality law is implied by parametricity.)- --- -- Instances are similar to 'Functor', e.g. given a data type- --- -- > data Tree a = Empty | Leaf a | Node (Tree a) a (Tree a)- --- -- a suitable instance would be- --- -- > instance Traversable Tree where- -- > traverse f Empty = pure Empty- -- > traverse f (Leaf x) = Leaf <$> f x- -- > traverse f (Node l k r) = Node <$> traverse f l <*> f k <*> traverse f r- --- -- This is suitable even for abstract types, as the laws for '<*>'- -- imply a form of associativity.- --- -- The superclass instances should satisfy the following:- --- -- * In the 'Functor' instance, 'fmap' should be equivalent to traversal- -- with the identity applicative functor ('fmapDefault').- --- -- * In the 'Foldable' instance, 'Data.Foldable.foldMap' should be- -- equivalent to traversal with a constant applicative functor- -- ('foldMapDefault').- --- class (Functor t, Foldable t) => Traversable t where- -- {-# MINIMAL traverse | sequenceA #-}-- -- -| Map each element of a structure to an action, evaluate these actions- -- from left to right, and collect the results. For a version that ignores- -- the results see 'Data.Foldable.traverse_'.- traverse :: Applicative f => (a -> f b) -> t a -> f (t b)- traverse f = sequenceA . fmap f-- -- -| Evaluate each action in the structure from left to right, and- -- and collect the results. For a version that ignores the results- -- see 'Data.Foldable.sequenceA_'.- sequenceA :: Applicative f => t (f a) -> f (t a)- sequenceA = traverse id-- -- -| Map each element of a structure to a monadic action, evaluate- -- these actions from left to right, and collect the results. For- -- a version that ignores the results see 'Data.Foldable.mapM_'.- mapM :: Monad m => (a -> m b) -> t a -> m (t b)- mapM = traverse-- -- -| Evaluate each monadic action in the structure from left to- -- right, and collect the results. For a version that ignores the- -- results see 'Data.Foldable.sequence_'.- sequence :: Monad m => t (m a) -> m (t a)- sequence = sequenceA- |])--$(singletonsOnly [d|- -- instances for Prelude types-- deriving instance Traversable Maybe- deriving instance Traversable []- deriving instance Traversable NonEmpty- deriving instance Traversable (Either a)- deriving instance Traversable ((,) a)-- instance Traversable Proxy where- traverse _ _ = pure Proxy- sequenceA _ = pure Proxy- mapM _ _ = pure Proxy- sequence _ = pure Proxy-- deriving instance Traversable (Const m)- deriving instance Traversable Dual- deriving instance Traversable Sum- deriving instance Traversable Product- deriving instance Traversable First- deriving instance Traversable Last- deriving instance Traversable Identity-- -- general functions-- -- -| 'for' is 'traverse' with its arguments flipped. For a version- -- that ignores the results see 'Data.Foldable.for_'.- for :: (Traversable t, Applicative f) => t a -> (a -> f b) -> f (t b)- for = flip traverse-- -- -| 'forM' is 'mapM' with its arguments flipped. For a version that- -- ignores the results see 'Data.Foldable.forM_'.- forM :: (Traversable t, Monad m) => t a -> (a -> m b) -> m (t b)- forM = flip mapM-- instance Functor (StateL s) where- fmap f (StateL k) = StateL $ \ s -> let (s', v) = k s in (s', f v)-- instance Applicative (StateL s) where- pure x = StateL (\ s -> (s, x))- StateL kf <*> StateL kv = StateL $ \ s ->- let (s', f) = kf s- (s'', v) = kv s'- in (s'', f v)- liftA2 f (StateL kx) (StateL ky) = StateL $ \s ->- let (s', x) = kx s- (s'', y) = ky s'- in (s'', f x y)-- instance Functor (StateR s) where- fmap f (StateR k) = StateR $ \ s -> let (s', v) = k s in (s', f v)-- instance Applicative (StateR s) where- pure x = StateR (\ s -> (s, x))- StateR kf <*> StateR kv = StateR $ \ s ->- let (s', v) = kv s- (s'', f) = kf s'- in (s'', f v)- liftA2 f (StateR kx) (StateR ky) = StateR $ \ s ->- let (s', y) = ky s- (s'', x) = kx s'- in (s'', f x y)-- -- -|The 'mapAccumL' function behaves like a combination of 'fmap'- -- and 'foldl'; it applies a function to each element of a structure,- -- passing an accumulating parameter from left to right, and returning- -- a final value of this accumulator together with the new structure.- mapAccumL :: forall t a b c. Traversable t- => (a -> b -> (a, c)) -> a -> t b -> (a, t c)- mapAccumL f s t = runStateL (traverse (StateL . flip f) t) s-- -- -|The 'mapAccumR' function behaves like a combination of 'fmap'- -- and 'foldr'; it applies a function to each element of a structure,- -- passing an accumulating parameter from right to left, and returning- -- a final value of this accumulator together with the new structure.- mapAccumR :: Traversable t => (a -> b -> (a, c)) -> a -> t b -> (a, t c)- mapAccumR f s t = runStateR (traverse (StateR . flip f) t) s-- -- -| This function may be used as a value for `fmap` in a `Functor`- -- instance, provided that 'traverse' is defined. (Using- -- `fmapDefault` with a `Traversable` instance defined only by- -- 'sequenceA' will result in infinite recursion.)- --- -- @- -- 'fmapDefault' f ≡ 'runIdentity' . 'traverse' ('Identity' . f)- -- @- fmapDefault :: forall t a b . Traversable t- => (a -> b) -> t a -> t b- fmapDefault f x = case traverse (Identity . f) x of Identity y -> y-- -- -| This function may be used as a value for `Data.Foldable.foldMap`- -- in a `Foldable` instance.- --- -- @- -- 'foldMapDefault' f ≡ 'getConst' . 'traverse' ('Const' . f)- -- @- foldMapDefault :: forall t m a . (Traversable t, Monoid m)- => (a -> m) -> t a -> m- foldMapDefault f x = case traverse (mkConst . f) x of Const y -> y- where- mkConst :: m -> Const m ()- mkConst = Const- |])+{-# LANGUAGE DataKinds #-} +{-# LANGUAGE DefaultSignatures #-} +{-# LANGUAGE NoNamedWildCards #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE UndecidableInstances #-} + +----------------------------------------------------------------------------- +-- | +-- Module : Data.Traversable.Singletons +-- Copyright : (C) 2018 Ryan Scott +-- License : BSD-style (see LICENSE) +-- Maintainer : Ryan Scott +-- Stability : experimental +-- Portability : non-portable +-- +-- Defines the promoted and singled versions of the 'Traversable' type class. +-- +---------------------------------------------------------------------------- + +module Data.Traversable.Singletons ( + PTraversable(..), STraversable(..), + For, sFor, + ForM, sForM, + MapAccumL, sMapAccumL, + MapAccumR, sMapAccumR, + FmapDefault, sFmapDefault, + FoldMapDefault, sFoldMapDefault, + + -- * Defunctionalization symbols + TraverseSym0, TraverseSym1, TraverseSym2, + SequenceASym0, SequenceASym1, + MapMSym0, MapMSym1, MapMSym2, + SequenceSym0, SequenceSym1, + + ForSym0, ForSym1, ForSym2, + ForMSym0, ForMSym1, ForMSym2, + MapAccumLSym0, MapAccumLSym1, MapAccumLSym2, MapAccumLSym3, + MapAccumRSym0, MapAccumRSym1, MapAccumRSym2, MapAccumRSym3, + FmapDefaultSym0, FmapDefaultSym1, FmapDefaultSym2, + FoldMapDefaultSym0, FoldMapDefaultSym1, FoldMapDefaultSym2 + ) where + +import Control.Applicative +import Control.Monad.Singletons.Internal +import Data.Foldable.Singletons (SFoldable) +import Data.Functor.Const.Singletons +import Data.Functor.Identity +import Data.Functor.Identity.Singletons +import Data.Functor.Singletons () +import Data.Kind +import Data.List.NonEmpty (NonEmpty(..)) +import Data.Monoid +import Data.Monoid.Singletons +import Data.Proxy.Singletons +import Data.Singletons +import Data.Singletons.Base.Instances +import Data.Singletons.TH +import GHC.Base.Singletons hiding (Const, ConstSym0) + +type StateL :: Type -> Type -> Type +newtype StateL s a = StateL (s ~> (s, a)) +type SStateL :: forall s a. StateL s a -> Type +data SStateL state where + SStateL :: Sing x -> SStateL ('StateL x) +type instance Sing = SStateL +type StateLSym0 :: forall s a. (s ~> (s, a)) ~> StateL s a +data StateLSym0 z +type instance Apply StateLSym0 x = 'StateL x + +type StateR :: Type -> Type -> Type +newtype StateR s a = StateR (s ~> (s, a)) +type SStateR :: forall s a. StateR s a -> Type +data SStateR state where + SStateR :: Sing x -> SStateR ('StateR x) +type instance Sing = SStateR +type StateRSym0 :: forall s a. (s ~> (s, a)) ~> StateR s a +data StateRSym0 z +type instance Apply StateRSym0 x = 'StateR x + +$(singletonsOnly [d| + runStateL :: StateL s a -> (s -> (s, a)) + runStateL (StateL x) = x + + runStateR :: StateR s a -> (s -> (s, a)) + runStateR (StateR x) = x + |]) + +$(singletonsOnly [d| + -- -| Functors representing data structures that can be traversed from + -- left to right. + -- + -- A definition of 'traverse' must satisfy the following laws: + -- + -- [/naturality/] + -- @t . 'traverse' f = 'traverse' (t . f)@ + -- for every applicative transformation @t@ + -- + -- [/identity/] + -- @'traverse' Identity = Identity@ + -- + -- [/composition/] + -- @'traverse' (Compose . 'fmap' g . f) = Compose . 'fmap' ('traverse' g) . 'traverse' f@ + -- + -- A definition of 'sequenceA' must satisfy the following laws: + -- + -- [/naturality/] + -- @t . 'sequenceA' = 'sequenceA' . 'fmap' t@ + -- for every applicative transformation @t@ + -- + -- [/identity/] + -- @'sequenceA' . 'fmap' Identity = Identity@ + -- + -- [/composition/] + -- @'sequenceA' . 'fmap' Compose = Compose . 'fmap' 'sequenceA' . 'sequenceA'@ + -- + -- where an /applicative transformation/ is a function + -- + -- @t :: (Applicative f, Applicative g) => f a -> g a@ + -- + -- preserving the 'Applicative' operations, i.e. + -- + -- * @t ('pure' x) = 'pure' x@ + -- + -- * @t (x '<*>' y) = t x '<*>' t y@ + -- + -- and the identity functor @Identity@ and composition of functors @Compose@ + -- are defined as + -- + -- > newtype Identity a = Identity a + -- > + -- > instance Functor Identity where + -- > fmap f (Identity x) = Identity (f x) + -- > + -- > instance Applicative Identity where + -- > pure x = Identity x + -- > Identity f <*> Identity x = Identity (f x) + -- > + -- > newtype Compose f g a = Compose (f (g a)) + -- > + -- > instance (Functor f, Functor g) => Functor (Compose f g) where + -- > fmap f (Compose x) = Compose (fmap (fmap f) x) + -- > + -- > instance (Applicative f, Applicative g) => Applicative (Compose f g) where + -- > pure x = Compose (pure (pure x)) + -- > Compose f <*> Compose x = Compose ((<*>) <$> f <*> x) + -- + -- (The naturality law is implied by parametricity.) + -- + -- Instances are similar to 'Functor', e.g. given a data type + -- + -- > data Tree a = Empty | Leaf a | Node (Tree a) a (Tree a) + -- + -- a suitable instance would be + -- + -- > instance Traversable Tree where + -- > traverse f Empty = pure Empty + -- > traverse f (Leaf x) = Leaf <$> f x + -- > traverse f (Node l k r) = Node <$> traverse f l <*> f k <*> traverse f r + -- + -- This is suitable even for abstract types, as the laws for '<*>' + -- imply a form of associativity. + -- + -- The superclass instances should satisfy the following: + -- + -- * In the 'Functor' instance, 'fmap' should be equivalent to traversal + -- with the identity applicative functor ('fmapDefault'). + -- + -- * In the 'Foldable' instance, 'Data.Foldable.foldMap' should be + -- equivalent to traversal with a constant applicative functor + -- ('foldMapDefault'). + -- + class (Functor t, Foldable t) => Traversable t where + -- {-# MINIMAL traverse | sequenceA #-} + + -- -| Map each element of a structure to an action, evaluate these actions + -- from left to right, and collect the results. For a version that ignores + -- the results see 'Data.Foldable.traverse_'. + traverse :: Applicative f => (a -> f b) -> t a -> f (t b) + traverse f = sequenceA . fmap f + + -- -| Evaluate each action in the structure from left to right, and + -- and collect the results. For a version that ignores the results + -- see 'Data.Foldable.sequenceA_'. + sequenceA :: Applicative f => t (f a) -> f (t a) + sequenceA = traverse id + + -- -| Map each element of a structure to a monadic action, evaluate + -- these actions from left to right, and collect the results. For + -- a version that ignores the results see 'Data.Foldable.mapM_'. + mapM :: Monad m => (a -> m b) -> t a -> m (t b) + mapM = traverse + + -- -| Evaluate each monadic action in the structure from left to + -- right, and collect the results. For a version that ignores the + -- results see 'Data.Foldable.sequence_'. + sequence :: Monad m => t (m a) -> m (t a) + sequence = sequenceA + |]) + +$(singletonsOnly [d| + -- instances for Prelude types + + deriving instance Traversable Maybe + deriving instance Traversable [] + deriving instance Traversable NonEmpty + deriving instance Traversable (Either a) + deriving instance Traversable ((,) a) + + instance Traversable Proxy where + traverse _ _ = pure Proxy + sequenceA _ = pure Proxy + mapM _ _ = pure Proxy + sequence _ = pure Proxy + + deriving instance Traversable (Const m) + deriving instance Traversable Dual + deriving instance Traversable Sum + deriving instance Traversable Product + deriving instance Traversable First + deriving instance Traversable Last + deriving instance Traversable Identity + + -- general functions + + -- -| 'for' is 'traverse' with its arguments flipped. For a version + -- that ignores the results see 'Data.Foldable.for_'. + for :: (Traversable t, Applicative f) => t a -> (a -> f b) -> f (t b) + for = flip traverse + + -- -| 'forM' is 'mapM' with its arguments flipped. For a version that + -- ignores the results see 'Data.Foldable.forM_'. + forM :: (Traversable t, Monad m) => t a -> (a -> m b) -> m (t b) + forM = flip mapM + + instance Functor (StateL s) where + fmap f (StateL k) = StateL $ \ s -> let (s', v) = k s in (s', f v) + + instance Applicative (StateL s) where + pure x = StateL (\ s -> (s, x)) + StateL kf <*> StateL kv = StateL $ \ s -> + let (s', f) = kf s + (s'', v) = kv s' + in (s'', f v) + liftA2 f (StateL kx) (StateL ky) = StateL $ \s -> + let (s', x) = kx s + (s'', y) = ky s' + in (s'', f x y) + + instance Functor (StateR s) where + fmap f (StateR k) = StateR $ \ s -> let (s', v) = k s in (s', f v) + + instance Applicative (StateR s) where + pure x = StateR (\ s -> (s, x)) + StateR kf <*> StateR kv = StateR $ \ s -> + let (s', v) = kv s + (s'', f) = kf s' + in (s'', f v) + liftA2 f (StateR kx) (StateR ky) = StateR $ \ s -> + let (s', y) = ky s + (s'', x) = kx s' + in (s'', f x y) + + -- -|The 'mapAccumL' function behaves like a combination of 'fmap' + -- and 'foldl'; it applies a function to each element of a structure, + -- passing an accumulating parameter from left to right, and returning + -- a final value of this accumulator together with the new structure. + mapAccumL :: forall t a b c. Traversable t + => (a -> b -> (a, c)) -> a -> t b -> (a, t c) + mapAccumL f s t = runStateL (traverse (StateL . flip f) t) s + + -- -|The 'mapAccumR' function behaves like a combination of 'fmap' + -- and 'foldr'; it applies a function to each element of a structure, + -- passing an accumulating parameter from right to left, and returning + -- a final value of this accumulator together with the new structure. + mapAccumR :: Traversable t => (a -> b -> (a, c)) -> a -> t b -> (a, t c) + mapAccumR f s t = runStateR (traverse (StateR . flip f) t) s + + -- -| This function may be used as a value for `fmap` in a `Functor` + -- instance, provided that 'traverse' is defined. (Using + -- `fmapDefault` with a `Traversable` instance defined only by + -- 'sequenceA' will result in infinite recursion.) + -- + -- @ + -- 'fmapDefault' f ≡ 'runIdentity' . 'traverse' ('Identity' . f) + -- @ + fmapDefault :: forall t a b . Traversable t + => (a -> b) -> t a -> t b + fmapDefault f x = case traverse (Identity . f) x of Identity y -> y + + -- -| This function may be used as a value for `Data.Foldable.foldMap` + -- in a `Foldable` instance. + -- + -- @ + -- 'foldMapDefault' f ≡ 'getConst' . 'traverse' ('Const' . f) + -- @ + foldMapDefault :: forall t m a . (Traversable t, Monoid m) + => (a -> m) -> t a -> m + foldMapDefault f x = case traverse (mkConst . f) x of Const y -> y + where + mkConst :: m -> Const m () + mkConst = Const + |])
src/Data/Tuple/Singletons.hs view
@@ -1,74 +1,74 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE UndecidableInstances #-}---------------------------------------------------------------------------------- |--- Module : Data.Tuple.Singletons--- Copyright : (C) 2013 Richard Eisenberg--- License : BSD-style (see LICENSE)--- Maintainer : Ryan Scott--- Stability : experimental--- Portability : non-portable------ Defines functions and datatypes relating to the singleton for tuples,--- including singled versions of all the definitions in @Data.Tuple@.------ Because many of these definitions are produced by Template Haskell,--- it is not possible to create proper Haddock documentation. Please look--- up the corresponding operation in @Data.Tuple@. Also, please excuse--- the apparent repeated variable names. This is due to an interaction--- between Template Haskell and Haddock.----------------------------------------------------------------------------------module Data.Tuple.Singletons (- -- * Singleton definitions- -- | See 'Sing' for more info.-- Sing, STuple0(..), STuple2(..), STuple3(..),- STuple4(..), STuple5(..), STuple6(..), STuple7(..),-- -- * Singletons from @Data.Tuple@- Fst, sFst, Snd, sSnd, Curry, sCurry, Uncurry, sUncurry, Swap, sSwap,-- -- * Defunctionalization symbols- Tuple0Sym0,- Tuple2Sym0, Tuple2Sym1, Tuple2Sym2,- Tuple3Sym0, Tuple3Sym1, Tuple3Sym2, Tuple3Sym3,- Tuple4Sym0, Tuple4Sym1, Tuple4Sym2, Tuple4Sym3, Tuple4Sym4,- Tuple5Sym0, Tuple5Sym1, Tuple5Sym2, Tuple5Sym3, Tuple5Sym4, Tuple5Sym5,- Tuple6Sym0, Tuple6Sym1, Tuple6Sym2, Tuple6Sym3, Tuple6Sym4, Tuple6Sym5, Tuple6Sym6,- Tuple7Sym0, Tuple7Sym1, Tuple7Sym2, Tuple7Sym3, Tuple7Sym4, Tuple7Sym5, Tuple7Sym6, Tuple7Sym7,-- FstSym0, FstSym1, SndSym0, SndSym1,- CurrySym0, CurrySym1, CurrySym2, CurrySym3,- UncurrySym0, UncurrySym1, UncurrySym2,- SwapSym0, SwapSym1- ) where--import Data.Singletons.Base.Instances-import Data.Singletons.TH--$(singletonsOnly [d|- -- -| Extract the first component of a pair.- fst :: (a,b) -> a- fst (x,_) = x-- -- -| Extract the second component of a pair.- snd :: (a,b) -> b- snd (_,y) = y-- -- -| 'curry' converts an uncurried function to a curried function.- curry :: ((a, b) -> c) -> a -> b -> c- curry f x y = f (x, y)-- -- -| 'uncurry' converts a curried function to a function on pairs.- uncurry :: (a -> b -> c) -> ((a, b) -> c)- uncurry f p = f (fst p) (snd p)-- -- -| Swap the components of a pair.- swap :: (a,b) -> (b,a)- swap (a,b) = (b,a)- |])+{-# LANGUAGE DataKinds #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE UndecidableInstances #-} + +----------------------------------------------------------------------------- +-- | +-- Module : Data.Tuple.Singletons +-- Copyright : (C) 2013 Richard Eisenberg +-- License : BSD-style (see LICENSE) +-- Maintainer : Ryan Scott +-- Stability : experimental +-- Portability : non-portable +-- +-- Defines functions and datatypes relating to the singleton for tuples, +-- including singled versions of all the definitions in @Data.Tuple@. +-- +-- Because many of these definitions are produced by Template Haskell, +-- it is not possible to create proper Haddock documentation. Please look +-- up the corresponding operation in @Data.Tuple@. Also, please excuse +-- the apparent repeated variable names. This is due to an interaction +-- between Template Haskell and Haddock. +-- +---------------------------------------------------------------------------- + +module Data.Tuple.Singletons ( + -- * Singleton definitions + -- | See 'Sing' for more info. + + Sing, STuple0(..), STuple2(..), STuple3(..), + STuple4(..), STuple5(..), STuple6(..), STuple7(..), + + -- * Singletons from @Data.Tuple@ + Fst, sFst, Snd, sSnd, Curry, sCurry, Uncurry, sUncurry, Swap, sSwap, + + -- * Defunctionalization symbols + Tuple0Sym0, + Tuple2Sym0, Tuple2Sym1, Tuple2Sym2, + Tuple3Sym0, Tuple3Sym1, Tuple3Sym2, Tuple3Sym3, + Tuple4Sym0, Tuple4Sym1, Tuple4Sym2, Tuple4Sym3, Tuple4Sym4, + Tuple5Sym0, Tuple5Sym1, Tuple5Sym2, Tuple5Sym3, Tuple5Sym4, Tuple5Sym5, + Tuple6Sym0, Tuple6Sym1, Tuple6Sym2, Tuple6Sym3, Tuple6Sym4, Tuple6Sym5, Tuple6Sym6, + Tuple7Sym0, Tuple7Sym1, Tuple7Sym2, Tuple7Sym3, Tuple7Sym4, Tuple7Sym5, Tuple7Sym6, Tuple7Sym7, + + FstSym0, FstSym1, SndSym0, SndSym1, + CurrySym0, CurrySym1, CurrySym2, CurrySym3, + UncurrySym0, UncurrySym1, UncurrySym2, + SwapSym0, SwapSym1 + ) where + +import Data.Singletons.Base.Instances +import Data.Singletons.TH + +$(singletonsOnly [d| + -- -| Extract the first component of a pair. + fst :: (a,b) -> a + fst (x,_) = x + + -- -| Extract the second component of a pair. + snd :: (a,b) -> b + snd (_,y) = y + + -- -| 'curry' converts an uncurried function to a curried function. + curry :: ((a, b) -> c) -> a -> b -> c + curry f x y = f (x, y) + + -- -| 'uncurry' converts a curried function to a function on pairs. + uncurry :: (a -> b -> c) -> ((a, b) -> c) + uncurry f p = f (fst p) (snd p) + + -- -| Swap the components of a pair. + swap :: (a,b) -> (b,a) + swap (a,b) = (b,a) + |])
src/Data/Void/Singletons.hs view
@@ -1,46 +1,46 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE UndecidableInstances #-}---------------------------------------------------------------------------------- |--- Module : Data.Void.Singletons--- Copyright : (C) 2017 Ryan Scott--- License : BSD-style (see LICENSE)--- Maintainer : Ryan Scott--- Stability : experimental--- Portability : non-portable------ Defines functions and datatypes relating to the singleton for 'Void',--- including singled versions of all the definitions in @Data.Void@.------ Because many of these definitions are produced by Template Haskell,--- it is not possible to create proper Haddock documentation. Please look--- up the corresponding operation in @Data.Void@. Also, please excuse--- the apparent repeated variable names. This is due to an interaction--- between Template Haskell and Haddock.---------------------------------------------------------------------------------module Data.Void.Singletons (- -- * The 'Void' singleton- Sing, SVoid,- -- | Just as 'Void' has no constructors, 'SVoid' also has no constructors.-- -- * Singletons from @Data.Void@- Absurd, sAbsurd,-- -- * Defunctionalization symbols- AbsurdSym0, AbsurdSym1- ) where--import Data.Singletons-import Data.Singletons.Base.Instances-import Data.Singletons.TH--$(singletonsOnly [d|- -- -| Since 'Void' values logically don't exist, this witnesses the- -- logical reasoning tool of \"ex falso quodlibet\".- absurd :: Void -> a- absurd a = case a of {}- |])+{-# LANGUAGE DataKinds #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE UndecidableInstances #-} + +----------------------------------------------------------------------------- +-- | +-- Module : Data.Void.Singletons +-- Copyright : (C) 2017 Ryan Scott +-- License : BSD-style (see LICENSE) +-- Maintainer : Ryan Scott +-- Stability : experimental +-- Portability : non-portable +-- +-- Defines functions and datatypes relating to the singleton for 'Void', +-- including singled versions of all the definitions in @Data.Void@. +-- +-- Because many of these definitions are produced by Template Haskell, +-- it is not possible to create proper Haddock documentation. Please look +-- up the corresponding operation in @Data.Void@. Also, please excuse +-- the apparent repeated variable names. This is due to an interaction +-- between Template Haskell and Haddock. +-- +---------------------------------------------------------------------------- +module Data.Void.Singletons ( + -- * The 'Void' singleton + Sing, SVoid, + -- | Just as 'Void' has no constructors, 'SVoid' also has no constructors. + + -- * Singletons from @Data.Void@ + Absurd, sAbsurd, + + -- * Defunctionalization symbols + AbsurdSym0, AbsurdSym1 + ) where + +import Data.Singletons +import Data.Singletons.Base.Instances +import Data.Singletons.TH + +$(singletonsOnly [d| + -- -| Since 'Void' values logically don't exist, this witnesses the + -- logical reasoning tool of \"ex falso quodlibet\". + absurd :: Void -> a + absurd a = case a of {} + |])
src/GHC/Base/Singletons.hs view
@@ -1,111 +1,111 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE UndecidableInstances #-}---------------------------------------------------------------------------------- |--- Module : GHC.Base.Singletons--- Copyright : (C) 2014 Jan Stolarek--- License : BSD-style (see LICENSE)--- Maintainer : Jan Stolarek (jan.stolarek@p.lodz.pl)--- Stability : experimental--- Portability : non-portable------ Implements singletonized versions of functions from @GHC.Base@ module.------ Because many of these definitions are produced by Template Haskell,--- it is not possible to create proper Haddock documentation. Please look--- up the corresponding operation in @Data.Tuple@. Also, please excuse--- the apparent repeated variable names. This is due to an interaction--- between Template Haskell and Haddock.----------------------------------------------------------------------------------module GHC.Base.Singletons (- -- * Basic functions- Foldr, sFoldr, Map, sMap, type (++), (%++), Otherwise, sOtherwise,- Id, sId, Const, sConst, type (.), (%.), type ($), type ($!), (%$), (%$!),- Until, sUntil, Flip, sFlip, AsTypeOf, sAsTypeOf,- Seq, sSeq,-- -- * Defunctionalization symbols- FoldrSym0, FoldrSym1, FoldrSym2, FoldrSym3,- MapSym0, MapSym1, MapSym2,- type (++@#@$), type (++@#@$$), type (++@#@$$$),- OtherwiseSym0,- IdSym0, IdSym1,- ConstSym0, ConstSym1, ConstSym2,- type (.@#@$), type (.@#@$$), type (.@#@$$$), type (.@#@$$$$),- type ($@#@$), type ($@#@$$), type ($@#@$$$),- type ($!@#@$), type ($!@#@$$), type ($!@#@$$$),- UntilSym0, UntilSym1, UntilSym2, UntilSym3,- FlipSym0, FlipSym1, FlipSym2, FlipSym3,- AsTypeOfSym0, AsTypeOfSym1, AsTypeOfSym2,- SeqSym0, SeqSym1, SeqSym2- ) where--import Data.Bool.Singletons-import Data.Singletons.Base.Instances-import Data.Singletons.TH---- Promoted and singletonized versions of "otherwise" are imported and--- re-exported from Data.Bool.Singletons. This is done to avoid cyclic--- module dependencies.--$(singletonsOnly [d|- foldr :: (a -> b -> b) -> b -> [a] -> b- foldr k z = go- where- go [] = z- go (y:ys) = y `k` go ys-- map :: (a -> b) -> [a] -> [b]- map _ [] = []- map f (x:xs) = f x : map f xs-- (++) :: [a] -> [a] -> [a]- (++) [] ys = ys- (++) (x:xs) ys = x : xs ++ ys- infixr 5 ++-- id :: a -> a- id x = x-- const :: a -> b -> a- const x _ = x-- (.) :: (b -> c) -> (a -> b) -> a -> c- (.) f g = \x -> f (g x)- infixr 9 .-- flip :: (a -> b -> c) -> b -> a -> c- flip f x y = f y x-- asTypeOf :: a -> a -> a- asTypeOf = const-- ($) :: (a -> b) -> a -> b- f $ x = f x- infixr 0 $-- ($!) :: (a -> b) -> a -> b- f $! x = let {-!-}vx = x in f vx- infixr 0 $!-- until :: (a -> Bool) -> (a -> a) -> a -> a- until p f = go- where- -- Does not singletonize due to overlapping patterns.- {-- go x | p x = x- | otherwise = go (f x)- -}- go x = if p x then x else go (f x)-- -- This is not part of GHC.Base, but we need to emulate seq and this is a good- -- place to do it.- seq :: a -> b -> b- seq _ x = x- infixr 0 `seq`- |])+{-# LANGUAGE DataKinds #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE UndecidableInstances #-} + +----------------------------------------------------------------------------- +-- | +-- Module : GHC.Base.Singletons +-- Copyright : (C) 2014 Jan Stolarek +-- License : BSD-style (see LICENSE) +-- Maintainer : Jan Stolarek (jan.stolarek@p.lodz.pl) +-- Stability : experimental +-- Portability : non-portable +-- +-- Implements singletonized versions of functions from @GHC.Base@ module. +-- +-- Because many of these definitions are produced by Template Haskell, +-- it is not possible to create proper Haddock documentation. Please look +-- up the corresponding operation in @Data.Tuple@. Also, please excuse +-- the apparent repeated variable names. This is due to an interaction +-- between Template Haskell and Haddock. +-- +---------------------------------------------------------------------------- + +module GHC.Base.Singletons ( + -- * Basic functions + Foldr, sFoldr, Map, sMap, type (++), (%++), Otherwise, sOtherwise, + Id, sId, Const, sConst, type (.), (%.), type ($), type ($!), (%$), (%$!), + Until, sUntil, Flip, sFlip, AsTypeOf, sAsTypeOf, + Seq, sSeq, + + -- * Defunctionalization symbols + FoldrSym0, FoldrSym1, FoldrSym2, FoldrSym3, + MapSym0, MapSym1, MapSym2, + type (++@#@$), type (++@#@$$), type (++@#@$$$), + OtherwiseSym0, + IdSym0, IdSym1, + ConstSym0, ConstSym1, ConstSym2, + type (.@#@$), type (.@#@$$), type (.@#@$$$), type (.@#@$$$$), + type ($@#@$), type ($@#@$$), type ($@#@$$$), + type ($!@#@$), type ($!@#@$$), type ($!@#@$$$), + UntilSym0, UntilSym1, UntilSym2, UntilSym3, + FlipSym0, FlipSym1, FlipSym2, FlipSym3, + AsTypeOfSym0, AsTypeOfSym1, AsTypeOfSym2, + SeqSym0, SeqSym1, SeqSym2 + ) where + +import Data.Bool.Singletons +import Data.Singletons.Base.Instances +import Data.Singletons.TH + +-- Promoted and singletonized versions of "otherwise" are imported and +-- re-exported from Data.Bool.Singletons. This is done to avoid cyclic +-- module dependencies. + +$(singletonsOnly [d| + foldr :: (a -> b -> b) -> b -> [a] -> b + foldr k z = go + where + go [] = z + go (y:ys) = y `k` go ys + + map :: (a -> b) -> [a] -> [b] + map _ [] = [] + map f (x:xs) = f x : map f xs + + (++) :: [a] -> [a] -> [a] + (++) [] ys = ys + (++) (x:xs) ys = x : xs ++ ys + infixr 5 ++ + + id :: a -> a + id x = x + + const :: a -> b -> a + const x _ = x + + (.) :: (b -> c) -> (a -> b) -> a -> c + (.) f g = \x -> f (g x) + infixr 9 . + + flip :: (a -> b -> c) -> b -> a -> c + flip f x y = f y x + + asTypeOf :: a -> a -> a + asTypeOf = const + + ($) :: (a -> b) -> a -> b + f $ x = f x + infixr 0 $ + + ($!) :: (a -> b) -> a -> b + f $! x = let {-!-}vx = x in f vx + infixr 0 $! + + until :: (a -> Bool) -> (a -> a) -> a -> a + until p f = go + where + -- Does not singletonize due to overlapping patterns. + {- + go x | p x = x + | otherwise = go (f x) + -} + go x = if p x then x else go (f x) + + -- This is not part of GHC.Base, but we need to emulate seq and this is a good + -- place to do it. + seq :: a -> b -> b + seq _ x = x + infixr 0 `seq` + |])
src/GHC/Num/Singletons.hs view
@@ -1,141 +1,131 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE DefaultSignatures #-}-{-# LANGUAGE NoStarIsType #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE UndecidableInstances #-}---------------------------------------------------------------------------------- |--- Module : GHC.Num.Singletons--- Copyright : (C) 2014 Richard Eisenberg--- License : BSD-style (see LICENSE)--- Maintainer : Ryan Scott--- Stability : experimental--- Portability : non-portable------ Defines and exports promoted and singleton versions of definitions from--- "GHC.Num".------ Be warned that some of the associated type families in the 'PNum' class--- (@(+)@, @(-)@, and @(*)@) clash with their counterparts for 'Natural' in the--- "GHC.TypeLits" module.-------------------------------------------------------------------------------module GHC.Num.Singletons (- PNum(..), SNum(..), Subtract, sSubtract,-- -- ** Defunctionalization symbols- type (+@#@$), type (+@#@$$), type (+@#@$$$),- type (-@#@$), type (-@#@$$), type (-@#@$$$),- type (*@#@$), type (*@#@$$), type (*@#@$$$),- NegateSym0, NegateSym1,- AbsSym0, AbsSym1,- SignumSym0, SignumSym1,- FromIntegerSym0, FromIntegerSym1,- SubtractSym0, SubtractSym1, SubtractSym2- ) where--import Data.Ord (Down(..))-import Data.Ord.Singletons-import Data.Singletons-import Data.Singletons.Decide-import Data.Singletons.TH-import GHC.TypeLits.Singletons.Internal-import qualified GHC.TypeNats as TN-import GHC.TypeNats (SomeNat(..), someNatVal)-import Unsafe.Coerce--$(singletonsOnly [d|- -- Basic numeric class.- --- -- Minimal complete definition: all except 'negate' or @(-)@- class Num a where- (+), (-), (*) :: a -> a -> a- infixl 6 +- infixl 6 -- infixl 7 *- -- Unary negation.- negate :: a -> a- -- Absolute value.- abs :: a -> a- -- Sign of a number.- -- The functions 'abs' and 'signum' should satisfy the law:- --- -- > abs x * signum x == x- --- -- For real numbers, the 'signum' is either @-1@ (negative), @0@ (zero)- -- or @1@ (positive).- signum :: a -> a- -- Conversion from a 'Natural'.- fromInteger :: Natural -> a-- x - y = x + negate y-- negate x = 0 - x-- subtract :: Num a => a -> a -> a- subtract x y = y - x-- -- deriving newtype instance Num a => Num (Down a)- instance Num a => Num (Down a) where- Down a + Down b = Down (a + b)- Down a - Down b = Down (a - b)- Down a * Down b = Down (a * b)- negate (Down a) = Down (negate a)- abs (Down a) = Down (abs a)- signum (Down a) = Down (signum a)- fromInteger n = Down (fromInteger n)- |])---- PNum instance-type SignumNat :: Natural -> Natural-type family SignumNat a where- SignumNat 0 = 0- SignumNat x = 1--instance PNum Natural where- type a + b = a TN.+ b- type a - b = a TN.- b- type a * b = a TN.* b- type Negate (a :: Natural) = Error "Cannot negate a natural number"- type Abs (a :: Natural) = a- type Signum a = SignumNat a- type FromInteger a = a---- SNum instance-instance SNum Natural where- sa %+ sb =- let a = fromSing sa- b = fromSing sb- ex = someNatVal (a + b)- in- case ex of- SomeNat (_ :: Proxy ab) -> unsafeCoerce (SNat :: Sing ab)-- sa %- sb =- let a = fromSing sa- b = fromSing sb- ex = someNatVal (a - b)- in- case ex of- SomeNat (_ :: Proxy ab) -> unsafeCoerce (SNat :: Sing ab)-- sa %* sb =- let a = fromSing sa- b = fromSing sb- ex = someNatVal (a * b)- in- case ex of- SomeNat (_ :: Proxy ab) -> unsafeCoerce (SNat :: Sing ab)-- sNegate _ = error "Cannot call sNegate on a natural number singleton."-- sAbs x = x-- sSignum sx =- case sx %~ (sing :: Sing 0) of- Proved Refl -> sing :: Sing 0- Disproved _ -> unsafeCoerce (sing :: Sing 1)-- sFromInteger x = x+{-# LANGUAGE DataKinds #-} +{-# LANGUAGE DefaultSignatures #-} +{-# LANGUAGE NoStarIsType #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE UndecidableInstances #-} + +----------------------------------------------------------------------------- +-- | +-- Module : GHC.Num.Singletons +-- Copyright : (C) 2014 Richard Eisenberg +-- License : BSD-style (see LICENSE) +-- Maintainer : Ryan Scott +-- Stability : experimental +-- Portability : non-portable +-- +-- Defines and exports promoted and singleton versions of definitions from +-- "GHC.Num". +-- +-- Be warned that some of the associated type families in the 'PNum' class +-- (@(+)@, @(-)@, and @(*)@) clash with their counterparts for 'Natural' in the +-- "GHC.TypeLits" module. +---------------------------------------------------------------------------- + +module GHC.Num.Singletons ( + PNum(..), SNum(..), Subtract, sSubtract, + + -- ** Defunctionalization symbols + type (+@#@$), type (+@#@$$), type (+@#@$$$), + type (-@#@$), type (-@#@$$), type (-@#@$$$), + type (*@#@$), type (*@#@$$), type (*@#@$$$), + NegateSym0, NegateSym1, + AbsSym0, AbsSym1, + SignumSym0, SignumSym1, + FromIntegerSym0, FromIntegerSym1, + SubtractSym0, SubtractSym1, SubtractSym2 + ) where + +import Data.Ord (Down(..)) +import Data.Ord.Singletons +import Data.Singletons +import Data.Singletons.Decide +import Data.Singletons.TH +import GHC.TypeLits.Singletons.Internal +import qualified GHC.TypeNats as TN +import Unsafe.Coerce + +$(singletonsOnly [d| + -- Basic numeric class. + -- + -- Minimal complete definition: all except 'negate' or @(-)@ + class Num a where + (+), (-), (*) :: a -> a -> a + infixl 6 + + infixl 6 - + infixl 7 * + -- Unary negation. + negate :: a -> a + -- Absolute value. + abs :: a -> a + -- Sign of a number. + -- The functions 'abs' and 'signum' should satisfy the law: + -- + -- > abs x * signum x == x + -- + -- For real numbers, the 'signum' is either @-1@ (negative), @0@ (zero) + -- or @1@ (positive). + signum :: a -> a + -- Conversion from a 'Natural'. + fromInteger :: Natural -> a + + x - y = x + negate y + + negate x = 0 - x + + subtract :: Num a => a -> a -> a + subtract x y = y - x + + -- deriving newtype instance Num a => Num (Down a) + instance Num a => Num (Down a) where + Down a + Down b = Down (a + b) + Down a - Down b = Down (a - b) + Down a * Down b = Down (a * b) + negate (Down a) = Down (negate a) + abs (Down a) = Down (abs a) + signum (Down a) = Down (signum a) + fromInteger n = Down (fromInteger n) + |]) + +-- PNum instance +type SignumNat :: Natural -> Natural +type family SignumNat a where + SignumNat 0 = 0 + SignumNat x = 1 + +instance PNum Natural where + type a + b = a TN.+ b + type a - b = a TN.- b + type a * b = a TN.* b + type Negate (a :: Natural) = Error "Cannot negate a natural number" + type Abs (a :: Natural) = a + type Signum a = SignumNat a + type FromInteger a = a + +-- SNum instance +instance SNum Natural where + sa %+ sb = + let a = fromSing sa + b = fromSing sb + in TN.withSomeSNat (a + b) unsafeCoerce + + sa %- sb = + let a = fromSing sa + b = fromSing sb + in TN.withSomeSNat (a - b) unsafeCoerce + + sa %* sb = + let a = fromSing sa + b = fromSing sb + in TN.withSomeSNat (a * b) unsafeCoerce + + sNegate _ = error "Cannot call sNegate on a natural number singleton." + + sAbs x = x + + sSignum sx = + case sx %~ (sing :: Sing 0) of + Proved Refl -> sing :: Sing 0 + Disproved _ -> unsafeCoerce (sing :: Sing 1) + + sFromInteger x = x
src/GHC/TypeLits/Singletons.hs view
@@ -1,269 +1,260 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE UndecidableInstances #-}-{-# OPTIONS_GHC -Wno-orphans #-}---------------------------------------------------------------------------------- |--- Module : GHC.TypeLits.Singletons--- Copyright : (C) 2014 Richard Eisenberg--- License : BSD-style (see LICENSE)--- Maintainer : Ryan Scott--- Stability : experimental--- Portability : non-portable------ Defines and exports singletons useful for the Natural, Symbol, and Char--- kinds.----------------------------------------------------------------------------------module GHC.TypeLits.Singletons (- Natural, Symbol, Char,- Sing, SNat(..), SSymbol(..), SChar(..),- withKnownNat, withKnownSymbol, withKnownChar,- Error, sError,- ErrorWithoutStackTrace, sErrorWithoutStackTrace,- Undefined, sUndefined,- KnownNat, natVal,- KnownSymbol, symbolVal,- KnownChar, charVal,-- type (^), (%^),- type (<=?), (%<=?),-- TN.Log2, sLog2,- Div, sDiv, Mod, sMod, DivMod, sDivMod,- Quot, sQuot, Rem, sRem, QuotRem, sQuotRem,-- consSymbol, ConsSymbol, sConsSymbol,- unconsSymbol, UnconsSymbol, sUnconsSymbol,- charToNat, CharToNat, sCharToNat,- natToChar, NatToChar, sNatToChar,-- -- * Defunctionalization symbols- ErrorSym0, ErrorSym1,- ErrorWithoutStackTraceSym0, ErrorWithoutStackTraceSym1,- UndefinedSym0,- KnownNatSym0, KnownNatSym1,- KnownSymbolSym0, KnownSymbolSym1,- KnownCharSym0, KnownCharSym1,- type (^@#@$), type (^@#@$$), type (^@#@$$$),- type (<=?@#@$), type (<=?@#@$$), type (<=?@#@$$$),- Log2Sym0, Log2Sym1,- DivSym0, DivSym1, DivSym2,- ModSym0, ModSym1, ModSym2,- DivModSym0, DivModSym1, DivModSym2,- QuotSym0, QuotSym1, QuotSym2,- RemSym0, RemSym1, RemSym2,- QuotRemSym0, QuotRemSym1, QuotRemSym2,- ConsSymbolSym0, ConsSymbolSym1, ConsSymbolSym2,- UnconsSymbolSym0, UnconsSymbolSym1,- CharToNatSym0, CharToNatSym1,- NatToCharSym0, NatToCharSym1- ) where--import Data.Char (chr, ord)-import qualified Data.List as L (uncons)-import Data.Singletons-import Data.Singletons.TH-import Data.String (IsString(..))-import qualified Data.Text as T-import Data.Tuple.Singletons-import GHC.TypeLits ( CharToNat, ConsSymbol, NatToChar, SomeChar(..)- , SomeSymbol(..), UnconsSymbol, someCharVal, someSymbolVal )-import GHC.TypeLits.Singletons.Internal-import qualified GHC.TypeNats as TN-import GHC.TypeNats (Div, Mod, SomeNat(..))-import Unsafe.Coerce---- | This bogus instance is helpful for people who want to define--- functions over Symbols that will only be used at the type level or--- as singletons.-instance Eq Symbol where- (==) = no_term_level_syms--instance Ord Symbol where- compare = no_term_level_syms--instance IsString Symbol where- fromString = no_term_level_syms--instance Semigroup Symbol where- (<>) = no_term_level_syms--instance Monoid Symbol where- mempty = no_term_level_syms--instance Show Symbol where- showsPrec = no_term_level_syms--no_term_level_syms :: a-no_term_level_syms = error "The kind `Symbol` may not be used at the term level."---- These are often useful in TypeLits-heavy code-$(genDefunSymbols [''KnownNat, ''KnownSymbol, ''KnownChar])----------------------------------------------------------------- Log2, Div, Mod, DivMod, and friends---------------------------------------------------------------{- | Adapted from GHC's source code.--Compute the logarithm of a number in the given base, rounded down to the-closest integer. -}-genLog2 :: Natural -> Natural-genLog2 x = exactLoop 0 x- where- exactLoop s i- | i == 1 = s- | i < 2 = s- | otherwise =- let s1 = s + 1- in s1 `seq` case divMod i 2 of- (j,r)- | r == 0 -> exactLoop s1 j- | otherwise -> underLoop s1 j-- underLoop s i- | i < 2 = s- | otherwise = let s1 = s + 1 in s1 `seq` underLoop s1 (div i 2)---sLog2 :: Sing x -> Sing (TN.Log2 x)-sLog2 sx =- let x = fromSing sx- in case x of- 0 -> error "log2 of 0"- _ -> case TN.someNatVal (genLog2 x) of- SomeNat (_ :: Proxy res) -> unsafeCoerce (SNat :: Sing res)-$(genDefunSymbols [''TN.Log2])-instance SingI Log2Sym0 where- sing = singFun1 sLog2--sDiv :: Sing x -> Sing y -> Sing (Div x y)-sDiv sx sy =- let x = fromSing sx- y = fromSing sy- res = TN.someNatVal (x `div` y)- in case res of- SomeNat (_ :: Proxy res) -> unsafeCoerce (SNat :: Sing res)-infixl 7 `sDiv`-$(genDefunSymbols [''Div])-instance SingI DivSym0 where- sing = singFun2 sDiv-instance SingI x => SingI (DivSym1 x) where- sing = singFun1 $ sDiv (sing @x)-instance SingI1 DivSym1 where- liftSing s = singFun1 $ sDiv s--sMod :: Sing x -> Sing y -> Sing (Mod x y)-sMod sx sy =- let x = fromSing sx- y = fromSing sy- res = TN.someNatVal (x `mod` y)- in case res of- SomeNat (_ :: Proxy res) -> unsafeCoerce (SNat :: Sing res)-infixl 7 `sMod`-$(genDefunSymbols [''Mod])-instance SingI ModSym0 where- sing = singFun2 sMod-instance SingI x => SingI (ModSym1 x) where- sing = singFun1 $ sMod $ sing @x-instance SingI1 ModSym1 where- liftSing s = singFun1 $ sMod s--$(promoteOnly [d|- divMod :: Natural -> Natural -> (Natural, Natural)- divMod x y = (div x y, mod x y)-- quotRem :: Natural -> Natural -> (Natural, Natural)- quotRem = divMod-- quot :: Natural -> Natural -> Natural- quot = div- infixl 7 `quot`-- rem :: Natural -> Natural -> Natural- rem = mod- infixl 7 `rem`- |])--sDivMod :: Sing x -> Sing y -> Sing (DivMod x y)-sDivMod sx sy =- let x = fromSing sx- y = fromSing sy- (q,r) = x `divMod` y- qRes = TN.someNatVal q- rRes = TN.someNatVal r- in case (qRes, rRes) of- (SomeNat (_ :: Proxy q), SomeNat (_ :: Proxy r))- -> unsafeCoerce (STuple2 (SNat :: Sing q) (SNat :: Sing r))--sQuotRem :: Sing x -> Sing y -> Sing (QuotRem x y)-sQuotRem = sDivMod--sQuot :: Sing x -> Sing y -> Sing (Quot x y)-sQuot = sDiv-infixl 7 `sQuot`--sRem :: Sing x -> Sing y -> Sing (Rem x y)-sRem = sMod-infixl 7 `sRem`--consSymbol :: Char -> String -> String-consSymbol = (:)--sConsSymbol :: Sing x -> Sing y -> Sing (ConsSymbol x y)-sConsSymbol sx sy =- let x = fromSing sx- y = T.unpack (fromSing sy)- res = someSymbolVal (consSymbol x y)- in case res of- SomeSymbol (_ :: Proxy res) -> unsafeCoerce (SSym :: Sing res)-$(genDefunSymbols [''ConsSymbol])-instance SingI ConsSymbolSym0 where- sing = singFun2 sConsSymbol-instance SingI x => SingI (ConsSymbolSym1 x) where- sing = singFun1 $ sConsSymbol $ sing @x-instance SingI1 ConsSymbolSym1 where- liftSing s = singFun1 $ sConsSymbol s--unconsSymbol :: String -> Maybe (Char, String)-unconsSymbol = L.uncons--sUnconsSymbol :: Sing x -> Sing (UnconsSymbol x)-sUnconsSymbol sx =- let x = T.unpack (fromSing sx)- res = toSing (unconsSymbol x)- in case res of- SomeSing s -> unsafeCoerce s-$(genDefunSymbols [''UnconsSymbol])-instance SingI UnconsSymbolSym0 where- sing = singFun1 sUnconsSymbol--charToNat :: Char -> Natural-charToNat = fromIntegral . ord--sCharToNat :: Sing x -> Sing (CharToNat x)-sCharToNat sx =- let x = fromSing sx- res = TN.someNatVal (charToNat x)- in case res of- SomeNat (_ :: Proxy res) -> unsafeCoerce (SNat :: Sing res)-$(genDefunSymbols [''CharToNat])-instance SingI CharToNatSym0 where- sing = singFun1 sCharToNat--natToChar :: Natural -> Char-natToChar = chr . fromIntegral--sNatToChar :: Sing x -> Sing (NatToChar x)-sNatToChar sx =- let x = fromSing sx- res = someCharVal (natToChar x)- in case res of- SomeChar (_ :: Proxy res) -> unsafeCoerce (SChar :: Sing res)-$(genDefunSymbols [''NatToChar])-instance SingI NatToCharSym0 where- sing = singFun1 sNatToChar+{-# LANGUAGE DataKinds #-} +{-# LANGUAGE PatternSynonyms #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE UndecidableInstances #-} +{-# OPTIONS_GHC -Wno-orphans #-} + +----------------------------------------------------------------------------- +-- | +-- Module : GHC.TypeLits.Singletons +-- Copyright : (C) 2014 Richard Eisenberg +-- License : BSD-style (see LICENSE) +-- Maintainer : Ryan Scott +-- Stability : experimental +-- Portability : non-portable +-- +-- Defines and exports singletons useful for the Natural, Symbol, and Char +-- kinds. +-- +---------------------------------------------------------------------------- + +module GHC.TypeLits.Singletons ( + Natural, Symbol, Char, + Sing, + SNat, pattern SNat, + SSymbol, pattern SSymbol, pattern SSym, + SChar, pattern SChar, + withKnownNat, withKnownSymbol, withKnownChar, + Error, sError, + ErrorWithoutStackTrace, sErrorWithoutStackTrace, + Undefined, sUndefined, + KnownNat, natVal, + KnownSymbol, symbolVal, + KnownChar, charVal, + + type (^), (%^), + type (<=?), (%<=?), + + TN.Log2, sLog2, + Div, sDiv, Mod, sMod, DivMod, sDivMod, + Quot, sQuot, Rem, sRem, QuotRem, sQuotRem, + + consSymbol, ConsSymbol, sConsSymbol, + unconsSymbol, UnconsSymbol, sUnconsSymbol, + charToNat, CharToNat, sCharToNat, + natToChar, NatToChar, sNatToChar, + + -- * Defunctionalization symbols + ErrorSym0, ErrorSym1, + ErrorWithoutStackTraceSym0, ErrorWithoutStackTraceSym1, + UndefinedSym0, + KnownNatSym0, KnownNatSym1, + KnownSymbolSym0, KnownSymbolSym1, + KnownCharSym0, KnownCharSym1, + type (^@#@$), type (^@#@$$), type (^@#@$$$), + type (<=?@#@$), type (<=?@#@$$), type (<=?@#@$$$), + Log2Sym0, Log2Sym1, + DivSym0, DivSym1, DivSym2, + ModSym0, ModSym1, ModSym2, + DivModSym0, DivModSym1, DivModSym2, + QuotSym0, QuotSym1, QuotSym2, + RemSym0, RemSym1, RemSym2, + QuotRemSym0, QuotRemSym1, QuotRemSym2, + ConsSymbolSym0, ConsSymbolSym1, ConsSymbolSym2, + UnconsSymbolSym0, UnconsSymbolSym1, + CharToNatSym0, CharToNatSym1, + NatToCharSym0, NatToCharSym1 + ) where + +import Data.Char (chr, ord) +import qualified Data.List as L (uncons) +import Data.Singletons +import Data.Singletons.TH +import Data.String (IsString(..)) +import qualified Data.Text as T +import Data.Tuple.Singletons +import GHC.TypeLits ( CharToNat, ConsSymbol, NatToChar, UnconsSymbol + , withSomeSChar, withSomeSSymbol ) +import GHC.TypeLits.Singletons.Internal +import qualified GHC.TypeNats as TN +import GHC.TypeNats (Div, Mod) +import Unsafe.Coerce + +-- | This bogus instance is helpful for people who want to define +-- functions over Symbols that will only be used at the type level or +-- as singletons. +instance Eq Symbol where + (==) = no_term_level_syms + +instance Ord Symbol where + compare = no_term_level_syms + +instance IsString Symbol where + fromString = no_term_level_syms + +instance Semigroup Symbol where + (<>) = no_term_level_syms + +instance Monoid Symbol where + mempty = no_term_level_syms + +instance Show Symbol where + showsPrec = no_term_level_syms + +no_term_level_syms :: a +no_term_level_syms = error "The kind `Symbol` may not be used at the term level." + +-- These are often useful in TypeLits-heavy code +$(genDefunSymbols [''KnownNat, ''KnownSymbol, ''KnownChar]) + +------------------------------------------------------------ +-- Log2, Div, Mod, DivMod, and friends +------------------------------------------------------------ + +{- | Adapted from GHC's source code. + +Compute the logarithm of a number in the given base, rounded down to the +closest integer. -} +genLog2 :: Natural -> Natural +genLog2 x = exactLoop 0 x + where + exactLoop s i + | i == 1 = s + | i < 2 = s + | otherwise = + let s1 = s + 1 + in s1 `seq` case divMod i 2 of + (j,r) + | r == 0 -> exactLoop s1 j + | otherwise -> underLoop s1 j + + underLoop s i + | i < 2 = s + | otherwise = let s1 = s + 1 in s1 `seq` underLoop s1 (div i 2) + + +sLog2 :: Sing x -> Sing (TN.Log2 x) +sLog2 sx = + let x = fromSing sx + in case x of + 0 -> error "log2 of 0" + _ -> TN.withSomeSNat (genLog2 x) unsafeCoerce +$(genDefunSymbols [''TN.Log2]) +instance SingI Log2Sym0 where + sing = singFun1 sLog2 + +sDiv :: Sing x -> Sing y -> Sing (Div x y) +sDiv sx sy = + let x = fromSing sx + y = fromSing sy + in TN.withSomeSNat (x `div` y) unsafeCoerce +infixl 7 `sDiv` +$(genDefunSymbols [''Div]) +instance SingI DivSym0 where + sing = singFun2 sDiv +instance SingI x => SingI (DivSym1 x) where + sing = singFun1 $ sDiv (sing @x) +instance SingI1 DivSym1 where + liftSing s = singFun1 $ sDiv s + +sMod :: Sing x -> Sing y -> Sing (Mod x y) +sMod sx sy = + let x = fromSing sx + y = fromSing sy + in TN.withSomeSNat (x `mod` y) unsafeCoerce +infixl 7 `sMod` +$(genDefunSymbols [''Mod]) +instance SingI ModSym0 where + sing = singFun2 sMod +instance SingI x => SingI (ModSym1 x) where + sing = singFun1 $ sMod $ sing @x +instance SingI1 ModSym1 where + liftSing s = singFun1 $ sMod s + +$(promoteOnly [d| + divMod :: Natural -> Natural -> (Natural, Natural) + divMod x y = (div x y, mod x y) + + quotRem :: Natural -> Natural -> (Natural, Natural) + quotRem = divMod + + quot :: Natural -> Natural -> Natural + quot = div + infixl 7 `quot` + + rem :: Natural -> Natural -> Natural + rem = mod + infixl 7 `rem` + |]) + +sDivMod :: Sing x -> Sing y -> Sing (DivMod x y) +sDivMod sx sy = + let x = fromSing sx + y = fromSing sy + (q,r) = x `divMod` y + in TN.withSomeSNat q $ \sq -> + TN.withSomeSNat r $ \sr -> + unsafeCoerce (STuple2 sq sr) + +sQuotRem :: Sing x -> Sing y -> Sing (QuotRem x y) +sQuotRem = sDivMod + +sQuot :: Sing x -> Sing y -> Sing (Quot x y) +sQuot = sDiv +infixl 7 `sQuot` + +sRem :: Sing x -> Sing y -> Sing (Rem x y) +sRem = sMod +infixl 7 `sRem` + +consSymbol :: Char -> String -> String +consSymbol = (:) + +sConsSymbol :: Sing x -> Sing y -> Sing (ConsSymbol x y) +sConsSymbol sx sy = + let x = fromSing sx + y = T.unpack (fromSing sy) + in withSomeSSymbol (consSymbol x y) unsafeCoerce +$(genDefunSymbols [''ConsSymbol]) +instance SingI ConsSymbolSym0 where + sing = singFun2 sConsSymbol +instance SingI x => SingI (ConsSymbolSym1 x) where + sing = singFun1 $ sConsSymbol $ sing @x +instance SingI1 ConsSymbolSym1 where + liftSing s = singFun1 $ sConsSymbol s + +unconsSymbol :: String -> Maybe (Char, String) +unconsSymbol = L.uncons + +sUnconsSymbol :: Sing x -> Sing (UnconsSymbol x) +sUnconsSymbol sx = + let x = T.unpack (fromSing sx) + res = toSing (unconsSymbol x) + in case res of + SomeSing s -> unsafeCoerce s +$(genDefunSymbols [''UnconsSymbol]) +instance SingI UnconsSymbolSym0 where + sing = singFun1 sUnconsSymbol + +charToNat :: Char -> Natural +charToNat = fromIntegral . ord + +sCharToNat :: Sing x -> Sing (CharToNat x) +sCharToNat sx = + let x = fromSing sx + in TN.withSomeSNat (charToNat x) unsafeCoerce +$(genDefunSymbols [''CharToNat]) +instance SingI CharToNatSym0 where + sing = singFun1 sCharToNat + +natToChar :: Natural -> Char +natToChar = chr . fromIntegral + +sNatToChar :: Sing x -> Sing (NatToChar x) +sNatToChar sx = + let x = fromSing sx + in withSomeSChar (natToChar x) unsafeCoerce +$(genDefunSymbols [''NatToChar]) +instance SingI NatToCharSym0 where + sing = singFun1 sNatToChar
src/GHC/TypeLits/Singletons/Internal.hs view
@@ -1,310 +1,288 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE UndecidableInstances #-}-{-# OPTIONS_GHC -Wno-orphans #-}---------------------------------------------------------------------------------- |--- Module : GHC.TypeLits.Singletons.Internal--- Copyright : (C) 2014 Richard Eisenberg--- License : BSD-style (see LICENSE)--- Maintainer : Ryan Scott--- Stability : experimental--- Portability : non-portable------ Defines and exports singletons useful for the 'Natural', 'Symbol', and--- 'Char' kinds. This exports the internal, unsafe constructors. Use import--- "GHC.TypeLits.Singletons" for a safe interface.----------------------------------------------------------------------------------module GHC.TypeLits.Singletons.Internal (- Sing,-- Natural, Symbol, Char,- SNat(..), SSymbol(..), SChar(..),- withKnownNat, withKnownSymbol, withKnownChar,- Error, sError,- ErrorWithoutStackTrace, sErrorWithoutStackTrace,- Undefined, sUndefined,- KnownNat, TN.natVal, KnownSymbol, symbolVal, KnownChar, charVal,- type (^), (%^),- type (<=?), (%<=?),-- -- * Defunctionalization symbols- ErrorSym0, ErrorSym1,- ErrorWithoutStackTraceSym0, ErrorWithoutStackTraceSym1,- UndefinedSym0,- type (^@#@$), type (^@#@$$), type (^@#@$$$),- type (<=?@#@$), type (<=?@#@$$), type (<=?@#@$$$)- ) where--import Data.Bool.Singletons-import Data.Eq.Singletons-import Data.Kind-import Data.Ord.Singletons as O-import Data.Singletons-import Data.Singletons.Decide-import Data.Singletons.TH-import GHC.Show (appPrec, appPrec1)-import GHC.Stack (HasCallStack)-import GHC.TypeLits as TL-import qualified GHC.TypeNats as TN-import Unsafe.Coerce--import qualified Data.Text as T-import Data.Text ( Text )----------------------------------------------------------------------------- TypeLits singletons ----------------------------------------------------------------------------------------------------------------------type SNat :: Natural -> Type-data SNat (n :: Natural) = KnownNat n => SNat-type instance Sing = SNat--instance KnownNat n => SingI n where- sing = SNat--instance SingKind Natural where- type Demote Natural = Natural- fromSing (SNat :: Sing n) = TN.natVal (Proxy :: Proxy n)- toSing n = case TN.someNatVal n of- SomeNat (_ :: Proxy n) -> SomeSing (SNat :: Sing n)--type SSymbol :: Symbol -> Type-data SSymbol (n :: Symbol) = KnownSymbol n => SSym-type instance Sing = SSymbol--instance KnownSymbol n => SingI n where- sing = SSym--instance SingKind Symbol where- type Demote Symbol = Text- fromSing (SSym :: Sing n) = T.pack (symbolVal (Proxy :: Proxy n))- toSing s = case someSymbolVal (T.unpack s) of- SomeSymbol (_ :: Proxy n) -> SomeSing (SSym :: Sing n)--type SChar :: Char -> Type-data SChar (c :: Char) = KnownChar c => SChar-type instance Sing = SChar--instance KnownChar c => SingI c where- sing = SChar--instance SingKind Char where- type Demote Char = Char- fromSing (SChar :: Sing c) = charVal (Proxy :: Proxy c)- toSing sc = case someCharVal sc of- SomeChar (_ :: Proxy c) -> SomeSing (SChar :: Sing c)---- SDecide instances:-instance SDecide Natural where- (SNat :: Sing n) %~ (SNat :: Sing m)- | Just r <- TN.sameNat (Proxy :: Proxy n) (Proxy :: Proxy m)- = Proved r- | otherwise- = Disproved (\Refl -> error errStr)- where errStr = "Broken Natural singletons"--instance SDecide Symbol where- (SSym :: Sing n) %~ (SSym :: Sing m)- | Just r <- sameSymbol (Proxy :: Proxy n) (Proxy :: Proxy m)- = Proved r- | otherwise- = Disproved (\Refl -> error errStr)- where errStr = "Broken Symbol singletons"--instance SDecide Char where- (SChar :: Sing n) %~ (SChar :: Sing m)- | Just r <- sameChar (Proxy :: Proxy n) (Proxy :: Proxy m)- = Proved r- | otherwise- = Disproved (\Refl -> error errStr)- where errStr = "Broken Char singletons"---- PEq instances-instance PEq Natural where- type x == y = DefaultEq x y-instance PEq Symbol where- type x == y = DefaultEq x y-instance PEq Char where- type x == y = DefaultEq x y---- need SEq instances for TypeLits kinds-instance SEq Natural where- (SNat :: Sing n) %== (SNat :: Sing m)- = case sameNat (Proxy :: Proxy n) (Proxy :: Proxy m) of- Just Refl -> STrue- Nothing -> unsafeCoerce SFalse--instance SEq Symbol where- (SSym :: Sing n) %== (SSym :: Sing m)- = case sameSymbol (Proxy :: Proxy n) (Proxy :: Proxy m) of- Just Refl -> STrue- Nothing -> unsafeCoerce SFalse--instance SEq Char where- (SChar :: Sing n) %== (SChar :: Sing m)- = case sameChar (Proxy :: Proxy n) (Proxy :: Proxy m) of- Just Refl -> STrue- Nothing -> unsafeCoerce SFalse---- POrd instances-instance POrd Natural where- type (a :: Natural) `Compare` (b :: Natural) = a `TN.CmpNat` b--instance POrd Symbol where- type (a :: Symbol) `Compare` (b :: Symbol) = a `TL.CmpSymbol` b--instance POrd Char where- type (a :: Char) `Compare` (b :: Char) = a `TL.CmpChar` b---- SOrd instances-instance SOrd Natural where- a `sCompare` b = case fromSing a `compare` fromSing b of- LT -> unsafeCoerce SLT- EQ -> unsafeCoerce SEQ- GT -> unsafeCoerce SGT--instance SOrd Symbol where- a `sCompare` b = case fromSing a `compare` fromSing b of- LT -> unsafeCoerce SLT- EQ -> unsafeCoerce SEQ- GT -> unsafeCoerce SGT--instance SOrd Char where- a `sCompare` b = case fromSing a `compare` fromSing b of- LT -> unsafeCoerce SLT- EQ -> unsafeCoerce SEQ- GT -> unsafeCoerce SGT---- Show instances---- These are a bit special because the singleton constructor does not uniquely--- determine the type being used in the constructor's return type (e.g., all Naturals--- have the same singleton constructor, SNat). To compensate for this, we display--- the type being used using visible type application. (Thanks to @cumber on #179--- for suggesting this implementation.)--instance Show (SNat n) where- showsPrec p n@SNat- = showParen (p > appPrec)- ( showString "SNat @"- . showsPrec appPrec1 (TN.natVal n)- )--instance Show (SSymbol s) where- showsPrec p s@SSym- = showParen (p > appPrec)- ( showString "SSym @"- . showsPrec appPrec1 (symbolVal s)- )--instance Show (SChar c) where- showsPrec p s@SChar- = showParen (p > appPrec)- ( showString "SChar @"- . showsPrec appPrec1 (charVal s)- )---- Convenience functions---- | Given a singleton for @Nat@, call something requiring a--- @KnownNat@ instance.-withKnownNat :: Sing n -> (KnownNat n => r) -> r-withKnownNat SNat f = f---- | Given a singleton for @Symbol@, call something requiring--- a @KnownSymbol@ instance.-withKnownSymbol :: Sing n -> (KnownSymbol n => r) -> r-withKnownSymbol SSym f = f---- | Given a singleton for @Char@, call something requiring--- a @KnownChar@ instance.-withKnownChar :: Sing n -> (KnownChar n => r) -> r-withKnownChar SChar f = f---- | The promotion of 'error'. This version is more poly-kinded for--- easier use.-type Error :: k0 -> k-type family Error (str :: k0) :: k where {}-$(genDefunSymbols [''Error])-instance SingI (ErrorSym0 :: Symbol ~> a) where- sing = singFun1 sError---- | The singleton for 'error'-sError :: HasCallStack => Sing (str :: Symbol) -> a-sError sstr = error (T.unpack (fromSing sstr))---- | The promotion of 'errorWithoutStackTrace'. This version is more--- poly-kinded for easier use.-type ErrorWithoutStackTrace :: k0 -> k-type family ErrorWithoutStackTrace (str :: k0) :: k where {}-$(genDefunSymbols [''ErrorWithoutStackTrace])-instance SingI (ErrorWithoutStackTraceSym0 :: Symbol ~> a) where- sing = singFun1 sErrorWithoutStackTrace---- | The singleton for 'errorWithoutStackTrace'.-sErrorWithoutStackTrace :: Sing (str :: Symbol) -> a-sErrorWithoutStackTrace sstr = errorWithoutStackTrace (T.unpack (fromSing sstr))---- | The promotion of 'undefined'.-type Undefined :: k-type family Undefined :: k where {}-$(genDefunSymbols [''Undefined])---- | The singleton for 'undefined'.-sUndefined :: HasCallStack => a-sUndefined = undefined---- | The singleton analogue of '(TN.^)' for 'Natural's.-(%^) :: Sing a -> Sing b -> Sing (a ^ b)-sa %^ sb =- let a = fromSing sa- b = fromSing sb- ex = TN.someNatVal (a ^ b)- in- case ex of- SomeNat (_ :: Proxy ab) -> unsafeCoerce (SNat :: Sing ab)-infixr 8 %^---- Defunctionalization symbols for type-level (^)-$(genDefunSymbols [''(^)])-instance SingI (^@#@$) where- sing = singFun2 (%^)-instance SingI x => SingI ((^@#@$$) x) where- sing = singFun1 (sing @x %^)-instance SingI1 (^@#@$$) where- liftSing s = singFun1 (s %^)---- | The singleton analogue of 'TN.<=?'------ Note that, because of historical reasons in GHC's 'Natural' API, 'TN.<=?'--- is incompatible (unification-wise) with 'O.<=' and the 'PEq', 'SEq',--- 'POrd', and 'SOrd' instances for 'Natural'. @(a '<=?' b) ~ 'True@ does not--- imply anything about @a 'O.<=' b@ or any other 'PEq' / 'POrd'--- relationships.------ (Be aware that 'O.<=' in the paragraph above refers to 'O.<=' from the--- 'POrd' typeclass, exported from "Data.Ord.Singletons", and /not/--- the 'TN.<=' from "GHC.TypeNats". The latter is simply a type alias for--- @(a 'TN.<=?' b) ~ 'True@.)------ This is provided here for the sake of completeness and for compatibility--- with libraries with APIs built around '<=?'. New code should use--- 'CmpNat', exposed through this library through the 'POrd' and 'SOrd'--- instances for 'Natural'.-(%<=?) :: forall (a :: Natural) (b :: Natural). Sing a -> Sing b -> Sing (a <=? b)-sa %<=? sb = unsafeCoerce (sa %<= sb)-infix 4 %<=?---- Defunctionalization symbols for (<=?)-$(genDefunSymbols [''(<=?)])-instance SingI ((<=?@#@$) @Natural) where- sing = singFun2 (%<=?)-instance SingI x => SingI ((<=?@#@$$) @Natural x) where- sing = singFun1 (sing @x %<=?)-instance SingI1 ((<=?@#@$$) @Natural) where- liftSing s = singFun1 (s %<=?)+{-# LANGUAGE DataKinds #-} +{-# LANGUAGE PatternSynonyms #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE UndecidableInstances #-} +{-# OPTIONS_GHC -Wno-orphans #-} + +----------------------------------------------------------------------------- +-- | +-- Module : GHC.TypeLits.Singletons.Internal +-- Copyright : (C) 2014 Richard Eisenberg +-- License : BSD-style (see LICENSE) +-- Maintainer : Ryan Scott +-- Stability : experimental +-- Portability : non-portable +-- +-- Defines and exports singletons useful for the 'Natural', 'TL.Symbol', and +-- 'Char' kinds. This exports the internal, unsafe constructors. Use import +-- "GHC.TypeLits.Singletons" for a safe interface. +-- +---------------------------------------------------------------------------- + +module GHC.TypeLits.Singletons.Internal ( + Sing, + + Natural, TL.Symbol, Char, + TN.SNat, pattern TN.SNat, + TL.SSymbol, pattern TL.SSymbol, pattern SSym, + TL.SChar, pattern TL.SChar, + TN.withKnownNat, TL.withKnownSymbol, TL.withKnownChar, + Error, sError, + ErrorWithoutStackTrace, sErrorWithoutStackTrace, + Undefined, sUndefined, + TL.KnownNat, TN.natVal, TL.KnownSymbol, TL.symbolVal, TL.KnownChar, TL.charVal, + type (TN.^), (%^), + type (TN.<=?), (%<=?), + + -- * Defunctionalization symbols + ErrorSym0, ErrorSym1, + ErrorWithoutStackTraceSym0, ErrorWithoutStackTraceSym1, + UndefinedSym0, + type (^@#@$), type (^@#@$$), type (^@#@$$$), + type (<=?@#@$), type (<=?@#@$$), type (<=?@#@$$$) + ) where + +import Data.Bool.Singletons +import Data.Eq.Singletons +import Data.Ord.Singletons as O +import Data.Semigroup.Singletons.Internal.Classes +import Data.Singletons +import Data.Singletons.Decide +import Data.Singletons.TH +import Data.Type.Equality (TestEquality(..)) +import GHC.Stack (HasCallStack) +import qualified GHC.TypeLits as TL +import qualified GHC.TypeNats as TN +import Numeric.Natural (Natural) +import Unsafe.Coerce + +import qualified Data.Text as T +import Data.Text ( Text ) + +---------------------------------------------------------------------- +---- TypeLits singletons --------------------------------------------- +---------------------------------------------------------------------- + +-- SNat +type instance Sing = TN.SNat + +instance TN.KnownNat n => SingI n where + sing = TN.natSing + +instance SingKind Natural where + type Demote Natural = Natural + fromSing = TN.fromSNat + toSing n = TN.withSomeSNat n SomeSing + +-- STL.Symbol +type instance Sing = TL.SSymbol + +-- | An alias for the 'TL.SSymbol' pattern synonym. +pattern SSym :: forall s. () => TL.KnownSymbol s => TL.SSymbol s +pattern SSym = TL.SSymbol +{-# COMPLETE SSym #-} + +instance TL.KnownSymbol n => SingI n where + sing = TL.symbolSing + +instance SingKind TL.Symbol where + type Demote TL.Symbol = Text + fromSing = T.pack . TL.fromSSymbol + toSing s = TL.withSomeSSymbol (T.unpack s) SomeSing + +-- SChar +type instance Sing = TL.SChar + +instance TL.KnownChar c => SingI c where + sing = TL.charSing + +instance SingKind Char where + type Demote Char = Char + fromSing = TL.fromSChar + toSing c = TL.withSomeSChar c SomeSing + +-- SDecide instances: +instance SDecide Natural where + sn %~ sm + | Just r <- testEquality sn sm + = Proved r + | otherwise + = Disproved (\Refl -> error errStr) + where errStr = "Broken Natural singletons" + +instance SDecide TL.Symbol where + sn %~ sm + | Just r <- testEquality sn sm + = Proved r + | otherwise + = Disproved (\Refl -> error errStr) + where errStr = "Broken TL.Symbol singletons" + +instance SDecide Char where + sn %~ sm + | Just r <- testEquality sn sm + = Proved r + | otherwise + = Disproved (\Refl -> error errStr) + where errStr = "Broken Char singletons" + +-- PEq instances +instance PEq Natural where + type x == y = DefaultEq x y +instance PEq TL.Symbol where + type x == y = DefaultEq x y +instance PEq Char where + type x == y = DefaultEq x y + +-- need SEq instances for TypeLits kinds +instance SEq Natural where + sn %== sm + = case testEquality sn sm of + Just Refl -> STrue + Nothing -> unsafeCoerce SFalse + +instance SEq TL.Symbol where + sn %== sm + = case testEquality sn sm of + Just Refl -> STrue + Nothing -> unsafeCoerce SFalse + +instance SEq Char where + sn %== sm + = case testEquality sn sm of + Just Refl -> STrue + Nothing -> unsafeCoerce SFalse + +-- POrd instances +instance POrd Natural where + type (a :: Natural) `Compare` (b :: Natural) = a `TN.CmpNat` b + +instance POrd TL.Symbol where + type (a :: TL.Symbol) `Compare` (b :: TL.Symbol) = a `TL.CmpSymbol` b + +instance POrd Char where + type (a :: Char) `Compare` (b :: Char) = a `TL.CmpChar` b + +-- SOrd instances +instance SOrd Natural where + a `sCompare` b = case fromSing a `compare` fromSing b of + LT -> unsafeCoerce SLT + EQ -> unsafeCoerce SEQ + GT -> unsafeCoerce SGT + +instance SOrd TL.Symbol where + a `sCompare` b = case fromSing a `compare` fromSing b of + LT -> unsafeCoerce SLT + EQ -> unsafeCoerce SEQ + GT -> unsafeCoerce SGT + +instance SOrd Char where + a `sCompare` b = case fromSing a `compare` fromSing b of + LT -> unsafeCoerce SLT + EQ -> unsafeCoerce SEQ + GT -> unsafeCoerce SGT + +-- PSemigroup instance + +instance PSemigroup TL.Symbol where + type a <> b = TL.AppendSymbol a b + +-- SSemigroup instance + +instance SSemigroup TL.Symbol where + sa %<> sb = + let a = fromSing sa + b = fromSing sb + in TL.withSomeSSymbol (T.unpack (a <> b)) unsafeCoerce + +-- Convenience functions + +-- | A promoted version of 'error'. This implements 'Error' as a stuck type +-- family with a 'Symbol' argument. Depending on your needs, you might also +-- consider the following alternatives: +-- +-- * "Data.Singletons.Base.PolyError" provides @PolyError@, which generalizes +-- the argument to be kind-polymorphic. This allows passing additional +-- information to the error besides raw 'Symbol's. +-- +-- * "Data.Singletons.Base.TypeError" provides @TypeError@, a slightly modified +-- version of the custom type error machinery found in "GHC.TypeLits". This +-- allows emitting error messages as compiler errors rather than as stuck type +-- families. +type Error :: TL.Symbol -> a +type family Error (str :: TL.Symbol) :: a where {} +$(genDefunSymbols [''Error]) +instance SingI (ErrorSym0 :: TL.Symbol ~> a) where + sing = singFun1 sError + +-- | The singleton for 'error'. +sError :: HasCallStack => Sing (str :: TL.Symbol) -> a +sError sstr = error (T.unpack (fromSing sstr)) + +-- | The promotion of 'errorWithoutStackTrace'. +type ErrorWithoutStackTrace :: TL.Symbol -> a +type family ErrorWithoutStackTrace (str :: TL.Symbol) :: a where {} +$(genDefunSymbols [''ErrorWithoutStackTrace]) +instance SingI (ErrorWithoutStackTraceSym0 :: TL.Symbol ~> a) where + sing = singFun1 sErrorWithoutStackTrace + +-- | The singleton for 'errorWithoutStackTrace'. +sErrorWithoutStackTrace :: Sing (str :: TL.Symbol) -> a +sErrorWithoutStackTrace sstr = errorWithoutStackTrace (T.unpack (fromSing sstr)) + +-- | The promotion of 'undefined'. +type Undefined :: a +type family Undefined :: a where {} +$(genDefunSymbols [''Undefined]) + +-- | The singleton for 'undefined'. +sUndefined :: HasCallStack => a +sUndefined = undefined + +-- | The singleton analogue of '(TN.^)' for 'Natural's. +(%^) :: Sing a -> Sing b -> Sing (a TN.^ b) +sa %^ sb = + let a = fromSing sa + b = fromSing sb + in TN.withSomeSNat (a ^ b) unsafeCoerce +infixr 8 %^ + +-- Defunctionalization symbols for type-level (^) +$(genDefunSymbols [''(TN.^)]) +instance SingI (^@#@$) where + sing = singFun2 (%^) +instance SingI x => SingI ((^@#@$$) x) where + sing = singFun1 (sing @x %^) +instance SingI1 (^@#@$$) where + liftSing s = singFun1 (s %^) + +-- | The singleton analogue of 'TN.<=?' +-- +-- Note that, because of historical reasons in GHC's 'Natural' API, 'TN.<=?' +-- is incompatible (unification-wise) with 'O.<=' and the 'PEq', 'SEq', +-- 'POrd', and 'SOrd' instances for 'Natural'. @(a '<=?' b) ~ 'True@ does not +-- imply anything about @a 'O.<=' b@ or any other 'PEq' / 'POrd' +-- relationships. +-- +-- (Be aware that 'O.<=' in the paragraph above refers to 'O.<=' from the +-- 'POrd' typeclass, exported from "Data.Ord.Singletons", and /not/ +-- the 'TN.<=' from "GHC.TypeNats". The latter is simply a type alias for +-- @(a 'TN.<=?' b) ~ 'True@.) +-- +-- This is provided here for the sake of completeness and for compatibility +-- with libraries with APIs built around '<=?'. New code should use +-- 'CmpNat', exposed through this library through the 'POrd' and 'SOrd' +-- instances for 'Natural'. +(%<=?) :: forall (a :: Natural) (b :: Natural). Sing a -> Sing b -> Sing (a TN.<=? b) +sa %<=? sb = unsafeCoerce (sa %<= sb) +infix 4 %<=? + +-- Defunctionalization symbols for (<=?) +$(genDefunSymbols [''(TN.<=?)]) +instance SingI ((<=?@#@$) @Natural) where + sing = singFun2 (%<=?) +instance SingI x => SingI ((<=?@#@$$) @Natural x) where + sing = singFun1 (sing @x %<=?) +instance SingI1 ((<=?@#@$$) @Natural) where + liftSing s = singFun1 (s %<=?)
src/Prelude/Singletons.hs view
@@ -1,420 +1,421 @@-{-# LANGUAGE ExplicitNamespaces #-}-{-# LANGUAGE NoStarIsType #-}---------------------------------------------------------------------------------- |--- Module : Prelude.Singletons--- Copyright : (C) 2013 Richard Eisenberg--- License : BSD-style (see LICENSE)--- Maintainer : Ryan Scott--- Stability : experimental--- Portability : non-portable------ Mimics the Haskell Prelude, but with singleton types. Includes the basic--- singleton definitions. Note: This is currently very incomplete!------ Because many of these definitions are produced by Template Haskell, it is--- not possible to create proper Haddock documentation. Also, please excuse--- the apparent repeated variable names. This is due to an interaction between--- Template Haskell and Haddock.----------------------------------------------------------------------------------module Prelude.Singletons (- -- * Basic singleton definitions- module Data.Singletons,-- -- * Promoted and singled types, classes, and related functions-- -- ** Basic data types- SBool(SFalse, STrue),- If, sIf,- type (&&), (%&&), type (||), (%||), Not, sNot, Otherwise, sOtherwise,-- SMaybe(SNothing, SJust),- -- | 'maybe_' is a reimplementation of the 'maybe' function with a different- -- name to avoid clashing with the 'Maybe' data type when promoted.- maybe_, Maybe_, sMaybe_,-- SEither(SLeft, SRight),- -- | 'either_' is a reimplementation of the 'either' function with a different- -- name to avoid clashing with the 'Either' data type when promoted.- either_, Either_, sEither_,-- SOrdering(SLT, SEQ, SGT),- SChar, Symbol, -- The closest things we have to Char and String- SList(..),-- -- *** Tuples- STuple0(..), STuple2(..), STuple3(..), STuple4(..),- STuple5(..), STuple6(..), STuple7(..),- Fst, sFst, Snd, sSnd, Curry, sCurry, Uncurry, sUncurry,-- -- ** Basic type classes- PEq(type (==), type (/=)), SEq((%==), (%/=)),- POrd(Compare, type (<), type (<=), type (>=), type (>), Max, Min),- SOrd(sCompare, (%<), (%<=), (%>=), (%>), sMax, sMin),- -- | As a matter of convenience, the "Prelude.Singletons" does /not/ export- -- promoted/singletonized @succ@ and @pred@, due to likely conflicts with- -- unary numbers. Please import "Data.Singletons.Base.Enum" directly if- -- you want these.- PEnum( -- Succ, Pred,- ToEnum, FromEnum,- {-- See the comments in Data.Singletons.Base.Enum for why these are not defined.- -}- -- EnumFrom, EnumFromThen,- EnumFromTo, EnumFromThenTo),- SEnum( -- sSucc, sPred,- sToEnum, sFromEnum,- {-- See the comments in Data.Singletons.Base.Enum for why these are not defined.- -}- -- sEnumFrom, sEnumFromThen,- sEnumFromTo, sEnumFromThenTo),- PBounded(MinBound, MaxBound), SBounded(sMinBound, sMaxBound),-- -- ** Numbers-- {-- There are no singled counterparts to any of the following numeric types. The- closest thing is Nat, which we deliberately do not export to avoid clashing- with unary natural number data types.-- -- *** Numeric types- Int, Integer, Float, Double,- Rational, Word,- -}-- -- *** Numeric type classes- PNum(type (+), type (-), type (*), Negate, Abs, Signum, FromInteger),- SNum((%+), (%-), (%*), sNegate, sAbs, sSignum, sFromInteger),- {-- We currently do not promote or single any of the following classes. Some- of these functions have Nat-specialized versions in GHC.TypeLits.Singletons,- however (e.g., Div and Mod).- -}- -- Real(toRational),- -- Integral(quot, rem, div, mod, quotRem, divMod, toInteger),- -- Fractional((/), recip, fromRational),- -- Floating(pi, exp, log, sqrt, (**), logBase, sin, cos, tan,- -- asin, acos, atan, sinh, cosh, tanh, asinh, acosh, atanh),- -- RealFrac(properFraction, truncate, round, ceiling, floor),- -- RealFloat(floatRadix, floatDigits, floatRange, decodeFloat,- -- encodeFloat, exponent, significand, scaleFloat, isNaN,- -- isInfinite, isDenormalized, isIEEE, isNegativeZero, atan2),-- -- *** Numeric functions- Subtract, sSubtract,- {-- The following functions require classes such as Integral, Real, and- Fractional, which we do not promote or single. Some of these functions have- Nat-specialized versions in GHC.TypeLits.Singletons, however (e.g., (^)).- -}- -- even, odd, gcd, lcm, (^), (^^),- -- fromIntegral, realToFrac,-- -- ** Semigroups and Monoids- PSemigroup(type (<>)), SSemigroup((%<>)),- PMonoid(Mempty, Mappend, Mconcat), SMonoid(sMempty, sMappend, sMconcat),-- -- ** Monads and functors- PFunctor(Fmap, type (<$)), SFunctor(sFmap, (%<$)), type (<$>), (%<$>),- PApplicative(Pure, type (<*>), type (*>), type (<*)),- SApplicative(sPure, (%<*>), (%*>), (%<*)),- PMonad(type (>>=), type (>>), Return),- SMonad((%>>=), (%>>), sReturn),- PMonadFail(Fail), SMonadFail(sFail),- MapM_, sMapM_, Sequence_, sSequence_, type (=<<), (%=<<),-- -- ** Folds and traversals- PFoldable(Elem, FoldMap, Foldr, Foldl, Foldr1, Foldl1,- Maximum, Minimum, Product, Sum),- SFoldable(sElem, sFoldMap, sFoldr, sFoldl, sFoldr1, sFoldl1,- sMaximum, sMinimum, sProduct, sSum),- PTraversable(Traverse, SequenceA, MapM, Sequence),- STraversable(sTraverse, sSequenceA, sMapM, sSequence),-- -- ** Miscellaneous functions- Id, sId, Const, sConst, type (.), (%.), Flip, sFlip, type ($), (%$), Until, sUntil,- AsTypeOf, sAsTypeOf,- Error, sError, ErrorWithoutStackTrace, sErrorWithoutStackTrace,- Undefined, sUndefined,- Seq, sSeq, type ($!), (%$!),-- -- * List operations- Map, sMap, type (++), (%++), Filter, sFilter,- Head, sHead, Last, sLast, Tail, sTail, Init, sInit, type (!!), (%!!),- Null, sNull, Length, sLength,- Reverse, sReverse,- -- *** Special folds- And, sAnd, Or, sOr, Any, sAny, All, sAll,- Concat, sConcat, ConcatMap, sConcatMap,- -- ** Building lists- -- *** Scans- Scanl, sScanl, Scanl1, sScanl1, Scanr, sScanr, Scanr1, sScanr1,- -- *** Infinite lists- {-- Unsurprisingly, most operations on infinite lists won't promote.- The `replicate` function is the lone exception.- -}- -- iterate, repeat,- Replicate, sReplicate,- -- cycle,- -- ** Sublists- Take, sTake, Drop, sDrop,- TakeWhile, sTakeWhile, DropWhile, sDropWhile,- Span, sSpan, Break, sBreak,- SplitAt, sSplitAt,- -- ** Searching lists- NotElem, sNotElem,- Lookup, sLookup,- -- ** Zipping and unzipping lists- Zip, sZip, Zip3, sZip3,- ZipWith, sZipWith, ZipWith3, sZipWith3,- Unzip, sUnzip, Unzip3, sUnzip3,- -- ** Functions on @Symbol@s- {-- The `lines` and `words` functions cannot yet be promoted.- See the comments in `Data.List.Singletons.Internal`.- -}- -- lines, words,- Unlines, sUnlines, Unwords, sUnwords,-- -- * Converting to and from @Symbol@- -- ** Converting to @Symbol@- SymbolS,- show_,- PShow(ShowsPrec, ShowList, Show_), SShow(sShowsPrec, sShowList, sShow_),- Shows, sShows,- ShowChar, sShowChar, ShowString, sShowString, ShowParen, sShowParen,- {-- We do not currently promote or single the Read class.-- -- ** Converting from @Symbol@- ReadS,- Read(readsPrec, readList),- reads, readParen, read, lex,- -}-- {-- We do not promote or single anything involving IO.-- -- * Basic Input and output- IO,- -- ** Simple I\/O operations- -- All I/O functions defined here are character oriented. The- -- treatment of the newline character will vary on different systems.- -- For example, two characters of input, return and linefeed, may- -- read as a single newline character. These functions cannot be- -- used portably for binary I/O.- -- *** Output functions- putChar,- putStr, putStrLn, print,- -- *** Input functions- getChar,- getLine, getContents, interact,- -- *** Files- FilePath,- readFile, writeFile, appendFile, readIO, readLn,- -- ** Exception handling in the I\/O monad- IOError, ioError, userError,- -}-- -- * Defunctionalization symbols-- -- ** Basic data types- FalseSym0, TrueSym0,- IfSym0, IfSym1, IfSym2, IfSym3,- type (&&@#@$), type (&&@#@$$), type (&&@#@$$$),- type (||@#@$), type (||@#@$$), type (||@#@$$$),- NotSym0, NotSym1,- OtherwiseSym0,-- NothingSym0, JustSym0, JustSym1,- Maybe_Sym0, Maybe_Sym1, Maybe_Sym2, Maybe_Sym3,-- LeftSym0, LeftSym1, RightSym0, RightSym1,- Either_Sym0, Either_Sym1, Either_Sym2, Either_Sym3,-- LTSym0, EQSym0, GTSym0,- (:@#@$), (:@#@$$), (:@#@$$$), NilSym0,-- -- *** Tuples- Tuple0Sym0,- Tuple2Sym0, Tuple2Sym1, Tuple2Sym2,- Tuple3Sym0, Tuple3Sym1, Tuple3Sym2, Tuple3Sym3,- Tuple4Sym0, Tuple4Sym1, Tuple4Sym2, Tuple4Sym3, Tuple4Sym4,- Tuple5Sym0, Tuple5Sym1, Tuple5Sym2, Tuple5Sym3, Tuple5Sym4, Tuple5Sym5,- Tuple6Sym0, Tuple6Sym1, Tuple6Sym2, Tuple6Sym3, Tuple6Sym4, Tuple6Sym5, Tuple6Sym6,- Tuple7Sym0, Tuple7Sym1, Tuple7Sym2, Tuple7Sym3, Tuple7Sym4, Tuple7Sym5, Tuple7Sym6, Tuple7Sym7,- FstSym0, FstSym1, SndSym0, SndSym1,- CurrySym0, CurrySym1, CurrySym2, CurrySym3,- UncurrySym0, UncurrySym1, UncurrySym2,-- -- ** Basic type classes- type (==@#@$), type (==@#@$$), type (==@#@$$$),- type (/=@#@$), type (/=@#@$$), type (/=@#@$$$),-- CompareSym0, CompareSym1, CompareSym2,- type (<@#@$), type (<@#@$$), type (<@#@$$$),- type (<=@#@$), type (<=@#@$$), type (<=@#@$$$),- type (>@#@$), type (>@#@$$), type (>@#@$$$),- type (>=@#@$), type (>=@#@$$), type (>=@#@$$$),- MaxSym0, MaxSym1, MaxSym2,- MinSym0, MinSym1, MinSym2,-- ToEnumSym0, ToEnumSym1,- FromEnumSym0, FromEnumSym1,- EnumFromToSym0, EnumFromToSym1, EnumFromToSym2,- EnumFromThenToSym0, EnumFromThenToSym1, EnumFromThenToSym2, EnumFromThenToSym3,-- MinBoundSym0, MaxBoundSym0,-- -- ** Numbers-- -- *** Numeric type classes- type (+@#@$), type (+@#@$$), type (+@#@$$$),- type (-@#@$), type (-@#@$$), type (-@#@$$$),- type (*@#@$), type (*@#@$$), type (*@#@$$$),- NegateSym0, NegateSym1,- AbsSym0, AbsSym1,- SignumSym0, SignumSym1,- FromIntegerSym0, FromIntegerSym1,-- -- *** Numeric functions- SubtractSym0, SubtractSym1, SubtractSym2,-- -- ** Semigroups and Monoids- type (<>@#@$), type (<>@#@$$), type (<>@#@$$$),- MemptySym0,- MappendSym0, MappendSym1, MappendSym2,- MconcatSym0, MconcatSym1,-- -- ** Monads and functors- FmapSym0, FmapSym1, FmapSym2,- type (<$@#@$), type (<$@#@$$), type (<$@#@$$$),- type (<$>@#@$), type (<$>@#@$$), type (<$>@#@$$$),- PureSym0, PureSym1,- type (<*>@#@$), type (<*>@#@$$), type (<*>@#@$$$),- type (*>@#@$), type (*>@#@$$), type (*>@#@$$$),- type (<*@#@$), type (<*@#@$$), type (<*@#@$$$),- type (>>=@#@$), type (>>=@#@$$), type (>>=@#@$$$),- type (>>@#@$), type (>>@#@$$), type (>>@#@$$$),- ReturnSym0, ReturnSym1, FailSym0, FailSym1,- MapM_Sym0, MapM_Sym1, MapM_Sym2,- Sequence_Sym0, Sequence_Sym1,- type (=<<@#@$), type (=<<@#@$$), type (=<<@#@$$$),-- -- ** Folds and traversals- ElemSym0, ElemSym1, ElemSym2,- FoldMapSym0, FoldMapSym1, FoldMapSym2,- FoldrSym0, FoldrSym1, FoldrSym2, FoldrSym3,- FoldlSym0, FoldlSym1, FoldlSym2, FoldlSym3,- Foldr1Sym0, Foldr1Sym1, Foldr1Sym2,- Foldl1Sym0, Foldl1Sym1, Foldl1Sym2,- MaximumSym0, MaximumSym1,- MinimumSym0, MinimumSym1,- ProductSym0, ProductSym1,- SumSym0, SumSym1,-- TraverseSym0, TraverseSym1, TraverseSym2,- SequenceASym0, SequenceASym1,- MapMSym0, MapMSym1, MapMSym2,- SequenceSym0, SequenceSym1,-- -- ** Miscellaneous functions- IdSym0, IdSym1, ConstSym0, ConstSym1, ConstSym2,- type (.@#@$), type (.@#@$$), type (.@#@$$$), type (.@#@$$$$),- FlipSym0, FlipSym1, FlipSym2, FlipSym3,- type ($@#@$), type ($@#@$$), type ($@#@$$$),- UntilSym0, UntilSym1, UntilSym2, UntilSym3,- AsTypeOfSym0, AsTypeOfSym1, AsTypeOfSym2,- ErrorSym0, ErrorSym1,- ErrorWithoutStackTraceSym0, ErrorWithoutStackTraceSym1,- UndefinedSym0,- SeqSym0, SeqSym1, SeqSym2,- type ($!@#@$), type ($!@#@$$), type ($!@#@$$$),-- -- * List operations- MapSym0, MapSym1, MapSym2,- type (++@#@$), type (++@#@$$), type (++@#@$$$),- FilterSym0, FilterSym1, FilterSym2,- HeadSym0, HeadSym1, LastSym0, LastSym1,- TailSym0, TailSym1, InitSym0, InitSym1,- type (!!@#@$), type (!!@#@$$), type (!!@#@$$$),- NullSym0, NullSym1,- LengthSym0, LengthSym1,- ReverseSym0, ReverseSym1,- -- *** Special folds- AndSym0, AndSym1, OrSym0, OrSym1,- AnySym0, AnySym1, AnySym2,- AllSym0, AllSym1, AllSym2,- ConcatSym0, ConcatSym1,- ConcatMapSym0, ConcatMapSym1, ConcatMapSym2,- -- ** Building lists- -- *** Scans- ScanlSym0, ScanlSym1, ScanlSym2, ScanlSym3,- Scanl1Sym0, Scanl1Sym1, Scanl1Sym2,- ScanrSym0, ScanrSym1, ScanrSym2, ScanrSym3,- Scanr1Sym0, Scanr1Sym1, Scanr1Sym2,- -- *** Infinite lists- ReplicateSym0, ReplicateSym1, ReplicateSym2,- -- ** Sublists- TakeSym0, TakeSym1, TakeSym2,- DropSym0, DropSym1, DropSym2,- TakeWhileSym0, TakeWhileSym1, TakeWhileSym2,- DropWhileSym0, DropWhileSym1, DropWhileSym2,- DropWhileEndSym0, DropWhileEndSym1, DropWhileEndSym2,- SpanSym0, SpanSym1, SpanSym2,- BreakSym0, BreakSym1, BreakSym2,- SplitAtSym0, SplitAtSym1, SplitAtSym2,- -- ** Searching lists- NotElemSym0, NotElemSym1, NotElemSym2,- LookupSym0, LookupSym1, LookupSym2,- -- ** Zipping and unzipping lists- ZipSym0, ZipSym1, ZipSym2,- Zip3Sym0, Zip3Sym1, Zip3Sym2, Zip3Sym3,- ZipWithSym0, ZipWithSym1, ZipWithSym2, ZipWithSym3,- ZipWith3Sym0, ZipWith3Sym1, ZipWith3Sym2, ZipWith3Sym3,- UnzipSym0, UnzipSym1, Unzip3Sym0, Unzip3Sym1,- -- ** Functions on @Symbol@s- UnlinesSym0, UnlinesSym1, UnwordsSym0, UnwordsSym1,-- -- * Converting to and from @Symbol@- -- ** Converting to @Symbol@- ShowsPrecSym0, ShowsPrecSym1, ShowsPrecSym2, ShowsPrecSym3,- ShowListSym0, ShowListSym1, ShowListSym2,- Show_Sym0, Show_Sym1,- ShowsSym0, ShowsSym1, ShowsSym2,- ShowCharSym0, ShowCharSym1, ShowCharSym2,- ShowStringSym0, ShowStringSym1, ShowStringSym2,- ShowParenSym0, ShowParenSym1, ShowParenSym2- ) where--import Control.Applicative.Singletons- hiding (Const, ConstSym0, ConstSym1)-import Control.Monad.Singletons-import Data.Bool.Singletons-import Data.Either.Singletons-import Data.Eq.Singletons-import Data.Foldable.Singletons-import Data.List.Singletons-import Data.Maybe.Singletons-import Data.Monoid.Singletons- ( PMonoid(..), SMonoid(..), MemptySym0, MappendSym0- , MappendSym1, MappendSym2, MconcatSym0, MconcatSym1 )-import Data.Ord.Singletons-import Data.Semigroup.Singletons- ( PSemigroup(..), SSemigroup(..)- , type (<>@#@$), type (<>@#@$$), type (<>@#@$$$) )-import Data.Singletons-import Data.Singletons.Base.Enum- hiding (Succ, Pred, SuccSym0, SuccSym1, PredSym0, PredSym1, sSucc, sPred)-import Data.Traversable.Singletons-import Data.Tuple.Singletons-import GHC.Base.Singletons- hiding (Foldr, FoldrSym0, FoldrSym1, FoldrSym2, FoldrSym3, sFoldr)-import GHC.Num.Singletons-import GHC.TypeLits.Singletons-import Text.Show.Singletons+{-# LANGUAGE ExplicitNamespaces #-} +{-# LANGUAGE NoStarIsType #-} + +----------------------------------------------------------------------------- +-- | +-- Module : Prelude.Singletons +-- Copyright : (C) 2013 Richard Eisenberg +-- License : BSD-style (see LICENSE) +-- Maintainer : Ryan Scott +-- Stability : experimental +-- Portability : non-portable +-- +-- Mimics the Haskell Prelude, but with singleton types. Includes the basic +-- singleton definitions. Note: This is currently very incomplete! +-- +-- Because many of these definitions are produced by Template Haskell, it is +-- not possible to create proper Haddock documentation. Also, please excuse +-- the apparent repeated variable names. This is due to an interaction between +-- Template Haskell and Haddock. +-- +---------------------------------------------------------------------------- + +module Prelude.Singletons ( + -- * Basic singleton definitions + module Data.Singletons, + + -- * Promoted and singled types, classes, and related functions + + -- ** Basic data types + SBool(SFalse, STrue), + If, sIf, + type (&&), (%&&), type (||), (%||), Not, sNot, Otherwise, sOtherwise, + + SMaybe(SNothing, SJust), + -- | 'maybe_' is a reimplementation of the 'maybe' function with a different + -- name to avoid clashing with the 'Maybe' data type when promoted. + maybe_, Maybe_, sMaybe_, + + SEither(SLeft, SRight), + -- | 'either_' is a reimplementation of the 'either' function with a different + -- name to avoid clashing with the 'Either' data type when promoted. + either_, Either_, sEither_, + + SOrdering(SLT, SEQ, SGT), + SChar, Symbol, -- The closest things we have to Char and String + SList(..), + + -- *** Tuples + STuple0(..), STuple2(..), STuple3(..), STuple4(..), + STuple5(..), STuple6(..), STuple7(..), + Fst, sFst, Snd, sSnd, Curry, sCurry, Uncurry, sUncurry, + + -- ** Basic type classes + PEq(type (==), type (/=)), SEq((%==), (%/=)), + POrd(Compare, type (<), type (<=), type (>=), type (>), Max, Min), + SOrd(sCompare, (%<), (%<=), (%>=), (%>), sMax, sMin), + -- | As a matter of convenience, the "Prelude.Singletons" does /not/ export + -- promoted/singletonized @succ@ and @pred@, due to likely conflicts with + -- unary numbers. Please import "Data.Singletons.Base.Enum" directly if + -- you want these. + PEnum( -- Succ, Pred, + ToEnum, FromEnum, + {- + See the comments in Data.Singletons.Base.Enum for why these are not defined. + -} + -- EnumFrom, EnumFromThen, + EnumFromTo, EnumFromThenTo), + SEnum( -- sSucc, sPred, + sToEnum, sFromEnum, + {- + See the comments in Data.Singletons.Base.Enum for why these are not defined. + -} + -- sEnumFrom, sEnumFromThen, + sEnumFromTo, sEnumFromThenTo), + PBounded(MinBound, MaxBound), SBounded(sMinBound, sMaxBound), + + -- ** Numbers + + {- + There are no singled counterparts to any of the following numeric types. The + closest thing is Nat, which we deliberately do not export to avoid clashing + with unary natural number data types. + + -- *** Numeric types + Int, Integer, Float, Double, + Rational, Word, + -} + + -- *** Numeric type classes + PNum(type (+), type (-), type (*), Negate, Abs, Signum, FromInteger), + SNum((%+), (%-), (%*), sNegate, sAbs, sSignum, sFromInteger), + {- + We currently do not promote or single any of the following classes. Some + of these functions have Nat-specialized versions in GHC.TypeLits.Singletons, + however (e.g., Div and Mod). + -} + -- Real(toRational), + -- Integral(quot, rem, div, mod, quotRem, divMod, toInteger), + -- Fractional((/), recip, fromRational), + -- Floating(pi, exp, log, sqrt, (**), logBase, sin, cos, tan, + -- asin, acos, atan, sinh, cosh, tanh, asinh, acosh, atanh), + -- RealFrac(properFraction, truncate, round, ceiling, floor), + -- RealFloat(floatRadix, floatDigits, floatRange, decodeFloat, + -- encodeFloat, exponent, significand, scaleFloat, isNaN, + -- isInfinite, isDenormalized, isIEEE, isNegativeZero, atan2), + + -- *** Numeric functions + Subtract, sSubtract, + {- + The following functions require classes such as Integral, Real, and + Fractional, which we do not promote or single. Some of these functions have + Nat-specialized versions in GHC.TypeLits.Singletons, however (e.g., (^)). + -} + -- even, odd, gcd, lcm, (^), (^^), + -- fromIntegral, realToFrac, + + -- ** Semigroups and Monoids + PSemigroup(type (<>)), SSemigroup((%<>)), + PMonoid(Mempty, Mappend, Mconcat), SMonoid(sMempty, sMappend, sMconcat), + + -- ** Monads and functors + PFunctor(Fmap, type (<$)), SFunctor(sFmap, (%<$)), type (<$>), (%<$>), + PApplicative(Pure, type (<*>), type (*>), type (<*), LiftA2), + SApplicative(sPure, (%<*>), (%*>), (%<*), sLiftA2), + PMonad(type (>>=), type (>>), Return), + SMonad((%>>=), (%>>), sReturn), + PMonadFail(Fail), SMonadFail(sFail), + MapM_, sMapM_, Sequence_, sSequence_, type (=<<), (%=<<), + + -- ** Folds and traversals + PFoldable(Elem, FoldMap, Foldr, Foldl, Foldr1, Foldl1, + Maximum, Minimum, Product, Sum), + SFoldable(sElem, sFoldMap, sFoldr, sFoldl, sFoldr1, sFoldl1, + sMaximum, sMinimum, sProduct, sSum), + PTraversable(Traverse, SequenceA, MapM, Sequence), + STraversable(sTraverse, sSequenceA, sMapM, sSequence), + + -- ** Miscellaneous functions + Id, sId, Const, sConst, type (.), (%.), Flip, sFlip, type ($), (%$), Until, sUntil, + AsTypeOf, sAsTypeOf, + Error, sError, ErrorWithoutStackTrace, sErrorWithoutStackTrace, + Undefined, sUndefined, + Seq, sSeq, type ($!), (%$!), + + -- * List operations + Map, sMap, type (++), (%++), Filter, sFilter, + Head, sHead, Last, sLast, Tail, sTail, Init, sInit, type (!!), (%!!), + Null, sNull, Length, sLength, + Reverse, sReverse, + -- *** Special folds + And, sAnd, Or, sOr, Any, sAny, All, sAll, + Concat, sConcat, ConcatMap, sConcatMap, + -- ** Building lists + -- *** Scans + Scanl, sScanl, Scanl1, sScanl1, Scanr, sScanr, Scanr1, sScanr1, + -- *** Infinite lists + {- + Unsurprisingly, most operations on infinite lists won't promote. + The `replicate` function is the lone exception. + -} + -- iterate, repeat, + Replicate, sReplicate, + -- cycle, + -- ** Sublists + Take, sTake, Drop, sDrop, + TakeWhile, sTakeWhile, DropWhile, sDropWhile, + Span, sSpan, Break, sBreak, + SplitAt, sSplitAt, + -- ** Searching lists + NotElem, sNotElem, + Lookup, sLookup, + -- ** Zipping and unzipping lists + Zip, sZip, Zip3, sZip3, + ZipWith, sZipWith, ZipWith3, sZipWith3, + Unzip, sUnzip, Unzip3, sUnzip3, + -- ** Functions on @Symbol@s + {- + The `lines` and `words` functions cannot yet be promoted. + See the comments in `Data.List.Singletons.Internal`. + -} + -- lines, words, + Unlines, sUnlines, Unwords, sUnwords, + + -- * Converting to and from @Symbol@ + -- ** Converting to @Symbol@ + SymbolS, + show_, + PShow(ShowsPrec, ShowList, Show_), SShow(sShowsPrec, sShowList, sShow_), + Shows, sShows, + ShowChar, sShowChar, ShowString, sShowString, ShowParen, sShowParen, + {- + We do not currently promote or single the Read class. + + -- ** Converting from @Symbol@ + ReadS, + Read(readsPrec, readList), + reads, readParen, read, lex, + -} + + {- + We do not promote or single anything involving IO. + + -- * Basic Input and output + IO, + -- ** Simple I\/O operations + -- All I/O functions defined here are character oriented. The + -- treatment of the newline character will vary on different systems. + -- For example, two characters of input, return and linefeed, may + -- read as a single newline character. These functions cannot be + -- used portably for binary I/O. + -- *** Output functions + putChar, + putStr, putStrLn, print, + -- *** Input functions + getChar, + getLine, getContents, interact, + -- *** Files + FilePath, + readFile, writeFile, appendFile, readIO, readLn, + -- ** Exception handling in the I\/O monad + IOError, ioError, userError, + -} + + -- * Defunctionalization symbols + + -- ** Basic data types + FalseSym0, TrueSym0, + IfSym0, IfSym1, IfSym2, IfSym3, + type (&&@#@$), type (&&@#@$$), type (&&@#@$$$), + type (||@#@$), type (||@#@$$), type (||@#@$$$), + NotSym0, NotSym1, + OtherwiseSym0, + + NothingSym0, JustSym0, JustSym1, + Maybe_Sym0, Maybe_Sym1, Maybe_Sym2, Maybe_Sym3, + + LeftSym0, LeftSym1, RightSym0, RightSym1, + Either_Sym0, Either_Sym1, Either_Sym2, Either_Sym3, + + LTSym0, EQSym0, GTSym0, + (:@#@$), (:@#@$$), (:@#@$$$), NilSym0, + + -- *** Tuples + Tuple0Sym0, + Tuple2Sym0, Tuple2Sym1, Tuple2Sym2, + Tuple3Sym0, Tuple3Sym1, Tuple3Sym2, Tuple3Sym3, + Tuple4Sym0, Tuple4Sym1, Tuple4Sym2, Tuple4Sym3, Tuple4Sym4, + Tuple5Sym0, Tuple5Sym1, Tuple5Sym2, Tuple5Sym3, Tuple5Sym4, Tuple5Sym5, + Tuple6Sym0, Tuple6Sym1, Tuple6Sym2, Tuple6Sym3, Tuple6Sym4, Tuple6Sym5, Tuple6Sym6, + Tuple7Sym0, Tuple7Sym1, Tuple7Sym2, Tuple7Sym3, Tuple7Sym4, Tuple7Sym5, Tuple7Sym6, Tuple7Sym7, + FstSym0, FstSym1, SndSym0, SndSym1, + CurrySym0, CurrySym1, CurrySym2, CurrySym3, + UncurrySym0, UncurrySym1, UncurrySym2, + + -- ** Basic type classes + type (==@#@$), type (==@#@$$), type (==@#@$$$), + type (/=@#@$), type (/=@#@$$), type (/=@#@$$$), + + CompareSym0, CompareSym1, CompareSym2, + type (<@#@$), type (<@#@$$), type (<@#@$$$), + type (<=@#@$), type (<=@#@$$), type (<=@#@$$$), + type (>@#@$), type (>@#@$$), type (>@#@$$$), + type (>=@#@$), type (>=@#@$$), type (>=@#@$$$), + MaxSym0, MaxSym1, MaxSym2, + MinSym0, MinSym1, MinSym2, + + ToEnumSym0, ToEnumSym1, + FromEnumSym0, FromEnumSym1, + EnumFromToSym0, EnumFromToSym1, EnumFromToSym2, + EnumFromThenToSym0, EnumFromThenToSym1, EnumFromThenToSym2, EnumFromThenToSym3, + + MinBoundSym0, MaxBoundSym0, + + -- ** Numbers + + -- *** Numeric type classes + type (+@#@$), type (+@#@$$), type (+@#@$$$), + type (-@#@$), type (-@#@$$), type (-@#@$$$), + type (*@#@$), type (*@#@$$), type (*@#@$$$), + NegateSym0, NegateSym1, + AbsSym0, AbsSym1, + SignumSym0, SignumSym1, + FromIntegerSym0, FromIntegerSym1, + + -- *** Numeric functions + SubtractSym0, SubtractSym1, SubtractSym2, + + -- ** Semigroups and Monoids + type (<>@#@$), type (<>@#@$$), type (<>@#@$$$), + MemptySym0, + MappendSym0, MappendSym1, MappendSym2, + MconcatSym0, MconcatSym1, + + -- ** Monads and functors + FmapSym0, FmapSym1, FmapSym2, + type (<$@#@$), type (<$@#@$$), type (<$@#@$$$), + type (<$>@#@$), type (<$>@#@$$), type (<$>@#@$$$), + PureSym0, PureSym1, + type (<*>@#@$), type (<*>@#@$$), type (<*>@#@$$$), + type (*>@#@$), type (*>@#@$$), type (*>@#@$$$), + type (<*@#@$), type (<*@#@$$), type (<*@#@$$$), + LiftA2Sym0, LiftA2Sym1, LiftA2Sym2, LiftA2Sym3, + type (>>=@#@$), type (>>=@#@$$), type (>>=@#@$$$), + type (>>@#@$), type (>>@#@$$), type (>>@#@$$$), + ReturnSym0, ReturnSym1, FailSym0, FailSym1, + MapM_Sym0, MapM_Sym1, MapM_Sym2, + Sequence_Sym0, Sequence_Sym1, + type (=<<@#@$), type (=<<@#@$$), type (=<<@#@$$$), + + -- ** Folds and traversals + ElemSym0, ElemSym1, ElemSym2, + FoldMapSym0, FoldMapSym1, FoldMapSym2, + FoldrSym0, FoldrSym1, FoldrSym2, FoldrSym3, + FoldlSym0, FoldlSym1, FoldlSym2, FoldlSym3, + Foldr1Sym0, Foldr1Sym1, Foldr1Sym2, + Foldl1Sym0, Foldl1Sym1, Foldl1Sym2, + MaximumSym0, MaximumSym1, + MinimumSym0, MinimumSym1, + ProductSym0, ProductSym1, + SumSym0, SumSym1, + + TraverseSym0, TraverseSym1, TraverseSym2, + SequenceASym0, SequenceASym1, + MapMSym0, MapMSym1, MapMSym2, + SequenceSym0, SequenceSym1, + + -- ** Miscellaneous functions + IdSym0, IdSym1, ConstSym0, ConstSym1, ConstSym2, + type (.@#@$), type (.@#@$$), type (.@#@$$$), type (.@#@$$$$), + FlipSym0, FlipSym1, FlipSym2, FlipSym3, + type ($@#@$), type ($@#@$$), type ($@#@$$$), + UntilSym0, UntilSym1, UntilSym2, UntilSym3, + AsTypeOfSym0, AsTypeOfSym1, AsTypeOfSym2, + ErrorSym0, ErrorSym1, + ErrorWithoutStackTraceSym0, ErrorWithoutStackTraceSym1, + UndefinedSym0, + SeqSym0, SeqSym1, SeqSym2, + type ($!@#@$), type ($!@#@$$), type ($!@#@$$$), + + -- * List operations + MapSym0, MapSym1, MapSym2, + type (++@#@$), type (++@#@$$), type (++@#@$$$), + FilterSym0, FilterSym1, FilterSym2, + HeadSym0, HeadSym1, LastSym0, LastSym1, + TailSym0, TailSym1, InitSym0, InitSym1, + type (!!@#@$), type (!!@#@$$), type (!!@#@$$$), + NullSym0, NullSym1, + LengthSym0, LengthSym1, + ReverseSym0, ReverseSym1, + -- *** Special folds + AndSym0, AndSym1, OrSym0, OrSym1, + AnySym0, AnySym1, AnySym2, + AllSym0, AllSym1, AllSym2, + ConcatSym0, ConcatSym1, + ConcatMapSym0, ConcatMapSym1, ConcatMapSym2, + -- ** Building lists + -- *** Scans + ScanlSym0, ScanlSym1, ScanlSym2, ScanlSym3, + Scanl1Sym0, Scanl1Sym1, Scanl1Sym2, + ScanrSym0, ScanrSym1, ScanrSym2, ScanrSym3, + Scanr1Sym0, Scanr1Sym1, Scanr1Sym2, + -- *** Infinite lists + ReplicateSym0, ReplicateSym1, ReplicateSym2, + -- ** Sublists + TakeSym0, TakeSym1, TakeSym2, + DropSym0, DropSym1, DropSym2, + TakeWhileSym0, TakeWhileSym1, TakeWhileSym2, + DropWhileSym0, DropWhileSym1, DropWhileSym2, + DropWhileEndSym0, DropWhileEndSym1, DropWhileEndSym2, + SpanSym0, SpanSym1, SpanSym2, + BreakSym0, BreakSym1, BreakSym2, + SplitAtSym0, SplitAtSym1, SplitAtSym2, + -- ** Searching lists + NotElemSym0, NotElemSym1, NotElemSym2, + LookupSym0, LookupSym1, LookupSym2, + -- ** Zipping and unzipping lists + ZipSym0, ZipSym1, ZipSym2, + Zip3Sym0, Zip3Sym1, Zip3Sym2, Zip3Sym3, + ZipWithSym0, ZipWithSym1, ZipWithSym2, ZipWithSym3, + ZipWith3Sym0, ZipWith3Sym1, ZipWith3Sym2, ZipWith3Sym3, + UnzipSym0, UnzipSym1, Unzip3Sym0, Unzip3Sym1, + -- ** Functions on @Symbol@s + UnlinesSym0, UnlinesSym1, UnwordsSym0, UnwordsSym1, + + -- * Converting to and from @Symbol@ + -- ** Converting to @Symbol@ + ShowsPrecSym0, ShowsPrecSym1, ShowsPrecSym2, ShowsPrecSym3, + ShowListSym0, ShowListSym1, ShowListSym2, + Show_Sym0, Show_Sym1, + ShowsSym0, ShowsSym1, ShowsSym2, + ShowCharSym0, ShowCharSym1, ShowCharSym2, + ShowStringSym0, ShowStringSym1, ShowStringSym2, + ShowParenSym0, ShowParenSym1, ShowParenSym2 + ) where + +import Control.Applicative.Singletons + hiding (Const, ConstSym0, ConstSym1) +import Control.Monad.Singletons +import Data.Bool.Singletons +import Data.Either.Singletons +import Data.Eq.Singletons +import Data.Foldable.Singletons +import Data.List.Singletons +import Data.Maybe.Singletons +import Data.Monoid.Singletons + ( PMonoid(..), SMonoid(..), MemptySym0, MappendSym0 + , MappendSym1, MappendSym2, MconcatSym0, MconcatSym1 ) +import Data.Ord.Singletons +import Data.Semigroup.Singletons + ( PSemigroup(..), SSemigroup(..) + , type (<>@#@$), type (<>@#@$$), type (<>@#@$$$) ) +import Data.Singletons +import Data.Singletons.Base.Enum + hiding (Succ, Pred, SuccSym0, SuccSym1, PredSym0, PredSym1, sSucc, sPred) +import Data.Traversable.Singletons +import Data.Tuple.Singletons +import GHC.Base.Singletons + hiding (Foldr, FoldrSym0, FoldrSym1, FoldrSym2, FoldrSym3, sFoldr) +import GHC.Num.Singletons +import GHC.TypeLits.Singletons +import Text.Show.Singletons
src/Text/Show/Singletons.hs view
@@ -1,286 +1,273 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE DefaultSignatures #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE UndecidableInstances #-}---------------------------------------------------------------------------------- |--- Module : Text.Show.Singletons--- Copyright : (C) 2017 Ryan Scott--- License : BSD-style (see LICENSE)--- Maintainer : Ryan Scott--- Stability : experimental--- Portability : non-portable------ Defines the SShow singleton version of the Show type class.-----------------------------------------------------------------------------------module Text.Show.Singletons (- PShow(..), SShow(..), SymbolS, show_,- Shows, sShows,- ShowListWith, sShowListWith,- ShowChar, sShowChar,- ShowString, sShowString,- ShowParen, sShowParen,- ShowSpace, sShowSpace,- ShowCommaSpace, sShowCommaSpace,- AppPrec, sAppPrec,- AppPrec1, sAppPrec1,-- -- * Defunctionalization symbols- ShowsPrecSym0, ShowsPrecSym1, ShowsPrecSym2, ShowsPrecSym3,- Show_Sym0, Show_Sym1,- ShowListSym0, ShowListSym1, ShowListSym2,- ShowsSym0, ShowsSym1, ShowsSym2,- ShowListWithSym0, ShowListWithSym1, ShowListWithSym2, ShowListWithSym3,- ShowCharSym0, ShowCharSym1, ShowCharSym2,- ShowStringSym0, ShowStringSym1, ShowStringSym2,- ShowParenSym0, ShowParenSym1, ShowParenSym2,- ShowSpaceSym0, ShowSpaceSym1,- ShowCommaSpaceSym0, ShowCommaSpaceSym1,- AppPrecSym0, AppPrec1Sym0- ) where--import Data.Bool.Singletons-import Data.Eq.Singletons-import Data.Kind-import Data.List.NonEmpty (NonEmpty)-import Data.List.Singletons.Internal-import Data.Ord (Down)-import Data.Ord.Singletons-import Data.Proxy-import Data.Semigroup.Singletons.Internal-import Data.Singletons-import Data.Singletons.Base.Instances-import Data.Singletons.TH-import qualified Data.Text as T-import GHC.Base.Singletons-import GHC.Num.Singletons-import GHC.TypeLits-import GHC.TypeLits.Singletons-import qualified Prelude as P-import Prelude hiding (Show(..))-import Unsafe.Coerce (unsafeCoerce)---- | The @shows@ functions return a function that prepends the--- output 'Symbol' to an existing 'Symbol'. This allows constant-time--- concatenation of results using function composition.-type SymbolS :: Type-type SymbolS = Symbol -> Symbol--$(singletonsOnly [d|- class Show a where- showsPrec :: Natural -> a -> SymbolS- show_ :: a -> Symbol- showList :: [a] -> SymbolS-- showsPrec _ x s = show_ x <> s- show_ x = shows x ""- showList ls s = showListWith shows ls s-- shows :: Show a => a -> SymbolS- shows s = showsPrec 0 s-- showListWith :: (a -> SymbolS) -> [a] -> SymbolS- showListWith _ [] s = "[]" <> s- showListWith showx (x:xs) s = "[" <> showx x (showl xs)- where- showl [] = "]" <> s- showl (y:ys) = "," <> showx y (showl ys)-- showChar :: Char -> SymbolS- showChar = consSymbol-- showString :: Symbol -> SymbolS- showString = (<>)-- showParen :: Bool -> SymbolS -> SymbolS- showParen b p = if b then showChar '(' . p . showChar ')' else p-- showSpace :: SymbolS- showSpace = \xs -> " " <> xs-- showCommaSpace :: SymbolS- showCommaSpace = showString ", "-- appPrec, appPrec1 :: Nat- appPrec = 10- appPrec1 = 11-- instance Show a => Show [a] where- showsPrec _ = showList-- show_tuple :: [SymbolS] -> SymbolS- show_tuple ss = showChar '('- . foldr1 (\s r -> s . showChar ',' . r) ss- . showChar ')'-- instance (Show a, Show b) => Show (a,b) where- showsPrec _ (a,b) s = show_tuple [shows a, shows b] s-- instance (Show a, Show b, Show c) => Show (a, b, c) where- showsPrec _ (a,b,c) s = show_tuple [shows a, shows b, shows c] s-- instance (Show a, Show b, Show c, Show d) => Show (a, b, c, d) where- showsPrec _ (a,b,c,d) s = show_tuple [shows a, shows b, shows c, shows d] s-- instance (Show a, Show b, Show c, Show d, Show e) => Show (a, b, c, d, e) where- showsPrec _ (a,b,c,d,e) s = show_tuple [shows a, shows b, shows c, shows d, shows e] s-- instance (Show a, Show b, Show c, Show d, Show e, Show f) => Show (a,b,c,d,e,f) where- showsPrec _ (a,b,c,d,e,f) s = show_tuple [shows a, shows b, shows c, shows d, shows e, shows f] s-- instance (Show a, Show b, Show c, Show d, Show e, Show f, Show g)- => Show (a,b,c,d,e,f,g) where- showsPrec _ (a,b,c,d,e,f,g) s- = show_tuple [shows a, shows b, shows c, shows d, shows e, shows f, shows g] s-- deriving instance Show a => Show (Down a)- |])--$(promoteOnly [d|- showsNat :: Natural -> SymbolS- showsNat 0 = showChar '0'- showsNat 1 = showChar '1'- showsNat 2 = showChar '2'- showsNat 3 = showChar '3'- showsNat 4 = showChar '4'- showsNat 5 = showChar '5'- showsNat 6 = showChar '6'- showsNat 7 = showChar '7'- showsNat 8 = showChar '8'- showsNat 9 = showChar '9'- showsNat n = showsNat (n `div` 10) . showsNat (n `mod` 10)- |])--instance PShow Natural where- type ShowsPrec _ n x = ShowsNat n x--instance SShow Natural where- sShowsPrec _ sn sx =- let n = fromSing sn- x = fromSing sx- ex = someSymbolVal (P.show n ++ T.unpack x)- in- case ex of- SomeSymbol (_ :: Proxy s) -> unsafeCoerce (SSym :: Sing s)--$(promoteOnly [d|- showsCharPrec :: Natural -> Char -> SymbolS- showsCharPrec _ '\'' = showString "'\\''"- showsCharPrec _ c = showChar '\'' . showLitChar c . showChar '\''-- showCharList :: [Char] -> SymbolS- showCharList cs = showChar '"' . showLitString cs . showChar '"'-- -- -| Like 'showCharList', but for 'Symbol's.- showSymbol :: Symbol -> SymbolS- showSymbol sym = showChar '"' . showLitSymbol sym . showChar '"'-- -- -| Convert a character to a string using only printable characters,- -- using Haskell source-language escape conventions. For example:- --- -- > showLitChar '\n' s = "\\n" ++ s- --- showLitChar :: Char -> SymbolS- showLitChar c s | c > '\DEL' = showChar '\\' (protectEsc isDec (shows (charToNat c)) s)- showLitChar '\DEL' s = showString "\\DEL" s- showLitChar '\\' s = showString "\\\\" s- showLitChar c s | c >= ' ' = showChar c s- showLitChar '\a' s = showString "\\a" s- showLitChar '\b' s = showString "\\b" s- showLitChar '\f' s = showString "\\f" s- showLitChar '\n' s = showString "\\n" s- showLitChar '\r' s = showString "\\r" s- showLitChar '\t' s = showString "\\t" s- showLitChar '\v' s = showString "\\v" s- showLitChar '\SO' s = protectEsc (== 'H') (showString "\\SO") s- showLitChar c s = showString ('\\' `consSymbol` (asciiTab!!charToNat c)) s- -- I've done manual eta-expansion here, because otherwise it's- -- impossible to stop (asciiTab!!charToNat) getting floated out as an MFE-- showLitString :: String -> SymbolS- -- -| Same as 'showLitChar', but for strings- -- It converts the string to a string using Haskell escape conventions- -- for non-printable characters. Does not add double-quotes around the- -- whole thing; the caller should do that.- -- The main difference from showLitChar (apart from the fact that the- -- argument is a string not a list) is that we must escape double-quotes- showLitString [] s = s- showLitString ('"' : cs) s = showString "\\\"" (showLitString cs s)- showLitString (c : cs) s = showLitChar c (showLitString cs s)- -- Making 's' an explicit parameter makes it clear to GHC that- -- showLitString has arity 2, which avoids it allocating an extra lambda- -- The sticking point is the recursive call to (showLitString cs), which- -- it can't figure out would be ok with arity 2.-- -- -| Like 'showLitString', but for 'Symbol's.- showLitSymbol :: Symbol -> SymbolS- showLitSymbol sym s = case unconsSymbol sym of- Nothing -> s- Just ('"', cs) -> showString "\\\"" (showLitSymbol cs s)- Just (c, cs) -> showLitChar c (showLitSymbol cs s)-- isDec :: Char -> Bool- isDec c = c >= '0' && c <= '9'-- protectEsc :: (Char -> Bool) -> SymbolS -> SymbolS- protectEsc p f = f . cont- -- where cont s@(c:_) | p c = "\\&" ++ s- -- cont s = s- where cont s = case unconsSymbol s of- Just (c, _) | p c -> "\\&" <> s- Nothing -> s-- asciiTab :: [Symbol]- asciiTab = -- Using an array drags in the array module. listArray ('\NUL', ' ')- ["NUL", "SOH", "STX", "ETX", "EOT", "ENQ", "ACK", "BEL",- "BS", "HT", "LF", "VT", "FF", "CR", "SO", "SI",- "DLE", "DC1", "DC2", "DC3", "DC4", "NAK", "SYN", "ETB",- "CAN", "EM", "SUB", "ESC", "FS", "GS", "RS", "US",- "SP"]- |])--instance PShow Char where- type ShowsPrec p c x = ShowsCharPrec p c x- type ShowList cs x = ShowCharList cs x--instance SShow Char where- sShowsPrec sp sc sx =- let p = fromSing sp- c = fromSing sc- x = fromSing sx- ex = someSymbolVal (P.showsPrec (fromIntegral p) c (T.unpack x))- in- case ex of- SomeSymbol (_ :: Proxy s) -> unsafeCoerce (SSym :: Sing s)-- sShowList scs sx =- let cs = fromSing scs- x = fromSing sx- ex = someSymbolVal (P.showList cs (T.unpack x))- in- case ex of- SomeSymbol (_ :: Proxy s) -> unsafeCoerce (SSym :: Sing s)--instance PShow Symbol where- type ShowsPrec _ s x = ShowSymbol s x--instance SShow Symbol where- sShowsPrec _ ss sx =- let s = fromSing ss- x = fromSing sx- ex = someSymbolVal (P.show s ++ T.unpack x)- in- case ex of- SomeSymbol (_ :: Proxy s) -> unsafeCoerce (SSym :: Sing s)---- | 'P.show', but with an extra underscore so that its promoted counterpart--- ('Show_') will not clash with the 'Show' class.-show_ :: P.Show a => a -> String-show_ = P.show--$(singShowInstances [ ''(), ''Maybe, ''Either, ''NonEmpty, ''Bool,- ''Ordering, ''Void ])+{-# LANGUAGE DataKinds #-} +{-# LANGUAGE DefaultSignatures #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE UndecidableInstances #-} + +----------------------------------------------------------------------------- +-- | +-- Module : Text.Show.Singletons +-- Copyright : (C) 2017 Ryan Scott +-- License : BSD-style (see LICENSE) +-- Maintainer : Ryan Scott +-- Stability : experimental +-- Portability : non-portable +-- +-- Defines the SShow singleton version of the Show type class. +-- +----------------------------------------------------------------------------- + +module Text.Show.Singletons ( + PShow(..), SShow(..), SymbolS, show_, + Shows, sShows, + ShowListWith, sShowListWith, + ShowChar, sShowChar, + ShowString, sShowString, + ShowParen, sShowParen, + ShowSpace, sShowSpace, + ShowCommaSpace, sShowCommaSpace, + AppPrec, sAppPrec, + AppPrec1, sAppPrec1, + + -- * Defunctionalization symbols + ShowsPrecSym0, ShowsPrecSym1, ShowsPrecSym2, ShowsPrecSym3, + Show_Sym0, Show_Sym1, + ShowListSym0, ShowListSym1, ShowListSym2, + ShowsSym0, ShowsSym1, ShowsSym2, + ShowListWithSym0, ShowListWithSym1, ShowListWithSym2, ShowListWithSym3, + ShowCharSym0, ShowCharSym1, ShowCharSym2, + ShowStringSym0, ShowStringSym1, ShowStringSym2, + ShowParenSym0, ShowParenSym1, ShowParenSym2, + ShowSpaceSym0, ShowSpaceSym1, + ShowCommaSpaceSym0, ShowCommaSpaceSym1, + AppPrecSym0, AppPrec1Sym0 + ) where + +import Data.Bool.Singletons +import Data.Eq.Singletons +import Data.Kind +import Data.List.NonEmpty (NonEmpty) +import Data.List.Singletons.Internal +import Data.Ord (Down) +import Data.Ord.Singletons +import Data.Semigroup.Singletons.Internal.Classes +import Data.Singletons +import Data.Singletons.Base.Instances +import Data.Singletons.TH +import qualified Data.Text as T +import GHC.Base.Singletons +import GHC.Num.Singletons +import GHC.TypeLits +import GHC.TypeLits.Singletons +import qualified Prelude as P +import Prelude hiding (Show(..)) +import Unsafe.Coerce (unsafeCoerce) + +-- | The @shows@ functions return a function that prepends the +-- output 'Symbol' to an existing 'Symbol'. This allows constant-time +-- concatenation of results using function composition. +type SymbolS :: Type +type SymbolS = Symbol -> Symbol + +$(singletonsOnly [d| + class Show a where + showsPrec :: Natural -> a -> SymbolS + show_ :: a -> Symbol + showList :: [a] -> SymbolS + + showsPrec _ x s = show_ x <> s + show_ x = shows x "" + showList ls s = showListWith shows ls s + + shows :: Show a => a -> SymbolS + shows s = showsPrec 0 s + + showListWith :: (a -> SymbolS) -> [a] -> SymbolS + showListWith _ [] s = "[]" <> s + showListWith showx (x:xs) s = "[" <> showx x (showl xs) + where + showl [] = "]" <> s + showl (y:ys) = "," <> showx y (showl ys) + + showChar :: Char -> SymbolS + showChar = consSymbol + + showString :: Symbol -> SymbolS + showString = (<>) + + showParen :: Bool -> SymbolS -> SymbolS + showParen b p = if b then showChar '(' . p . showChar ')' else p + + showSpace :: SymbolS + showSpace = \xs -> " " <> xs + + showCommaSpace :: SymbolS + showCommaSpace = showString ", " + + appPrec, appPrec1 :: Nat + appPrec = 10 + appPrec1 = 11 + + instance Show a => Show [a] where + showsPrec _ = showList + + show_tuple :: [SymbolS] -> SymbolS + show_tuple ss = showChar '(' + . foldr1 (\s r -> s . showChar ',' . r) ss + . showChar ')' + + instance (Show a, Show b) => Show (a,b) where + showsPrec _ (a,b) s = show_tuple [shows a, shows b] s + + instance (Show a, Show b, Show c) => Show (a, b, c) where + showsPrec _ (a,b,c) s = show_tuple [shows a, shows b, shows c] s + + instance (Show a, Show b, Show c, Show d) => Show (a, b, c, d) where + showsPrec _ (a,b,c,d) s = show_tuple [shows a, shows b, shows c, shows d] s + + instance (Show a, Show b, Show c, Show d, Show e) => Show (a, b, c, d, e) where + showsPrec _ (a,b,c,d,e) s = show_tuple [shows a, shows b, shows c, shows d, shows e] s + + instance (Show a, Show b, Show c, Show d, Show e, Show f) => Show (a,b,c,d,e,f) where + showsPrec _ (a,b,c,d,e,f) s = show_tuple [shows a, shows b, shows c, shows d, shows e, shows f] s + + instance (Show a, Show b, Show c, Show d, Show e, Show f, Show g) + => Show (a,b,c,d,e,f,g) where + showsPrec _ (a,b,c,d,e,f,g) s + = show_tuple [shows a, shows b, shows c, shows d, shows e, shows f, shows g] s + + deriving instance Show a => Show (Down a) + |]) + +$(promoteOnly [d| + showsNat :: Natural -> SymbolS + showsNat 0 = showChar '0' + showsNat 1 = showChar '1' + showsNat 2 = showChar '2' + showsNat 3 = showChar '3' + showsNat 4 = showChar '4' + showsNat 5 = showChar '5' + showsNat 6 = showChar '6' + showsNat 7 = showChar '7' + showsNat 8 = showChar '8' + showsNat 9 = showChar '9' + showsNat n = showsNat (n `div` 10) . showsNat (n `mod` 10) + |]) + +instance PShow Natural where + type ShowsPrec _ n x = ShowsNat n x + +instance SShow Natural where + sShowsPrec _ sn sx = + let n = fromSing sn + x = fromSing sx + in withSomeSSymbol (P.show n ++ T.unpack x) unsafeCoerce + +$(promoteOnly [d| + showsCharPrec :: Natural -> Char -> SymbolS + showsCharPrec _ '\'' = showString "'\\''" + showsCharPrec _ c = showChar '\'' . showLitChar c . showChar '\'' + + showCharList :: [Char] -> SymbolS + showCharList cs = showChar '"' . showLitString cs . showChar '"' + + -- -| Like 'showCharList', but for 'Symbol's. + showSymbol :: Symbol -> SymbolS + showSymbol sym = showChar '"' . showLitSymbol sym . showChar '"' + + -- -| Convert a character to a string using only printable characters, + -- using Haskell source-language escape conventions. For example: + -- + -- > showLitChar '\n' s = "\\n" ++ s + -- + showLitChar :: Char -> SymbolS + showLitChar c s | c > '\DEL' = showChar '\\' (protectEsc isDec (shows (charToNat c)) s) + showLitChar '\DEL' s = showString "\\DEL" s + showLitChar '\\' s = showString "\\\\" s + showLitChar c s | c >= ' ' = showChar c s + showLitChar '\a' s = showString "\\a" s + showLitChar '\b' s = showString "\\b" s + showLitChar '\f' s = showString "\\f" s + showLitChar '\n' s = showString "\\n" s + showLitChar '\r' s = showString "\\r" s + showLitChar '\t' s = showString "\\t" s + showLitChar '\v' s = showString "\\v" s + showLitChar '\SO' s = protectEsc (== 'H') (showString "\\SO") s + showLitChar c s = showString ('\\' `consSymbol` (asciiTab!!charToNat c)) s + -- I've done manual eta-expansion here, because otherwise it's + -- impossible to stop (asciiTab!!charToNat) getting floated out as an MFE + + showLitString :: String -> SymbolS + -- -| Same as 'showLitChar', but for strings + -- It converts the string to a string using Haskell escape conventions + -- for non-printable characters. Does not add double-quotes around the + -- whole thing; the caller should do that. + -- The main difference from showLitChar (apart from the fact that the + -- argument is a string not a list) is that we must escape double-quotes + showLitString [] s = s + showLitString ('"' : cs) s = showString "\\\"" (showLitString cs s) + showLitString (c : cs) s = showLitChar c (showLitString cs s) + -- Making 's' an explicit parameter makes it clear to GHC that + -- showLitString has arity 2, which avoids it allocating an extra lambda + -- The sticking point is the recursive call to (showLitString cs), which + -- it can't figure out would be ok with arity 2. + + -- -| Like 'showLitString', but for 'Symbol's. + showLitSymbol :: Symbol -> SymbolS + showLitSymbol sym s = case unconsSymbol sym of + Nothing -> s + Just ('"', cs) -> showString "\\\"" (showLitSymbol cs s) + Just (c, cs) -> showLitChar c (showLitSymbol cs s) + + isDec :: Char -> Bool + isDec c = c >= '0' && c <= '9' + + protectEsc :: (Char -> Bool) -> SymbolS -> SymbolS + protectEsc p f = f . cont + -- where cont s@(c:_) | p c = "\\&" ++ s + -- cont s = s + where cont s = case unconsSymbol s of + Just (c, _) | p c -> "\\&" <> s + Nothing -> s + + asciiTab :: [Symbol] + asciiTab = -- Using an array drags in the array module. listArray ('\NUL', ' ') + ["NUL", "SOH", "STX", "ETX", "EOT", "ENQ", "ACK", "BEL", + "BS", "HT", "LF", "VT", "FF", "CR", "SO", "SI", + "DLE", "DC1", "DC2", "DC3", "DC4", "NAK", "SYN", "ETB", + "CAN", "EM", "SUB", "ESC", "FS", "GS", "RS", "US", + "SP"] + |]) + +instance PShow Char where + type ShowsPrec p c x = ShowsCharPrec p c x + type ShowList cs x = ShowCharList cs x + +instance SShow Char where + sShowsPrec sp sc sx = + let p = fromSing sp + c = fromSing sc + x = fromSing sx + in withSomeSSymbol (P.showsPrec (fromIntegral p) c (T.unpack x)) unsafeCoerce + + sShowList scs sx = + let cs = fromSing scs + x = fromSing sx + in withSomeSSymbol (P.showList cs (T.unpack x)) unsafeCoerce + +instance PShow Symbol where + type ShowsPrec _ s x = ShowSymbol s x + +instance SShow Symbol where + sShowsPrec _ ss sx = + let s = fromSing ss + x = fromSing sx + in withSomeSSymbol (P.show s ++ T.unpack x) unsafeCoerce + +-- | 'P.show', but with an extra underscore so that its promoted counterpart +-- ('Show_') will not clash with the 'Show' class. +show_ :: P.Show a => a -> String +show_ = P.show + +$(singShowInstances [ ''(), ''Maybe, ''Either, ''NonEmpty, ''Bool, + ''Ordering, ''Void ])
tests/README.md view
@@ -1,65 +1,65 @@-`singletons-base` testsuite notes-=================================--The `singletons-base` testsuite is built using the-[`tasty`](http://hackage.haskell.org/package/tasty) testing framework. Aside-from the standard `HUnit` and `QuickCheck` tests, it contains a number of-compile-and-dump tests. These tests run GHC to compile a test file that uses-the `singletons-base` library and compare the generated Template Haskell splices-against expected output saved in a "golden" file. Below are some details about-these tests:-- * GHC uses the in-tree `singletons-base` library. This means there is no need to- install the library in your system before running the tests. You can simply- run the tests with:-- ```bash- cabal test- ```-- * Compile-and-dump tests are stored in the subdirectories of the- `tests/compile-and-dump/` directory. Files with a `.golden` extension store- the expected output. Running the testsuite produces files with an `.actual`- extension which contain the actual output produced by GHC. These files are- not deleted by the testsuite, which allows one to inspect them in case a- test fails. To remove the `.actual` files, run:-- ```bash- make clean-tests- ```-- * Running the testsuite requires `diff`, as `diff` is used to compare golden- and actual files.-- * Each compile-and-dump test requires a set of GHC options to be used for- compilation. The testsuite defines a default set of options that enable all- of the language extensions required by `singletons-base`. This makes writing- tests easier since there is no need to put all the extensions into a source- file. The default options also enable `-ddump-splices` (which dumps splices- generated by Template Haskell), `-dsuppress-uniques` (which avoids test- failures due to unique identifiers), `-v0` (which silences GHC's build- output) and `-fforce-recomp` (which forces recompilation each time a- testsuite is run). There is a convenience function (`compileAndDumpTest`)- that creates a test with the standard GHC options defined by the testsuite.-- * Because `singletons-base` only supports one version of GHC, the `.golden` files- should not be assumed to be portable across multiple versions of GHC. Beware- of this should you try testing `singletons-base` against GHC HEAD.-- * You can run single tests or groups of tests whose name match a regexp using- tasty's pattern feature. For example:-- ```bash- cabal test --test-options="--pattern=Testsuite/Singletons/*"- ```-- runs all tests in the `Testsuite/Singletons` branch of the test tree.- The `SingletonsTestSuite` module defines the structure of the test tree.-- * If you modify `singletons`, `singletons-th`, or `singletons-base`, you may- cause the actual output of some tests to change. If these changes are what- you intended, you can accept the new output by running the following command:-- ```bash- cabal test --test-options="--accept"- ```+`singletons-base` testsuite notes +================================= + +The `singletons-base` testsuite is built using the +[`tasty`](http://hackage.haskell.org/package/tasty) testing framework. Aside +from the standard `HUnit` and `QuickCheck` tests, it contains a number of +compile-and-dump tests. These tests run GHC to compile a test file that uses +the `singletons-base` library and compare the generated Template Haskell splices +against expected output saved in a "golden" file. Below are some details about +these tests: + + * GHC uses the in-tree `singletons-base` library. This means there is no need to + install the library in your system before running the tests. You can simply + run the tests with: + + ```bash + cabal test + ``` + + * Compile-and-dump tests are stored in the subdirectories of the + `tests/compile-and-dump/` directory. Files with a `.golden` extension store + the expected output. Running the testsuite produces files with an `.actual` + extension which contain the actual output produced by GHC. These files are + not deleted by the testsuite, which allows one to inspect them in case a + test fails. To remove the `.actual` files, run: + + ```bash + make clean-tests + ``` + + * Running the testsuite requires `diff`, as `diff` is used to compare golden + and actual files. + + * Each compile-and-dump test requires a set of GHC options to be used for + compilation. The testsuite defines a default set of options that enable all + of the language extensions required by `singletons-base`. This makes writing + tests easier since there is no need to put all the extensions into a source + file. The default options also enable `-ddump-splices` (which dumps splices + generated by Template Haskell), `-dsuppress-uniques` (which avoids test + failures due to unique identifiers), `-v0` (which silences GHC's build + output) and `-fforce-recomp` (which forces recompilation each time a + testsuite is run). There is a convenience function (`compileAndDumpTest`) + that creates a test with the standard GHC options defined by the testsuite. + + * Because `singletons-base` only supports one version of GHC, the `.golden` files + should not be assumed to be portable across multiple versions of GHC. Beware + of this should you try testing `singletons-base` against GHC HEAD. + + * You can run single tests or groups of tests whose name match a regexp using + tasty's pattern feature. For example: + + ```bash + cabal test --test-options="--pattern=Testsuite/Singletons/*" + ``` + + runs all tests in the `Testsuite/Singletons` branch of the test tree. + The `SingletonsTestSuite` module defines the structure of the test tree. + + * If you modify `singletons`, `singletons-th`, or `singletons-base`, you may + cause the actual output of some tests to change. If these changes are what + you intended, you can accept the new output by running the following command: + + ```bash + cabal test --test-options="--accept" + ```
tests/SingletonsBaseTestSuite.hs view
@@ -1,169 +1,173 @@-module Main (- main- ) where--import Test.Tasty ( DependencyType(..), TestTree- , after, defaultMain, testGroup )-import SingletonsBaseTestSuiteUtils ( compileAndDumpStdTest, compileAndDumpTest- , testCompileAndDumpGroup, ghcOpts )--main :: IO ()-main = defaultMain tests--tests :: TestTree-tests =- testGroup "Testsuite" $ [- testCompileAndDumpGroup "Singletons"- [ compileAndDumpStdTest "Nat"- , compileAndDumpStdTest "Empty"- , compileAndDumpStdTest "Maybe"- , compileAndDumpStdTest "BoxUnBox"- , afterSingletonsNat .- compileAndDumpStdTest "Operators"- , afterSingletonsNat .- compileAndDumpStdTest "HigherOrder"- , compileAndDumpStdTest "Contains"- , afterSingletonsNat .- compileAndDumpStdTest "AsPattern"- , afterSingletonsNat .- compileAndDumpStdTest "DataValues"- , after AllSucceed "$3 == \"Empty\"" .- after AllSucceed "$3 == \"Operators\"" .- compileAndDumpStdTest "EqInstances"- , compileAndDumpStdTest "CaseExpressions"- , afterSingletonsNat .- compileAndDumpStdTest "Star"- , afterSingletonsNat .- compileAndDumpStdTest "ReturnFunc"- , compileAndDumpStdTest "Lambdas"- , afterSingletonsNat .- compileAndDumpStdTest "LambdasComprehensive"- , compileAndDumpStdTest "Error"- , compileAndDumpStdTest "TopLevelPatterns"- , afterSingletonsNat .- compileAndDumpStdTest "LetStatements"- , compileAndDumpStdTest "LambdaCase"- , afterSingletonsNat .- compileAndDumpStdTest "Sections"- , afterSingletonsNat .- compileAndDumpStdTest "PatternMatching"- , compileAndDumpStdTest "Records"- , compileAndDumpStdTest "T29"- , compileAndDumpStdTest "T33"- , compileAndDumpStdTest "T54"- , afterSingletonsNat .- compileAndDumpStdTest "Classes"- , afterSingletonsNat .- after AllSucceed "$3 == \"Classes\"" .- compileAndDumpStdTest "Classes2"- , compileAndDumpStdTest "FunDeps"- , compileAndDumpStdTest "T78"- , compileAndDumpStdTest "OrdDeriving"- , compileAndDumpStdTest "BoundedDeriving"- , compileAndDumpStdTest "BadBoundedDeriving"- , compileAndDumpStdTest "EnumDeriving"- , compileAndDumpStdTest "BadEnumDeriving"- , compileAndDumpStdTest "Fixity"- , compileAndDumpStdTest "Undef"- , compileAndDumpStdTest "T124"- , compileAndDumpStdTest "T136"- , compileAndDumpStdTest "T136b"- , compileAndDumpStdTest "T153"- , compileAndDumpStdTest "T157"- , compileAndDumpStdTest "T159"- , compileAndDumpStdTest "T167"- , compileAndDumpStdTest "T145"- , compileAndDumpStdTest "PolyKinds"- , compileAndDumpStdTest "PolyKindsApp"- , afterSingletonsNat .- compileAndDumpStdTest "T150"- , compileAndDumpStdTest "T160"- , compileAndDumpStdTest "T163"- , compileAndDumpStdTest "T166"- , compileAndDumpStdTest "T172"- , compileAndDumpStdTest "T175"- , compileAndDumpStdTest "T176"- , compileAndDumpStdTest "T178"- , compileAndDumpStdTest "T183"- , compileAndDumpStdTest "T184"- , compileAndDumpStdTest "T187"- , compileAndDumpStdTest "T190"- , compileAndDumpStdTest "ShowDeriving"- , compileAndDumpStdTest "EmptyShowDeriving"- , compileAndDumpStdTest "StandaloneDeriving"- , compileAndDumpStdTest "T197"- , compileAndDumpStdTest "T197b"- , compileAndDumpStdTest "T200"- , compileAndDumpStdTest "T204"- , compileAndDumpStdTest "T206"- , compileAndDumpStdTest "T209"- , compileAndDumpStdTest "T216"- , compileAndDumpStdTest "T226"- , compileAndDumpStdTest "T229"- , compileAndDumpStdTest "T249"- , compileAndDumpStdTest "OverloadedStrings"- , compileAndDumpStdTest "T271"- , compileAndDumpStdTest "T287"- , compileAndDumpStdTest "TypeRepTYPE"- , compileAndDumpStdTest "T296"- , compileAndDumpStdTest "T297"- , compileAndDumpStdTest "T312"- , compileAndDumpStdTest "T313"- , compileAndDumpStdTest "T316"- , compileAndDumpStdTest "T322"- , compileAndDumpStdTest "T326"- , compileAndDumpStdTest "NatSymbolReflexive"- , compileAndDumpStdTest "T323"- , compileAndDumpStdTest "T332"- , compileAndDumpStdTest "T342"- , compileAndDumpStdTest "FunctorLikeDeriving"- , compileAndDumpStdTest "T353"- , compileAndDumpStdTest "T358"- , compileAndDumpStdTest "T367"- , compileAndDumpStdTest "T371"- , compileAndDumpStdTest "T376"- , compileAndDumpStdTest "T378a"- , afterSingletonsNat .- compileAndDumpStdTest "T378b"- , compileAndDumpStdTest "T401"- , compileAndDumpStdTest "T401b"- , compileAndDumpStdTest "T402"- , compileAndDumpStdTest "T410"- , compileAndDumpStdTest "T412"- , compileAndDumpStdTest "T414"- , compileAndDumpStdTest "T443"- , afterSingletonsNat .- compileAndDumpStdTest "T445"- , compileAndDumpStdTest "T450"- , compileAndDumpStdTest "T453"- , compileAndDumpStdTest "NegativeLiterals"- , compileAndDumpStdTest "T470"- , compileAndDumpStdTest "T480"- , compileAndDumpStdTest "T487"- , compileAndDumpStdTest "T489"- , compileAndDumpStdTest "T492"- , compileAndDumpStdTest "Natural"- , compileAndDumpStdTest "T511"- ],- testCompileAndDumpGroup "Promote"- [ compileAndDumpStdTest "Constructors"- , compileAndDumpStdTest "GenDefunSymbols"- , afterSingletonsNat .- compileAndDumpStdTest "Newtypes"- , compileAndDumpStdTest "Pragmas"- , compileAndDumpStdTest "Prelude"- , compileAndDumpStdTest "T180"- , compileAndDumpStdTest "T361"- ],- testGroup "Database client"- [ compileAndDumpTest "GradingClient/Database" ghcOpts- , after AllSucceed "$3 == \"Database\"" $- compileAndDumpTest "GradingClient/Main" ghcOpts- ],- testCompileAndDumpGroup "InsertionSort"- [ compileAndDumpStdTest "InsertionSortImp"- ]- ]--afterSingletonsNat :: TestTree -> TestTree-afterSingletonsNat = after AllSucceed "$3 == \"Nat\""+module Main ( + main + ) where + +import Test.Tasty ( DependencyType(..), TestTree + , after, defaultMain, testGroup ) +import SingletonsBaseTestSuiteUtils ( compileAndDumpStdTest, compileAndDumpTest + , testCompileAndDumpGroup, ghcOpts ) + +main :: IO () +main = defaultMain tests + +tests :: TestTree +tests = + testGroup "Testsuite" $ [ + testCompileAndDumpGroup "Singletons" + [ compileAndDumpStdTest "Nat" + , compileAndDumpStdTest "Empty" + , compileAndDumpStdTest "Maybe" + , compileAndDumpStdTest "BoxUnBox" + , afterSingletonsNat . + compileAndDumpStdTest "Operators" + , afterSingletonsNat . + compileAndDumpStdTest "HigherOrder" + , compileAndDumpStdTest "Contains" + , afterSingletonsNat . + compileAndDumpStdTest "AsPattern" + , afterSingletonsNat . + compileAndDumpStdTest "DataValues" + , after AllSucceed "$3 == \"Empty\"" . + after AllSucceed "$3 == \"Operators\"" . + compileAndDumpStdTest "EqInstances" + , compileAndDumpStdTest "CaseExpressions" + , afterSingletonsNat . + compileAndDumpStdTest "Star" + , afterSingletonsNat . + compileAndDumpStdTest "ReturnFunc" + , compileAndDumpStdTest "Lambdas" + , afterSingletonsNat . + compileAndDumpStdTest "LambdasComprehensive" + , compileAndDumpStdTest "Error" + , compileAndDumpStdTest "TopLevelPatterns" + , afterSingletonsNat . + compileAndDumpStdTest "LetStatements" + , compileAndDumpStdTest "LambdaCase" + , afterSingletonsNat . + compileAndDumpStdTest "Sections" + , afterSingletonsNat . + compileAndDumpStdTest "PatternMatching" + , compileAndDumpStdTest "Records" + , compileAndDumpStdTest "T29" + , compileAndDumpStdTest "T33" + , compileAndDumpStdTest "T54" + , afterSingletonsNat . + compileAndDumpStdTest "Classes" + , afterSingletonsNat . + after AllSucceed "$3 == \"Classes\"" . + compileAndDumpStdTest "Classes2" + , compileAndDumpStdTest "FunDeps" + , compileAndDumpStdTest "T78" + , compileAndDumpStdTest "T89" + , compileAndDumpStdTest "OrdDeriving" + , compileAndDumpStdTest "BoundedDeriving" + , compileAndDumpStdTest "BadBoundedDeriving" + , compileAndDumpStdTest "EnumDeriving" + , compileAndDumpStdTest "BadEnumDeriving" + , compileAndDumpStdTest "Fixity" + , compileAndDumpStdTest "Undef" + , compileAndDumpStdTest "T124" + , compileAndDumpStdTest "T136" + , compileAndDumpStdTest "T136b" + , compileAndDumpStdTest "T153" + , compileAndDumpStdTest "T157" + , compileAndDumpStdTest "T159" + , compileAndDumpStdTest "T167" + , compileAndDumpStdTest "T145" + , compileAndDumpStdTest "PolyKinds" + , compileAndDumpStdTest "PolyKindsApp" + , afterSingletonsNat . + compileAndDumpStdTest "T150" + , compileAndDumpStdTest "T160" + , compileAndDumpStdTest "T163" + , compileAndDumpStdTest "T166" + , compileAndDumpStdTest "T172" + , compileAndDumpStdTest "T175" + , compileAndDumpStdTest "T176" + , compileAndDumpStdTest "T178" + , compileAndDumpStdTest "T183" + , compileAndDumpStdTest "T184" + , compileAndDumpStdTest "T187" + , compileAndDumpStdTest "T190" + , compileAndDumpStdTest "ShowDeriving" + , compileAndDumpStdTest "EmptyShowDeriving" + , compileAndDumpStdTest "StandaloneDeriving" + , compileAndDumpStdTest "T197" + , compileAndDumpStdTest "T197b" + , compileAndDumpStdTest "T200" + , compileAndDumpStdTest "T204" + , compileAndDumpStdTest "T206" + , compileAndDumpStdTest "T209" + , compileAndDumpStdTest "T216" + , compileAndDumpStdTest "T226" + , compileAndDumpStdTest "T229" + , compileAndDumpStdTest "T249" + , compileAndDumpStdTest "OverloadedStrings" + , compileAndDumpStdTest "T271" + , compileAndDumpStdTest "T287" + , compileAndDumpStdTest "TypeRepTYPE" + , compileAndDumpStdTest "T296" + , compileAndDumpStdTest "T297" + , compileAndDumpStdTest "T312" + , compileAndDumpStdTest "T313" + , compileAndDumpStdTest "T316" + , compileAndDumpStdTest "T322" + , compileAndDumpStdTest "T326" + , compileAndDumpStdTest "NatSymbolReflexive" + , compileAndDumpStdTest "T323" + , compileAndDumpStdTest "T332" + , compileAndDumpStdTest "T342" + , compileAndDumpStdTest "FunctorLikeDeriving" + , compileAndDumpStdTest "T353" + , compileAndDumpStdTest "T358" + , compileAndDumpStdTest "T367" + , compileAndDumpStdTest "T371" + , compileAndDumpStdTest "T376" + , compileAndDumpStdTest "T378a" + , afterSingletonsNat . + compileAndDumpStdTest "T378b" + , compileAndDumpStdTest "T401" + , compileAndDumpStdTest "T401b" + , compileAndDumpStdTest "T402" + , compileAndDumpStdTest "T410" + , compileAndDumpStdTest "T412" + , compileAndDumpStdTest "T414" + , compileAndDumpStdTest "T443" + , afterSingletonsNat . + compileAndDumpStdTest "T445" + , compileAndDumpStdTest "T450" + , compileAndDumpStdTest "T453" + , compileAndDumpStdTest "NegativeLiterals" + , compileAndDumpStdTest "T470" + , compileAndDumpStdTest "T480" + , compileAndDumpStdTest "T487" + , compileAndDumpStdTest "T489" + , compileAndDumpStdTest "T492" + , compileAndDumpStdTest "Natural" + , compileAndDumpStdTest "T511" + , compileAndDumpStdTest "T536" + , compileAndDumpStdTest "T555" + , compileAndDumpStdTest "T559" + ], + testCompileAndDumpGroup "Promote" + [ compileAndDumpStdTest "Constructors" + , compileAndDumpStdTest "GenDefunSymbols" + , afterSingletonsNat . + compileAndDumpStdTest "Newtypes" + , compileAndDumpStdTest "Pragmas" + , compileAndDumpStdTest "Prelude" + , compileAndDumpStdTest "T180" + , compileAndDumpStdTest "T361" + ], + testGroup "Database client" + [ compileAndDumpTest "GradingClient/Database" ghcOpts + , after AllSucceed "$3 == \"Database\"" $ + compileAndDumpTest "GradingClient/Main" ghcOpts + ], + testCompileAndDumpGroup "InsertionSort" + [ compileAndDumpStdTest "InsertionSortImp" + ] + ] + +afterSingletonsNat :: TestTree -> TestTree +afterSingletonsNat = after AllSucceed "$3 == \"Nat\""
tests/SingletonsBaseTestSuiteUtils.hs view
@@ -1,204 +1,204 @@-{-# LANGUAGE DeriveAnyClass #-}-{-# LANGUAGE DerivingStrategies #-}-{-# LANGUAGE OverloadedStrings #-}--module SingletonsBaseTestSuiteUtils (- compileAndDumpTest- , compileAndDumpStdTest- , testCompileAndDumpGroup- , ghcOpts- , cleanFiles- ) where--import Build_singletons_base ( ghcPath, ghcFlags, rootDir )-import Control.Exception ( Exception )-import Data.Foldable ( asum )-import Data.Text ( Text )-import Data.String ( IsString(fromString) )-import System.FilePath ( takeBaseName, pathSeparator )-import System.FilePath ( (</>) )-import System.IO ( IOMode(..), openFile )-import System.Process ( CreateProcess(..), StdStream(..)- , createProcess, proc, waitForProcess- , callCommand )-import Test.Tasty ( TestTree, testGroup )-import Test.Tasty.Golden ( goldenVsFileDiff )-import qualified Data.Text as Text-import qualified Turtle---- Some infractructure for handling external process errors-newtype ProcessException = ProcessException String- deriving newtype (Eq, Ord, Show)- deriving anyclass Exception---- directory storing compile-and-run tests and golden files-goldenPath :: FilePath-goldenPath = rootDir </> "tests/compile-and-dump/"---- GHC options used when running the tests-ghcOpts :: [String]-ghcOpts = ghcFlags ++ [- "-v0"- , "-c"- , "-ddump-splices"- , "-dsuppress-uniques"- , "-fforce-recomp"- , "-fprint-explicit-kinds"- , "-O0"- , "-i" ++ goldenPath- , "-XGHC2021"- , "-XTemplateHaskell"- , "-XDataKinds"- , "-XTypeFamilies"- , "-XGADTs"- , "-XUndecidableInstances"- , "-XIncoherentInstances"- , "-XLambdaCase"- , "-XUnboxedTuples"- , "-XDefaultSignatures"- , "-XCPP"- , "-XNoStarIsType"- , "-XNoNamedWildCards"- ]---- Compile a test using specified GHC options. Save output to file, normalize--- and compare it with golden file. This function also builds golden file--- from a template file. Putting it here is a bit of a hack but it's easy and it--- works.------ First parameter is a path to the test file relative to goldenPath directory--- with no ".hs".-compileAndDumpTest :: FilePath -> [String] -> TestTree-compileAndDumpTest testName opts =- goldenVsFileDiff- (takeBaseName testName)- (\ref new -> ["diff", "-w", "-B", ref, new]) -- see Note [Diff options]- goldenFilePath- actualFilePath- compileWithGHC- where- testPath = testName ++ ".hs"- goldenFilePath = goldenPath ++ testName ++ ".golden"- actualFilePath = goldenPath ++ testName ++ ".actual"-- compileWithGHC :: IO ()- compileWithGHC = do- hActualFile <- openFile actualFilePath WriteMode- (_, _, _, pid) <- createProcess (proc ghcPath (testPath : opts))- { std_out = UseHandle hActualFile- , std_err = UseHandle hActualFile- , cwd = Just goldenPath }- _ <- waitForProcess pid -- see Note [Ignore exit code]- normalizeOutput actualFilePath -- see Note [Output normalization]- return ()---- Compile-and-dump test using standard GHC options defined by the testsuite.--- It takes two parameters: name of a file containing a test (no ".hs"--- extension) and directory where the test is located (relative to--- goldenPath). Test name and path are passed separately so that this function--- can be used easily with testCompileAndDumpGroup.-compileAndDumpStdTest :: FilePath -> FilePath -> TestTree-compileAndDumpStdTest testName testPath =- compileAndDumpTest (testPath ++ (pathSeparator : testName)) ghcOpts---- A convenience function for defining a group of compile-and-dump tests stored--- in the same subdirectory. It takes the name of subdirectory and list of--- functions that given the name of subdirectory create a TestTree. Designed for--- use with compileAndDumpStdTest.-testCompileAndDumpGroup :: FilePath -> [FilePath -> TestTree] -> TestTree-testCompileAndDumpGroup testDir tests =- testGroup testDir $ map ($ testDir) tests--{--Note [Ignore exit code]-~~~~~~~~~~~~~~~~~~~~~~~-It may happen that the compilation of a source file fails. We could find out-whether that happened by inspecting the exit code of the `ghc` process. But it-would be tricky to get a helpful message from the failing test; we would need-to display the stderr that we just wrote into a file. Luckliy, we don't have to-do that - we can ignore the problem here and let the test fail when the-actual file is compared with the golden file.--Note [Diff options]-~~~~~~~~~~~~~~~~~~~-We use following diff options:- -w - Ignore all white space.- -B - Ignore changes whose lines are all blank.--Note [Output normalization]-~~~~~~~~~~~~~~~~~~~~~~~~~~~-Output file is normalized inplace. Line numbers generated in splices:-- Foo:(40,3)-(42,4)- Foo.hs:7:3:- Equals_1235967303--are turned into:-- Foo:(0,0)-(0,0)- Foo.hs:0:0:- Equals_0123456789--This allows inserting comments into test files without the need to modify the-golden file to adjust line numbers.--Note [Normalizing Windows path separators]-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-File paths are printed differently by GHC depending on which operating system-one uses:--* On Unix-like operating systems: Foo/Bar.hs-* On Windows: Foo\Bar.hs--This is annoying for golden testing, since it means that checking in output-that prints file paths will only work on some operating systems and not others.-To circumvent this problem, we normalize Windows-style path separators to-Unix-like ones.--One way to do this is to replace all occurrences of the '\' character with '/'.-This is a step too far, however, since this will normalize things like-(\x -> x) to (/x -> x). A reasonable middle ground is to require that the-characters before and after the '\' character are alphanumeric before-normalizing it. This just so happens to be the case for every path that is-checked into the singletons-base test suite. This approach isn't perfect, since-one could check in a golden file that prints a path with a non-alphanumeric-character. This seems very unlikely to happen, however, so we will only worry-about that issue should it ever arise in practice.--Moreover, this approach would normalize expressions like (id\x -> x)-to (id/x -> x), which could hypothetically happen with BlockArguments. However,-the vast majority of the expressions that we check into golden files arise from--ddump-splices output, which puts surrounding whitespace after the backslashes-in lambda expressions. As a result, the expression above would be-pretty-printed as (id \ x -> x), which avoids the issue entirely. Again, we-will choose not to worry about this corner case unless it becomes an issue in-practice.--}--normalizeOutput :: FilePath -> IO ()-normalizeOutput file = Turtle.inplace pat (fromString file)- where- pat :: Turtle.Pattern Text- pat = asum- [ "(0,0)-(0,0)" <$ numPair <* "-" <* numPair- , ":0:0:" <$ ":" <* d <* ":" <* d <* "-" <* d- , ":0:0" <$ ":" <* d <* ":" <* d- , fromString @Text . numPeriod <$> Turtle.lowerBounded 10 Turtle.digit- , fromString @Text . ('%' <$) <$> Turtle.lowerBounded 10 punctSym- -- Remove pretty-printed references to the singletons package- -- (e.g., turn `singletons-2.4.1:Sing` into `Sing`) to make the output- -- more stable.- , "" <$ "singletons-" <* verNum <* ":"- , do x <- Turtle.alphaNum- _ <- Turtle.char '\\'- y <- Turtle.alphaNum- pure $ Text.pack [x, '/', y]- ]- verNum = d `Turtle.sepBy` Turtle.char '.'- numPair = () <$ "(" <* d <* "," <* d <* ")"- punctSym = Turtle.oneOf "!#$%&*+./>"- numPeriod = zipWith const (cycle "0123456789876543210")- d = Turtle.some Turtle.digit--cleanFiles :: IO ()-cleanFiles = callCommand $ "rm -f " ++ rootDir </> "tests/compile-and-dump/*/*.{hi,o}"+{-# LANGUAGE DeriveAnyClass #-} +{-# LANGUAGE DerivingStrategies #-} +{-# LANGUAGE OverloadedStrings #-} + +module SingletonsBaseTestSuiteUtils ( + compileAndDumpTest + , compileAndDumpStdTest + , testCompileAndDumpGroup + , ghcOpts + , cleanFiles + ) where + +import Build_singletons_base ( ghcPath, ghcFlags, rootDir ) +import Control.Exception ( Exception ) +import Data.Foldable ( asum ) +import Data.Text ( Text ) +import Data.String ( IsString(fromString) ) +import System.FilePath ( takeBaseName, pathSeparator ) +import System.FilePath ( (</>) ) +import System.IO ( IOMode(..), openFile ) +import System.Process ( CreateProcess(..), StdStream(..) + , createProcess, proc, waitForProcess + , callCommand ) +import Test.Tasty ( TestTree, testGroup ) +import Test.Tasty.Golden ( goldenVsFileDiff ) +import qualified Data.Text as Text +import qualified Turtle + +-- Some infractructure for handling external process errors +newtype ProcessException = ProcessException String + deriving newtype (Eq, Ord, Show) + deriving anyclass Exception + +-- directory storing compile-and-run tests and golden files +goldenPath :: FilePath +goldenPath = rootDir </> "tests/compile-and-dump/" + +-- GHC options used when running the tests +ghcOpts :: [String] +ghcOpts = ghcFlags ++ [ + "-v0" + , "-c" + , "-ddump-splices" + , "-dsuppress-uniques" + , "-fforce-recomp" + , "-fprint-explicit-kinds" + , "-O0" + , "-i" ++ goldenPath + , "-XGHC2021" + , "-XTemplateHaskell" + , "-XDataKinds" + , "-XTypeFamilies" + , "-XGADTs" + , "-XUndecidableInstances" + , "-XIncoherentInstances" + , "-XLambdaCase" + , "-XUnboxedTuples" + , "-XDefaultSignatures" + , "-XCPP" + , "-XNoStarIsType" + , "-XNoNamedWildCards" + ] + +-- Compile a test using specified GHC options. Save output to file, normalize +-- and compare it with golden file. This function also builds golden file +-- from a template file. Putting it here is a bit of a hack but it's easy and it +-- works. +-- +-- First parameter is a path to the test file relative to goldenPath directory +-- with no ".hs". +compileAndDumpTest :: FilePath -> [String] -> TestTree +compileAndDumpTest testName opts = + goldenVsFileDiff + (takeBaseName testName) + (\ref new -> ["diff", "-w", "-B", ref, new]) -- see Note [Diff options] + goldenFilePath + actualFilePath + compileWithGHC + where + testPath = testName ++ ".hs" + goldenFilePath = goldenPath ++ testName ++ ".golden" + actualFilePath = goldenPath ++ testName ++ ".actual" + + compileWithGHC :: IO () + compileWithGHC = do + hActualFile <- openFile actualFilePath WriteMode + (_, _, _, pid) <- createProcess (proc ghcPath (testPath : opts)) + { std_out = UseHandle hActualFile + , std_err = UseHandle hActualFile + , cwd = Just goldenPath } + _ <- waitForProcess pid -- see Note [Ignore exit code] + normalizeOutput actualFilePath -- see Note [Output normalization] + return () + +-- Compile-and-dump test using standard GHC options defined by the testsuite. +-- It takes two parameters: name of a file containing a test (no ".hs" +-- extension) and directory where the test is located (relative to +-- goldenPath). Test name and path are passed separately so that this function +-- can be used easily with testCompileAndDumpGroup. +compileAndDumpStdTest :: FilePath -> FilePath -> TestTree +compileAndDumpStdTest testName testPath = + compileAndDumpTest (testPath ++ (pathSeparator : testName)) ghcOpts + +-- A convenience function for defining a group of compile-and-dump tests stored +-- in the same subdirectory. It takes the name of subdirectory and list of +-- functions that given the name of subdirectory create a TestTree. Designed for +-- use with compileAndDumpStdTest. +testCompileAndDumpGroup :: FilePath -> [FilePath -> TestTree] -> TestTree +testCompileAndDumpGroup testDir tests = + testGroup testDir $ map ($ testDir) tests + +{- +Note [Ignore exit code] +~~~~~~~~~~~~~~~~~~~~~~~ +It may happen that the compilation of a source file fails. We could find out +whether that happened by inspecting the exit code of the `ghc` process. But it +would be tricky to get a helpful message from the failing test; we would need +to display the stderr that we just wrote into a file. Luckliy, we don't have to +do that - we can ignore the problem here and let the test fail when the +actual file is compared with the golden file. + +Note [Diff options] +~~~~~~~~~~~~~~~~~~~ +We use following diff options: + -w - Ignore all white space. + -B - Ignore changes whose lines are all blank. + +Note [Output normalization] +~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Output file is normalized inplace. Line numbers generated in splices: + + Foo:(40,3)-(42,4) + Foo.hs:7:3: + Equals_1235967303 + +are turned into: + + Foo:(0,0)-(0,0) + Foo.hs:0:0: + Equals_0123456789 + +This allows inserting comments into test files without the need to modify the +golden file to adjust line numbers. + +Note [Normalizing Windows path separators] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +File paths are printed differently by GHC depending on which operating system +one uses: + +* On Unix-like operating systems: Foo/Bar.hs +* On Windows: Foo\Bar.hs + +This is annoying for golden testing, since it means that checking in output +that prints file paths will only work on some operating systems and not others. +To circumvent this problem, we normalize Windows-style path separators to +Unix-like ones. + +One way to do this is to replace all occurrences of the '\' character with '/'. +This is a step too far, however, since this will normalize things like +(\x -> x) to (/x -> x). A reasonable middle ground is to require that the +characters before and after the '\' character are alphanumeric before +normalizing it. This just so happens to be the case for every path that is +checked into the singletons-base test suite. This approach isn't perfect, since +one could check in a golden file that prints a path with a non-alphanumeric +character. This seems very unlikely to happen, however, so we will only worry +about that issue should it ever arise in practice. + +Moreover, this approach would normalize expressions like (id\x -> x) +to (id/x -> x), which could hypothetically happen with BlockArguments. However, +the vast majority of the expressions that we check into golden files arise from +-ddump-splices output, which puts surrounding whitespace after the backslashes +in lambda expressions. As a result, the expression above would be +pretty-printed as (id \ x -> x), which avoids the issue entirely. Again, we +will choose not to worry about this corner case unless it becomes an issue in +practice. +-} + +normalizeOutput :: FilePath -> IO () +normalizeOutput file = Turtle.inplace pat (fromString file) + where + pat :: Turtle.Pattern Text + pat = asum + [ "(0,0)-(0,0)" <$ numPair <* "-" <* numPair + , ":0:0:" <$ ":" <* d <* ":" <* d <* "-" <* d + , ":0:0" <$ ":" <* d <* ":" <* d + , fromString @Text . numPeriod <$> Turtle.lowerBounded 10 Turtle.digit + , fromString @Text . ('%' <$) <$> Turtle.lowerBounded 10 punctSym + -- Remove pretty-printed references to the singletons package + -- (e.g., turn `singletons-2.4.1:Sing` into `Sing`) to make the output + -- more stable. + , "" <$ "singletons-" <* verNum <* ":" + , do x <- Turtle.alphaNum + _ <- Turtle.char '\\' + y <- Turtle.alphaNum + pure $ Text.pack [x, '/', y] + ] + verNum = d `Turtle.sepBy` Turtle.char '.' + numPair = () <$ "(" <* d <* "," <* d <* ")" + punctSym = Turtle.oneOf "!#$%&*+./>" + numPeriod = zipWith const (cycle "0123456789876543210") + d = Turtle.some Turtle.digit + +cleanFiles :: IO () +cleanFiles = callCommand $ "rm -f " ++ rootDir </> "tests/compile-and-dump/*/*.{hi,o}"
tests/compile-and-dump/GradingClient/Database.golden view
@@ -1,3478 +1,3487 @@-GradingClient/Database.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| data Nat- = Zero | Succ Nat- deriving (Eq, Ord) |]- ======>- data Nat- = Zero | Succ Nat- deriving (Eq, Ord)- type ZeroSym0 :: Nat- type family ZeroSym0 :: Nat where- ZeroSym0 = Zero- type SuccSym0 :: (~>) Nat Nat- data SuccSym0 :: (~>) Nat Nat- where- SuccSym0KindInference :: SameKind (Apply SuccSym0 arg) (SuccSym1 arg) =>- SuccSym0 a0123456789876543210- type instance Apply SuccSym0 a0123456789876543210 = Succ a0123456789876543210- instance SuppressUnusedWarnings SuccSym0 where- suppressUnusedWarnings = snd (((,) SuccSym0KindInference) ())- type SuccSym1 :: Nat -> Nat- type family SuccSym1 (a0123456789876543210 :: Nat) :: Nat where- SuccSym1 a0123456789876543210 = Succ a0123456789876543210- type TFHelper_0123456789876543210 :: Nat -> Nat -> Bool- type family TFHelper_0123456789876543210 (a :: Nat) (a :: Nat) :: Bool where- TFHelper_0123456789876543210 Zero Zero = TrueSym0- TFHelper_0123456789876543210 Zero (Succ _) = FalseSym0- TFHelper_0123456789876543210 (Succ _) Zero = FalseSym0- TFHelper_0123456789876543210 (Succ a_0123456789876543210) (Succ b_0123456789876543210) = Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210- type TFHelper_0123456789876543210Sym0 :: (~>) Nat ((~>) Nat Bool)- data TFHelper_0123456789876543210Sym0 :: (~>) Nat ((~>) Nat Bool)- where- TFHelper_0123456789876543210Sym0KindInference :: SameKind (Apply TFHelper_0123456789876543210Sym0 arg) (TFHelper_0123456789876543210Sym1 arg) =>- TFHelper_0123456789876543210Sym0 a0123456789876543210- type instance Apply TFHelper_0123456789876543210Sym0 a0123456789876543210 = TFHelper_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings TFHelper_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) TFHelper_0123456789876543210Sym0KindInference) ())- type TFHelper_0123456789876543210Sym1 :: Nat -> (~>) Nat Bool- data TFHelper_0123456789876543210Sym1 (a0123456789876543210 :: Nat) :: (~>) Nat Bool- where- TFHelper_0123456789876543210Sym1KindInference :: SameKind (Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) arg) (TFHelper_0123456789876543210Sym2 a0123456789876543210 arg) =>- TFHelper_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (TFHelper_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) TFHelper_0123456789876543210Sym1KindInference) ())- type TFHelper_0123456789876543210Sym2 :: Nat -> Nat -> Bool- type family TFHelper_0123456789876543210Sym2 (a0123456789876543210 :: Nat) (a0123456789876543210 :: Nat) :: Bool where- TFHelper_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210- instance PEq Nat where- type (==) a a = Apply (Apply TFHelper_0123456789876543210Sym0 a) a- type Compare_0123456789876543210 :: Nat -> Nat -> Ordering- type family Compare_0123456789876543210 (a :: Nat) (a :: Nat) :: Ordering where- Compare_0123456789876543210 Zero Zero = Apply (Apply (Apply FoldlSym0 ThenCmpSym0) EQSym0) NilSym0- Compare_0123456789876543210 (Succ a_0123456789876543210) (Succ b_0123456789876543210) = Apply (Apply (Apply FoldlSym0 ThenCmpSym0) EQSym0) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) NilSym0)- Compare_0123456789876543210 Zero (Succ _) = LTSym0- Compare_0123456789876543210 (Succ _) Zero = GTSym0- type Compare_0123456789876543210Sym0 :: (~>) Nat ((~>) Nat Ordering)- data Compare_0123456789876543210Sym0 :: (~>) Nat ((~>) Nat Ordering)- where- Compare_0123456789876543210Sym0KindInference :: SameKind (Apply Compare_0123456789876543210Sym0 arg) (Compare_0123456789876543210Sym1 arg) =>- Compare_0123456789876543210Sym0 a0123456789876543210- type instance Apply Compare_0123456789876543210Sym0 a0123456789876543210 = Compare_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings Compare_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Compare_0123456789876543210Sym0KindInference) ())- type Compare_0123456789876543210Sym1 :: Nat -> (~>) Nat Ordering- data Compare_0123456789876543210Sym1 (a0123456789876543210 :: Nat) :: (~>) Nat Ordering- where- Compare_0123456789876543210Sym1KindInference :: SameKind (Apply (Compare_0123456789876543210Sym1 a0123456789876543210) arg) (Compare_0123456789876543210Sym2 a0123456789876543210 arg) =>- Compare_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (Compare_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Compare_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Compare_0123456789876543210Sym1KindInference) ())- type Compare_0123456789876543210Sym2 :: Nat -> Nat -> Ordering- type family Compare_0123456789876543210Sym2 (a0123456789876543210 :: Nat) (a0123456789876543210 :: Nat) :: Ordering where- Compare_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210- instance POrd Nat where- type Compare a a = Apply (Apply Compare_0123456789876543210Sym0 a) a- data SNat :: Nat -> Type- where- SZero :: SNat (Zero :: Nat)- SSucc :: forall (n :: Nat). (Sing n) -> SNat (Succ n :: Nat)- type instance Sing @Nat = SNat- instance SingKind Nat where- type Demote Nat = Nat- fromSing SZero = Zero- fromSing (SSucc b) = Succ (fromSing b)- toSing Zero = SomeSing SZero- toSing (Succ (b :: Demote Nat))- = case toSing b :: SomeSing Nat of SomeSing c -> SomeSing (SSucc c)- instance SEq Nat => SEq Nat where- (%==) ::- forall (t1 :: Nat) (t2 :: Nat). Sing t1- -> Sing t2- -> Sing (Apply (Apply ((==@#@$) :: TyFun Nat ((~>) Nat Bool)- -> Type) t1) t2)- (%==) SZero SZero = STrue- (%==) SZero (SSucc _) = SFalse- (%==) (SSucc _) SZero = SFalse- (%==)- (SSucc (sA_0123456789876543210 :: Sing a_0123456789876543210))- (SSucc (sB_0123456789876543210 :: Sing b_0123456789876543210))- = (applySing- ((applySing ((singFun2 @(==@#@$)) (%==))) sA_0123456789876543210))- sB_0123456789876543210- instance SOrd Nat => SOrd Nat where- sCompare ::- forall (t1 :: Nat) (t2 :: Nat). Sing t1- -> Sing t2- -> Sing (Apply (Apply (CompareSym0 :: TyFun Nat ((~>) Nat Ordering)- -> Type) t1) t2)- sCompare SZero SZero- = (applySing- ((applySing- ((applySing ((singFun3 @FoldlSym0) sFoldl))- ((singFun2 @ThenCmpSym0) sThenCmp)))- SEQ))- SNil- sCompare- (SSucc (sA_0123456789876543210 :: Sing a_0123456789876543210))- (SSucc (sB_0123456789876543210 :: Sing b_0123456789876543210))- = (applySing- ((applySing- ((applySing ((singFun3 @FoldlSym0) sFoldl))- ((singFun2 @ThenCmpSym0) sThenCmp)))- SEQ))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing- ((applySing ((singFun2 @CompareSym0) sCompare))- sA_0123456789876543210))- sB_0123456789876543210)))- SNil)- sCompare SZero (SSucc _) = SLT- sCompare (SSucc _) SZero = SGT- instance SDecide Nat => SDecide Nat where- (%~) SZero SZero = Proved Refl- (%~) SZero (SSucc _) = Disproved (\ x -> case x of {})- (%~) (SSucc _) SZero = Disproved (\ x -> case x of {})- (%~) (SSucc a) (SSucc b)- = case ((%~) a) b of- Proved Refl -> Proved Refl- Disproved contra- -> Disproved (\ refl -> case refl of Refl -> contra Refl)- instance SDecide Nat =>- Data.Type.Equality.TestEquality (SNat :: Nat -> Type) where- Data.Type.Equality.testEquality- = Data.Singletons.Decide.decideEquality- instance SDecide Nat =>- Data.Type.Coercion.TestCoercion (SNat :: Nat -> Type) where- Data.Type.Coercion.testCoercion- = Data.Singletons.Decide.decideCoercion- instance SingI Zero where- sing = SZero- instance SingI n => SingI (Succ (n :: Nat)) where- sing = SSucc sing- instance SingI1 Succ where- liftSing = SSucc- instance SingI (SuccSym0 :: (~>) Nat Nat) where- sing = (singFun1 @SuccSym0) SSucc-GradingClient/Database.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| append :: Schema -> Schema -> Schema- append (Sch s1) (Sch s2) = Sch (s1 ++ s2)- attrNotIn :: Attribute -> Schema -> Bool- attrNotIn _ (Sch []) = True- attrNotIn (Attr name u) (Sch ((Attr name' _) : t))- = (name /= name') && (attrNotIn (Attr name u) (Sch t))- disjoint :: Schema -> Schema -> Bool- disjoint (Sch []) _ = True- disjoint (Sch (h : t)) s = (attrNotIn h s) && (disjoint (Sch t) s)- occurs :: [AChar] -> Schema -> Bool- occurs _ (Sch []) = False- occurs name (Sch ((Attr name' _) : attrs))- = name == name' || occurs name (Sch attrs)- lookup :: [AChar] -> Schema -> U- lookup _ (Sch []) = undefined- lookup name (Sch ((Attr name' u) : attrs))- = if name == name' then u else lookup name (Sch attrs)- - data U- = BOOL | STRING | NAT | VEC U Nat- deriving (Read, Eq, Show)- data AChar- = CA |- CB |- CC |- CD |- CE |- CF |- CG |- CH |- CI |- CJ |- CK |- CL |- CM |- CN |- CO |- CP |- CQ |- CR |- CS |- CT |- CU |- CV |- CW |- CX |- CY |- CZ- deriving (Read, Show, Eq)- data Attribute = Attr [AChar] U- data Schema = Sch [Attribute] |]- ======>- data U- = BOOL | STRING | NAT | VEC U Nat- deriving (Read, Eq, Show)- data AChar- = CA |- CB |- CC |- CD |- CE |- CF |- CG |- CH |- CI |- CJ |- CK |- CL |- CM |- CN |- CO |- CP |- CQ |- CR |- CS |- CT |- CU |- CV |- CW |- CX |- CY |- CZ- deriving (Read, Show, Eq)- data Attribute = Attr [AChar] U- data Schema = Sch [Attribute]- append :: Schema -> Schema -> Schema- append (Sch s1) (Sch s2) = Sch (s1 ++ s2)- attrNotIn :: Attribute -> Schema -> Bool- attrNotIn _ (Sch []) = True- attrNotIn (Attr name u) (Sch (Attr name' _ : t))- = ((name /= name') && (attrNotIn ((Attr name) u)) (Sch t))- disjoint :: Schema -> Schema -> Bool- disjoint (Sch []) _ = True- disjoint (Sch (h : t)) s- = ((attrNotIn h) s && (disjoint (Sch t)) s)- occurs :: [AChar] -> Schema -> Bool- occurs _ (Sch []) = False- occurs name (Sch (Attr name' _ : attrs))- = ((name == name') || (occurs name) (Sch attrs))- lookup :: [AChar] -> Schema -> U- lookup _ (Sch []) = undefined- lookup name (Sch (Attr name' u : attrs))- = if (name == name') then u else (lookup name) (Sch attrs)- type BOOLSym0 :: U- type family BOOLSym0 :: U where- BOOLSym0 = BOOL- type STRINGSym0 :: U- type family STRINGSym0 :: U where- STRINGSym0 = STRING- type NATSym0 :: U- type family NATSym0 :: U where- NATSym0 = NAT- type VECSym0 :: (~>) U ((~>) Nat U)- data VECSym0 :: (~>) U ((~>) Nat U)- where- VECSym0KindInference :: SameKind (Apply VECSym0 arg) (VECSym1 arg) =>- VECSym0 a0123456789876543210- type instance Apply VECSym0 a0123456789876543210 = VECSym1 a0123456789876543210- instance SuppressUnusedWarnings VECSym0 where- suppressUnusedWarnings = snd (((,) VECSym0KindInference) ())- type VECSym1 :: U -> (~>) Nat U- data VECSym1 (a0123456789876543210 :: U) :: (~>) Nat U- where- VECSym1KindInference :: SameKind (Apply (VECSym1 a0123456789876543210) arg) (VECSym2 a0123456789876543210 arg) =>- VECSym1 a0123456789876543210 a0123456789876543210- type instance Apply (VECSym1 a0123456789876543210) a0123456789876543210 = VEC a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (VECSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) VECSym1KindInference) ())- type VECSym2 :: U -> Nat -> U- type family VECSym2 (a0123456789876543210 :: U) (a0123456789876543210 :: Nat) :: U where- VECSym2 a0123456789876543210 a0123456789876543210 = VEC a0123456789876543210 a0123456789876543210- type CASym0 :: AChar- type family CASym0 :: AChar where- CASym0 = CA- type CBSym0 :: AChar- type family CBSym0 :: AChar where- CBSym0 = CB- type CCSym0 :: AChar- type family CCSym0 :: AChar where- CCSym0 = CC- type CDSym0 :: AChar- type family CDSym0 :: AChar where- CDSym0 = CD- type CESym0 :: AChar- type family CESym0 :: AChar where- CESym0 = CE- type CFSym0 :: AChar- type family CFSym0 :: AChar where- CFSym0 = CF- type CGSym0 :: AChar- type family CGSym0 :: AChar where- CGSym0 = CG- type CHSym0 :: AChar- type family CHSym0 :: AChar where- CHSym0 = CH- type CISym0 :: AChar- type family CISym0 :: AChar where- CISym0 = CI- type CJSym0 :: AChar- type family CJSym0 :: AChar where- CJSym0 = CJ- type CKSym0 :: AChar- type family CKSym0 :: AChar where- CKSym0 = CK- type CLSym0 :: AChar- type family CLSym0 :: AChar where- CLSym0 = CL- type CMSym0 :: AChar- type family CMSym0 :: AChar where- CMSym0 = CM- type CNSym0 :: AChar- type family CNSym0 :: AChar where- CNSym0 = CN- type COSym0 :: AChar- type family COSym0 :: AChar where- COSym0 = CO- type CPSym0 :: AChar- type family CPSym0 :: AChar where- CPSym0 = CP- type CQSym0 :: AChar- type family CQSym0 :: AChar where- CQSym0 = CQ- type CRSym0 :: AChar- type family CRSym0 :: AChar where- CRSym0 = CR- type CSSym0 :: AChar- type family CSSym0 :: AChar where- CSSym0 = CS- type CTSym0 :: AChar- type family CTSym0 :: AChar where- CTSym0 = CT- type CUSym0 :: AChar- type family CUSym0 :: AChar where- CUSym0 = CU- type CVSym0 :: AChar- type family CVSym0 :: AChar where- CVSym0 = CV- type CWSym0 :: AChar- type family CWSym0 :: AChar where- CWSym0 = CW- type CXSym0 :: AChar- type family CXSym0 :: AChar where- CXSym0 = CX- type CYSym0 :: AChar- type family CYSym0 :: AChar where- CYSym0 = CY- type CZSym0 :: AChar- type family CZSym0 :: AChar where- CZSym0 = CZ- type AttrSym0 :: (~>) [AChar] ((~>) U Attribute)- data AttrSym0 :: (~>) [AChar] ((~>) U Attribute)- where- AttrSym0KindInference :: SameKind (Apply AttrSym0 arg) (AttrSym1 arg) =>- AttrSym0 a0123456789876543210- type instance Apply AttrSym0 a0123456789876543210 = AttrSym1 a0123456789876543210- instance SuppressUnusedWarnings AttrSym0 where- suppressUnusedWarnings = snd (((,) AttrSym0KindInference) ())- type AttrSym1 :: [AChar] -> (~>) U Attribute- data AttrSym1 (a0123456789876543210 :: [AChar]) :: (~>) U Attribute- where- AttrSym1KindInference :: SameKind (Apply (AttrSym1 a0123456789876543210) arg) (AttrSym2 a0123456789876543210 arg) =>- AttrSym1 a0123456789876543210 a0123456789876543210- type instance Apply (AttrSym1 a0123456789876543210) a0123456789876543210 = Attr a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (AttrSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) AttrSym1KindInference) ())- type AttrSym2 :: [AChar] -> U -> Attribute- type family AttrSym2 (a0123456789876543210 :: [AChar]) (a0123456789876543210 :: U) :: Attribute where- AttrSym2 a0123456789876543210 a0123456789876543210 = Attr a0123456789876543210 a0123456789876543210- type SchSym0 :: (~>) [Attribute] Schema- data SchSym0 :: (~>) [Attribute] Schema- where- SchSym0KindInference :: SameKind (Apply SchSym0 arg) (SchSym1 arg) =>- SchSym0 a0123456789876543210- type instance Apply SchSym0 a0123456789876543210 = Sch a0123456789876543210- instance SuppressUnusedWarnings SchSym0 where- suppressUnusedWarnings = snd (((,) SchSym0KindInference) ())- type SchSym1 :: [Attribute] -> Schema- type family SchSym1 (a0123456789876543210 :: [Attribute]) :: Schema where- SchSym1 a0123456789876543210 = Sch a0123456789876543210- data Let0123456789876543210Scrutinee_0123456789876543210Sym0 name0123456789876543210- where- Let0123456789876543210Scrutinee_0123456789876543210Sym0KindInference :: SameKind (Apply Let0123456789876543210Scrutinee_0123456789876543210Sym0 arg) (Let0123456789876543210Scrutinee_0123456789876543210Sym1 arg) =>- Let0123456789876543210Scrutinee_0123456789876543210Sym0 name0123456789876543210- type instance Apply Let0123456789876543210Scrutinee_0123456789876543210Sym0 name0123456789876543210 = Let0123456789876543210Scrutinee_0123456789876543210Sym1 name0123456789876543210- instance SuppressUnusedWarnings Let0123456789876543210Scrutinee_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd- (((,)- Let0123456789876543210Scrutinee_0123456789876543210Sym0KindInference)- ())- data Let0123456789876543210Scrutinee_0123456789876543210Sym1 name0123456789876543210 name'0123456789876543210- where- Let0123456789876543210Scrutinee_0123456789876543210Sym1KindInference :: SameKind (Apply (Let0123456789876543210Scrutinee_0123456789876543210Sym1 name0123456789876543210) arg) (Let0123456789876543210Scrutinee_0123456789876543210Sym2 name0123456789876543210 arg) =>- Let0123456789876543210Scrutinee_0123456789876543210Sym1 name0123456789876543210 name'0123456789876543210- type instance Apply (Let0123456789876543210Scrutinee_0123456789876543210Sym1 name0123456789876543210) name'0123456789876543210 = Let0123456789876543210Scrutinee_0123456789876543210Sym2 name0123456789876543210 name'0123456789876543210- instance SuppressUnusedWarnings (Let0123456789876543210Scrutinee_0123456789876543210Sym1 name0123456789876543210) where- suppressUnusedWarnings- = snd- (((,)- Let0123456789876543210Scrutinee_0123456789876543210Sym1KindInference)- ())- data Let0123456789876543210Scrutinee_0123456789876543210Sym2 name0123456789876543210 name'0123456789876543210 u0123456789876543210- where- Let0123456789876543210Scrutinee_0123456789876543210Sym2KindInference :: SameKind (Apply (Let0123456789876543210Scrutinee_0123456789876543210Sym2 name0123456789876543210 name'0123456789876543210) arg) (Let0123456789876543210Scrutinee_0123456789876543210Sym3 name0123456789876543210 name'0123456789876543210 arg) =>- Let0123456789876543210Scrutinee_0123456789876543210Sym2 name0123456789876543210 name'0123456789876543210 u0123456789876543210- type instance Apply (Let0123456789876543210Scrutinee_0123456789876543210Sym2 name0123456789876543210 name'0123456789876543210) u0123456789876543210 = Let0123456789876543210Scrutinee_0123456789876543210Sym3 name0123456789876543210 name'0123456789876543210 u0123456789876543210- instance SuppressUnusedWarnings (Let0123456789876543210Scrutinee_0123456789876543210Sym2 name0123456789876543210 name'0123456789876543210) where- suppressUnusedWarnings- = snd- (((,)- Let0123456789876543210Scrutinee_0123456789876543210Sym2KindInference)- ())- data Let0123456789876543210Scrutinee_0123456789876543210Sym3 name0123456789876543210 name'0123456789876543210 u0123456789876543210 attrs0123456789876543210- where- Let0123456789876543210Scrutinee_0123456789876543210Sym3KindInference :: SameKind (Apply (Let0123456789876543210Scrutinee_0123456789876543210Sym3 name0123456789876543210 name'0123456789876543210 u0123456789876543210) arg) (Let0123456789876543210Scrutinee_0123456789876543210Sym4 name0123456789876543210 name'0123456789876543210 u0123456789876543210 arg) =>- Let0123456789876543210Scrutinee_0123456789876543210Sym3 name0123456789876543210 name'0123456789876543210 u0123456789876543210 attrs0123456789876543210- type instance Apply (Let0123456789876543210Scrutinee_0123456789876543210Sym3 name0123456789876543210 name'0123456789876543210 u0123456789876543210) attrs0123456789876543210 = Let0123456789876543210Scrutinee_0123456789876543210 name0123456789876543210 name'0123456789876543210 u0123456789876543210 attrs0123456789876543210- instance SuppressUnusedWarnings (Let0123456789876543210Scrutinee_0123456789876543210Sym3 name0123456789876543210 name'0123456789876543210 u0123456789876543210) where- suppressUnusedWarnings- = snd- (((,)- Let0123456789876543210Scrutinee_0123456789876543210Sym3KindInference)- ())- type family Let0123456789876543210Scrutinee_0123456789876543210Sym4 name0123456789876543210 name'0123456789876543210 u0123456789876543210 attrs0123456789876543210 where- Let0123456789876543210Scrutinee_0123456789876543210Sym4 name0123456789876543210 name'0123456789876543210 u0123456789876543210 attrs0123456789876543210 = Let0123456789876543210Scrutinee_0123456789876543210 name0123456789876543210 name'0123456789876543210 u0123456789876543210 attrs0123456789876543210- type family Let0123456789876543210Scrutinee_0123456789876543210 name name' u attrs where- Let0123456789876543210Scrutinee_0123456789876543210 name name' u attrs = Apply (Apply (==@#@$) name) name'- type family Case_0123456789876543210 name name' u attrs t where- Case_0123456789876543210 name name' u attrs 'True = u- Case_0123456789876543210 name name' u attrs 'False = Apply (Apply LookupSym0 name) (Apply SchSym0 attrs)- type LookupSym0 :: (~>) [AChar] ((~>) Schema U)- data LookupSym0 :: (~>) [AChar] ((~>) Schema U)- where- LookupSym0KindInference :: SameKind (Apply LookupSym0 arg) (LookupSym1 arg) =>- LookupSym0 a0123456789876543210- type instance Apply LookupSym0 a0123456789876543210 = LookupSym1 a0123456789876543210- instance SuppressUnusedWarnings LookupSym0 where- suppressUnusedWarnings = snd (((,) LookupSym0KindInference) ())- type LookupSym1 :: [AChar] -> (~>) Schema U- data LookupSym1 (a0123456789876543210 :: [AChar]) :: (~>) Schema U- where- LookupSym1KindInference :: SameKind (Apply (LookupSym1 a0123456789876543210) arg) (LookupSym2 a0123456789876543210 arg) =>- LookupSym1 a0123456789876543210 a0123456789876543210- type instance Apply (LookupSym1 a0123456789876543210) a0123456789876543210 = Lookup a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (LookupSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) LookupSym1KindInference) ())- type LookupSym2 :: [AChar] -> Schema -> U- type family LookupSym2 (a0123456789876543210 :: [AChar]) (a0123456789876543210 :: Schema) :: U where- LookupSym2 a0123456789876543210 a0123456789876543210 = Lookup a0123456789876543210 a0123456789876543210- type OccursSym0 :: (~>) [AChar] ((~>) Schema Bool)- data OccursSym0 :: (~>) [AChar] ((~>) Schema Bool)- where- OccursSym0KindInference :: SameKind (Apply OccursSym0 arg) (OccursSym1 arg) =>- OccursSym0 a0123456789876543210- type instance Apply OccursSym0 a0123456789876543210 = OccursSym1 a0123456789876543210- instance SuppressUnusedWarnings OccursSym0 where- suppressUnusedWarnings = snd (((,) OccursSym0KindInference) ())- type OccursSym1 :: [AChar] -> (~>) Schema Bool- data OccursSym1 (a0123456789876543210 :: [AChar]) :: (~>) Schema Bool- where- OccursSym1KindInference :: SameKind (Apply (OccursSym1 a0123456789876543210) arg) (OccursSym2 a0123456789876543210 arg) =>- OccursSym1 a0123456789876543210 a0123456789876543210- type instance Apply (OccursSym1 a0123456789876543210) a0123456789876543210 = Occurs a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (OccursSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) OccursSym1KindInference) ())- type OccursSym2 :: [AChar] -> Schema -> Bool- type family OccursSym2 (a0123456789876543210 :: [AChar]) (a0123456789876543210 :: Schema) :: Bool where- OccursSym2 a0123456789876543210 a0123456789876543210 = Occurs a0123456789876543210 a0123456789876543210- type DisjointSym0 :: (~>) Schema ((~>) Schema Bool)- data DisjointSym0 :: (~>) Schema ((~>) Schema Bool)- where- DisjointSym0KindInference :: SameKind (Apply DisjointSym0 arg) (DisjointSym1 arg) =>- DisjointSym0 a0123456789876543210- type instance Apply DisjointSym0 a0123456789876543210 = DisjointSym1 a0123456789876543210- instance SuppressUnusedWarnings DisjointSym0 where- suppressUnusedWarnings = snd (((,) DisjointSym0KindInference) ())- type DisjointSym1 :: Schema -> (~>) Schema Bool- data DisjointSym1 (a0123456789876543210 :: Schema) :: (~>) Schema Bool- where- DisjointSym1KindInference :: SameKind (Apply (DisjointSym1 a0123456789876543210) arg) (DisjointSym2 a0123456789876543210 arg) =>- DisjointSym1 a0123456789876543210 a0123456789876543210- type instance Apply (DisjointSym1 a0123456789876543210) a0123456789876543210 = Disjoint a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (DisjointSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) DisjointSym1KindInference) ())- type DisjointSym2 :: Schema -> Schema -> Bool- type family DisjointSym2 (a0123456789876543210 :: Schema) (a0123456789876543210 :: Schema) :: Bool where- DisjointSym2 a0123456789876543210 a0123456789876543210 = Disjoint a0123456789876543210 a0123456789876543210- type AttrNotInSym0 :: (~>) Attribute ((~>) Schema Bool)- data AttrNotInSym0 :: (~>) Attribute ((~>) Schema Bool)- where- AttrNotInSym0KindInference :: SameKind (Apply AttrNotInSym0 arg) (AttrNotInSym1 arg) =>- AttrNotInSym0 a0123456789876543210- type instance Apply AttrNotInSym0 a0123456789876543210 = AttrNotInSym1 a0123456789876543210- instance SuppressUnusedWarnings AttrNotInSym0 where- suppressUnusedWarnings = snd (((,) AttrNotInSym0KindInference) ())- type AttrNotInSym1 :: Attribute -> (~>) Schema Bool- data AttrNotInSym1 (a0123456789876543210 :: Attribute) :: (~>) Schema Bool- where- AttrNotInSym1KindInference :: SameKind (Apply (AttrNotInSym1 a0123456789876543210) arg) (AttrNotInSym2 a0123456789876543210 arg) =>- AttrNotInSym1 a0123456789876543210 a0123456789876543210- type instance Apply (AttrNotInSym1 a0123456789876543210) a0123456789876543210 = AttrNotIn a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (AttrNotInSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) AttrNotInSym1KindInference) ())- type AttrNotInSym2 :: Attribute -> Schema -> Bool- type family AttrNotInSym2 (a0123456789876543210 :: Attribute) (a0123456789876543210 :: Schema) :: Bool where- AttrNotInSym2 a0123456789876543210 a0123456789876543210 = AttrNotIn a0123456789876543210 a0123456789876543210- type AppendSym0 :: (~>) Schema ((~>) Schema Schema)- data AppendSym0 :: (~>) Schema ((~>) Schema Schema)- where- AppendSym0KindInference :: SameKind (Apply AppendSym0 arg) (AppendSym1 arg) =>- AppendSym0 a0123456789876543210- type instance Apply AppendSym0 a0123456789876543210 = AppendSym1 a0123456789876543210- instance SuppressUnusedWarnings AppendSym0 where- suppressUnusedWarnings = snd (((,) AppendSym0KindInference) ())- type AppendSym1 :: Schema -> (~>) Schema Schema- data AppendSym1 (a0123456789876543210 :: Schema) :: (~>) Schema Schema- where- AppendSym1KindInference :: SameKind (Apply (AppendSym1 a0123456789876543210) arg) (AppendSym2 a0123456789876543210 arg) =>- AppendSym1 a0123456789876543210 a0123456789876543210- type instance Apply (AppendSym1 a0123456789876543210) a0123456789876543210 = Append a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (AppendSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) AppendSym1KindInference) ())- type AppendSym2 :: Schema -> Schema -> Schema- type family AppendSym2 (a0123456789876543210 :: Schema) (a0123456789876543210 :: Schema) :: Schema where- AppendSym2 a0123456789876543210 a0123456789876543210 = Append a0123456789876543210 a0123456789876543210- type Lookup :: [AChar] -> Schema -> U- type family Lookup (a :: [AChar]) (a :: Schema) :: U where- Lookup _ (Sch '[]) = UndefinedSym0- Lookup name (Sch ('(:) (Attr name' u) attrs)) = Case_0123456789876543210 name name' u attrs (Let0123456789876543210Scrutinee_0123456789876543210Sym4 name name' u attrs)- type Occurs :: [AChar] -> Schema -> Bool- type family Occurs (a :: [AChar]) (a :: Schema) :: Bool where- Occurs _ (Sch '[]) = FalseSym0- Occurs name (Sch ('(:) (Attr name' _) attrs)) = Apply (Apply (||@#@$) (Apply (Apply (==@#@$) name) name')) (Apply (Apply OccursSym0 name) (Apply SchSym0 attrs))- type Disjoint :: Schema -> Schema -> Bool- type family Disjoint (a :: Schema) (a :: Schema) :: Bool where- Disjoint (Sch '[]) _ = TrueSym0- Disjoint (Sch ('(:) h t)) s = Apply (Apply (&&@#@$) (Apply (Apply AttrNotInSym0 h) s)) (Apply (Apply DisjointSym0 (Apply SchSym0 t)) s)- type AttrNotIn :: Attribute -> Schema -> Bool- type family AttrNotIn (a :: Attribute) (a :: Schema) :: Bool where- AttrNotIn _ (Sch '[]) = TrueSym0- AttrNotIn (Attr name u) (Sch ('(:) (Attr name' _) t)) = Apply (Apply (&&@#@$) (Apply (Apply (/=@#@$) name) name')) (Apply (Apply AttrNotInSym0 (Apply (Apply AttrSym0 name) u)) (Apply SchSym0 t))- type Append :: Schema -> Schema -> Schema- type family Append (a :: Schema) (a :: Schema) :: Schema where- Append (Sch s1) (Sch s2) = Apply SchSym0 (Apply (Apply (++@#@$) s1) s2)- type TFHelper_0123456789876543210 :: U -> U -> Bool- type family TFHelper_0123456789876543210 (a :: U) (a :: U) :: Bool where- TFHelper_0123456789876543210 BOOL BOOL = TrueSym0- TFHelper_0123456789876543210 BOOL STRING = FalseSym0- TFHelper_0123456789876543210 BOOL NAT = FalseSym0- TFHelper_0123456789876543210 BOOL (VEC _ _) = FalseSym0- TFHelper_0123456789876543210 STRING BOOL = FalseSym0- TFHelper_0123456789876543210 STRING STRING = TrueSym0- TFHelper_0123456789876543210 STRING NAT = FalseSym0- TFHelper_0123456789876543210 STRING (VEC _ _) = FalseSym0- TFHelper_0123456789876543210 NAT BOOL = FalseSym0- TFHelper_0123456789876543210 NAT STRING = FalseSym0- TFHelper_0123456789876543210 NAT NAT = TrueSym0- TFHelper_0123456789876543210 NAT (VEC _ _) = FalseSym0- TFHelper_0123456789876543210 (VEC _ _) BOOL = FalseSym0- TFHelper_0123456789876543210 (VEC _ _) STRING = FalseSym0- TFHelper_0123456789876543210 (VEC _ _) NAT = FalseSym0- TFHelper_0123456789876543210 (VEC a_0123456789876543210 a_0123456789876543210) (VEC b_0123456789876543210 b_0123456789876543210) = Apply (Apply (&&@#@$) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)- type TFHelper_0123456789876543210Sym0 :: (~>) U ((~>) U Bool)- data TFHelper_0123456789876543210Sym0 :: (~>) U ((~>) U Bool)- where- TFHelper_0123456789876543210Sym0KindInference :: SameKind (Apply TFHelper_0123456789876543210Sym0 arg) (TFHelper_0123456789876543210Sym1 arg) =>- TFHelper_0123456789876543210Sym0 a0123456789876543210- type instance Apply TFHelper_0123456789876543210Sym0 a0123456789876543210 = TFHelper_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings TFHelper_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) TFHelper_0123456789876543210Sym0KindInference) ())- type TFHelper_0123456789876543210Sym1 :: U -> (~>) U Bool- data TFHelper_0123456789876543210Sym1 (a0123456789876543210 :: U) :: (~>) U Bool- where- TFHelper_0123456789876543210Sym1KindInference :: SameKind (Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) arg) (TFHelper_0123456789876543210Sym2 a0123456789876543210 arg) =>- TFHelper_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (TFHelper_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) TFHelper_0123456789876543210Sym1KindInference) ())- type TFHelper_0123456789876543210Sym2 :: U -> U -> Bool- type family TFHelper_0123456789876543210Sym2 (a0123456789876543210 :: U) (a0123456789876543210 :: U) :: Bool where- TFHelper_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210- instance PEq U where- type (==) a a = Apply (Apply TFHelper_0123456789876543210Sym0 a) a- type ShowsPrec_0123456789876543210 :: GHC.Num.Natural.Natural- -> U -> Symbol -> Symbol- type family ShowsPrec_0123456789876543210 (a :: GHC.Num.Natural.Natural) (a :: U) (a :: Symbol) :: Symbol where- ShowsPrec_0123456789876543210 _ BOOL a_0123456789876543210 = Apply (Apply ShowStringSym0 "BOOL") a_0123456789876543210- ShowsPrec_0123456789876543210 _ STRING a_0123456789876543210 = Apply (Apply ShowStringSym0 "STRING") a_0123456789876543210- ShowsPrec_0123456789876543210 _ NAT a_0123456789876543210 = Apply (Apply ShowStringSym0 "NAT") a_0123456789876543210- ShowsPrec_0123456789876543210 p_0123456789876543210 (VEC arg_0123456789876543210 arg_0123456789876543210) a_0123456789876543210 = Apply (Apply (Apply ShowParenSym0 (Apply (Apply (>@#@$) p_0123456789876543210) (FromInteger 10))) (Apply (Apply (.@#@$) (Apply ShowStringSym0 "VEC ")) (Apply (Apply (.@#@$) (Apply (Apply ShowsPrecSym0 (FromInteger 11)) arg_0123456789876543210)) (Apply (Apply (.@#@$) ShowSpaceSym0) (Apply (Apply ShowsPrecSym0 (FromInteger 11)) arg_0123456789876543210))))) a_0123456789876543210- type ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) U ((~>) Symbol Symbol))- data ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) U ((~>) Symbol Symbol))- where- ShowsPrec_0123456789876543210Sym0KindInference :: SameKind (Apply ShowsPrec_0123456789876543210Sym0 arg) (ShowsPrec_0123456789876543210Sym1 arg) =>- ShowsPrec_0123456789876543210Sym0 a0123456789876543210- type instance Apply ShowsPrec_0123456789876543210Sym0 a0123456789876543210 = ShowsPrec_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings ShowsPrec_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym0KindInference) ())- type ShowsPrec_0123456789876543210Sym1 :: GHC.Num.Natural.Natural- -> (~>) U ((~>) Symbol Symbol)- data ShowsPrec_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Num.Natural.Natural) :: (~>) U ((~>) Symbol Symbol)- where- ShowsPrec_0123456789876543210Sym1KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 arg) =>- ShowsPrec_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym1KindInference) ())- type ShowsPrec_0123456789876543210Sym2 :: GHC.Num.Natural.Natural- -> U -> (~>) Symbol Symbol- data ShowsPrec_0123456789876543210Sym2 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: U) :: (~>) Symbol Symbol- where- ShowsPrec_0123456789876543210Sym2KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 arg) =>- ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym2KindInference) ())- type ShowsPrec_0123456789876543210Sym3 :: GHC.Num.Natural.Natural- -> U -> Symbol -> Symbol- type family ShowsPrec_0123456789876543210Sym3 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: U) (a0123456789876543210 :: Symbol) :: Symbol where- ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance PShow U where- type ShowsPrec a a a = Apply (Apply (Apply ShowsPrec_0123456789876543210Sym0 a) a) a- type ShowsPrec_0123456789876543210 :: GHC.Num.Natural.Natural- -> AChar -> Symbol -> Symbol- type family ShowsPrec_0123456789876543210 (a :: GHC.Num.Natural.Natural) (a :: AChar) (a :: Symbol) :: Symbol where- ShowsPrec_0123456789876543210 _ CA a_0123456789876543210 = Apply (Apply ShowStringSym0 "CA") a_0123456789876543210- ShowsPrec_0123456789876543210 _ CB a_0123456789876543210 = Apply (Apply ShowStringSym0 "CB") a_0123456789876543210- ShowsPrec_0123456789876543210 _ CC a_0123456789876543210 = Apply (Apply ShowStringSym0 "CC") a_0123456789876543210- ShowsPrec_0123456789876543210 _ CD a_0123456789876543210 = Apply (Apply ShowStringSym0 "CD") a_0123456789876543210- ShowsPrec_0123456789876543210 _ CE a_0123456789876543210 = Apply (Apply ShowStringSym0 "CE") a_0123456789876543210- ShowsPrec_0123456789876543210 _ CF a_0123456789876543210 = Apply (Apply ShowStringSym0 "CF") a_0123456789876543210- ShowsPrec_0123456789876543210 _ CG a_0123456789876543210 = Apply (Apply ShowStringSym0 "CG") a_0123456789876543210- ShowsPrec_0123456789876543210 _ CH a_0123456789876543210 = Apply (Apply ShowStringSym0 "CH") a_0123456789876543210- ShowsPrec_0123456789876543210 _ CI a_0123456789876543210 = Apply (Apply ShowStringSym0 "CI") a_0123456789876543210- ShowsPrec_0123456789876543210 _ CJ a_0123456789876543210 = Apply (Apply ShowStringSym0 "CJ") a_0123456789876543210- ShowsPrec_0123456789876543210 _ CK a_0123456789876543210 = Apply (Apply ShowStringSym0 "CK") a_0123456789876543210- ShowsPrec_0123456789876543210 _ CL a_0123456789876543210 = Apply (Apply ShowStringSym0 "CL") a_0123456789876543210- ShowsPrec_0123456789876543210 _ CM a_0123456789876543210 = Apply (Apply ShowStringSym0 "CM") a_0123456789876543210- ShowsPrec_0123456789876543210 _ CN a_0123456789876543210 = Apply (Apply ShowStringSym0 "CN") a_0123456789876543210- ShowsPrec_0123456789876543210 _ CO a_0123456789876543210 = Apply (Apply ShowStringSym0 "CO") a_0123456789876543210- ShowsPrec_0123456789876543210 _ CP a_0123456789876543210 = Apply (Apply ShowStringSym0 "CP") a_0123456789876543210- ShowsPrec_0123456789876543210 _ CQ a_0123456789876543210 = Apply (Apply ShowStringSym0 "CQ") a_0123456789876543210- ShowsPrec_0123456789876543210 _ CR a_0123456789876543210 = Apply (Apply ShowStringSym0 "CR") a_0123456789876543210- ShowsPrec_0123456789876543210 _ CS a_0123456789876543210 = Apply (Apply ShowStringSym0 "CS") a_0123456789876543210- ShowsPrec_0123456789876543210 _ CT a_0123456789876543210 = Apply (Apply ShowStringSym0 "CT") a_0123456789876543210- ShowsPrec_0123456789876543210 _ CU a_0123456789876543210 = Apply (Apply ShowStringSym0 "CU") a_0123456789876543210- ShowsPrec_0123456789876543210 _ CV a_0123456789876543210 = Apply (Apply ShowStringSym0 "CV") a_0123456789876543210- ShowsPrec_0123456789876543210 _ CW a_0123456789876543210 = Apply (Apply ShowStringSym0 "CW") a_0123456789876543210- ShowsPrec_0123456789876543210 _ CX a_0123456789876543210 = Apply (Apply ShowStringSym0 "CX") a_0123456789876543210- ShowsPrec_0123456789876543210 _ CY a_0123456789876543210 = Apply (Apply ShowStringSym0 "CY") a_0123456789876543210- ShowsPrec_0123456789876543210 _ CZ a_0123456789876543210 = Apply (Apply ShowStringSym0 "CZ") a_0123456789876543210- type ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) AChar ((~>) Symbol Symbol))- data ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) AChar ((~>) Symbol Symbol))- where- ShowsPrec_0123456789876543210Sym0KindInference :: SameKind (Apply ShowsPrec_0123456789876543210Sym0 arg) (ShowsPrec_0123456789876543210Sym1 arg) =>- ShowsPrec_0123456789876543210Sym0 a0123456789876543210- type instance Apply ShowsPrec_0123456789876543210Sym0 a0123456789876543210 = ShowsPrec_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings ShowsPrec_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym0KindInference) ())- type ShowsPrec_0123456789876543210Sym1 :: GHC.Num.Natural.Natural- -> (~>) AChar ((~>) Symbol Symbol)- data ShowsPrec_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Num.Natural.Natural) :: (~>) AChar ((~>) Symbol Symbol)- where- ShowsPrec_0123456789876543210Sym1KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 arg) =>- ShowsPrec_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym1KindInference) ())- type ShowsPrec_0123456789876543210Sym2 :: GHC.Num.Natural.Natural- -> AChar -> (~>) Symbol Symbol- data ShowsPrec_0123456789876543210Sym2 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: AChar) :: (~>) Symbol Symbol- where- ShowsPrec_0123456789876543210Sym2KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 arg) =>- ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym2KindInference) ())- type ShowsPrec_0123456789876543210Sym3 :: GHC.Num.Natural.Natural- -> AChar -> Symbol -> Symbol- type family ShowsPrec_0123456789876543210Sym3 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: AChar) (a0123456789876543210 :: Symbol) :: Symbol where- ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance PShow AChar where- type ShowsPrec a a a = Apply (Apply (Apply ShowsPrec_0123456789876543210Sym0 a) a) a- type TFHelper_0123456789876543210 :: AChar -> AChar -> Bool- type family TFHelper_0123456789876543210 (a :: AChar) (a :: AChar) :: Bool where- TFHelper_0123456789876543210 CA CA = TrueSym0- TFHelper_0123456789876543210 CA CB = FalseSym0- TFHelper_0123456789876543210 CA CC = FalseSym0- TFHelper_0123456789876543210 CA CD = FalseSym0- TFHelper_0123456789876543210 CA CE = FalseSym0- TFHelper_0123456789876543210 CA CF = FalseSym0- TFHelper_0123456789876543210 CA CG = FalseSym0- TFHelper_0123456789876543210 CA CH = FalseSym0- TFHelper_0123456789876543210 CA CI = FalseSym0- TFHelper_0123456789876543210 CA CJ = FalseSym0- TFHelper_0123456789876543210 CA CK = FalseSym0- TFHelper_0123456789876543210 CA CL = FalseSym0- TFHelper_0123456789876543210 CA CM = FalseSym0- TFHelper_0123456789876543210 CA CN = FalseSym0- TFHelper_0123456789876543210 CA CO = FalseSym0- TFHelper_0123456789876543210 CA CP = FalseSym0- TFHelper_0123456789876543210 CA CQ = FalseSym0- TFHelper_0123456789876543210 CA CR = FalseSym0- TFHelper_0123456789876543210 CA CS = FalseSym0- TFHelper_0123456789876543210 CA CT = FalseSym0- TFHelper_0123456789876543210 CA CU = FalseSym0- TFHelper_0123456789876543210 CA CV = FalseSym0- TFHelper_0123456789876543210 CA CW = FalseSym0- TFHelper_0123456789876543210 CA CX = FalseSym0- TFHelper_0123456789876543210 CA CY = FalseSym0- TFHelper_0123456789876543210 CA CZ = FalseSym0- TFHelper_0123456789876543210 CB CA = FalseSym0- TFHelper_0123456789876543210 CB CB = TrueSym0- TFHelper_0123456789876543210 CB CC = FalseSym0- TFHelper_0123456789876543210 CB CD = FalseSym0- TFHelper_0123456789876543210 CB CE = FalseSym0- TFHelper_0123456789876543210 CB CF = FalseSym0- TFHelper_0123456789876543210 CB CG = FalseSym0- TFHelper_0123456789876543210 CB CH = FalseSym0- TFHelper_0123456789876543210 CB CI = FalseSym0- TFHelper_0123456789876543210 CB CJ = FalseSym0- TFHelper_0123456789876543210 CB CK = FalseSym0- TFHelper_0123456789876543210 CB CL = FalseSym0- TFHelper_0123456789876543210 CB CM = FalseSym0- TFHelper_0123456789876543210 CB CN = FalseSym0- TFHelper_0123456789876543210 CB CO = FalseSym0- TFHelper_0123456789876543210 CB CP = FalseSym0- TFHelper_0123456789876543210 CB CQ = FalseSym0- TFHelper_0123456789876543210 CB CR = FalseSym0- TFHelper_0123456789876543210 CB CS = FalseSym0- TFHelper_0123456789876543210 CB CT = FalseSym0- TFHelper_0123456789876543210 CB CU = FalseSym0- TFHelper_0123456789876543210 CB CV = FalseSym0- TFHelper_0123456789876543210 CB CW = FalseSym0- TFHelper_0123456789876543210 CB CX = FalseSym0- TFHelper_0123456789876543210 CB CY = FalseSym0- TFHelper_0123456789876543210 CB CZ = FalseSym0- TFHelper_0123456789876543210 CC CA = FalseSym0- TFHelper_0123456789876543210 CC CB = FalseSym0- TFHelper_0123456789876543210 CC CC = TrueSym0- TFHelper_0123456789876543210 CC CD = FalseSym0- TFHelper_0123456789876543210 CC CE = FalseSym0- TFHelper_0123456789876543210 CC CF = FalseSym0- TFHelper_0123456789876543210 CC CG = FalseSym0- TFHelper_0123456789876543210 CC CH = FalseSym0- TFHelper_0123456789876543210 CC CI = FalseSym0- TFHelper_0123456789876543210 CC CJ = FalseSym0- TFHelper_0123456789876543210 CC CK = FalseSym0- TFHelper_0123456789876543210 CC CL = FalseSym0- TFHelper_0123456789876543210 CC CM = FalseSym0- TFHelper_0123456789876543210 CC CN = FalseSym0- TFHelper_0123456789876543210 CC CO = FalseSym0- TFHelper_0123456789876543210 CC CP = FalseSym0- TFHelper_0123456789876543210 CC CQ = FalseSym0- TFHelper_0123456789876543210 CC CR = FalseSym0- TFHelper_0123456789876543210 CC CS = FalseSym0- TFHelper_0123456789876543210 CC CT = FalseSym0- TFHelper_0123456789876543210 CC CU = FalseSym0- TFHelper_0123456789876543210 CC CV = FalseSym0- TFHelper_0123456789876543210 CC CW = FalseSym0- TFHelper_0123456789876543210 CC CX = FalseSym0- TFHelper_0123456789876543210 CC CY = FalseSym0- TFHelper_0123456789876543210 CC CZ = FalseSym0- TFHelper_0123456789876543210 CD CA = FalseSym0- TFHelper_0123456789876543210 CD CB = FalseSym0- TFHelper_0123456789876543210 CD CC = FalseSym0- TFHelper_0123456789876543210 CD CD = TrueSym0- TFHelper_0123456789876543210 CD CE = FalseSym0- TFHelper_0123456789876543210 CD CF = FalseSym0- TFHelper_0123456789876543210 CD CG = FalseSym0- TFHelper_0123456789876543210 CD CH = FalseSym0- TFHelper_0123456789876543210 CD CI = FalseSym0- TFHelper_0123456789876543210 CD CJ = FalseSym0- TFHelper_0123456789876543210 CD CK = FalseSym0- TFHelper_0123456789876543210 CD CL = FalseSym0- TFHelper_0123456789876543210 CD CM = FalseSym0- TFHelper_0123456789876543210 CD CN = FalseSym0- TFHelper_0123456789876543210 CD CO = FalseSym0- TFHelper_0123456789876543210 CD CP = FalseSym0- TFHelper_0123456789876543210 CD CQ = FalseSym0- TFHelper_0123456789876543210 CD CR = FalseSym0- TFHelper_0123456789876543210 CD CS = FalseSym0- TFHelper_0123456789876543210 CD CT = FalseSym0- TFHelper_0123456789876543210 CD CU = FalseSym0- TFHelper_0123456789876543210 CD CV = FalseSym0- TFHelper_0123456789876543210 CD CW = FalseSym0- TFHelper_0123456789876543210 CD CX = FalseSym0- TFHelper_0123456789876543210 CD CY = FalseSym0- TFHelper_0123456789876543210 CD CZ = FalseSym0- TFHelper_0123456789876543210 CE CA = FalseSym0- TFHelper_0123456789876543210 CE CB = FalseSym0- TFHelper_0123456789876543210 CE CC = FalseSym0- TFHelper_0123456789876543210 CE CD = FalseSym0- TFHelper_0123456789876543210 CE CE = TrueSym0- TFHelper_0123456789876543210 CE CF = FalseSym0- TFHelper_0123456789876543210 CE CG = FalseSym0- TFHelper_0123456789876543210 CE CH = FalseSym0- TFHelper_0123456789876543210 CE CI = FalseSym0- TFHelper_0123456789876543210 CE CJ = FalseSym0- TFHelper_0123456789876543210 CE CK = FalseSym0- TFHelper_0123456789876543210 CE CL = FalseSym0- TFHelper_0123456789876543210 CE CM = FalseSym0- TFHelper_0123456789876543210 CE CN = FalseSym0- TFHelper_0123456789876543210 CE CO = FalseSym0- TFHelper_0123456789876543210 CE CP = FalseSym0- TFHelper_0123456789876543210 CE CQ = FalseSym0- TFHelper_0123456789876543210 CE CR = FalseSym0- TFHelper_0123456789876543210 CE CS = FalseSym0- TFHelper_0123456789876543210 CE CT = FalseSym0- TFHelper_0123456789876543210 CE CU = FalseSym0- TFHelper_0123456789876543210 CE CV = FalseSym0- TFHelper_0123456789876543210 CE CW = FalseSym0- TFHelper_0123456789876543210 CE CX = FalseSym0- TFHelper_0123456789876543210 CE CY = FalseSym0- TFHelper_0123456789876543210 CE CZ = FalseSym0- TFHelper_0123456789876543210 CF CA = FalseSym0- TFHelper_0123456789876543210 CF CB = FalseSym0- TFHelper_0123456789876543210 CF CC = FalseSym0- TFHelper_0123456789876543210 CF CD = FalseSym0- TFHelper_0123456789876543210 CF CE = FalseSym0- TFHelper_0123456789876543210 CF CF = TrueSym0- TFHelper_0123456789876543210 CF CG = FalseSym0- TFHelper_0123456789876543210 CF CH = FalseSym0- TFHelper_0123456789876543210 CF CI = FalseSym0- TFHelper_0123456789876543210 CF CJ = FalseSym0- TFHelper_0123456789876543210 CF CK = FalseSym0- TFHelper_0123456789876543210 CF CL = FalseSym0- TFHelper_0123456789876543210 CF CM = FalseSym0- TFHelper_0123456789876543210 CF CN = FalseSym0- TFHelper_0123456789876543210 CF CO = FalseSym0- TFHelper_0123456789876543210 CF CP = FalseSym0- TFHelper_0123456789876543210 CF CQ = FalseSym0- TFHelper_0123456789876543210 CF CR = FalseSym0- TFHelper_0123456789876543210 CF CS = FalseSym0- TFHelper_0123456789876543210 CF CT = FalseSym0- TFHelper_0123456789876543210 CF CU = FalseSym0- TFHelper_0123456789876543210 CF CV = FalseSym0- TFHelper_0123456789876543210 CF CW = FalseSym0- TFHelper_0123456789876543210 CF CX = FalseSym0- TFHelper_0123456789876543210 CF CY = FalseSym0- TFHelper_0123456789876543210 CF CZ = FalseSym0- TFHelper_0123456789876543210 CG CA = FalseSym0- TFHelper_0123456789876543210 CG CB = FalseSym0- TFHelper_0123456789876543210 CG CC = FalseSym0- TFHelper_0123456789876543210 CG CD = FalseSym0- TFHelper_0123456789876543210 CG CE = FalseSym0- TFHelper_0123456789876543210 CG CF = FalseSym0- TFHelper_0123456789876543210 CG CG = TrueSym0- TFHelper_0123456789876543210 CG CH = FalseSym0- TFHelper_0123456789876543210 CG CI = FalseSym0- TFHelper_0123456789876543210 CG CJ = FalseSym0- TFHelper_0123456789876543210 CG CK = FalseSym0- TFHelper_0123456789876543210 CG CL = FalseSym0- TFHelper_0123456789876543210 CG CM = FalseSym0- TFHelper_0123456789876543210 CG CN = FalseSym0- TFHelper_0123456789876543210 CG CO = FalseSym0- TFHelper_0123456789876543210 CG CP = FalseSym0- TFHelper_0123456789876543210 CG CQ = FalseSym0- TFHelper_0123456789876543210 CG CR = FalseSym0- TFHelper_0123456789876543210 CG CS = FalseSym0- TFHelper_0123456789876543210 CG CT = FalseSym0- TFHelper_0123456789876543210 CG CU = FalseSym0- TFHelper_0123456789876543210 CG CV = FalseSym0- TFHelper_0123456789876543210 CG CW = FalseSym0- TFHelper_0123456789876543210 CG CX = FalseSym0- TFHelper_0123456789876543210 CG CY = FalseSym0- TFHelper_0123456789876543210 CG CZ = FalseSym0- TFHelper_0123456789876543210 CH CA = FalseSym0- TFHelper_0123456789876543210 CH CB = FalseSym0- TFHelper_0123456789876543210 CH CC = FalseSym0- TFHelper_0123456789876543210 CH CD = FalseSym0- TFHelper_0123456789876543210 CH CE = FalseSym0- TFHelper_0123456789876543210 CH CF = FalseSym0- TFHelper_0123456789876543210 CH CG = FalseSym0- TFHelper_0123456789876543210 CH CH = TrueSym0- TFHelper_0123456789876543210 CH CI = FalseSym0- TFHelper_0123456789876543210 CH CJ = FalseSym0- TFHelper_0123456789876543210 CH CK = FalseSym0- TFHelper_0123456789876543210 CH CL = FalseSym0- TFHelper_0123456789876543210 CH CM = FalseSym0- TFHelper_0123456789876543210 CH CN = FalseSym0- TFHelper_0123456789876543210 CH CO = FalseSym0- TFHelper_0123456789876543210 CH CP = FalseSym0- TFHelper_0123456789876543210 CH CQ = FalseSym0- TFHelper_0123456789876543210 CH CR = FalseSym0- TFHelper_0123456789876543210 CH CS = FalseSym0- TFHelper_0123456789876543210 CH CT = FalseSym0- TFHelper_0123456789876543210 CH CU = FalseSym0- TFHelper_0123456789876543210 CH CV = FalseSym0- TFHelper_0123456789876543210 CH CW = FalseSym0- TFHelper_0123456789876543210 CH CX = FalseSym0- TFHelper_0123456789876543210 CH CY = FalseSym0- TFHelper_0123456789876543210 CH CZ = FalseSym0- TFHelper_0123456789876543210 CI CA = FalseSym0- TFHelper_0123456789876543210 CI CB = FalseSym0- TFHelper_0123456789876543210 CI CC = FalseSym0- TFHelper_0123456789876543210 CI CD = FalseSym0- TFHelper_0123456789876543210 CI CE = FalseSym0- TFHelper_0123456789876543210 CI CF = FalseSym0- TFHelper_0123456789876543210 CI CG = FalseSym0- TFHelper_0123456789876543210 CI CH = FalseSym0- TFHelper_0123456789876543210 CI CI = TrueSym0- TFHelper_0123456789876543210 CI CJ = FalseSym0- TFHelper_0123456789876543210 CI CK = FalseSym0- TFHelper_0123456789876543210 CI CL = FalseSym0- TFHelper_0123456789876543210 CI CM = FalseSym0- TFHelper_0123456789876543210 CI CN = FalseSym0- TFHelper_0123456789876543210 CI CO = FalseSym0- TFHelper_0123456789876543210 CI CP = FalseSym0- TFHelper_0123456789876543210 CI CQ = FalseSym0- TFHelper_0123456789876543210 CI CR = FalseSym0- TFHelper_0123456789876543210 CI CS = FalseSym0- TFHelper_0123456789876543210 CI CT = FalseSym0- TFHelper_0123456789876543210 CI CU = FalseSym0- TFHelper_0123456789876543210 CI CV = FalseSym0- TFHelper_0123456789876543210 CI CW = FalseSym0- TFHelper_0123456789876543210 CI CX = FalseSym0- TFHelper_0123456789876543210 CI CY = FalseSym0- TFHelper_0123456789876543210 CI CZ = FalseSym0- TFHelper_0123456789876543210 CJ CA = FalseSym0- TFHelper_0123456789876543210 CJ CB = FalseSym0- TFHelper_0123456789876543210 CJ CC = FalseSym0- TFHelper_0123456789876543210 CJ CD = FalseSym0- TFHelper_0123456789876543210 CJ CE = FalseSym0- TFHelper_0123456789876543210 CJ CF = FalseSym0- TFHelper_0123456789876543210 CJ CG = FalseSym0- TFHelper_0123456789876543210 CJ CH = FalseSym0- TFHelper_0123456789876543210 CJ CI = FalseSym0- TFHelper_0123456789876543210 CJ CJ = TrueSym0- TFHelper_0123456789876543210 CJ CK = FalseSym0- TFHelper_0123456789876543210 CJ CL = FalseSym0- TFHelper_0123456789876543210 CJ CM = FalseSym0- TFHelper_0123456789876543210 CJ CN = FalseSym0- TFHelper_0123456789876543210 CJ CO = FalseSym0- TFHelper_0123456789876543210 CJ CP = FalseSym0- TFHelper_0123456789876543210 CJ CQ = FalseSym0- TFHelper_0123456789876543210 CJ CR = FalseSym0- TFHelper_0123456789876543210 CJ CS = FalseSym0- TFHelper_0123456789876543210 CJ CT = FalseSym0- TFHelper_0123456789876543210 CJ CU = FalseSym0- TFHelper_0123456789876543210 CJ CV = FalseSym0- TFHelper_0123456789876543210 CJ CW = FalseSym0- TFHelper_0123456789876543210 CJ CX = FalseSym0- TFHelper_0123456789876543210 CJ CY = FalseSym0- TFHelper_0123456789876543210 CJ CZ = FalseSym0- TFHelper_0123456789876543210 CK CA = FalseSym0- TFHelper_0123456789876543210 CK CB = FalseSym0- TFHelper_0123456789876543210 CK CC = FalseSym0- TFHelper_0123456789876543210 CK CD = FalseSym0- TFHelper_0123456789876543210 CK CE = FalseSym0- TFHelper_0123456789876543210 CK CF = FalseSym0- TFHelper_0123456789876543210 CK CG = FalseSym0- TFHelper_0123456789876543210 CK CH = FalseSym0- TFHelper_0123456789876543210 CK CI = FalseSym0- TFHelper_0123456789876543210 CK CJ = FalseSym0- TFHelper_0123456789876543210 CK CK = TrueSym0- TFHelper_0123456789876543210 CK CL = FalseSym0- TFHelper_0123456789876543210 CK CM = FalseSym0- TFHelper_0123456789876543210 CK CN = FalseSym0- TFHelper_0123456789876543210 CK CO = FalseSym0- TFHelper_0123456789876543210 CK CP = FalseSym0- TFHelper_0123456789876543210 CK CQ = FalseSym0- TFHelper_0123456789876543210 CK CR = FalseSym0- TFHelper_0123456789876543210 CK CS = FalseSym0- TFHelper_0123456789876543210 CK CT = FalseSym0- TFHelper_0123456789876543210 CK CU = FalseSym0- TFHelper_0123456789876543210 CK CV = FalseSym0- TFHelper_0123456789876543210 CK CW = FalseSym0- TFHelper_0123456789876543210 CK CX = FalseSym0- TFHelper_0123456789876543210 CK CY = FalseSym0- TFHelper_0123456789876543210 CK CZ = FalseSym0- TFHelper_0123456789876543210 CL CA = FalseSym0- TFHelper_0123456789876543210 CL CB = FalseSym0- TFHelper_0123456789876543210 CL CC = FalseSym0- TFHelper_0123456789876543210 CL CD = FalseSym0- TFHelper_0123456789876543210 CL CE = FalseSym0- TFHelper_0123456789876543210 CL CF = FalseSym0- TFHelper_0123456789876543210 CL CG = FalseSym0- TFHelper_0123456789876543210 CL CH = FalseSym0- TFHelper_0123456789876543210 CL CI = FalseSym0- TFHelper_0123456789876543210 CL CJ = FalseSym0- TFHelper_0123456789876543210 CL CK = FalseSym0- TFHelper_0123456789876543210 CL CL = TrueSym0- TFHelper_0123456789876543210 CL CM = FalseSym0- TFHelper_0123456789876543210 CL CN = FalseSym0- TFHelper_0123456789876543210 CL CO = FalseSym0- TFHelper_0123456789876543210 CL CP = FalseSym0- TFHelper_0123456789876543210 CL CQ = FalseSym0- TFHelper_0123456789876543210 CL CR = FalseSym0- TFHelper_0123456789876543210 CL CS = FalseSym0- TFHelper_0123456789876543210 CL CT = FalseSym0- TFHelper_0123456789876543210 CL CU = FalseSym0- TFHelper_0123456789876543210 CL CV = FalseSym0- TFHelper_0123456789876543210 CL CW = FalseSym0- TFHelper_0123456789876543210 CL CX = FalseSym0- TFHelper_0123456789876543210 CL CY = FalseSym0- TFHelper_0123456789876543210 CL CZ = FalseSym0- TFHelper_0123456789876543210 CM CA = FalseSym0- TFHelper_0123456789876543210 CM CB = FalseSym0- TFHelper_0123456789876543210 CM CC = FalseSym0- TFHelper_0123456789876543210 CM CD = FalseSym0- TFHelper_0123456789876543210 CM CE = FalseSym0- TFHelper_0123456789876543210 CM CF = FalseSym0- TFHelper_0123456789876543210 CM CG = FalseSym0- TFHelper_0123456789876543210 CM CH = FalseSym0- TFHelper_0123456789876543210 CM CI = FalseSym0- TFHelper_0123456789876543210 CM CJ = FalseSym0- TFHelper_0123456789876543210 CM CK = FalseSym0- TFHelper_0123456789876543210 CM CL = FalseSym0- TFHelper_0123456789876543210 CM CM = TrueSym0- TFHelper_0123456789876543210 CM CN = FalseSym0- TFHelper_0123456789876543210 CM CO = FalseSym0- TFHelper_0123456789876543210 CM CP = FalseSym0- TFHelper_0123456789876543210 CM CQ = FalseSym0- TFHelper_0123456789876543210 CM CR = FalseSym0- TFHelper_0123456789876543210 CM CS = FalseSym0- TFHelper_0123456789876543210 CM CT = FalseSym0- TFHelper_0123456789876543210 CM CU = FalseSym0- TFHelper_0123456789876543210 CM CV = FalseSym0- TFHelper_0123456789876543210 CM CW = FalseSym0- TFHelper_0123456789876543210 CM CX = FalseSym0- TFHelper_0123456789876543210 CM CY = FalseSym0- TFHelper_0123456789876543210 CM CZ = FalseSym0- TFHelper_0123456789876543210 CN CA = FalseSym0- TFHelper_0123456789876543210 CN CB = FalseSym0- TFHelper_0123456789876543210 CN CC = FalseSym0- TFHelper_0123456789876543210 CN CD = FalseSym0- TFHelper_0123456789876543210 CN CE = FalseSym0- TFHelper_0123456789876543210 CN CF = FalseSym0- TFHelper_0123456789876543210 CN CG = FalseSym0- TFHelper_0123456789876543210 CN CH = FalseSym0- TFHelper_0123456789876543210 CN CI = FalseSym0- TFHelper_0123456789876543210 CN CJ = FalseSym0- TFHelper_0123456789876543210 CN CK = FalseSym0- TFHelper_0123456789876543210 CN CL = FalseSym0- TFHelper_0123456789876543210 CN CM = FalseSym0- TFHelper_0123456789876543210 CN CN = TrueSym0- TFHelper_0123456789876543210 CN CO = FalseSym0- TFHelper_0123456789876543210 CN CP = FalseSym0- TFHelper_0123456789876543210 CN CQ = FalseSym0- TFHelper_0123456789876543210 CN CR = FalseSym0- TFHelper_0123456789876543210 CN CS = FalseSym0- TFHelper_0123456789876543210 CN CT = FalseSym0- TFHelper_0123456789876543210 CN CU = FalseSym0- TFHelper_0123456789876543210 CN CV = FalseSym0- TFHelper_0123456789876543210 CN CW = FalseSym0- TFHelper_0123456789876543210 CN CX = FalseSym0- TFHelper_0123456789876543210 CN CY = FalseSym0- TFHelper_0123456789876543210 CN CZ = FalseSym0- TFHelper_0123456789876543210 CO CA = FalseSym0- TFHelper_0123456789876543210 CO CB = FalseSym0- TFHelper_0123456789876543210 CO CC = FalseSym0- TFHelper_0123456789876543210 CO CD = FalseSym0- TFHelper_0123456789876543210 CO CE = FalseSym0- TFHelper_0123456789876543210 CO CF = FalseSym0- TFHelper_0123456789876543210 CO CG = FalseSym0- TFHelper_0123456789876543210 CO CH = FalseSym0- TFHelper_0123456789876543210 CO CI = FalseSym0- TFHelper_0123456789876543210 CO CJ = FalseSym0- TFHelper_0123456789876543210 CO CK = FalseSym0- TFHelper_0123456789876543210 CO CL = FalseSym0- TFHelper_0123456789876543210 CO CM = FalseSym0- TFHelper_0123456789876543210 CO CN = FalseSym0- TFHelper_0123456789876543210 CO CO = TrueSym0- TFHelper_0123456789876543210 CO CP = FalseSym0- TFHelper_0123456789876543210 CO CQ = FalseSym0- TFHelper_0123456789876543210 CO CR = FalseSym0- TFHelper_0123456789876543210 CO CS = FalseSym0- TFHelper_0123456789876543210 CO CT = FalseSym0- TFHelper_0123456789876543210 CO CU = FalseSym0- TFHelper_0123456789876543210 CO CV = FalseSym0- TFHelper_0123456789876543210 CO CW = FalseSym0- TFHelper_0123456789876543210 CO CX = FalseSym0- TFHelper_0123456789876543210 CO CY = FalseSym0- TFHelper_0123456789876543210 CO CZ = FalseSym0- TFHelper_0123456789876543210 CP CA = FalseSym0- TFHelper_0123456789876543210 CP CB = FalseSym0- TFHelper_0123456789876543210 CP CC = FalseSym0- TFHelper_0123456789876543210 CP CD = FalseSym0- TFHelper_0123456789876543210 CP CE = FalseSym0- TFHelper_0123456789876543210 CP CF = FalseSym0- TFHelper_0123456789876543210 CP CG = FalseSym0- TFHelper_0123456789876543210 CP CH = FalseSym0- TFHelper_0123456789876543210 CP CI = FalseSym0- TFHelper_0123456789876543210 CP CJ = FalseSym0- TFHelper_0123456789876543210 CP CK = FalseSym0- TFHelper_0123456789876543210 CP CL = FalseSym0- TFHelper_0123456789876543210 CP CM = FalseSym0- TFHelper_0123456789876543210 CP CN = FalseSym0- TFHelper_0123456789876543210 CP CO = FalseSym0- TFHelper_0123456789876543210 CP CP = TrueSym0- TFHelper_0123456789876543210 CP CQ = FalseSym0- TFHelper_0123456789876543210 CP CR = FalseSym0- TFHelper_0123456789876543210 CP CS = FalseSym0- TFHelper_0123456789876543210 CP CT = FalseSym0- TFHelper_0123456789876543210 CP CU = FalseSym0- TFHelper_0123456789876543210 CP CV = FalseSym0- TFHelper_0123456789876543210 CP CW = FalseSym0- TFHelper_0123456789876543210 CP CX = FalseSym0- TFHelper_0123456789876543210 CP CY = FalseSym0- TFHelper_0123456789876543210 CP CZ = FalseSym0- TFHelper_0123456789876543210 CQ CA = FalseSym0- TFHelper_0123456789876543210 CQ CB = FalseSym0- TFHelper_0123456789876543210 CQ CC = FalseSym0- TFHelper_0123456789876543210 CQ CD = FalseSym0- TFHelper_0123456789876543210 CQ CE = FalseSym0- TFHelper_0123456789876543210 CQ CF = FalseSym0- TFHelper_0123456789876543210 CQ CG = FalseSym0- TFHelper_0123456789876543210 CQ CH = FalseSym0- TFHelper_0123456789876543210 CQ CI = FalseSym0- TFHelper_0123456789876543210 CQ CJ = FalseSym0- TFHelper_0123456789876543210 CQ CK = FalseSym0- TFHelper_0123456789876543210 CQ CL = FalseSym0- TFHelper_0123456789876543210 CQ CM = FalseSym0- TFHelper_0123456789876543210 CQ CN = FalseSym0- TFHelper_0123456789876543210 CQ CO = FalseSym0- TFHelper_0123456789876543210 CQ CP = FalseSym0- TFHelper_0123456789876543210 CQ CQ = TrueSym0- TFHelper_0123456789876543210 CQ CR = FalseSym0- TFHelper_0123456789876543210 CQ CS = FalseSym0- TFHelper_0123456789876543210 CQ CT = FalseSym0- TFHelper_0123456789876543210 CQ CU = FalseSym0- TFHelper_0123456789876543210 CQ CV = FalseSym0- TFHelper_0123456789876543210 CQ CW = FalseSym0- TFHelper_0123456789876543210 CQ CX = FalseSym0- TFHelper_0123456789876543210 CQ CY = FalseSym0- TFHelper_0123456789876543210 CQ CZ = FalseSym0- TFHelper_0123456789876543210 CR CA = FalseSym0- TFHelper_0123456789876543210 CR CB = FalseSym0- TFHelper_0123456789876543210 CR CC = FalseSym0- TFHelper_0123456789876543210 CR CD = FalseSym0- TFHelper_0123456789876543210 CR CE = FalseSym0- TFHelper_0123456789876543210 CR CF = FalseSym0- TFHelper_0123456789876543210 CR CG = FalseSym0- TFHelper_0123456789876543210 CR CH = FalseSym0- TFHelper_0123456789876543210 CR CI = FalseSym0- TFHelper_0123456789876543210 CR CJ = FalseSym0- TFHelper_0123456789876543210 CR CK = FalseSym0- TFHelper_0123456789876543210 CR CL = FalseSym0- TFHelper_0123456789876543210 CR CM = FalseSym0- TFHelper_0123456789876543210 CR CN = FalseSym0- TFHelper_0123456789876543210 CR CO = FalseSym0- TFHelper_0123456789876543210 CR CP = FalseSym0- TFHelper_0123456789876543210 CR CQ = FalseSym0- TFHelper_0123456789876543210 CR CR = TrueSym0- TFHelper_0123456789876543210 CR CS = FalseSym0- TFHelper_0123456789876543210 CR CT = FalseSym0- TFHelper_0123456789876543210 CR CU = FalseSym0- TFHelper_0123456789876543210 CR CV = FalseSym0- TFHelper_0123456789876543210 CR CW = FalseSym0- TFHelper_0123456789876543210 CR CX = FalseSym0- TFHelper_0123456789876543210 CR CY = FalseSym0- TFHelper_0123456789876543210 CR CZ = FalseSym0- TFHelper_0123456789876543210 CS CA = FalseSym0- TFHelper_0123456789876543210 CS CB = FalseSym0- TFHelper_0123456789876543210 CS CC = FalseSym0- TFHelper_0123456789876543210 CS CD = FalseSym0- TFHelper_0123456789876543210 CS CE = FalseSym0- TFHelper_0123456789876543210 CS CF = FalseSym0- TFHelper_0123456789876543210 CS CG = FalseSym0- TFHelper_0123456789876543210 CS CH = FalseSym0- TFHelper_0123456789876543210 CS CI = FalseSym0- TFHelper_0123456789876543210 CS CJ = FalseSym0- TFHelper_0123456789876543210 CS CK = FalseSym0- TFHelper_0123456789876543210 CS CL = FalseSym0- TFHelper_0123456789876543210 CS CM = FalseSym0- TFHelper_0123456789876543210 CS CN = FalseSym0- TFHelper_0123456789876543210 CS CO = FalseSym0- TFHelper_0123456789876543210 CS CP = FalseSym0- TFHelper_0123456789876543210 CS CQ = FalseSym0- TFHelper_0123456789876543210 CS CR = FalseSym0- TFHelper_0123456789876543210 CS CS = TrueSym0- TFHelper_0123456789876543210 CS CT = FalseSym0- TFHelper_0123456789876543210 CS CU = FalseSym0- TFHelper_0123456789876543210 CS CV = FalseSym0- TFHelper_0123456789876543210 CS CW = FalseSym0- TFHelper_0123456789876543210 CS CX = FalseSym0- TFHelper_0123456789876543210 CS CY = FalseSym0- TFHelper_0123456789876543210 CS CZ = FalseSym0- TFHelper_0123456789876543210 CT CA = FalseSym0- TFHelper_0123456789876543210 CT CB = FalseSym0- TFHelper_0123456789876543210 CT CC = FalseSym0- TFHelper_0123456789876543210 CT CD = FalseSym0- TFHelper_0123456789876543210 CT CE = FalseSym0- TFHelper_0123456789876543210 CT CF = FalseSym0- TFHelper_0123456789876543210 CT CG = FalseSym0- TFHelper_0123456789876543210 CT CH = FalseSym0- TFHelper_0123456789876543210 CT CI = FalseSym0- TFHelper_0123456789876543210 CT CJ = FalseSym0- TFHelper_0123456789876543210 CT CK = FalseSym0- TFHelper_0123456789876543210 CT CL = FalseSym0- TFHelper_0123456789876543210 CT CM = FalseSym0- TFHelper_0123456789876543210 CT CN = FalseSym0- TFHelper_0123456789876543210 CT CO = FalseSym0- TFHelper_0123456789876543210 CT CP = FalseSym0- TFHelper_0123456789876543210 CT CQ = FalseSym0- TFHelper_0123456789876543210 CT CR = FalseSym0- TFHelper_0123456789876543210 CT CS = FalseSym0- TFHelper_0123456789876543210 CT CT = TrueSym0- TFHelper_0123456789876543210 CT CU = FalseSym0- TFHelper_0123456789876543210 CT CV = FalseSym0- TFHelper_0123456789876543210 CT CW = FalseSym0- TFHelper_0123456789876543210 CT CX = FalseSym0- TFHelper_0123456789876543210 CT CY = FalseSym0- TFHelper_0123456789876543210 CT CZ = FalseSym0- TFHelper_0123456789876543210 CU CA = FalseSym0- TFHelper_0123456789876543210 CU CB = FalseSym0- TFHelper_0123456789876543210 CU CC = FalseSym0- TFHelper_0123456789876543210 CU CD = FalseSym0- TFHelper_0123456789876543210 CU CE = FalseSym0- TFHelper_0123456789876543210 CU CF = FalseSym0- TFHelper_0123456789876543210 CU CG = FalseSym0- TFHelper_0123456789876543210 CU CH = FalseSym0- TFHelper_0123456789876543210 CU CI = FalseSym0- TFHelper_0123456789876543210 CU CJ = FalseSym0- TFHelper_0123456789876543210 CU CK = FalseSym0- TFHelper_0123456789876543210 CU CL = FalseSym0- TFHelper_0123456789876543210 CU CM = FalseSym0- TFHelper_0123456789876543210 CU CN = FalseSym0- TFHelper_0123456789876543210 CU CO = FalseSym0- TFHelper_0123456789876543210 CU CP = FalseSym0- TFHelper_0123456789876543210 CU CQ = FalseSym0- TFHelper_0123456789876543210 CU CR = FalseSym0- TFHelper_0123456789876543210 CU CS = FalseSym0- TFHelper_0123456789876543210 CU CT = FalseSym0- TFHelper_0123456789876543210 CU CU = TrueSym0- TFHelper_0123456789876543210 CU CV = FalseSym0- TFHelper_0123456789876543210 CU CW = FalseSym0- TFHelper_0123456789876543210 CU CX = FalseSym0- TFHelper_0123456789876543210 CU CY = FalseSym0- TFHelper_0123456789876543210 CU CZ = FalseSym0- TFHelper_0123456789876543210 CV CA = FalseSym0- TFHelper_0123456789876543210 CV CB = FalseSym0- TFHelper_0123456789876543210 CV CC = FalseSym0- TFHelper_0123456789876543210 CV CD = FalseSym0- TFHelper_0123456789876543210 CV CE = FalseSym0- TFHelper_0123456789876543210 CV CF = FalseSym0- TFHelper_0123456789876543210 CV CG = FalseSym0- TFHelper_0123456789876543210 CV CH = FalseSym0- TFHelper_0123456789876543210 CV CI = FalseSym0- TFHelper_0123456789876543210 CV CJ = FalseSym0- TFHelper_0123456789876543210 CV CK = FalseSym0- TFHelper_0123456789876543210 CV CL = FalseSym0- TFHelper_0123456789876543210 CV CM = FalseSym0- TFHelper_0123456789876543210 CV CN = FalseSym0- TFHelper_0123456789876543210 CV CO = FalseSym0- TFHelper_0123456789876543210 CV CP = FalseSym0- TFHelper_0123456789876543210 CV CQ = FalseSym0- TFHelper_0123456789876543210 CV CR = FalseSym0- TFHelper_0123456789876543210 CV CS = FalseSym0- TFHelper_0123456789876543210 CV CT = FalseSym0- TFHelper_0123456789876543210 CV CU = FalseSym0- TFHelper_0123456789876543210 CV CV = TrueSym0- TFHelper_0123456789876543210 CV CW = FalseSym0- TFHelper_0123456789876543210 CV CX = FalseSym0- TFHelper_0123456789876543210 CV CY = FalseSym0- TFHelper_0123456789876543210 CV CZ = FalseSym0- TFHelper_0123456789876543210 CW CA = FalseSym0- TFHelper_0123456789876543210 CW CB = FalseSym0- TFHelper_0123456789876543210 CW CC = FalseSym0- TFHelper_0123456789876543210 CW CD = FalseSym0- TFHelper_0123456789876543210 CW CE = FalseSym0- TFHelper_0123456789876543210 CW CF = FalseSym0- TFHelper_0123456789876543210 CW CG = FalseSym0- TFHelper_0123456789876543210 CW CH = FalseSym0- TFHelper_0123456789876543210 CW CI = FalseSym0- TFHelper_0123456789876543210 CW CJ = FalseSym0- TFHelper_0123456789876543210 CW CK = FalseSym0- TFHelper_0123456789876543210 CW CL = FalseSym0- TFHelper_0123456789876543210 CW CM = FalseSym0- TFHelper_0123456789876543210 CW CN = FalseSym0- TFHelper_0123456789876543210 CW CO = FalseSym0- TFHelper_0123456789876543210 CW CP = FalseSym0- TFHelper_0123456789876543210 CW CQ = FalseSym0- TFHelper_0123456789876543210 CW CR = FalseSym0- TFHelper_0123456789876543210 CW CS = FalseSym0- TFHelper_0123456789876543210 CW CT = FalseSym0- TFHelper_0123456789876543210 CW CU = FalseSym0- TFHelper_0123456789876543210 CW CV = FalseSym0- TFHelper_0123456789876543210 CW CW = TrueSym0- TFHelper_0123456789876543210 CW CX = FalseSym0- TFHelper_0123456789876543210 CW CY = FalseSym0- TFHelper_0123456789876543210 CW CZ = FalseSym0- TFHelper_0123456789876543210 CX CA = FalseSym0- TFHelper_0123456789876543210 CX CB = FalseSym0- TFHelper_0123456789876543210 CX CC = FalseSym0- TFHelper_0123456789876543210 CX CD = FalseSym0- TFHelper_0123456789876543210 CX CE = FalseSym0- TFHelper_0123456789876543210 CX CF = FalseSym0- TFHelper_0123456789876543210 CX CG = FalseSym0- TFHelper_0123456789876543210 CX CH = FalseSym0- TFHelper_0123456789876543210 CX CI = FalseSym0- TFHelper_0123456789876543210 CX CJ = FalseSym0- TFHelper_0123456789876543210 CX CK = FalseSym0- TFHelper_0123456789876543210 CX CL = FalseSym0- TFHelper_0123456789876543210 CX CM = FalseSym0- TFHelper_0123456789876543210 CX CN = FalseSym0- TFHelper_0123456789876543210 CX CO = FalseSym0- TFHelper_0123456789876543210 CX CP = FalseSym0- TFHelper_0123456789876543210 CX CQ = FalseSym0- TFHelper_0123456789876543210 CX CR = FalseSym0- TFHelper_0123456789876543210 CX CS = FalseSym0- TFHelper_0123456789876543210 CX CT = FalseSym0- TFHelper_0123456789876543210 CX CU = FalseSym0- TFHelper_0123456789876543210 CX CV = FalseSym0- TFHelper_0123456789876543210 CX CW = FalseSym0- TFHelper_0123456789876543210 CX CX = TrueSym0- TFHelper_0123456789876543210 CX CY = FalseSym0- TFHelper_0123456789876543210 CX CZ = FalseSym0- TFHelper_0123456789876543210 CY CA = FalseSym0- TFHelper_0123456789876543210 CY CB = FalseSym0- TFHelper_0123456789876543210 CY CC = FalseSym0- TFHelper_0123456789876543210 CY CD = FalseSym0- TFHelper_0123456789876543210 CY CE = FalseSym0- TFHelper_0123456789876543210 CY CF = FalseSym0- TFHelper_0123456789876543210 CY CG = FalseSym0- TFHelper_0123456789876543210 CY CH = FalseSym0- TFHelper_0123456789876543210 CY CI = FalseSym0- TFHelper_0123456789876543210 CY CJ = FalseSym0- TFHelper_0123456789876543210 CY CK = FalseSym0- TFHelper_0123456789876543210 CY CL = FalseSym0- TFHelper_0123456789876543210 CY CM = FalseSym0- TFHelper_0123456789876543210 CY CN = FalseSym0- TFHelper_0123456789876543210 CY CO = FalseSym0- TFHelper_0123456789876543210 CY CP = FalseSym0- TFHelper_0123456789876543210 CY CQ = FalseSym0- TFHelper_0123456789876543210 CY CR = FalseSym0- TFHelper_0123456789876543210 CY CS = FalseSym0- TFHelper_0123456789876543210 CY CT = FalseSym0- TFHelper_0123456789876543210 CY CU = FalseSym0- TFHelper_0123456789876543210 CY CV = FalseSym0- TFHelper_0123456789876543210 CY CW = FalseSym0- TFHelper_0123456789876543210 CY CX = FalseSym0- TFHelper_0123456789876543210 CY CY = TrueSym0- TFHelper_0123456789876543210 CY CZ = FalseSym0- TFHelper_0123456789876543210 CZ CA = FalseSym0- TFHelper_0123456789876543210 CZ CB = FalseSym0- TFHelper_0123456789876543210 CZ CC = FalseSym0- TFHelper_0123456789876543210 CZ CD = FalseSym0- TFHelper_0123456789876543210 CZ CE = FalseSym0- TFHelper_0123456789876543210 CZ CF = FalseSym0- TFHelper_0123456789876543210 CZ CG = FalseSym0- TFHelper_0123456789876543210 CZ CH = FalseSym0- TFHelper_0123456789876543210 CZ CI = FalseSym0- TFHelper_0123456789876543210 CZ CJ = FalseSym0- TFHelper_0123456789876543210 CZ CK = FalseSym0- TFHelper_0123456789876543210 CZ CL = FalseSym0- TFHelper_0123456789876543210 CZ CM = FalseSym0- TFHelper_0123456789876543210 CZ CN = FalseSym0- TFHelper_0123456789876543210 CZ CO = FalseSym0- TFHelper_0123456789876543210 CZ CP = FalseSym0- TFHelper_0123456789876543210 CZ CQ = FalseSym0- TFHelper_0123456789876543210 CZ CR = FalseSym0- TFHelper_0123456789876543210 CZ CS = FalseSym0- TFHelper_0123456789876543210 CZ CT = FalseSym0- TFHelper_0123456789876543210 CZ CU = FalseSym0- TFHelper_0123456789876543210 CZ CV = FalseSym0- TFHelper_0123456789876543210 CZ CW = FalseSym0- TFHelper_0123456789876543210 CZ CX = FalseSym0- TFHelper_0123456789876543210 CZ CY = FalseSym0- TFHelper_0123456789876543210 CZ CZ = TrueSym0- type TFHelper_0123456789876543210Sym0 :: (~>) AChar ((~>) AChar Bool)- data TFHelper_0123456789876543210Sym0 :: (~>) AChar ((~>) AChar Bool)- where- TFHelper_0123456789876543210Sym0KindInference :: SameKind (Apply TFHelper_0123456789876543210Sym0 arg) (TFHelper_0123456789876543210Sym1 arg) =>- TFHelper_0123456789876543210Sym0 a0123456789876543210- type instance Apply TFHelper_0123456789876543210Sym0 a0123456789876543210 = TFHelper_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings TFHelper_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) TFHelper_0123456789876543210Sym0KindInference) ())- type TFHelper_0123456789876543210Sym1 :: AChar -> (~>) AChar Bool- data TFHelper_0123456789876543210Sym1 (a0123456789876543210 :: AChar) :: (~>) AChar Bool- where- TFHelper_0123456789876543210Sym1KindInference :: SameKind (Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) arg) (TFHelper_0123456789876543210Sym2 a0123456789876543210 arg) =>- TFHelper_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (TFHelper_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) TFHelper_0123456789876543210Sym1KindInference) ())- type TFHelper_0123456789876543210Sym2 :: AChar -> AChar -> Bool- type family TFHelper_0123456789876543210Sym2 (a0123456789876543210 :: AChar) (a0123456789876543210 :: AChar) :: Bool where- TFHelper_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210- instance PEq AChar where- type (==) a a = Apply (Apply TFHelper_0123456789876543210Sym0 a) a- sLookup ::- forall (t :: [AChar]) (t :: Schema). Sing t- -> Sing t -> Sing (Apply (Apply LookupSym0 t) t :: U)- sOccurs ::- forall (t :: [AChar]) (t :: Schema). Sing t- -> Sing t -> Sing (Apply (Apply OccursSym0 t) t :: Bool)- sDisjoint ::- forall (t :: Schema) (t :: Schema). Sing t- -> Sing t -> Sing (Apply (Apply DisjointSym0 t) t :: Bool)- sAttrNotIn ::- forall (t :: Attribute) (t :: Schema). Sing t- -> Sing t- -> Sing (Apply (Apply AttrNotInSym0 t) t :: Bool)- sAppend ::- forall (t :: Schema) (t :: Schema). Sing t- -> Sing t -> Sing (Apply (Apply AppendSym0 t) t :: Schema)- sLookup _ (SSch SNil) = sUndefined- sLookup- (sName :: Sing name)- (SSch (SCons (SAttr (sName' :: Sing name') (sU :: Sing u))- (sAttrs :: Sing attrs)))- = let- sScrutinee_0123456789876543210 ::- Sing @_ (Let0123456789876543210Scrutinee_0123456789876543210Sym4 name name' u attrs)- sScrutinee_0123456789876543210- = (applySing ((applySing ((singFun2 @(==@#@$)) (%==))) sName))- sName'- in- (GHC.Base.id- @(Sing (Case_0123456789876543210 name name' u attrs (Let0123456789876543210Scrutinee_0123456789876543210Sym4 name name' u attrs) :: U)))- (case sScrutinee_0123456789876543210 of- STrue -> sU- SFalse- -> (applySing ((applySing ((singFun2 @LookupSym0) sLookup)) sName))- ((applySing ((singFun1 @SchSym0) SSch)) sAttrs))- sOccurs _ (SSch SNil) = SFalse- sOccurs- (sName :: Sing name)- (SSch (SCons (SAttr (sName' :: Sing name') _)- (sAttrs :: Sing attrs)))- = (applySing- ((applySing ((singFun2 @(||@#@$)) (%||)))- ((applySing ((applySing ((singFun2 @(==@#@$)) (%==))) sName))- sName')))- ((applySing ((applySing ((singFun2 @OccursSym0) sOccurs)) sName))- ((applySing ((singFun1 @SchSym0) SSch)) sAttrs))- sDisjoint (SSch SNil) _ = STrue- sDisjoint- (SSch (SCons (sH :: Sing h) (sT :: Sing t)))- (sS :: Sing s)- = (applySing- ((applySing ((singFun2 @(&&@#@$)) (%&&)))- ((applySing- ((applySing ((singFun2 @AttrNotInSym0) sAttrNotIn)) sH))- sS)))- ((applySing- ((applySing ((singFun2 @DisjointSym0) sDisjoint))- ((applySing ((singFun1 @SchSym0) SSch)) sT)))- sS)- sAttrNotIn _ (SSch SNil) = STrue- sAttrNotIn- (SAttr (sName :: Sing name) (sU :: Sing u))- (SSch (SCons (SAttr (sName' :: Sing name') _) (sT :: Sing t)))- = (applySing- ((applySing ((singFun2 @(&&@#@$)) (%&&)))- ((applySing ((applySing ((singFun2 @(/=@#@$)) (%/=))) sName))- sName')))- ((applySing- ((applySing ((singFun2 @AttrNotInSym0) sAttrNotIn))- ((applySing ((applySing ((singFun2 @AttrSym0) SAttr)) sName)) sU)))- ((applySing ((singFun1 @SchSym0) SSch)) sT))- sAppend (SSch (sS1 :: Sing s1)) (SSch (sS2 :: Sing s2))- = (applySing ((singFun1 @SchSym0) SSch))- ((applySing ((applySing ((singFun2 @(++@#@$)) (%++))) sS1)) sS2)- instance SingI (LookupSym0 :: (~>) [AChar] ((~>) Schema U)) where- sing = (singFun2 @LookupSym0) sLookup- instance SingI d =>- SingI (LookupSym1 (d :: [AChar]) :: (~>) Schema U) where- sing = (singFun1 @(LookupSym1 (d :: [AChar]))) (sLookup (sing @d))- instance SingI1 (LookupSym1 :: [AChar] -> (~>) Schema U) where- liftSing (s :: Sing (d :: [AChar]))- = (singFun1 @(LookupSym1 (d :: [AChar]))) (sLookup s)- instance SingI (OccursSym0 :: (~>) [AChar] ((~>) Schema Bool)) where- sing = (singFun2 @OccursSym0) sOccurs- instance SingI d =>- SingI (OccursSym1 (d :: [AChar]) :: (~>) Schema Bool) where- sing = (singFun1 @(OccursSym1 (d :: [AChar]))) (sOccurs (sing @d))- instance SingI1 (OccursSym1 :: [AChar] -> (~>) Schema Bool) where- liftSing (s :: Sing (d :: [AChar]))- = (singFun1 @(OccursSym1 (d :: [AChar]))) (sOccurs s)- instance SingI (DisjointSym0 :: (~>) Schema ((~>) Schema Bool)) where- sing = (singFun2 @DisjointSym0) sDisjoint- instance SingI d =>- SingI (DisjointSym1 (d :: Schema) :: (~>) Schema Bool) where- sing- = (singFun1 @(DisjointSym1 (d :: Schema))) (sDisjoint (sing @d))- instance SingI1 (DisjointSym1 :: Schema -> (~>) Schema Bool) where- liftSing (s :: Sing (d :: Schema))- = (singFun1 @(DisjointSym1 (d :: Schema))) (sDisjoint s)- instance SingI (AttrNotInSym0 :: (~>) Attribute ((~>) Schema Bool)) where- sing = (singFun2 @AttrNotInSym0) sAttrNotIn- instance SingI d =>- SingI (AttrNotInSym1 (d :: Attribute) :: (~>) Schema Bool) where- sing- = (singFun1 @(AttrNotInSym1 (d :: Attribute)))- (sAttrNotIn (sing @d))- instance SingI1 (AttrNotInSym1 :: Attribute- -> (~>) Schema Bool) where- liftSing (s :: Sing (d :: Attribute))- = (singFun1 @(AttrNotInSym1 (d :: Attribute))) (sAttrNotIn s)- instance SingI (AppendSym0 :: (~>) Schema ((~>) Schema Schema)) where- sing = (singFun2 @AppendSym0) sAppend- instance SingI d =>- SingI (AppendSym1 (d :: Schema) :: (~>) Schema Schema) where- sing = (singFun1 @(AppendSym1 (d :: Schema))) (sAppend (sing @d))- instance SingI1 (AppendSym1 :: Schema -> (~>) Schema Schema) where- liftSing (s :: Sing (d :: Schema))- = (singFun1 @(AppendSym1 (d :: Schema))) (sAppend s)- data SU :: U -> Type- where- SBOOL :: SU (BOOL :: U)- SSTRING :: SU (STRING :: U)- SNAT :: SU (NAT :: U)- SVEC :: forall (n :: U) (n :: Nat).- (Sing n) -> (Sing n) -> SU (VEC n n :: U)- type instance Sing @U = SU- instance SingKind U where- type Demote U = U- fromSing SBOOL = BOOL- fromSing SSTRING = STRING- fromSing SNAT = NAT- fromSing (SVEC b b) = (VEC (fromSing b)) (fromSing b)- toSing BOOL = SomeSing SBOOL- toSing STRING = SomeSing SSTRING- toSing NAT = SomeSing SNAT- toSing (VEC (b :: Demote U) (b :: Demote Nat))- = case ((,) (toSing b :: SomeSing U)) (toSing b :: SomeSing Nat) of- (,) (SomeSing c) (SomeSing c) -> SomeSing ((SVEC c) c)- data SAChar :: AChar -> Type- where- SCA :: SAChar (CA :: AChar)- SCB :: SAChar (CB :: AChar)- SCC :: SAChar (CC :: AChar)- SCD :: SAChar (CD :: AChar)- SCE :: SAChar (CE :: AChar)- SCF :: SAChar (CF :: AChar)- SCG :: SAChar (CG :: AChar)- SCH :: SAChar (CH :: AChar)- SCI :: SAChar (CI :: AChar)- SCJ :: SAChar (CJ :: AChar)- SCK :: SAChar (CK :: AChar)- SCL :: SAChar (CL :: AChar)- SCM :: SAChar (CM :: AChar)- SCN :: SAChar (CN :: AChar)- SCO :: SAChar (CO :: AChar)- SCP :: SAChar (CP :: AChar)- SCQ :: SAChar (CQ :: AChar)- SCR :: SAChar (CR :: AChar)- SCS :: SAChar (CS :: AChar)- SCT :: SAChar (CT :: AChar)- SCU :: SAChar (CU :: AChar)- SCV :: SAChar (CV :: AChar)- SCW :: SAChar (CW :: AChar)- SCX :: SAChar (CX :: AChar)- SCY :: SAChar (CY :: AChar)- SCZ :: SAChar (CZ :: AChar)- type instance Sing @AChar = SAChar- instance SingKind AChar where- type Demote AChar = AChar- fromSing SCA = CA- fromSing SCB = CB- fromSing SCC = CC- fromSing SCD = CD- fromSing SCE = CE- fromSing SCF = CF- fromSing SCG = CG- fromSing SCH = CH- fromSing SCI = CI- fromSing SCJ = CJ- fromSing SCK = CK- fromSing SCL = CL- fromSing SCM = CM- fromSing SCN = CN- fromSing SCO = CO- fromSing SCP = CP- fromSing SCQ = CQ- fromSing SCR = CR- fromSing SCS = CS- fromSing SCT = CT- fromSing SCU = CU- fromSing SCV = CV- fromSing SCW = CW- fromSing SCX = CX- fromSing SCY = CY- fromSing SCZ = CZ- toSing CA = SomeSing SCA- toSing CB = SomeSing SCB- toSing CC = SomeSing SCC- toSing CD = SomeSing SCD- toSing CE = SomeSing SCE- toSing CF = SomeSing SCF- toSing CG = SomeSing SCG- toSing CH = SomeSing SCH- toSing CI = SomeSing SCI- toSing CJ = SomeSing SCJ- toSing CK = SomeSing SCK- toSing CL = SomeSing SCL- toSing CM = SomeSing SCM- toSing CN = SomeSing SCN- toSing CO = SomeSing SCO- toSing CP = SomeSing SCP- toSing CQ = SomeSing SCQ- toSing CR = SomeSing SCR- toSing CS = SomeSing SCS- toSing CT = SomeSing SCT- toSing CU = SomeSing SCU- toSing CV = SomeSing SCV- toSing CW = SomeSing SCW- toSing CX = SomeSing SCX- toSing CY = SomeSing SCY- toSing CZ = SomeSing SCZ- data SAttribute :: Attribute -> Type- where- SAttr :: forall (n :: [AChar]) (n :: U).- (Sing n) -> (Sing n) -> SAttribute (Attr n n :: Attribute)- type instance Sing @Attribute = SAttribute- instance SingKind Attribute where- type Demote Attribute = Attribute- fromSing (SAttr b b) = (Attr (fromSing b)) (fromSing b)- toSing (Attr (b :: Demote [AChar]) (b :: Demote U))- = case- ((,) (toSing b :: SomeSing [AChar])) (toSing b :: SomeSing U)- of- (,) (SomeSing c) (SomeSing c) -> SomeSing ((SAttr c) c)- data SSchema :: Schema -> Type- where- SSch :: forall (n :: [Attribute]).- (Sing n) -> SSchema (Sch n :: Schema)- type instance Sing @Schema = SSchema- instance SingKind Schema where- type Demote Schema = Schema- fromSing (SSch b) = Sch (fromSing b)- toSing (Sch (b :: Demote [Attribute]))- = case toSing b :: SomeSing [Attribute] of- SomeSing c -> SomeSing (SSch c)- instance (SEq U, SEq Nat) => SEq U where- (%==) ::- forall (t1 :: U) (t2 :: U). Sing t1- -> Sing t2- -> Sing (Apply (Apply ((==@#@$) :: TyFun U ((~>) U Bool)- -> Type) t1) t2)- (%==) SBOOL SBOOL = STrue- (%==) SBOOL SSTRING = SFalse- (%==) SBOOL SNAT = SFalse- (%==) SBOOL (SVEC _ _) = SFalse- (%==) SSTRING SBOOL = SFalse- (%==) SSTRING SSTRING = STrue- (%==) SSTRING SNAT = SFalse- (%==) SSTRING (SVEC _ _) = SFalse- (%==) SNAT SBOOL = SFalse- (%==) SNAT SSTRING = SFalse- (%==) SNAT SNAT = STrue- (%==) SNAT (SVEC _ _) = SFalse- (%==) (SVEC _ _) SBOOL = SFalse- (%==) (SVEC _ _) SSTRING = SFalse- (%==) (SVEC _ _) SNAT = SFalse- (%==)- (SVEC (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210))- (SVEC (sB_0123456789876543210 :: Sing b_0123456789876543210)- (sB_0123456789876543210 :: Sing b_0123456789876543210))- = (applySing- ((applySing ((singFun2 @(&&@#@$)) (%&&)))- ((applySing- ((applySing ((singFun2 @(==@#@$)) (%==))) sA_0123456789876543210))- sB_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @(==@#@$)) (%==))) sA_0123456789876543210))- sB_0123456789876543210)- instance (SShow U, SShow Nat) => SShow U where- sShowsPrec ::- forall (t1 :: GHC.Num.Natural.Natural)- (t2 :: U)- (t3 :: Symbol). Sing t1- -> Sing t2- -> Sing t3- -> Sing (Apply (Apply (Apply (ShowsPrecSym0 :: TyFun GHC.Num.Natural.Natural ((~>) U ((~>) Symbol Symbol))- -> Type) t1) t2) t3)- sShowsPrec- _- SBOOL- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "BOOL")))- sA_0123456789876543210- sShowsPrec- _- SSTRING- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "STRING")))- sA_0123456789876543210- sShowsPrec- _- SNAT- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "NAT")))- sA_0123456789876543210- sShowsPrec- (sP_0123456789876543210 :: Sing p_0123456789876543210)- (SVEC (sArg_0123456789876543210 :: Sing arg_0123456789876543210)- (sArg_0123456789876543210 :: Sing arg_0123456789876543210))- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing- ((applySing ((singFun3 @ShowParenSym0) sShowParen))- ((applySing- ((applySing ((singFun2 @(>@#@$)) (%>))) sP_0123456789876543210))- (sFromInteger (sing :: Sing 10)))))- ((applySing- ((applySing ((singFun3 @(.@#@$)) (%.)))- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "VEC "))))- ((applySing- ((applySing ((singFun3 @(.@#@$)) (%.)))- ((applySing- ((applySing ((singFun3 @ShowsPrecSym0) sShowsPrec))- (sFromInteger (sing :: Sing 11))))- sArg_0123456789876543210)))- ((applySing- ((applySing ((singFun3 @(.@#@$)) (%.)))- ((singFun1 @ShowSpaceSym0) sShowSpace)))- ((applySing- ((applySing ((singFun3 @ShowsPrecSym0) sShowsPrec))- (sFromInteger (sing :: Sing 11))))- sArg_0123456789876543210))))))- sA_0123456789876543210- instance SShow AChar where- sShowsPrec ::- forall (t1 :: GHC.Num.Natural.Natural)- (t2 :: AChar)- (t3 :: Symbol). Sing t1- -> Sing t2- -> Sing t3- -> Sing (Apply (Apply (Apply (ShowsPrecSym0 :: TyFun GHC.Num.Natural.Natural ((~>) AChar ((~>) Symbol Symbol))- -> Type) t1) t2) t3)- sShowsPrec- _- SCA- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "CA")))- sA_0123456789876543210- sShowsPrec- _- SCB- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "CB")))- sA_0123456789876543210- sShowsPrec- _- SCC- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "CC")))- sA_0123456789876543210- sShowsPrec- _- SCD- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "CD")))- sA_0123456789876543210- sShowsPrec- _- SCE- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "CE")))- sA_0123456789876543210- sShowsPrec- _- SCF- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "CF")))- sA_0123456789876543210- sShowsPrec- _- SCG- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "CG")))- sA_0123456789876543210- sShowsPrec- _- SCH- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "CH")))- sA_0123456789876543210- sShowsPrec- _- SCI- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "CI")))- sA_0123456789876543210- sShowsPrec- _- SCJ- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "CJ")))- sA_0123456789876543210- sShowsPrec- _- SCK- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "CK")))- sA_0123456789876543210- sShowsPrec- _- SCL- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "CL")))- sA_0123456789876543210- sShowsPrec- _- SCM- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "CM")))- sA_0123456789876543210- sShowsPrec- _- SCN- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "CN")))- sA_0123456789876543210- sShowsPrec- _- SCO- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "CO")))- sA_0123456789876543210- sShowsPrec- _- SCP- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "CP")))- sA_0123456789876543210- sShowsPrec- _- SCQ- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "CQ")))- sA_0123456789876543210- sShowsPrec- _- SCR- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "CR")))- sA_0123456789876543210- sShowsPrec- _- SCS- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "CS")))- sA_0123456789876543210- sShowsPrec- _- SCT- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "CT")))- sA_0123456789876543210- sShowsPrec- _- SCU- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "CU")))- sA_0123456789876543210- sShowsPrec- _- SCV- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "CV")))- sA_0123456789876543210- sShowsPrec- _- SCW- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "CW")))- sA_0123456789876543210- sShowsPrec- _- SCX- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "CX")))- sA_0123456789876543210- sShowsPrec- _- SCY- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "CY")))- sA_0123456789876543210- sShowsPrec- _- SCZ- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "CZ")))- sA_0123456789876543210- instance SEq AChar where- (%==) ::- forall (t1 :: AChar) (t2 :: AChar). Sing t1- -> Sing t2- -> Sing (Apply (Apply ((==@#@$) :: TyFun AChar ((~>) AChar Bool)- -> Type) t1) t2)- (%==) SCA SCA = STrue- (%==) SCA SCB = SFalse- (%==) SCA SCC = SFalse- (%==) SCA SCD = SFalse- (%==) SCA SCE = SFalse- (%==) SCA SCF = SFalse- (%==) SCA SCG = SFalse- (%==) SCA SCH = SFalse- (%==) SCA SCI = SFalse- (%==) SCA SCJ = SFalse- (%==) SCA SCK = SFalse- (%==) SCA SCL = SFalse- (%==) SCA SCM = SFalse- (%==) SCA SCN = SFalse- (%==) SCA SCO = SFalse- (%==) SCA SCP = SFalse- (%==) SCA SCQ = SFalse- (%==) SCA SCR = SFalse- (%==) SCA SCS = SFalse- (%==) SCA SCT = SFalse- (%==) SCA SCU = SFalse- (%==) SCA SCV = SFalse- (%==) SCA SCW = SFalse- (%==) SCA SCX = SFalse- (%==) SCA SCY = SFalse- (%==) SCA SCZ = SFalse- (%==) SCB SCA = SFalse- (%==) SCB SCB = STrue- (%==) SCB SCC = SFalse- (%==) SCB SCD = SFalse- (%==) SCB SCE = SFalse- (%==) SCB SCF = SFalse- (%==) SCB SCG = SFalse- (%==) SCB SCH = SFalse- (%==) SCB SCI = SFalse- (%==) SCB SCJ = SFalse- (%==) SCB SCK = SFalse- (%==) SCB SCL = SFalse- (%==) SCB SCM = SFalse- (%==) SCB SCN = SFalse- (%==) SCB SCO = SFalse- (%==) SCB SCP = SFalse- (%==) SCB SCQ = SFalse- (%==) SCB SCR = SFalse- (%==) SCB SCS = SFalse- (%==) SCB SCT = SFalse- (%==) SCB SCU = SFalse- (%==) SCB SCV = SFalse- (%==) SCB SCW = SFalse- (%==) SCB SCX = SFalse- (%==) SCB SCY = SFalse- (%==) SCB SCZ = SFalse- (%==) SCC SCA = SFalse- (%==) SCC SCB = SFalse- (%==) SCC SCC = STrue- (%==) SCC SCD = SFalse- (%==) SCC SCE = SFalse- (%==) SCC SCF = SFalse- (%==) SCC SCG = SFalse- (%==) SCC SCH = SFalse- (%==) SCC SCI = SFalse- (%==) SCC SCJ = SFalse- (%==) SCC SCK = SFalse- (%==) SCC SCL = SFalse- (%==) SCC SCM = SFalse- (%==) SCC SCN = SFalse- (%==) SCC SCO = SFalse- (%==) SCC SCP = SFalse- (%==) SCC SCQ = SFalse- (%==) SCC SCR = SFalse- (%==) SCC SCS = SFalse- (%==) SCC SCT = SFalse- (%==) SCC SCU = SFalse- (%==) SCC SCV = SFalse- (%==) SCC SCW = SFalse- (%==) SCC SCX = SFalse- (%==) SCC SCY = SFalse- (%==) SCC SCZ = SFalse- (%==) SCD SCA = SFalse- (%==) SCD SCB = SFalse- (%==) SCD SCC = SFalse- (%==) SCD SCD = STrue- (%==) SCD SCE = SFalse- (%==) SCD SCF = SFalse- (%==) SCD SCG = SFalse- (%==) SCD SCH = SFalse- (%==) SCD SCI = SFalse- (%==) SCD SCJ = SFalse- (%==) SCD SCK = SFalse- (%==) SCD SCL = SFalse- (%==) SCD SCM = SFalse- (%==) SCD SCN = SFalse- (%==) SCD SCO = SFalse- (%==) SCD SCP = SFalse- (%==) SCD SCQ = SFalse- (%==) SCD SCR = SFalse- (%==) SCD SCS = SFalse- (%==) SCD SCT = SFalse- (%==) SCD SCU = SFalse- (%==) SCD SCV = SFalse- (%==) SCD SCW = SFalse- (%==) SCD SCX = SFalse- (%==) SCD SCY = SFalse- (%==) SCD SCZ = SFalse- (%==) SCE SCA = SFalse- (%==) SCE SCB = SFalse- (%==) SCE SCC = SFalse- (%==) SCE SCD = SFalse- (%==) SCE SCE = STrue- (%==) SCE SCF = SFalse- (%==) SCE SCG = SFalse- (%==) SCE SCH = SFalse- (%==) SCE SCI = SFalse- (%==) SCE SCJ = SFalse- (%==) SCE SCK = SFalse- (%==) SCE SCL = SFalse- (%==) SCE SCM = SFalse- (%==) SCE SCN = SFalse- (%==) SCE SCO = SFalse- (%==) SCE SCP = SFalse- (%==) SCE SCQ = SFalse- (%==) SCE SCR = SFalse- (%==) SCE SCS = SFalse- (%==) SCE SCT = SFalse- (%==) SCE SCU = SFalse- (%==) SCE SCV = SFalse- (%==) SCE SCW = SFalse- (%==) SCE SCX = SFalse- (%==) SCE SCY = SFalse- (%==) SCE SCZ = SFalse- (%==) SCF SCA = SFalse- (%==) SCF SCB = SFalse- (%==) SCF SCC = SFalse- (%==) SCF SCD = SFalse- (%==) SCF SCE = SFalse- (%==) SCF SCF = STrue- (%==) SCF SCG = SFalse- (%==) SCF SCH = SFalse- (%==) SCF SCI = SFalse- (%==) SCF SCJ = SFalse- (%==) SCF SCK = SFalse- (%==) SCF SCL = SFalse- (%==) SCF SCM = SFalse- (%==) SCF SCN = SFalse- (%==) SCF SCO = SFalse- (%==) SCF SCP = SFalse- (%==) SCF SCQ = SFalse- (%==) SCF SCR = SFalse- (%==) SCF SCS = SFalse- (%==) SCF SCT = SFalse- (%==) SCF SCU = SFalse- (%==) SCF SCV = SFalse- (%==) SCF SCW = SFalse- (%==) SCF SCX = SFalse- (%==) SCF SCY = SFalse- (%==) SCF SCZ = SFalse- (%==) SCG SCA = SFalse- (%==) SCG SCB = SFalse- (%==) SCG SCC = SFalse- (%==) SCG SCD = SFalse- (%==) SCG SCE = SFalse- (%==) SCG SCF = SFalse- (%==) SCG SCG = STrue- (%==) SCG SCH = SFalse- (%==) SCG SCI = SFalse- (%==) SCG SCJ = SFalse- (%==) SCG SCK = SFalse- (%==) SCG SCL = SFalse- (%==) SCG SCM = SFalse- (%==) SCG SCN = SFalse- (%==) SCG SCO = SFalse- (%==) SCG SCP = SFalse- (%==) SCG SCQ = SFalse- (%==) SCG SCR = SFalse- (%==) SCG SCS = SFalse- (%==) SCG SCT = SFalse- (%==) SCG SCU = SFalse- (%==) SCG SCV = SFalse- (%==) SCG SCW = SFalse- (%==) SCG SCX = SFalse- (%==) SCG SCY = SFalse- (%==) SCG SCZ = SFalse- (%==) SCH SCA = SFalse- (%==) SCH SCB = SFalse- (%==) SCH SCC = SFalse- (%==) SCH SCD = SFalse- (%==) SCH SCE = SFalse- (%==) SCH SCF = SFalse- (%==) SCH SCG = SFalse- (%==) SCH SCH = STrue- (%==) SCH SCI = SFalse- (%==) SCH SCJ = SFalse- (%==) SCH SCK = SFalse- (%==) SCH SCL = SFalse- (%==) SCH SCM = SFalse- (%==) SCH SCN = SFalse- (%==) SCH SCO = SFalse- (%==) SCH SCP = SFalse- (%==) SCH SCQ = SFalse- (%==) SCH SCR = SFalse- (%==) SCH SCS = SFalse- (%==) SCH SCT = SFalse- (%==) SCH SCU = SFalse- (%==) SCH SCV = SFalse- (%==) SCH SCW = SFalse- (%==) SCH SCX = SFalse- (%==) SCH SCY = SFalse- (%==) SCH SCZ = SFalse- (%==) SCI SCA = SFalse- (%==) SCI SCB = SFalse- (%==) SCI SCC = SFalse- (%==) SCI SCD = SFalse- (%==) SCI SCE = SFalse- (%==) SCI SCF = SFalse- (%==) SCI SCG = SFalse- (%==) SCI SCH = SFalse- (%==) SCI SCI = STrue- (%==) SCI SCJ = SFalse- (%==) SCI SCK = SFalse- (%==) SCI SCL = SFalse- (%==) SCI SCM = SFalse- (%==) SCI SCN = SFalse- (%==) SCI SCO = SFalse- (%==) SCI SCP = SFalse- (%==) SCI SCQ = SFalse- (%==) SCI SCR = SFalse- (%==) SCI SCS = SFalse- (%==) SCI SCT = SFalse- (%==) SCI SCU = SFalse- (%==) SCI SCV = SFalse- (%==) SCI SCW = SFalse- (%==) SCI SCX = SFalse- (%==) SCI SCY = SFalse- (%==) SCI SCZ = SFalse- (%==) SCJ SCA = SFalse- (%==) SCJ SCB = SFalse- (%==) SCJ SCC = SFalse- (%==) SCJ SCD = SFalse- (%==) SCJ SCE = SFalse- (%==) SCJ SCF = SFalse- (%==) SCJ SCG = SFalse- (%==) SCJ SCH = SFalse- (%==) SCJ SCI = SFalse- (%==) SCJ SCJ = STrue- (%==) SCJ SCK = SFalse- (%==) SCJ SCL = SFalse- (%==) SCJ SCM = SFalse- (%==) SCJ SCN = SFalse- (%==) SCJ SCO = SFalse- (%==) SCJ SCP = SFalse- (%==) SCJ SCQ = SFalse- (%==) SCJ SCR = SFalse- (%==) SCJ SCS = SFalse- (%==) SCJ SCT = SFalse- (%==) SCJ SCU = SFalse- (%==) SCJ SCV = SFalse- (%==) SCJ SCW = SFalse- (%==) SCJ SCX = SFalse- (%==) SCJ SCY = SFalse- (%==) SCJ SCZ = SFalse- (%==) SCK SCA = SFalse- (%==) SCK SCB = SFalse- (%==) SCK SCC = SFalse- (%==) SCK SCD = SFalse- (%==) SCK SCE = SFalse- (%==) SCK SCF = SFalse- (%==) SCK SCG = SFalse- (%==) SCK SCH = SFalse- (%==) SCK SCI = SFalse- (%==) SCK SCJ = SFalse- (%==) SCK SCK = STrue- (%==) SCK SCL = SFalse- (%==) SCK SCM = SFalse- (%==) SCK SCN = SFalse- (%==) SCK SCO = SFalse- (%==) SCK SCP = SFalse- (%==) SCK SCQ = SFalse- (%==) SCK SCR = SFalse- (%==) SCK SCS = SFalse- (%==) SCK SCT = SFalse- (%==) SCK SCU = SFalse- (%==) SCK SCV = SFalse- (%==) SCK SCW = SFalse- (%==) SCK SCX = SFalse- (%==) SCK SCY = SFalse- (%==) SCK SCZ = SFalse- (%==) SCL SCA = SFalse- (%==) SCL SCB = SFalse- (%==) SCL SCC = SFalse- (%==) SCL SCD = SFalse- (%==) SCL SCE = SFalse- (%==) SCL SCF = SFalse- (%==) SCL SCG = SFalse- (%==) SCL SCH = SFalse- (%==) SCL SCI = SFalse- (%==) SCL SCJ = SFalse- (%==) SCL SCK = SFalse- (%==) SCL SCL = STrue- (%==) SCL SCM = SFalse- (%==) SCL SCN = SFalse- (%==) SCL SCO = SFalse- (%==) SCL SCP = SFalse- (%==) SCL SCQ = SFalse- (%==) SCL SCR = SFalse- (%==) SCL SCS = SFalse- (%==) SCL SCT = SFalse- (%==) SCL SCU = SFalse- (%==) SCL SCV = SFalse- (%==) SCL SCW = SFalse- (%==) SCL SCX = SFalse- (%==) SCL SCY = SFalse- (%==) SCL SCZ = SFalse- (%==) SCM SCA = SFalse- (%==) SCM SCB = SFalse- (%==) SCM SCC = SFalse- (%==) SCM SCD = SFalse- (%==) SCM SCE = SFalse- (%==) SCM SCF = SFalse- (%==) SCM SCG = SFalse- (%==) SCM SCH = SFalse- (%==) SCM SCI = SFalse- (%==) SCM SCJ = SFalse- (%==) SCM SCK = SFalse- (%==) SCM SCL = SFalse- (%==) SCM SCM = STrue- (%==) SCM SCN = SFalse- (%==) SCM SCO = SFalse- (%==) SCM SCP = SFalse- (%==) SCM SCQ = SFalse- (%==) SCM SCR = SFalse- (%==) SCM SCS = SFalse- (%==) SCM SCT = SFalse- (%==) SCM SCU = SFalse- (%==) SCM SCV = SFalse- (%==) SCM SCW = SFalse- (%==) SCM SCX = SFalse- (%==) SCM SCY = SFalse- (%==) SCM SCZ = SFalse- (%==) SCN SCA = SFalse- (%==) SCN SCB = SFalse- (%==) SCN SCC = SFalse- (%==) SCN SCD = SFalse- (%==) SCN SCE = SFalse- (%==) SCN SCF = SFalse- (%==) SCN SCG = SFalse- (%==) SCN SCH = SFalse- (%==) SCN SCI = SFalse- (%==) SCN SCJ = SFalse- (%==) SCN SCK = SFalse- (%==) SCN SCL = SFalse- (%==) SCN SCM = SFalse- (%==) SCN SCN = STrue- (%==) SCN SCO = SFalse- (%==) SCN SCP = SFalse- (%==) SCN SCQ = SFalse- (%==) SCN SCR = SFalse- (%==) SCN SCS = SFalse- (%==) SCN SCT = SFalse- (%==) SCN SCU = SFalse- (%==) SCN SCV = SFalse- (%==) SCN SCW = SFalse- (%==) SCN SCX = SFalse- (%==) SCN SCY = SFalse- (%==) SCN SCZ = SFalse- (%==) SCO SCA = SFalse- (%==) SCO SCB = SFalse- (%==) SCO SCC = SFalse- (%==) SCO SCD = SFalse- (%==) SCO SCE = SFalse- (%==) SCO SCF = SFalse- (%==) SCO SCG = SFalse- (%==) SCO SCH = SFalse- (%==) SCO SCI = SFalse- (%==) SCO SCJ = SFalse- (%==) SCO SCK = SFalse- (%==) SCO SCL = SFalse- (%==) SCO SCM = SFalse- (%==) SCO SCN = SFalse- (%==) SCO SCO = STrue- (%==) SCO SCP = SFalse- (%==) SCO SCQ = SFalse- (%==) SCO SCR = SFalse- (%==) SCO SCS = SFalse- (%==) SCO SCT = SFalse- (%==) SCO SCU = SFalse- (%==) SCO SCV = SFalse- (%==) SCO SCW = SFalse- (%==) SCO SCX = SFalse- (%==) SCO SCY = SFalse- (%==) SCO SCZ = SFalse- (%==) SCP SCA = SFalse- (%==) SCP SCB = SFalse- (%==) SCP SCC = SFalse- (%==) SCP SCD = SFalse- (%==) SCP SCE = SFalse- (%==) SCP SCF = SFalse- (%==) SCP SCG = SFalse- (%==) SCP SCH = SFalse- (%==) SCP SCI = SFalse- (%==) SCP SCJ = SFalse- (%==) SCP SCK = SFalse- (%==) SCP SCL = SFalse- (%==) SCP SCM = SFalse- (%==) SCP SCN = SFalse- (%==) SCP SCO = SFalse- (%==) SCP SCP = STrue- (%==) SCP SCQ = SFalse- (%==) SCP SCR = SFalse- (%==) SCP SCS = SFalse- (%==) SCP SCT = SFalse- (%==) SCP SCU = SFalse- (%==) SCP SCV = SFalse- (%==) SCP SCW = SFalse- (%==) SCP SCX = SFalse- (%==) SCP SCY = SFalse- (%==) SCP SCZ = SFalse- (%==) SCQ SCA = SFalse- (%==) SCQ SCB = SFalse- (%==) SCQ SCC = SFalse- (%==) SCQ SCD = SFalse- (%==) SCQ SCE = SFalse- (%==) SCQ SCF = SFalse- (%==) SCQ SCG = SFalse- (%==) SCQ SCH = SFalse- (%==) SCQ SCI = SFalse- (%==) SCQ SCJ = SFalse- (%==) SCQ SCK = SFalse- (%==) SCQ SCL = SFalse- (%==) SCQ SCM = SFalse- (%==) SCQ SCN = SFalse- (%==) SCQ SCO = SFalse- (%==) SCQ SCP = SFalse- (%==) SCQ SCQ = STrue- (%==) SCQ SCR = SFalse- (%==) SCQ SCS = SFalse- (%==) SCQ SCT = SFalse- (%==) SCQ SCU = SFalse- (%==) SCQ SCV = SFalse- (%==) SCQ SCW = SFalse- (%==) SCQ SCX = SFalse- (%==) SCQ SCY = SFalse- (%==) SCQ SCZ = SFalse- (%==) SCR SCA = SFalse- (%==) SCR SCB = SFalse- (%==) SCR SCC = SFalse- (%==) SCR SCD = SFalse- (%==) SCR SCE = SFalse- (%==) SCR SCF = SFalse- (%==) SCR SCG = SFalse- (%==) SCR SCH = SFalse- (%==) SCR SCI = SFalse- (%==) SCR SCJ = SFalse- (%==) SCR SCK = SFalse- (%==) SCR SCL = SFalse- (%==) SCR SCM = SFalse- (%==) SCR SCN = SFalse- (%==) SCR SCO = SFalse- (%==) SCR SCP = SFalse- (%==) SCR SCQ = SFalse- (%==) SCR SCR = STrue- (%==) SCR SCS = SFalse- (%==) SCR SCT = SFalse- (%==) SCR SCU = SFalse- (%==) SCR SCV = SFalse- (%==) SCR SCW = SFalse- (%==) SCR SCX = SFalse- (%==) SCR SCY = SFalse- (%==) SCR SCZ = SFalse- (%==) SCS SCA = SFalse- (%==) SCS SCB = SFalse- (%==) SCS SCC = SFalse- (%==) SCS SCD = SFalse- (%==) SCS SCE = SFalse- (%==) SCS SCF = SFalse- (%==) SCS SCG = SFalse- (%==) SCS SCH = SFalse- (%==) SCS SCI = SFalse- (%==) SCS SCJ = SFalse- (%==) SCS SCK = SFalse- (%==) SCS SCL = SFalse- (%==) SCS SCM = SFalse- (%==) SCS SCN = SFalse- (%==) SCS SCO = SFalse- (%==) SCS SCP = SFalse- (%==) SCS SCQ = SFalse- (%==) SCS SCR = SFalse- (%==) SCS SCS = STrue- (%==) SCS SCT = SFalse- (%==) SCS SCU = SFalse- (%==) SCS SCV = SFalse- (%==) SCS SCW = SFalse- (%==) SCS SCX = SFalse- (%==) SCS SCY = SFalse- (%==) SCS SCZ = SFalse- (%==) SCT SCA = SFalse- (%==) SCT SCB = SFalse- (%==) SCT SCC = SFalse- (%==) SCT SCD = SFalse- (%==) SCT SCE = SFalse- (%==) SCT SCF = SFalse- (%==) SCT SCG = SFalse- (%==) SCT SCH = SFalse- (%==) SCT SCI = SFalse- (%==) SCT SCJ = SFalse- (%==) SCT SCK = SFalse- (%==) SCT SCL = SFalse- (%==) SCT SCM = SFalse- (%==) SCT SCN = SFalse- (%==) SCT SCO = SFalse- (%==) SCT SCP = SFalse- (%==) SCT SCQ = SFalse- (%==) SCT SCR = SFalse- (%==) SCT SCS = SFalse- (%==) SCT SCT = STrue- (%==) SCT SCU = SFalse- (%==) SCT SCV = SFalse- (%==) SCT SCW = SFalse- (%==) SCT SCX = SFalse- (%==) SCT SCY = SFalse- (%==) SCT SCZ = SFalse- (%==) SCU SCA = SFalse- (%==) SCU SCB = SFalse- (%==) SCU SCC = SFalse- (%==) SCU SCD = SFalse- (%==) SCU SCE = SFalse- (%==) SCU SCF = SFalse- (%==) SCU SCG = SFalse- (%==) SCU SCH = SFalse- (%==) SCU SCI = SFalse- (%==) SCU SCJ = SFalse- (%==) SCU SCK = SFalse- (%==) SCU SCL = SFalse- (%==) SCU SCM = SFalse- (%==) SCU SCN = SFalse- (%==) SCU SCO = SFalse- (%==) SCU SCP = SFalse- (%==) SCU SCQ = SFalse- (%==) SCU SCR = SFalse- (%==) SCU SCS = SFalse- (%==) SCU SCT = SFalse- (%==) SCU SCU = STrue- (%==) SCU SCV = SFalse- (%==) SCU SCW = SFalse- (%==) SCU SCX = SFalse- (%==) SCU SCY = SFalse- (%==) SCU SCZ = SFalse- (%==) SCV SCA = SFalse- (%==) SCV SCB = SFalse- (%==) SCV SCC = SFalse- (%==) SCV SCD = SFalse- (%==) SCV SCE = SFalse- (%==) SCV SCF = SFalse- (%==) SCV SCG = SFalse- (%==) SCV SCH = SFalse- (%==) SCV SCI = SFalse- (%==) SCV SCJ = SFalse- (%==) SCV SCK = SFalse- (%==) SCV SCL = SFalse- (%==) SCV SCM = SFalse- (%==) SCV SCN = SFalse- (%==) SCV SCO = SFalse- (%==) SCV SCP = SFalse- (%==) SCV SCQ = SFalse- (%==) SCV SCR = SFalse- (%==) SCV SCS = SFalse- (%==) SCV SCT = SFalse- (%==) SCV SCU = SFalse- (%==) SCV SCV = STrue- (%==) SCV SCW = SFalse- (%==) SCV SCX = SFalse- (%==) SCV SCY = SFalse- (%==) SCV SCZ = SFalse- (%==) SCW SCA = SFalse- (%==) SCW SCB = SFalse- (%==) SCW SCC = SFalse- (%==) SCW SCD = SFalse- (%==) SCW SCE = SFalse- (%==) SCW SCF = SFalse- (%==) SCW SCG = SFalse- (%==) SCW SCH = SFalse- (%==) SCW SCI = SFalse- (%==) SCW SCJ = SFalse- (%==) SCW SCK = SFalse- (%==) SCW SCL = SFalse- (%==) SCW SCM = SFalse- (%==) SCW SCN = SFalse- (%==) SCW SCO = SFalse- (%==) SCW SCP = SFalse- (%==) SCW SCQ = SFalse- (%==) SCW SCR = SFalse- (%==) SCW SCS = SFalse- (%==) SCW SCT = SFalse- (%==) SCW SCU = SFalse- (%==) SCW SCV = SFalse- (%==) SCW SCW = STrue- (%==) SCW SCX = SFalse- (%==) SCW SCY = SFalse- (%==) SCW SCZ = SFalse- (%==) SCX SCA = SFalse- (%==) SCX SCB = SFalse- (%==) SCX SCC = SFalse- (%==) SCX SCD = SFalse- (%==) SCX SCE = SFalse- (%==) SCX SCF = SFalse- (%==) SCX SCG = SFalse- (%==) SCX SCH = SFalse- (%==) SCX SCI = SFalse- (%==) SCX SCJ = SFalse- (%==) SCX SCK = SFalse- (%==) SCX SCL = SFalse- (%==) SCX SCM = SFalse- (%==) SCX SCN = SFalse- (%==) SCX SCO = SFalse- (%==) SCX SCP = SFalse- (%==) SCX SCQ = SFalse- (%==) SCX SCR = SFalse- (%==) SCX SCS = SFalse- (%==) SCX SCT = SFalse- (%==) SCX SCU = SFalse- (%==) SCX SCV = SFalse- (%==) SCX SCW = SFalse- (%==) SCX SCX = STrue- (%==) SCX SCY = SFalse- (%==) SCX SCZ = SFalse- (%==) SCY SCA = SFalse- (%==) SCY SCB = SFalse- (%==) SCY SCC = SFalse- (%==) SCY SCD = SFalse- (%==) SCY SCE = SFalse- (%==) SCY SCF = SFalse- (%==) SCY SCG = SFalse- (%==) SCY SCH = SFalse- (%==) SCY SCI = SFalse- (%==) SCY SCJ = SFalse- (%==) SCY SCK = SFalse- (%==) SCY SCL = SFalse- (%==) SCY SCM = SFalse- (%==) SCY SCN = SFalse- (%==) SCY SCO = SFalse- (%==) SCY SCP = SFalse- (%==) SCY SCQ = SFalse- (%==) SCY SCR = SFalse- (%==) SCY SCS = SFalse- (%==) SCY SCT = SFalse- (%==) SCY SCU = SFalse- (%==) SCY SCV = SFalse- (%==) SCY SCW = SFalse- (%==) SCY SCX = SFalse- (%==) SCY SCY = STrue- (%==) SCY SCZ = SFalse- (%==) SCZ SCA = SFalse- (%==) SCZ SCB = SFalse- (%==) SCZ SCC = SFalse- (%==) SCZ SCD = SFalse- (%==) SCZ SCE = SFalse- (%==) SCZ SCF = SFalse- (%==) SCZ SCG = SFalse- (%==) SCZ SCH = SFalse- (%==) SCZ SCI = SFalse- (%==) SCZ SCJ = SFalse- (%==) SCZ SCK = SFalse- (%==) SCZ SCL = SFalse- (%==) SCZ SCM = SFalse- (%==) SCZ SCN = SFalse- (%==) SCZ SCO = SFalse- (%==) SCZ SCP = SFalse- (%==) SCZ SCQ = SFalse- (%==) SCZ SCR = SFalse- (%==) SCZ SCS = SFalse- (%==) SCZ SCT = SFalse- (%==) SCZ SCU = SFalse- (%==) SCZ SCV = SFalse- (%==) SCZ SCW = SFalse- (%==) SCZ SCX = SFalse- (%==) SCZ SCY = SFalse- (%==) SCZ SCZ = STrue- instance (SDecide U, SDecide Nat) => SDecide U where- (%~) SBOOL SBOOL = Proved Refl- (%~) SBOOL SSTRING = Disproved (\ x -> case x of {})- (%~) SBOOL SNAT = Disproved (\ x -> case x of {})- (%~) SBOOL (SVEC _ _) = Disproved (\ x -> case x of {})- (%~) SSTRING SBOOL = Disproved (\ x -> case x of {})- (%~) SSTRING SSTRING = Proved Refl- (%~) SSTRING SNAT = Disproved (\ x -> case x of {})- (%~) SSTRING (SVEC _ _) = Disproved (\ x -> case x of {})- (%~) SNAT SBOOL = Disproved (\ x -> case x of {})- (%~) SNAT SSTRING = Disproved (\ x -> case x of {})- (%~) SNAT SNAT = Proved Refl- (%~) SNAT (SVEC _ _) = Disproved (\ x -> case x of {})- (%~) (SVEC _ _) SBOOL = Disproved (\ x -> case x of {})- (%~) (SVEC _ _) SSTRING = Disproved (\ x -> case x of {})- (%~) (SVEC _ _) SNAT = Disproved (\ x -> case x of {})- (%~) (SVEC a a) (SVEC b b)- = case ((,) (((%~) a) b)) (((%~) a) b) of- (,) (Proved Refl) (Proved Refl) -> Proved Refl- (,) (Disproved contra) _- -> Disproved (\ refl -> case refl of Refl -> contra Refl)- (,) _ (Disproved contra)- -> Disproved (\ refl -> case refl of Refl -> contra Refl)- instance (SDecide U, SDecide Nat) =>- Data.Type.Equality.TestEquality (SU :: U -> Type) where- Data.Type.Equality.testEquality- = Data.Singletons.Decide.decideEquality- instance (SDecide U, SDecide Nat) =>- Data.Type.Coercion.TestCoercion (SU :: U -> Type) where- Data.Type.Coercion.testCoercion- = Data.Singletons.Decide.decideCoercion- instance SDecide AChar where- (%~) SCA SCA = Proved Refl- (%~) SCA SCB = Disproved (\ x -> case x of {})- (%~) SCA SCC = Disproved (\ x -> case x of {})- (%~) SCA SCD = Disproved (\ x -> case x of {})- (%~) SCA SCE = Disproved (\ x -> case x of {})- (%~) SCA SCF = Disproved (\ x -> case x of {})- (%~) SCA SCG = Disproved (\ x -> case x of {})- (%~) SCA SCH = Disproved (\ x -> case x of {})- (%~) SCA SCI = Disproved (\ x -> case x of {})- (%~) SCA SCJ = Disproved (\ x -> case x of {})- (%~) SCA SCK = Disproved (\ x -> case x of {})- (%~) SCA SCL = Disproved (\ x -> case x of {})- (%~) SCA SCM = Disproved (\ x -> case x of {})- (%~) SCA SCN = Disproved (\ x -> case x of {})- (%~) SCA SCO = Disproved (\ x -> case x of {})- (%~) SCA SCP = Disproved (\ x -> case x of {})- (%~) SCA SCQ = Disproved (\ x -> case x of {})- (%~) SCA SCR = Disproved (\ x -> case x of {})- (%~) SCA SCS = Disproved (\ x -> case x of {})- (%~) SCA SCT = Disproved (\ x -> case x of {})- (%~) SCA SCU = Disproved (\ x -> case x of {})- (%~) SCA SCV = Disproved (\ x -> case x of {})- (%~) SCA SCW = Disproved (\ x -> case x of {})- (%~) SCA SCX = Disproved (\ x -> case x of {})- (%~) SCA SCY = Disproved (\ x -> case x of {})- (%~) SCA SCZ = Disproved (\ x -> case x of {})- (%~) SCB SCA = Disproved (\ x -> case x of {})- (%~) SCB SCB = Proved Refl- (%~) SCB SCC = Disproved (\ x -> case x of {})- (%~) SCB SCD = Disproved (\ x -> case x of {})- (%~) SCB SCE = Disproved (\ x -> case x of {})- (%~) SCB SCF = Disproved (\ x -> case x of {})- (%~) SCB SCG = Disproved (\ x -> case x of {})- (%~) SCB SCH = Disproved (\ x -> case x of {})- (%~) SCB SCI = Disproved (\ x -> case x of {})- (%~) SCB SCJ = Disproved (\ x -> case x of {})- (%~) SCB SCK = Disproved (\ x -> case x of {})- (%~) SCB SCL = Disproved (\ x -> case x of {})- (%~) SCB SCM = Disproved (\ x -> case x of {})- (%~) SCB SCN = Disproved (\ x -> case x of {})- (%~) SCB SCO = Disproved (\ x -> case x of {})- (%~) SCB SCP = Disproved (\ x -> case x of {})- (%~) SCB SCQ = Disproved (\ x -> case x of {})- (%~) SCB SCR = Disproved (\ x -> case x of {})- (%~) SCB SCS = Disproved (\ x -> case x of {})- (%~) SCB SCT = Disproved (\ x -> case x of {})- (%~) SCB SCU = Disproved (\ x -> case x of {})- (%~) SCB SCV = Disproved (\ x -> case x of {})- (%~) SCB SCW = Disproved (\ x -> case x of {})- (%~) SCB SCX = Disproved (\ x -> case x of {})- (%~) SCB SCY = Disproved (\ x -> case x of {})- (%~) SCB SCZ = Disproved (\ x -> case x of {})- (%~) SCC SCA = Disproved (\ x -> case x of {})- (%~) SCC SCB = Disproved (\ x -> case x of {})- (%~) SCC SCC = Proved Refl- (%~) SCC SCD = Disproved (\ x -> case x of {})- (%~) SCC SCE = Disproved (\ x -> case x of {})- (%~) SCC SCF = Disproved (\ x -> case x of {})- (%~) SCC SCG = Disproved (\ x -> case x of {})- (%~) SCC SCH = Disproved (\ x -> case x of {})- (%~) SCC SCI = Disproved (\ x -> case x of {})- (%~) SCC SCJ = Disproved (\ x -> case x of {})- (%~) SCC SCK = Disproved (\ x -> case x of {})- (%~) SCC SCL = Disproved (\ x -> case x of {})- (%~) SCC SCM = Disproved (\ x -> case x of {})- (%~) SCC SCN = Disproved (\ x -> case x of {})- (%~) SCC SCO = Disproved (\ x -> case x of {})- (%~) SCC SCP = Disproved (\ x -> case x of {})- (%~) SCC SCQ = Disproved (\ x -> case x of {})- (%~) SCC SCR = Disproved (\ x -> case x of {})- (%~) SCC SCS = Disproved (\ x -> case x of {})- (%~) SCC SCT = Disproved (\ x -> case x of {})- (%~) SCC SCU = Disproved (\ x -> case x of {})- (%~) SCC SCV = Disproved (\ x -> case x of {})- (%~) SCC SCW = Disproved (\ x -> case x of {})- (%~) SCC SCX = Disproved (\ x -> case x of {})- (%~) SCC SCY = Disproved (\ x -> case x of {})- (%~) SCC SCZ = Disproved (\ x -> case x of {})- (%~) SCD SCA = Disproved (\ x -> case x of {})- (%~) SCD SCB = Disproved (\ x -> case x of {})- (%~) SCD SCC = Disproved (\ x -> case x of {})- (%~) SCD SCD = Proved Refl- (%~) SCD SCE = Disproved (\ x -> case x of {})- (%~) SCD SCF = Disproved (\ x -> case x of {})- (%~) SCD SCG = Disproved (\ x -> case x of {})- (%~) SCD SCH = Disproved (\ x -> case x of {})- (%~) SCD SCI = Disproved (\ x -> case x of {})- (%~) SCD SCJ = Disproved (\ x -> case x of {})- (%~) SCD SCK = Disproved (\ x -> case x of {})- (%~) SCD SCL = Disproved (\ x -> case x of {})- (%~) SCD SCM = Disproved (\ x -> case x of {})- (%~) SCD SCN = Disproved (\ x -> case x of {})- (%~) SCD SCO = Disproved (\ x -> case x of {})- (%~) SCD SCP = Disproved (\ x -> case x of {})- (%~) SCD SCQ = Disproved (\ x -> case x of {})- (%~) SCD SCR = Disproved (\ x -> case x of {})- (%~) SCD SCS = Disproved (\ x -> case x of {})- (%~) SCD SCT = Disproved (\ x -> case x of {})- (%~) SCD SCU = Disproved (\ x -> case x of {})- (%~) SCD SCV = Disproved (\ x -> case x of {})- (%~) SCD SCW = Disproved (\ x -> case x of {})- (%~) SCD SCX = Disproved (\ x -> case x of {})- (%~) SCD SCY = Disproved (\ x -> case x of {})- (%~) SCD SCZ = Disproved (\ x -> case x of {})- (%~) SCE SCA = Disproved (\ x -> case x of {})- (%~) SCE SCB = Disproved (\ x -> case x of {})- (%~) SCE SCC = Disproved (\ x -> case x of {})- (%~) SCE SCD = Disproved (\ x -> case x of {})- (%~) SCE SCE = Proved Refl- (%~) SCE SCF = Disproved (\ x -> case x of {})- (%~) SCE SCG = Disproved (\ x -> case x of {})- (%~) SCE SCH = Disproved (\ x -> case x of {})- (%~) SCE SCI = Disproved (\ x -> case x of {})- (%~) SCE SCJ = Disproved (\ x -> case x of {})- (%~) SCE SCK = Disproved (\ x -> case x of {})- (%~) SCE SCL = Disproved (\ x -> case x of {})- (%~) SCE SCM = Disproved (\ x -> case x of {})- (%~) SCE SCN = Disproved (\ x -> case x of {})- (%~) SCE SCO = Disproved (\ x -> case x of {})- (%~) SCE SCP = Disproved (\ x -> case x of {})- (%~) SCE SCQ = Disproved (\ x -> case x of {})- (%~) SCE SCR = Disproved (\ x -> case x of {})- (%~) SCE SCS = Disproved (\ x -> case x of {})- (%~) SCE SCT = Disproved (\ x -> case x of {})- (%~) SCE SCU = Disproved (\ x -> case x of {})- (%~) SCE SCV = Disproved (\ x -> case x of {})- (%~) SCE SCW = Disproved (\ x -> case x of {})- (%~) SCE SCX = Disproved (\ x -> case x of {})- (%~) SCE SCY = Disproved (\ x -> case x of {})- (%~) SCE SCZ = Disproved (\ x -> case x of {})- (%~) SCF SCA = Disproved (\ x -> case x of {})- (%~) SCF SCB = Disproved (\ x -> case x of {})- (%~) SCF SCC = Disproved (\ x -> case x of {})- (%~) SCF SCD = Disproved (\ x -> case x of {})- (%~) SCF SCE = Disproved (\ x -> case x of {})- (%~) SCF SCF = Proved Refl- (%~) SCF SCG = Disproved (\ x -> case x of {})- (%~) SCF SCH = Disproved (\ x -> case x of {})- (%~) SCF SCI = Disproved (\ x -> case x of {})- (%~) SCF SCJ = Disproved (\ x -> case x of {})- (%~) SCF SCK = Disproved (\ x -> case x of {})- (%~) SCF SCL = Disproved (\ x -> case x of {})- (%~) SCF SCM = Disproved (\ x -> case x of {})- (%~) SCF SCN = Disproved (\ x -> case x of {})- (%~) SCF SCO = Disproved (\ x -> case x of {})- (%~) SCF SCP = Disproved (\ x -> case x of {})- (%~) SCF SCQ = Disproved (\ x -> case x of {})- (%~) SCF SCR = Disproved (\ x -> case x of {})- (%~) SCF SCS = Disproved (\ x -> case x of {})- (%~) SCF SCT = Disproved (\ x -> case x of {})- (%~) SCF SCU = Disproved (\ x -> case x of {})- (%~) SCF SCV = Disproved (\ x -> case x of {})- (%~) SCF SCW = Disproved (\ x -> case x of {})- (%~) SCF SCX = Disproved (\ x -> case x of {})- (%~) SCF SCY = Disproved (\ x -> case x of {})- (%~) SCF SCZ = Disproved (\ x -> case x of {})- (%~) SCG SCA = Disproved (\ x -> case x of {})- (%~) SCG SCB = Disproved (\ x -> case x of {})- (%~) SCG SCC = Disproved (\ x -> case x of {})- (%~) SCG SCD = Disproved (\ x -> case x of {})- (%~) SCG SCE = Disproved (\ x -> case x of {})- (%~) SCG SCF = Disproved (\ x -> case x of {})- (%~) SCG SCG = Proved Refl- (%~) SCG SCH = Disproved (\ x -> case x of {})- (%~) SCG SCI = Disproved (\ x -> case x of {})- (%~) SCG SCJ = Disproved (\ x -> case x of {})- (%~) SCG SCK = Disproved (\ x -> case x of {})- (%~) SCG SCL = Disproved (\ x -> case x of {})- (%~) SCG SCM = Disproved (\ x -> case x of {})- (%~) SCG SCN = Disproved (\ x -> case x of {})- (%~) SCG SCO = Disproved (\ x -> case x of {})- (%~) SCG SCP = Disproved (\ x -> case x of {})- (%~) SCG SCQ = Disproved (\ x -> case x of {})- (%~) SCG SCR = Disproved (\ x -> case x of {})- (%~) SCG SCS = Disproved (\ x -> case x of {})- (%~) SCG SCT = Disproved (\ x -> case x of {})- (%~) SCG SCU = Disproved (\ x -> case x of {})- (%~) SCG SCV = Disproved (\ x -> case x of {})- (%~) SCG SCW = Disproved (\ x -> case x of {})- (%~) SCG SCX = Disproved (\ x -> case x of {})- (%~) SCG SCY = Disproved (\ x -> case x of {})- (%~) SCG SCZ = Disproved (\ x -> case x of {})- (%~) SCH SCA = Disproved (\ x -> case x of {})- (%~) SCH SCB = Disproved (\ x -> case x of {})- (%~) SCH SCC = Disproved (\ x -> case x of {})- (%~) SCH SCD = Disproved (\ x -> case x of {})- (%~) SCH SCE = Disproved (\ x -> case x of {})- (%~) SCH SCF = Disproved (\ x -> case x of {})- (%~) SCH SCG = Disproved (\ x -> case x of {})- (%~) SCH SCH = Proved Refl- (%~) SCH SCI = Disproved (\ x -> case x of {})- (%~) SCH SCJ = Disproved (\ x -> case x of {})- (%~) SCH SCK = Disproved (\ x -> case x of {})- (%~) SCH SCL = Disproved (\ x -> case x of {})- (%~) SCH SCM = Disproved (\ x -> case x of {})- (%~) SCH SCN = Disproved (\ x -> case x of {})- (%~) SCH SCO = Disproved (\ x -> case x of {})- (%~) SCH SCP = Disproved (\ x -> case x of {})- (%~) SCH SCQ = Disproved (\ x -> case x of {})- (%~) SCH SCR = Disproved (\ x -> case x of {})- (%~) SCH SCS = Disproved (\ x -> case x of {})- (%~) SCH SCT = Disproved (\ x -> case x of {})- (%~) SCH SCU = Disproved (\ x -> case x of {})- (%~) SCH SCV = Disproved (\ x -> case x of {})- (%~) SCH SCW = Disproved (\ x -> case x of {})- (%~) SCH SCX = Disproved (\ x -> case x of {})- (%~) SCH SCY = Disproved (\ x -> case x of {})- (%~) SCH SCZ = Disproved (\ x -> case x of {})- (%~) SCI SCA = Disproved (\ x -> case x of {})- (%~) SCI SCB = Disproved (\ x -> case x of {})- (%~) SCI SCC = Disproved (\ x -> case x of {})- (%~) SCI SCD = Disproved (\ x -> case x of {})- (%~) SCI SCE = Disproved (\ x -> case x of {})- (%~) SCI SCF = Disproved (\ x -> case x of {})- (%~) SCI SCG = Disproved (\ x -> case x of {})- (%~) SCI SCH = Disproved (\ x -> case x of {})- (%~) SCI SCI = Proved Refl- (%~) SCI SCJ = Disproved (\ x -> case x of {})- (%~) SCI SCK = Disproved (\ x -> case x of {})- (%~) SCI SCL = Disproved (\ x -> case x of {})- (%~) SCI SCM = Disproved (\ x -> case x of {})- (%~) SCI SCN = Disproved (\ x -> case x of {})- (%~) SCI SCO = Disproved (\ x -> case x of {})- (%~) SCI SCP = Disproved (\ x -> case x of {})- (%~) SCI SCQ = Disproved (\ x -> case x of {})- (%~) SCI SCR = Disproved (\ x -> case x of {})- (%~) SCI SCS = Disproved (\ x -> case x of {})- (%~) SCI SCT = Disproved (\ x -> case x of {})- (%~) SCI SCU = Disproved (\ x -> case x of {})- (%~) SCI SCV = Disproved (\ x -> case x of {})- (%~) SCI SCW = Disproved (\ x -> case x of {})- (%~) SCI SCX = Disproved (\ x -> case x of {})- (%~) SCI SCY = Disproved (\ x -> case x of {})- (%~) SCI SCZ = Disproved (\ x -> case x of {})- (%~) SCJ SCA = Disproved (\ x -> case x of {})- (%~) SCJ SCB = Disproved (\ x -> case x of {})- (%~) SCJ SCC = Disproved (\ x -> case x of {})- (%~) SCJ SCD = Disproved (\ x -> case x of {})- (%~) SCJ SCE = Disproved (\ x -> case x of {})- (%~) SCJ SCF = Disproved (\ x -> case x of {})- (%~) SCJ SCG = Disproved (\ x -> case x of {})- (%~) SCJ SCH = Disproved (\ x -> case x of {})- (%~) SCJ SCI = Disproved (\ x -> case x of {})- (%~) SCJ SCJ = Proved Refl- (%~) SCJ SCK = Disproved (\ x -> case x of {})- (%~) SCJ SCL = Disproved (\ x -> case x of {})- (%~) SCJ SCM = Disproved (\ x -> case x of {})- (%~) SCJ SCN = Disproved (\ x -> case x of {})- (%~) SCJ SCO = Disproved (\ x -> case x of {})- (%~) SCJ SCP = Disproved (\ x -> case x of {})- (%~) SCJ SCQ = Disproved (\ x -> case x of {})- (%~) SCJ SCR = Disproved (\ x -> case x of {})- (%~) SCJ SCS = Disproved (\ x -> case x of {})- (%~) SCJ SCT = Disproved (\ x -> case x of {})- (%~) SCJ SCU = Disproved (\ x -> case x of {})- (%~) SCJ SCV = Disproved (\ x -> case x of {})- (%~) SCJ SCW = Disproved (\ x -> case x of {})- (%~) SCJ SCX = Disproved (\ x -> case x of {})- (%~) SCJ SCY = Disproved (\ x -> case x of {})- (%~) SCJ SCZ = Disproved (\ x -> case x of {})- (%~) SCK SCA = Disproved (\ x -> case x of {})- (%~) SCK SCB = Disproved (\ x -> case x of {})- (%~) SCK SCC = Disproved (\ x -> case x of {})- (%~) SCK SCD = Disproved (\ x -> case x of {})- (%~) SCK SCE = Disproved (\ x -> case x of {})- (%~) SCK SCF = Disproved (\ x -> case x of {})- (%~) SCK SCG = Disproved (\ x -> case x of {})- (%~) SCK SCH = Disproved (\ x -> case x of {})- (%~) SCK SCI = Disproved (\ x -> case x of {})- (%~) SCK SCJ = Disproved (\ x -> case x of {})- (%~) SCK SCK = Proved Refl- (%~) SCK SCL = Disproved (\ x -> case x of {})- (%~) SCK SCM = Disproved (\ x -> case x of {})- (%~) SCK SCN = Disproved (\ x -> case x of {})- (%~) SCK SCO = Disproved (\ x -> case x of {})- (%~) SCK SCP = Disproved (\ x -> case x of {})- (%~) SCK SCQ = Disproved (\ x -> case x of {})- (%~) SCK SCR = Disproved (\ x -> case x of {})- (%~) SCK SCS = Disproved (\ x -> case x of {})- (%~) SCK SCT = Disproved (\ x -> case x of {})- (%~) SCK SCU = Disproved (\ x -> case x of {})- (%~) SCK SCV = Disproved (\ x -> case x of {})- (%~) SCK SCW = Disproved (\ x -> case x of {})- (%~) SCK SCX = Disproved (\ x -> case x of {})- (%~) SCK SCY = Disproved (\ x -> case x of {})- (%~) SCK SCZ = Disproved (\ x -> case x of {})- (%~) SCL SCA = Disproved (\ x -> case x of {})- (%~) SCL SCB = Disproved (\ x -> case x of {})- (%~) SCL SCC = Disproved (\ x -> case x of {})- (%~) SCL SCD = Disproved (\ x -> case x of {})- (%~) SCL SCE = Disproved (\ x -> case x of {})- (%~) SCL SCF = Disproved (\ x -> case x of {})- (%~) SCL SCG = Disproved (\ x -> case x of {})- (%~) SCL SCH = Disproved (\ x -> case x of {})- (%~) SCL SCI = Disproved (\ x -> case x of {})- (%~) SCL SCJ = Disproved (\ x -> case x of {})- (%~) SCL SCK = Disproved (\ x -> case x of {})- (%~) SCL SCL = Proved Refl- (%~) SCL SCM = Disproved (\ x -> case x of {})- (%~) SCL SCN = Disproved (\ x -> case x of {})- (%~) SCL SCO = Disproved (\ x -> case x of {})- (%~) SCL SCP = Disproved (\ x -> case x of {})- (%~) SCL SCQ = Disproved (\ x -> case x of {})- (%~) SCL SCR = Disproved (\ x -> case x of {})- (%~) SCL SCS = Disproved (\ x -> case x of {})- (%~) SCL SCT = Disproved (\ x -> case x of {})- (%~) SCL SCU = Disproved (\ x -> case x of {})- (%~) SCL SCV = Disproved (\ x -> case x of {})- (%~) SCL SCW = Disproved (\ x -> case x of {})- (%~) SCL SCX = Disproved (\ x -> case x of {})- (%~) SCL SCY = Disproved (\ x -> case x of {})- (%~) SCL SCZ = Disproved (\ x -> case x of {})- (%~) SCM SCA = Disproved (\ x -> case x of {})- (%~) SCM SCB = Disproved (\ x -> case x of {})- (%~) SCM SCC = Disproved (\ x -> case x of {})- (%~) SCM SCD = Disproved (\ x -> case x of {})- (%~) SCM SCE = Disproved (\ x -> case x of {})- (%~) SCM SCF = Disproved (\ x -> case x of {})- (%~) SCM SCG = Disproved (\ x -> case x of {})- (%~) SCM SCH = Disproved (\ x -> case x of {})- (%~) SCM SCI = Disproved (\ x -> case x of {})- (%~) SCM SCJ = Disproved (\ x -> case x of {})- (%~) SCM SCK = Disproved (\ x -> case x of {})- (%~) SCM SCL = Disproved (\ x -> case x of {})- (%~) SCM SCM = Proved Refl- (%~) SCM SCN = Disproved (\ x -> case x of {})- (%~) SCM SCO = Disproved (\ x -> case x of {})- (%~) SCM SCP = Disproved (\ x -> case x of {})- (%~) SCM SCQ = Disproved (\ x -> case x of {})- (%~) SCM SCR = Disproved (\ x -> case x of {})- (%~) SCM SCS = Disproved (\ x -> case x of {})- (%~) SCM SCT = Disproved (\ x -> case x of {})- (%~) SCM SCU = Disproved (\ x -> case x of {})- (%~) SCM SCV = Disproved (\ x -> case x of {})- (%~) SCM SCW = Disproved (\ x -> case x of {})- (%~) SCM SCX = Disproved (\ x -> case x of {})- (%~) SCM SCY = Disproved (\ x -> case x of {})- (%~) SCM SCZ = Disproved (\ x -> case x of {})- (%~) SCN SCA = Disproved (\ x -> case x of {})- (%~) SCN SCB = Disproved (\ x -> case x of {})- (%~) SCN SCC = Disproved (\ x -> case x of {})- (%~) SCN SCD = Disproved (\ x -> case x of {})- (%~) SCN SCE = Disproved (\ x -> case x of {})- (%~) SCN SCF = Disproved (\ x -> case x of {})- (%~) SCN SCG = Disproved (\ x -> case x of {})- (%~) SCN SCH = Disproved (\ x -> case x of {})- (%~) SCN SCI = Disproved (\ x -> case x of {})- (%~) SCN SCJ = Disproved (\ x -> case x of {})- (%~) SCN SCK = Disproved (\ x -> case x of {})- (%~) SCN SCL = Disproved (\ x -> case x of {})- (%~) SCN SCM = Disproved (\ x -> case x of {})- (%~) SCN SCN = Proved Refl- (%~) SCN SCO = Disproved (\ x -> case x of {})- (%~) SCN SCP = Disproved (\ x -> case x of {})- (%~) SCN SCQ = Disproved (\ x -> case x of {})- (%~) SCN SCR = Disproved (\ x -> case x of {})- (%~) SCN SCS = Disproved (\ x -> case x of {})- (%~) SCN SCT = Disproved (\ x -> case x of {})- (%~) SCN SCU = Disproved (\ x -> case x of {})- (%~) SCN SCV = Disproved (\ x -> case x of {})- (%~) SCN SCW = Disproved (\ x -> case x of {})- (%~) SCN SCX = Disproved (\ x -> case x of {})- (%~) SCN SCY = Disproved (\ x -> case x of {})- (%~) SCN SCZ = Disproved (\ x -> case x of {})- (%~) SCO SCA = Disproved (\ x -> case x of {})- (%~) SCO SCB = Disproved (\ x -> case x of {})- (%~) SCO SCC = Disproved (\ x -> case x of {})- (%~) SCO SCD = Disproved (\ x -> case x of {})- (%~) SCO SCE = Disproved (\ x -> case x of {})- (%~) SCO SCF = Disproved (\ x -> case x of {})- (%~) SCO SCG = Disproved (\ x -> case x of {})- (%~) SCO SCH = Disproved (\ x -> case x of {})- (%~) SCO SCI = Disproved (\ x -> case x of {})- (%~) SCO SCJ = Disproved (\ x -> case x of {})- (%~) SCO SCK = Disproved (\ x -> case x of {})- (%~) SCO SCL = Disproved (\ x -> case x of {})- (%~) SCO SCM = Disproved (\ x -> case x of {})- (%~) SCO SCN = Disproved (\ x -> case x of {})- (%~) SCO SCO = Proved Refl- (%~) SCO SCP = Disproved (\ x -> case x of {})- (%~) SCO SCQ = Disproved (\ x -> case x of {})- (%~) SCO SCR = Disproved (\ x -> case x of {})- (%~) SCO SCS = Disproved (\ x -> case x of {})- (%~) SCO SCT = Disproved (\ x -> case x of {})- (%~) SCO SCU = Disproved (\ x -> case x of {})- (%~) SCO SCV = Disproved (\ x -> case x of {})- (%~) SCO SCW = Disproved (\ x -> case x of {})- (%~) SCO SCX = Disproved (\ x -> case x of {})- (%~) SCO SCY = Disproved (\ x -> case x of {})- (%~) SCO SCZ = Disproved (\ x -> case x of {})- (%~) SCP SCA = Disproved (\ x -> case x of {})- (%~) SCP SCB = Disproved (\ x -> case x of {})- (%~) SCP SCC = Disproved (\ x -> case x of {})- (%~) SCP SCD = Disproved (\ x -> case x of {})- (%~) SCP SCE = Disproved (\ x -> case x of {})- (%~) SCP SCF = Disproved (\ x -> case x of {})- (%~) SCP SCG = Disproved (\ x -> case x of {})- (%~) SCP SCH = Disproved (\ x -> case x of {})- (%~) SCP SCI = Disproved (\ x -> case x of {})- (%~) SCP SCJ = Disproved (\ x -> case x of {})- (%~) SCP SCK = Disproved (\ x -> case x of {})- (%~) SCP SCL = Disproved (\ x -> case x of {})- (%~) SCP SCM = Disproved (\ x -> case x of {})- (%~) SCP SCN = Disproved (\ x -> case x of {})- (%~) SCP SCO = Disproved (\ x -> case x of {})- (%~) SCP SCP = Proved Refl- (%~) SCP SCQ = Disproved (\ x -> case x of {})- (%~) SCP SCR = Disproved (\ x -> case x of {})- (%~) SCP SCS = Disproved (\ x -> case x of {})- (%~) SCP SCT = Disproved (\ x -> case x of {})- (%~) SCP SCU = Disproved (\ x -> case x of {})- (%~) SCP SCV = Disproved (\ x -> case x of {})- (%~) SCP SCW = Disproved (\ x -> case x of {})- (%~) SCP SCX = Disproved (\ x -> case x of {})- (%~) SCP SCY = Disproved (\ x -> case x of {})- (%~) SCP SCZ = Disproved (\ x -> case x of {})- (%~) SCQ SCA = Disproved (\ x -> case x of {})- (%~) SCQ SCB = Disproved (\ x -> case x of {})- (%~) SCQ SCC = Disproved (\ x -> case x of {})- (%~) SCQ SCD = Disproved (\ x -> case x of {})- (%~) SCQ SCE = Disproved (\ x -> case x of {})- (%~) SCQ SCF = Disproved (\ x -> case x of {})- (%~) SCQ SCG = Disproved (\ x -> case x of {})- (%~) SCQ SCH = Disproved (\ x -> case x of {})- (%~) SCQ SCI = Disproved (\ x -> case x of {})- (%~) SCQ SCJ = Disproved (\ x -> case x of {})- (%~) SCQ SCK = Disproved (\ x -> case x of {})- (%~) SCQ SCL = Disproved (\ x -> case x of {})- (%~) SCQ SCM = Disproved (\ x -> case x of {})- (%~) SCQ SCN = Disproved (\ x -> case x of {})- (%~) SCQ SCO = Disproved (\ x -> case x of {})- (%~) SCQ SCP = Disproved (\ x -> case x of {})- (%~) SCQ SCQ = Proved Refl- (%~) SCQ SCR = Disproved (\ x -> case x of {})- (%~) SCQ SCS = Disproved (\ x -> case x of {})- (%~) SCQ SCT = Disproved (\ x -> case x of {})- (%~) SCQ SCU = Disproved (\ x -> case x of {})- (%~) SCQ SCV = Disproved (\ x -> case x of {})- (%~) SCQ SCW = Disproved (\ x -> case x of {})- (%~) SCQ SCX = Disproved (\ x -> case x of {})- (%~) SCQ SCY = Disproved (\ x -> case x of {})- (%~) SCQ SCZ = Disproved (\ x -> case x of {})- (%~) SCR SCA = Disproved (\ x -> case x of {})- (%~) SCR SCB = Disproved (\ x -> case x of {})- (%~) SCR SCC = Disproved (\ x -> case x of {})- (%~) SCR SCD = Disproved (\ x -> case x of {})- (%~) SCR SCE = Disproved (\ x -> case x of {})- (%~) SCR SCF = Disproved (\ x -> case x of {})- (%~) SCR SCG = Disproved (\ x -> case x of {})- (%~) SCR SCH = Disproved (\ x -> case x of {})- (%~) SCR SCI = Disproved (\ x -> case x of {})- (%~) SCR SCJ = Disproved (\ x -> case x of {})- (%~) SCR SCK = Disproved (\ x -> case x of {})- (%~) SCR SCL = Disproved (\ x -> case x of {})- (%~) SCR SCM = Disproved (\ x -> case x of {})- (%~) SCR SCN = Disproved (\ x -> case x of {})- (%~) SCR SCO = Disproved (\ x -> case x of {})- (%~) SCR SCP = Disproved (\ x -> case x of {})- (%~) SCR SCQ = Disproved (\ x -> case x of {})- (%~) SCR SCR = Proved Refl- (%~) SCR SCS = Disproved (\ x -> case x of {})- (%~) SCR SCT = Disproved (\ x -> case x of {})- (%~) SCR SCU = Disproved (\ x -> case x of {})- (%~) SCR SCV = Disproved (\ x -> case x of {})- (%~) SCR SCW = Disproved (\ x -> case x of {})- (%~) SCR SCX = Disproved (\ x -> case x of {})- (%~) SCR SCY = Disproved (\ x -> case x of {})- (%~) SCR SCZ = Disproved (\ x -> case x of {})- (%~) SCS SCA = Disproved (\ x -> case x of {})- (%~) SCS SCB = Disproved (\ x -> case x of {})- (%~) SCS SCC = Disproved (\ x -> case x of {})- (%~) SCS SCD = Disproved (\ x -> case x of {})- (%~) SCS SCE = Disproved (\ x -> case x of {})- (%~) SCS SCF = Disproved (\ x -> case x of {})- (%~) SCS SCG = Disproved (\ x -> case x of {})- (%~) SCS SCH = Disproved (\ x -> case x of {})- (%~) SCS SCI = Disproved (\ x -> case x of {})- (%~) SCS SCJ = Disproved (\ x -> case x of {})- (%~) SCS SCK = Disproved (\ x -> case x of {})- (%~) SCS SCL = Disproved (\ x -> case x of {})- (%~) SCS SCM = Disproved (\ x -> case x of {})- (%~) SCS SCN = Disproved (\ x -> case x of {})- (%~) SCS SCO = Disproved (\ x -> case x of {})- (%~) SCS SCP = Disproved (\ x -> case x of {})- (%~) SCS SCQ = Disproved (\ x -> case x of {})- (%~) SCS SCR = Disproved (\ x -> case x of {})- (%~) SCS SCS = Proved Refl- (%~) SCS SCT = Disproved (\ x -> case x of {})- (%~) SCS SCU = Disproved (\ x -> case x of {})- (%~) SCS SCV = Disproved (\ x -> case x of {})- (%~) SCS SCW = Disproved (\ x -> case x of {})- (%~) SCS SCX = Disproved (\ x -> case x of {})- (%~) SCS SCY = Disproved (\ x -> case x of {})- (%~) SCS SCZ = Disproved (\ x -> case x of {})- (%~) SCT SCA = Disproved (\ x -> case x of {})- (%~) SCT SCB = Disproved (\ x -> case x of {})- (%~) SCT SCC = Disproved (\ x -> case x of {})- (%~) SCT SCD = Disproved (\ x -> case x of {})- (%~) SCT SCE = Disproved (\ x -> case x of {})- (%~) SCT SCF = Disproved (\ x -> case x of {})- (%~) SCT SCG = Disproved (\ x -> case x of {})- (%~) SCT SCH = Disproved (\ x -> case x of {})- (%~) SCT SCI = Disproved (\ x -> case x of {})- (%~) SCT SCJ = Disproved (\ x -> case x of {})- (%~) SCT SCK = Disproved (\ x -> case x of {})- (%~) SCT SCL = Disproved (\ x -> case x of {})- (%~) SCT SCM = Disproved (\ x -> case x of {})- (%~) SCT SCN = Disproved (\ x -> case x of {})- (%~) SCT SCO = Disproved (\ x -> case x of {})- (%~) SCT SCP = Disproved (\ x -> case x of {})- (%~) SCT SCQ = Disproved (\ x -> case x of {})- (%~) SCT SCR = Disproved (\ x -> case x of {})- (%~) SCT SCS = Disproved (\ x -> case x of {})- (%~) SCT SCT = Proved Refl- (%~) SCT SCU = Disproved (\ x -> case x of {})- (%~) SCT SCV = Disproved (\ x -> case x of {})- (%~) SCT SCW = Disproved (\ x -> case x of {})- (%~) SCT SCX = Disproved (\ x -> case x of {})- (%~) SCT SCY = Disproved (\ x -> case x of {})- (%~) SCT SCZ = Disproved (\ x -> case x of {})- (%~) SCU SCA = Disproved (\ x -> case x of {})- (%~) SCU SCB = Disproved (\ x -> case x of {})- (%~) SCU SCC = Disproved (\ x -> case x of {})- (%~) SCU SCD = Disproved (\ x -> case x of {})- (%~) SCU SCE = Disproved (\ x -> case x of {})- (%~) SCU SCF = Disproved (\ x -> case x of {})- (%~) SCU SCG = Disproved (\ x -> case x of {})- (%~) SCU SCH = Disproved (\ x -> case x of {})- (%~) SCU SCI = Disproved (\ x -> case x of {})- (%~) SCU SCJ = Disproved (\ x -> case x of {})- (%~) SCU SCK = Disproved (\ x -> case x of {})- (%~) SCU SCL = Disproved (\ x -> case x of {})- (%~) SCU SCM = Disproved (\ x -> case x of {})- (%~) SCU SCN = Disproved (\ x -> case x of {})- (%~) SCU SCO = Disproved (\ x -> case x of {})- (%~) SCU SCP = Disproved (\ x -> case x of {})- (%~) SCU SCQ = Disproved (\ x -> case x of {})- (%~) SCU SCR = Disproved (\ x -> case x of {})- (%~) SCU SCS = Disproved (\ x -> case x of {})- (%~) SCU SCT = Disproved (\ x -> case x of {})- (%~) SCU SCU = Proved Refl- (%~) SCU SCV = Disproved (\ x -> case x of {})- (%~) SCU SCW = Disproved (\ x -> case x of {})- (%~) SCU SCX = Disproved (\ x -> case x of {})- (%~) SCU SCY = Disproved (\ x -> case x of {})- (%~) SCU SCZ = Disproved (\ x -> case x of {})- (%~) SCV SCA = Disproved (\ x -> case x of {})- (%~) SCV SCB = Disproved (\ x -> case x of {})- (%~) SCV SCC = Disproved (\ x -> case x of {})- (%~) SCV SCD = Disproved (\ x -> case x of {})- (%~) SCV SCE = Disproved (\ x -> case x of {})- (%~) SCV SCF = Disproved (\ x -> case x of {})- (%~) SCV SCG = Disproved (\ x -> case x of {})- (%~) SCV SCH = Disproved (\ x -> case x of {})- (%~) SCV SCI = Disproved (\ x -> case x of {})- (%~) SCV SCJ = Disproved (\ x -> case x of {})- (%~) SCV SCK = Disproved (\ x -> case x of {})- (%~) SCV SCL = Disproved (\ x -> case x of {})- (%~) SCV SCM = Disproved (\ x -> case x of {})- (%~) SCV SCN = Disproved (\ x -> case x of {})- (%~) SCV SCO = Disproved (\ x -> case x of {})- (%~) SCV SCP = Disproved (\ x -> case x of {})- (%~) SCV SCQ = Disproved (\ x -> case x of {})- (%~) SCV SCR = Disproved (\ x -> case x of {})- (%~) SCV SCS = Disproved (\ x -> case x of {})- (%~) SCV SCT = Disproved (\ x -> case x of {})- (%~) SCV SCU = Disproved (\ x -> case x of {})- (%~) SCV SCV = Proved Refl- (%~) SCV SCW = Disproved (\ x -> case x of {})- (%~) SCV SCX = Disproved (\ x -> case x of {})- (%~) SCV SCY = Disproved (\ x -> case x of {})- (%~) SCV SCZ = Disproved (\ x -> case x of {})- (%~) SCW SCA = Disproved (\ x -> case x of {})- (%~) SCW SCB = Disproved (\ x -> case x of {})- (%~) SCW SCC = Disproved (\ x -> case x of {})- (%~) SCW SCD = Disproved (\ x -> case x of {})- (%~) SCW SCE = Disproved (\ x -> case x of {})- (%~) SCW SCF = Disproved (\ x -> case x of {})- (%~) SCW SCG = Disproved (\ x -> case x of {})- (%~) SCW SCH = Disproved (\ x -> case x of {})- (%~) SCW SCI = Disproved (\ x -> case x of {})- (%~) SCW SCJ = Disproved (\ x -> case x of {})- (%~) SCW SCK = Disproved (\ x -> case x of {})- (%~) SCW SCL = Disproved (\ x -> case x of {})- (%~) SCW SCM = Disproved (\ x -> case x of {})- (%~) SCW SCN = Disproved (\ x -> case x of {})- (%~) SCW SCO = Disproved (\ x -> case x of {})- (%~) SCW SCP = Disproved (\ x -> case x of {})- (%~) SCW SCQ = Disproved (\ x -> case x of {})- (%~) SCW SCR = Disproved (\ x -> case x of {})- (%~) SCW SCS = Disproved (\ x -> case x of {})- (%~) SCW SCT = Disproved (\ x -> case x of {})- (%~) SCW SCU = Disproved (\ x -> case x of {})- (%~) SCW SCV = Disproved (\ x -> case x of {})- (%~) SCW SCW = Proved Refl- (%~) SCW SCX = Disproved (\ x -> case x of {})- (%~) SCW SCY = Disproved (\ x -> case x of {})- (%~) SCW SCZ = Disproved (\ x -> case x of {})- (%~) SCX SCA = Disproved (\ x -> case x of {})- (%~) SCX SCB = Disproved (\ x -> case x of {})- (%~) SCX SCC = Disproved (\ x -> case x of {})- (%~) SCX SCD = Disproved (\ x -> case x of {})- (%~) SCX SCE = Disproved (\ x -> case x of {})- (%~) SCX SCF = Disproved (\ x -> case x of {})- (%~) SCX SCG = Disproved (\ x -> case x of {})- (%~) SCX SCH = Disproved (\ x -> case x of {})- (%~) SCX SCI = Disproved (\ x -> case x of {})- (%~) SCX SCJ = Disproved (\ x -> case x of {})- (%~) SCX SCK = Disproved (\ x -> case x of {})- (%~) SCX SCL = Disproved (\ x -> case x of {})- (%~) SCX SCM = Disproved (\ x -> case x of {})- (%~) SCX SCN = Disproved (\ x -> case x of {})- (%~) SCX SCO = Disproved (\ x -> case x of {})- (%~) SCX SCP = Disproved (\ x -> case x of {})- (%~) SCX SCQ = Disproved (\ x -> case x of {})- (%~) SCX SCR = Disproved (\ x -> case x of {})- (%~) SCX SCS = Disproved (\ x -> case x of {})- (%~) SCX SCT = Disproved (\ x -> case x of {})- (%~) SCX SCU = Disproved (\ x -> case x of {})- (%~) SCX SCV = Disproved (\ x -> case x of {})- (%~) SCX SCW = Disproved (\ x -> case x of {})- (%~) SCX SCX = Proved Refl- (%~) SCX SCY = Disproved (\ x -> case x of {})- (%~) SCX SCZ = Disproved (\ x -> case x of {})- (%~) SCY SCA = Disproved (\ x -> case x of {})- (%~) SCY SCB = Disproved (\ x -> case x of {})- (%~) SCY SCC = Disproved (\ x -> case x of {})- (%~) SCY SCD = Disproved (\ x -> case x of {})- (%~) SCY SCE = Disproved (\ x -> case x of {})- (%~) SCY SCF = Disproved (\ x -> case x of {})- (%~) SCY SCG = Disproved (\ x -> case x of {})- (%~) SCY SCH = Disproved (\ x -> case x of {})- (%~) SCY SCI = Disproved (\ x -> case x of {})- (%~) SCY SCJ = Disproved (\ x -> case x of {})- (%~) SCY SCK = Disproved (\ x -> case x of {})- (%~) SCY SCL = Disproved (\ x -> case x of {})- (%~) SCY SCM = Disproved (\ x -> case x of {})- (%~) SCY SCN = Disproved (\ x -> case x of {})- (%~) SCY SCO = Disproved (\ x -> case x of {})- (%~) SCY SCP = Disproved (\ x -> case x of {})- (%~) SCY SCQ = Disproved (\ x -> case x of {})- (%~) SCY SCR = Disproved (\ x -> case x of {})- (%~) SCY SCS = Disproved (\ x -> case x of {})- (%~) SCY SCT = Disproved (\ x -> case x of {})- (%~) SCY SCU = Disproved (\ x -> case x of {})- (%~) SCY SCV = Disproved (\ x -> case x of {})- (%~) SCY SCW = Disproved (\ x -> case x of {})- (%~) SCY SCX = Disproved (\ x -> case x of {})- (%~) SCY SCY = Proved Refl- (%~) SCY SCZ = Disproved (\ x -> case x of {})- (%~) SCZ SCA = Disproved (\ x -> case x of {})- (%~) SCZ SCB = Disproved (\ x -> case x of {})- (%~) SCZ SCC = Disproved (\ x -> case x of {})- (%~) SCZ SCD = Disproved (\ x -> case x of {})- (%~) SCZ SCE = Disproved (\ x -> case x of {})- (%~) SCZ SCF = Disproved (\ x -> case x of {})- (%~) SCZ SCG = Disproved (\ x -> case x of {})- (%~) SCZ SCH = Disproved (\ x -> case x of {})- (%~) SCZ SCI = Disproved (\ x -> case x of {})- (%~) SCZ SCJ = Disproved (\ x -> case x of {})- (%~) SCZ SCK = Disproved (\ x -> case x of {})- (%~) SCZ SCL = Disproved (\ x -> case x of {})- (%~) SCZ SCM = Disproved (\ x -> case x of {})- (%~) SCZ SCN = Disproved (\ x -> case x of {})- (%~) SCZ SCO = Disproved (\ x -> case x of {})- (%~) SCZ SCP = Disproved (\ x -> case x of {})- (%~) SCZ SCQ = Disproved (\ x -> case x of {})- (%~) SCZ SCR = Disproved (\ x -> case x of {})- (%~) SCZ SCS = Disproved (\ x -> case x of {})- (%~) SCZ SCT = Disproved (\ x -> case x of {})- (%~) SCZ SCU = Disproved (\ x -> case x of {})- (%~) SCZ SCV = Disproved (\ x -> case x of {})- (%~) SCZ SCW = Disproved (\ x -> case x of {})- (%~) SCZ SCX = Disproved (\ x -> case x of {})- (%~) SCZ SCY = Disproved (\ x -> case x of {})- (%~) SCZ SCZ = Proved Refl- instance Data.Type.Equality.TestEquality (SAChar :: AChar- -> Type) where- Data.Type.Equality.testEquality- = Data.Singletons.Decide.decideEquality- instance Data.Type.Coercion.TestCoercion (SAChar :: AChar- -> Type) where- Data.Type.Coercion.testCoercion- = Data.Singletons.Decide.decideCoercion- deriving instance (Data.Singletons.ShowSing.ShowSing U,- Data.Singletons.ShowSing.ShowSing Nat) =>- Show (SU (z :: U))- deriving instance Show (SAChar (z :: AChar))- instance SingI BOOL where- sing = SBOOL- instance SingI STRING where- sing = SSTRING- instance SingI NAT where- sing = SNAT- instance (SingI n, SingI n) =>- SingI (VEC (n :: U) (n :: Nat)) where- sing = (SVEC sing) sing- instance SingI n => SingI1 (VEC (n :: U)) where- liftSing = SVEC sing- instance SingI2 VEC where- liftSing2 = SVEC- instance SingI (VECSym0 :: (~>) U ((~>) Nat U)) where- sing = (singFun2 @VECSym0) SVEC- instance SingI d => SingI (VECSym1 (d :: U) :: (~>) Nat U) where- sing = (singFun1 @(VECSym1 (d :: U))) (SVEC (sing @d))- instance SingI1 (VECSym1 :: U -> (~>) Nat U) where- liftSing (s :: Sing (d :: U))- = (singFun1 @(VECSym1 (d :: U))) (SVEC s)- instance SingI CA where- sing = SCA- instance SingI CB where- sing = SCB- instance SingI CC where- sing = SCC- instance SingI CD where- sing = SCD- instance SingI CE where- sing = SCE- instance SingI CF where- sing = SCF- instance SingI CG where- sing = SCG- instance SingI CH where- sing = SCH- instance SingI CI where- sing = SCI- instance SingI CJ where- sing = SCJ- instance SingI CK where- sing = SCK- instance SingI CL where- sing = SCL- instance SingI CM where- sing = SCM- instance SingI CN where- sing = SCN- instance SingI CO where- sing = SCO- instance SingI CP where- sing = SCP- instance SingI CQ where- sing = SCQ- instance SingI CR where- sing = SCR- instance SingI CS where- sing = SCS- instance SingI CT where- sing = SCT- instance SingI CU where- sing = SCU- instance SingI CV where- sing = SCV- instance SingI CW where- sing = SCW- instance SingI CX where- sing = SCX- instance SingI CY where- sing = SCY- instance SingI CZ where- sing = SCZ- instance (SingI n, SingI n) =>- SingI (Attr (n :: [AChar]) (n :: U)) where- sing = (SAttr sing) sing- instance SingI n => SingI1 (Attr (n :: [AChar])) where- liftSing = SAttr sing- instance SingI2 Attr where- liftSing2 = SAttr- instance SingI (AttrSym0 :: (~>) [AChar] ((~>) U Attribute)) where- sing = (singFun2 @AttrSym0) SAttr- instance SingI d =>- SingI (AttrSym1 (d :: [AChar]) :: (~>) U Attribute) where- sing = (singFun1 @(AttrSym1 (d :: [AChar]))) (SAttr (sing @d))- instance SingI1 (AttrSym1 :: [AChar] -> (~>) U Attribute) where- liftSing (s :: Sing (d :: [AChar]))- = (singFun1 @(AttrSym1 (d :: [AChar]))) (SAttr s)- instance SingI n => SingI (Sch (n :: [Attribute])) where- sing = SSch sing- instance SingI1 Sch where- liftSing = SSch- instance SingI (SchSym0 :: (~>) [Attribute] Schema) where- sing = (singFun1 @SchSym0) SSch-GradingClient/Database.hs:0:0:: Splicing declarations- return [] ======>-GradingClient/Database.hs:(0,0)-(0,0): Splicing expression- cases ''Row [| r |] [| changeId (n ++ (getId r)) r |]- ======>- case r of- EmptyRow _ -> (changeId (((++) n) (getId r))) r- ConsRow _ _ -> (changeId (((++) n) (getId r))) r+GradingClient/Database.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| data Nat + = Zero | Succ Nat + deriving (Eq, Ord) |] + ======> + data Nat + = Zero | Succ Nat + deriving (Eq, Ord) + type ZeroSym0 :: Nat + type family ZeroSym0 :: Nat where + ZeroSym0 = Zero + type SuccSym0 :: (~>) Nat Nat + data SuccSym0 :: (~>) Nat Nat + where + SuccSym0KindInference :: SameKind (Apply SuccSym0 arg) (SuccSym1 arg) => + SuccSym0 a0123456789876543210 + type instance Apply SuccSym0 a0123456789876543210 = Succ a0123456789876543210 + instance SuppressUnusedWarnings SuccSym0 where + suppressUnusedWarnings = snd ((,) SuccSym0KindInference ()) + type SuccSym1 :: Nat -> Nat + type family SuccSym1 (a0123456789876543210 :: Nat) :: Nat where + SuccSym1 a0123456789876543210 = Succ a0123456789876543210 + type TFHelper_0123456789876543210 :: Nat -> Nat -> Bool + type family TFHelper_0123456789876543210 (a :: Nat) (a :: Nat) :: Bool where + TFHelper_0123456789876543210 Zero Zero = TrueSym0 + TFHelper_0123456789876543210 Zero (Succ _) = FalseSym0 + TFHelper_0123456789876543210 (Succ _) Zero = FalseSym0 + TFHelper_0123456789876543210 (Succ a_0123456789876543210) (Succ b_0123456789876543210) = Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210 + type TFHelper_0123456789876543210Sym0 :: (~>) Nat ((~>) Nat Bool) + data TFHelper_0123456789876543210Sym0 :: (~>) Nat ((~>) Nat Bool) + where + TFHelper_0123456789876543210Sym0KindInference :: SameKind (Apply TFHelper_0123456789876543210Sym0 arg) (TFHelper_0123456789876543210Sym1 arg) => + TFHelper_0123456789876543210Sym0 a0123456789876543210 + type instance Apply TFHelper_0123456789876543210Sym0 a0123456789876543210 = TFHelper_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings TFHelper_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) TFHelper_0123456789876543210Sym0KindInference ()) + type TFHelper_0123456789876543210Sym1 :: Nat -> (~>) Nat Bool + data TFHelper_0123456789876543210Sym1 (a0123456789876543210 :: Nat) :: (~>) Nat Bool + where + TFHelper_0123456789876543210Sym1KindInference :: SameKind (Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) arg) (TFHelper_0123456789876543210Sym2 a0123456789876543210 arg) => + TFHelper_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (TFHelper_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) TFHelper_0123456789876543210Sym1KindInference ()) + type TFHelper_0123456789876543210Sym2 :: Nat -> Nat -> Bool + type family TFHelper_0123456789876543210Sym2 (a0123456789876543210 :: Nat) (a0123456789876543210 :: Nat) :: Bool where + TFHelper_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PEq Nat where + type (==) a a = Apply (Apply TFHelper_0123456789876543210Sym0 a) a + type Compare_0123456789876543210 :: Nat -> Nat -> Ordering + type family Compare_0123456789876543210 (a :: Nat) (a :: Nat) :: Ordering where + Compare_0123456789876543210 Zero Zero = Apply (Apply (Apply FoldlSym0 (<>@#@$)) EQSym0) NilSym0 + Compare_0123456789876543210 (Succ a_0123456789876543210) (Succ b_0123456789876543210) = Apply (Apply (Apply FoldlSym0 (<>@#@$)) EQSym0) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) NilSym0) + Compare_0123456789876543210 Zero (Succ _) = LTSym0 + Compare_0123456789876543210 (Succ _) Zero = GTSym0 + type Compare_0123456789876543210Sym0 :: (~>) Nat ((~>) Nat Ordering) + data Compare_0123456789876543210Sym0 :: (~>) Nat ((~>) Nat Ordering) + where + Compare_0123456789876543210Sym0KindInference :: SameKind (Apply Compare_0123456789876543210Sym0 arg) (Compare_0123456789876543210Sym1 arg) => + Compare_0123456789876543210Sym0 a0123456789876543210 + type instance Apply Compare_0123456789876543210Sym0 a0123456789876543210 = Compare_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Compare_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Compare_0123456789876543210Sym0KindInference ()) + type Compare_0123456789876543210Sym1 :: Nat -> (~>) Nat Ordering + data Compare_0123456789876543210Sym1 (a0123456789876543210 :: Nat) :: (~>) Nat Ordering + where + Compare_0123456789876543210Sym1KindInference :: SameKind (Apply (Compare_0123456789876543210Sym1 a0123456789876543210) arg) (Compare_0123456789876543210Sym2 a0123456789876543210 arg) => + Compare_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (Compare_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Compare_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Compare_0123456789876543210Sym1KindInference ()) + type Compare_0123456789876543210Sym2 :: Nat -> Nat -> Ordering + type family Compare_0123456789876543210Sym2 (a0123456789876543210 :: Nat) (a0123456789876543210 :: Nat) :: Ordering where + Compare_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance POrd Nat where + type Compare a a = Apply (Apply Compare_0123456789876543210Sym0 a) a + data SNat :: Nat -> Type + where + SZero :: SNat (Zero :: Nat) + SSucc :: forall (n :: Nat). (Sing n) -> SNat (Succ n :: Nat) + type instance Sing @Nat = SNat + instance SingKind Nat where + type Demote Nat = Nat + fromSing SZero = Zero + fromSing (SSucc b) = Succ (fromSing b) + toSing Zero = SomeSing SZero + toSing (Succ (b :: Demote Nat)) + = case toSing b :: SomeSing Nat of SomeSing c -> SomeSing (SSucc c) + instance SEq Nat => SEq Nat where + (%==) :: + forall (t1 :: Nat) (t2 :: Nat). Sing t1 + -> Sing t2 + -> Sing (Apply (Apply ((==@#@$) :: TyFun Nat ((~>) Nat Bool) + -> Type) t1) t2) + (%==) SZero SZero = STrue + (%==) SZero (SSucc _) = SFalse + (%==) (SSucc _) SZero = SFalse + (%==) + (SSucc (sA_0123456789876543210 :: Sing a_0123456789876543210)) + (SSucc (sB_0123456789876543210 :: Sing b_0123456789876543210)) + = applySing + (applySing (singFun2 @(==@#@$) (%==)) sA_0123456789876543210) + sB_0123456789876543210 + instance SOrd Nat => SOrd Nat where + sCompare :: + forall (t1 :: Nat) (t2 :: Nat). Sing t1 + -> Sing t2 + -> Sing (Apply (Apply (CompareSym0 :: TyFun Nat ((~>) Nat Ordering) + -> Type) t1) t2) + sCompare SZero SZero + = applySing + (applySing + (applySing (singFun3 @FoldlSym0 sFoldl) (singFun2 @(<>@#@$) (%<>))) + SEQ) + SNil + sCompare + (SSucc (sA_0123456789876543210 :: Sing a_0123456789876543210)) + (SSucc (sB_0123456789876543210 :: Sing b_0123456789876543210)) + = applySing + (applySing + (applySing (singFun3 @FoldlSym0 sFoldl) (singFun2 @(<>@#@$) (%<>))) + SEQ) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing + (applySing (singFun2 @CompareSym0 sCompare) sA_0123456789876543210) + sB_0123456789876543210)) + SNil) + sCompare SZero (SSucc _) = SLT + sCompare (SSucc _) SZero = SGT + instance SDecide Nat => SDecide Nat where + (%~) SZero SZero = Proved Refl + (%~) SZero (SSucc _) = Disproved (\ x -> case x of {}) + (%~) (SSucc _) SZero = Disproved (\ x -> case x of {}) + (%~) (SSucc a) (SSucc b) + = case (%~) a b of + Proved Refl -> Proved Refl + Disproved contra + -> Disproved (\ refl -> case refl of Refl -> contra Refl) + instance SDecide Nat => + Data.Type.Equality.TestEquality (SNat :: Nat -> Type) where + Data.Type.Equality.testEquality + = Data.Singletons.Decide.decideEquality + instance SDecide Nat => + Data.Type.Coercion.TestCoercion (SNat :: Nat -> Type) where + Data.Type.Coercion.testCoercion + = Data.Singletons.Decide.decideCoercion + instance SingI Zero where + sing = SZero + instance SingI n => SingI (Succ (n :: Nat)) where + sing = SSucc sing + instance SingI1 Succ where + liftSing = SSucc + instance SingI (SuccSym0 :: (~>) Nat Nat) where + sing = singFun1 @SuccSym0 SSucc +GradingClient/Database.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| append :: Schema -> Schema -> Schema + append (Sch s1) (Sch s2) = Sch (s1 ++ s2) + attrNotIn :: Attribute -> Schema -> Bool + attrNotIn _ (Sch []) = True + attrNotIn (Attr name u) (Sch ((Attr name' _) : t)) + = (name /= name') && (attrNotIn (Attr name u) (Sch t)) + disjoint :: Schema -> Schema -> Bool + disjoint (Sch []) _ = True + disjoint (Sch (h : t)) s = (attrNotIn h s) && (disjoint (Sch t) s) + occurs :: [AChar] -> Schema -> Bool + occurs _ (Sch []) = False + occurs name (Sch ((Attr name' _) : attrs)) + = name == name' || occurs name (Sch attrs) + lookup :: [AChar] -> Schema -> U + lookup _ (Sch []) = undefined + lookup name (Sch ((Attr name' u) : attrs)) + = if name == name' then u else lookup name (Sch attrs) + + data U + = BOOL | STRING | NAT | VEC U Nat + deriving (Read, Eq, Show) + data AChar + = CA | + CB | + CC | + CD | + CE | + CF | + CG | + CH | + CI | + CJ | + CK | + CL | + CM | + CN | + CO | + CP | + CQ | + CR | + CS | + CT | + CU | + CV | + CW | + CX | + CY | + CZ + deriving (Read, Show, Eq) + data Attribute = Attr [AChar] U + data Schema = Sch [Attribute] |] + ======> + data U + = BOOL | STRING | NAT | VEC U Nat + deriving (Read, Eq, Show) + data AChar + = CA | + CB | + CC | + CD | + CE | + CF | + CG | + CH | + CI | + CJ | + CK | + CL | + CM | + CN | + CO | + CP | + CQ | + CR | + CS | + CT | + CU | + CV | + CW | + CX | + CY | + CZ + deriving (Read, Show, Eq) + data Attribute = Attr [AChar] U + data Schema = Sch [Attribute] + append :: Schema -> Schema -> Schema + append (Sch s1) (Sch s2) = Sch (s1 ++ s2) + attrNotIn :: Attribute -> Schema -> Bool + attrNotIn _ (Sch []) = True + attrNotIn (Attr name u) (Sch (Attr name' _ : t)) + = ((name /= name') && attrNotIn (Attr name u) (Sch t)) + disjoint :: Schema -> Schema -> Bool + disjoint (Sch []) _ = True + disjoint (Sch (h : t)) s = (attrNotIn h s && disjoint (Sch t) s) + occurs :: [AChar] -> Schema -> Bool + occurs _ (Sch []) = False + occurs name (Sch (Attr name' _ : attrs)) + = ((name == name') || occurs name (Sch attrs)) + lookup :: [AChar] -> Schema -> U + lookup _ (Sch []) = undefined + lookup name (Sch (Attr name' u : attrs)) + = if (name == name') then u else lookup name (Sch attrs) + type BOOLSym0 :: U + type family BOOLSym0 :: U where + BOOLSym0 = BOOL + type STRINGSym0 :: U + type family STRINGSym0 :: U where + STRINGSym0 = STRING + type NATSym0 :: U + type family NATSym0 :: U where + NATSym0 = NAT + type VECSym0 :: (~>) U ((~>) Nat U) + data VECSym0 :: (~>) U ((~>) Nat U) + where + VECSym0KindInference :: SameKind (Apply VECSym0 arg) (VECSym1 arg) => + VECSym0 a0123456789876543210 + type instance Apply VECSym0 a0123456789876543210 = VECSym1 a0123456789876543210 + instance SuppressUnusedWarnings VECSym0 where + suppressUnusedWarnings = snd ((,) VECSym0KindInference ()) + type VECSym1 :: U -> (~>) Nat U + data VECSym1 (a0123456789876543210 :: U) :: (~>) Nat U + where + VECSym1KindInference :: SameKind (Apply (VECSym1 a0123456789876543210) arg) (VECSym2 a0123456789876543210 arg) => + VECSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (VECSym1 a0123456789876543210) a0123456789876543210 = VEC a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (VECSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) VECSym1KindInference ()) + type VECSym2 :: U -> Nat -> U + type family VECSym2 (a0123456789876543210 :: U) (a0123456789876543210 :: Nat) :: U where + VECSym2 a0123456789876543210 a0123456789876543210 = VEC a0123456789876543210 a0123456789876543210 + type CASym0 :: AChar + type family CASym0 :: AChar where + CASym0 = CA + type CBSym0 :: AChar + type family CBSym0 :: AChar where + CBSym0 = CB + type CCSym0 :: AChar + type family CCSym0 :: AChar where + CCSym0 = CC + type CDSym0 :: AChar + type family CDSym0 :: AChar where + CDSym0 = CD + type CESym0 :: AChar + type family CESym0 :: AChar where + CESym0 = CE + type CFSym0 :: AChar + type family CFSym0 :: AChar where + CFSym0 = CF + type CGSym0 :: AChar + type family CGSym0 :: AChar where + CGSym0 = CG + type CHSym0 :: AChar + type family CHSym0 :: AChar where + CHSym0 = CH + type CISym0 :: AChar + type family CISym0 :: AChar where + CISym0 = CI + type CJSym0 :: AChar + type family CJSym0 :: AChar where + CJSym0 = CJ + type CKSym0 :: AChar + type family CKSym0 :: AChar where + CKSym0 = CK + type CLSym0 :: AChar + type family CLSym0 :: AChar where + CLSym0 = CL + type CMSym0 :: AChar + type family CMSym0 :: AChar where + CMSym0 = CM + type CNSym0 :: AChar + type family CNSym0 :: AChar where + CNSym0 = CN + type COSym0 :: AChar + type family COSym0 :: AChar where + COSym0 = CO + type CPSym0 :: AChar + type family CPSym0 :: AChar where + CPSym0 = CP + type CQSym0 :: AChar + type family CQSym0 :: AChar where + CQSym0 = CQ + type CRSym0 :: AChar + type family CRSym0 :: AChar where + CRSym0 = CR + type CSSym0 :: AChar + type family CSSym0 :: AChar where + CSSym0 = CS + type CTSym0 :: AChar + type family CTSym0 :: AChar where + CTSym0 = CT + type CUSym0 :: AChar + type family CUSym0 :: AChar where + CUSym0 = CU + type CVSym0 :: AChar + type family CVSym0 :: AChar where + CVSym0 = CV + type CWSym0 :: AChar + type family CWSym0 :: AChar where + CWSym0 = CW + type CXSym0 :: AChar + type family CXSym0 :: AChar where + CXSym0 = CX + type CYSym0 :: AChar + type family CYSym0 :: AChar where + CYSym0 = CY + type CZSym0 :: AChar + type family CZSym0 :: AChar where + CZSym0 = CZ + type AttrSym0 :: (~>) [AChar] ((~>) U Attribute) + data AttrSym0 :: (~>) [AChar] ((~>) U Attribute) + where + AttrSym0KindInference :: SameKind (Apply AttrSym0 arg) (AttrSym1 arg) => + AttrSym0 a0123456789876543210 + type instance Apply AttrSym0 a0123456789876543210 = AttrSym1 a0123456789876543210 + instance SuppressUnusedWarnings AttrSym0 where + suppressUnusedWarnings = snd ((,) AttrSym0KindInference ()) + type AttrSym1 :: [AChar] -> (~>) U Attribute + data AttrSym1 (a0123456789876543210 :: [AChar]) :: (~>) U Attribute + where + AttrSym1KindInference :: SameKind (Apply (AttrSym1 a0123456789876543210) arg) (AttrSym2 a0123456789876543210 arg) => + AttrSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (AttrSym1 a0123456789876543210) a0123456789876543210 = Attr a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (AttrSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) AttrSym1KindInference ()) + type AttrSym2 :: [AChar] -> U -> Attribute + type family AttrSym2 (a0123456789876543210 :: [AChar]) (a0123456789876543210 :: U) :: Attribute where + AttrSym2 a0123456789876543210 a0123456789876543210 = Attr a0123456789876543210 a0123456789876543210 + type SchSym0 :: (~>) [Attribute] Schema + data SchSym0 :: (~>) [Attribute] Schema + where + SchSym0KindInference :: SameKind (Apply SchSym0 arg) (SchSym1 arg) => + SchSym0 a0123456789876543210 + type instance Apply SchSym0 a0123456789876543210 = Sch a0123456789876543210 + instance SuppressUnusedWarnings SchSym0 where + suppressUnusedWarnings = snd ((,) SchSym0KindInference ()) + type SchSym1 :: [Attribute] -> Schema + type family SchSym1 (a0123456789876543210 :: [Attribute]) :: Schema where + SchSym1 a0123456789876543210 = Sch a0123456789876543210 + data Let0123456789876543210Scrutinee_0123456789876543210Sym0 name0123456789876543210 + where + Let0123456789876543210Scrutinee_0123456789876543210Sym0KindInference :: SameKind (Apply Let0123456789876543210Scrutinee_0123456789876543210Sym0 arg) (Let0123456789876543210Scrutinee_0123456789876543210Sym1 arg) => + Let0123456789876543210Scrutinee_0123456789876543210Sym0 name0123456789876543210 + type instance Apply Let0123456789876543210Scrutinee_0123456789876543210Sym0 name0123456789876543210 = Let0123456789876543210Scrutinee_0123456789876543210Sym1 name0123456789876543210 + instance SuppressUnusedWarnings Let0123456789876543210Scrutinee_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd + ((,) + Let0123456789876543210Scrutinee_0123456789876543210Sym0KindInference + ()) + data Let0123456789876543210Scrutinee_0123456789876543210Sym1 name0123456789876543210 name'0123456789876543210 + where + Let0123456789876543210Scrutinee_0123456789876543210Sym1KindInference :: SameKind (Apply (Let0123456789876543210Scrutinee_0123456789876543210Sym1 name0123456789876543210) arg) (Let0123456789876543210Scrutinee_0123456789876543210Sym2 name0123456789876543210 arg) => + Let0123456789876543210Scrutinee_0123456789876543210Sym1 name0123456789876543210 name'0123456789876543210 + type instance Apply (Let0123456789876543210Scrutinee_0123456789876543210Sym1 name0123456789876543210) name'0123456789876543210 = Let0123456789876543210Scrutinee_0123456789876543210Sym2 name0123456789876543210 name'0123456789876543210 + instance SuppressUnusedWarnings (Let0123456789876543210Scrutinee_0123456789876543210Sym1 name0123456789876543210) where + suppressUnusedWarnings + = snd + ((,) + Let0123456789876543210Scrutinee_0123456789876543210Sym1KindInference + ()) + data Let0123456789876543210Scrutinee_0123456789876543210Sym2 name0123456789876543210 name'0123456789876543210 u0123456789876543210 + where + Let0123456789876543210Scrutinee_0123456789876543210Sym2KindInference :: SameKind (Apply (Let0123456789876543210Scrutinee_0123456789876543210Sym2 name0123456789876543210 name'0123456789876543210) arg) (Let0123456789876543210Scrutinee_0123456789876543210Sym3 name0123456789876543210 name'0123456789876543210 arg) => + Let0123456789876543210Scrutinee_0123456789876543210Sym2 name0123456789876543210 name'0123456789876543210 u0123456789876543210 + type instance Apply (Let0123456789876543210Scrutinee_0123456789876543210Sym2 name0123456789876543210 name'0123456789876543210) u0123456789876543210 = Let0123456789876543210Scrutinee_0123456789876543210Sym3 name0123456789876543210 name'0123456789876543210 u0123456789876543210 + instance SuppressUnusedWarnings (Let0123456789876543210Scrutinee_0123456789876543210Sym2 name0123456789876543210 name'0123456789876543210) where + suppressUnusedWarnings + = snd + ((,) + Let0123456789876543210Scrutinee_0123456789876543210Sym2KindInference + ()) + data Let0123456789876543210Scrutinee_0123456789876543210Sym3 name0123456789876543210 name'0123456789876543210 u0123456789876543210 attrs0123456789876543210 + where + Let0123456789876543210Scrutinee_0123456789876543210Sym3KindInference :: SameKind (Apply (Let0123456789876543210Scrutinee_0123456789876543210Sym3 name0123456789876543210 name'0123456789876543210 u0123456789876543210) arg) (Let0123456789876543210Scrutinee_0123456789876543210Sym4 name0123456789876543210 name'0123456789876543210 u0123456789876543210 arg) => + Let0123456789876543210Scrutinee_0123456789876543210Sym3 name0123456789876543210 name'0123456789876543210 u0123456789876543210 attrs0123456789876543210 + type instance Apply (Let0123456789876543210Scrutinee_0123456789876543210Sym3 name0123456789876543210 name'0123456789876543210 u0123456789876543210) attrs0123456789876543210 = Let0123456789876543210Scrutinee_0123456789876543210 name0123456789876543210 name'0123456789876543210 u0123456789876543210 attrs0123456789876543210 + instance SuppressUnusedWarnings (Let0123456789876543210Scrutinee_0123456789876543210Sym3 name0123456789876543210 name'0123456789876543210 u0123456789876543210) where + suppressUnusedWarnings + = snd + ((,) + Let0123456789876543210Scrutinee_0123456789876543210Sym3KindInference + ()) + type family Let0123456789876543210Scrutinee_0123456789876543210Sym4 name0123456789876543210 name'0123456789876543210 u0123456789876543210 attrs0123456789876543210 where + Let0123456789876543210Scrutinee_0123456789876543210Sym4 name0123456789876543210 name'0123456789876543210 u0123456789876543210 attrs0123456789876543210 = Let0123456789876543210Scrutinee_0123456789876543210 name0123456789876543210 name'0123456789876543210 u0123456789876543210 attrs0123456789876543210 + type family Let0123456789876543210Scrutinee_0123456789876543210 name name' u attrs where + Let0123456789876543210Scrutinee_0123456789876543210 name name' u attrs = Apply (Apply (==@#@$) name) name' + type family Case_0123456789876543210 name name' u attrs t where + Case_0123456789876543210 name name' u attrs 'True = u + Case_0123456789876543210 name name' u attrs 'False = Apply (Apply LookupSym0 name) (Apply SchSym0 attrs) + type LookupSym0 :: (~>) [AChar] ((~>) Schema U) + data LookupSym0 :: (~>) [AChar] ((~>) Schema U) + where + LookupSym0KindInference :: SameKind (Apply LookupSym0 arg) (LookupSym1 arg) => + LookupSym0 a0123456789876543210 + type instance Apply LookupSym0 a0123456789876543210 = LookupSym1 a0123456789876543210 + instance SuppressUnusedWarnings LookupSym0 where + suppressUnusedWarnings = snd ((,) LookupSym0KindInference ()) + type LookupSym1 :: [AChar] -> (~>) Schema U + data LookupSym1 (a0123456789876543210 :: [AChar]) :: (~>) Schema U + where + LookupSym1KindInference :: SameKind (Apply (LookupSym1 a0123456789876543210) arg) (LookupSym2 a0123456789876543210 arg) => + LookupSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (LookupSym1 a0123456789876543210) a0123456789876543210 = Lookup a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (LookupSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) LookupSym1KindInference ()) + type LookupSym2 :: [AChar] -> Schema -> U + type family LookupSym2 (a0123456789876543210 :: [AChar]) (a0123456789876543210 :: Schema) :: U where + LookupSym2 a0123456789876543210 a0123456789876543210 = Lookup a0123456789876543210 a0123456789876543210 + type OccursSym0 :: (~>) [AChar] ((~>) Schema Bool) + data OccursSym0 :: (~>) [AChar] ((~>) Schema Bool) + where + OccursSym0KindInference :: SameKind (Apply OccursSym0 arg) (OccursSym1 arg) => + OccursSym0 a0123456789876543210 + type instance Apply OccursSym0 a0123456789876543210 = OccursSym1 a0123456789876543210 + instance SuppressUnusedWarnings OccursSym0 where + suppressUnusedWarnings = snd ((,) OccursSym0KindInference ()) + type OccursSym1 :: [AChar] -> (~>) Schema Bool + data OccursSym1 (a0123456789876543210 :: [AChar]) :: (~>) Schema Bool + where + OccursSym1KindInference :: SameKind (Apply (OccursSym1 a0123456789876543210) arg) (OccursSym2 a0123456789876543210 arg) => + OccursSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (OccursSym1 a0123456789876543210) a0123456789876543210 = Occurs a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (OccursSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) OccursSym1KindInference ()) + type OccursSym2 :: [AChar] -> Schema -> Bool + type family OccursSym2 (a0123456789876543210 :: [AChar]) (a0123456789876543210 :: Schema) :: Bool where + OccursSym2 a0123456789876543210 a0123456789876543210 = Occurs a0123456789876543210 a0123456789876543210 + type DisjointSym0 :: (~>) Schema ((~>) Schema Bool) + data DisjointSym0 :: (~>) Schema ((~>) Schema Bool) + where + DisjointSym0KindInference :: SameKind (Apply DisjointSym0 arg) (DisjointSym1 arg) => + DisjointSym0 a0123456789876543210 + type instance Apply DisjointSym0 a0123456789876543210 = DisjointSym1 a0123456789876543210 + instance SuppressUnusedWarnings DisjointSym0 where + suppressUnusedWarnings = snd ((,) DisjointSym0KindInference ()) + type DisjointSym1 :: Schema -> (~>) Schema Bool + data DisjointSym1 (a0123456789876543210 :: Schema) :: (~>) Schema Bool + where + DisjointSym1KindInference :: SameKind (Apply (DisjointSym1 a0123456789876543210) arg) (DisjointSym2 a0123456789876543210 arg) => + DisjointSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (DisjointSym1 a0123456789876543210) a0123456789876543210 = Disjoint a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (DisjointSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) DisjointSym1KindInference ()) + type DisjointSym2 :: Schema -> Schema -> Bool + type family DisjointSym2 (a0123456789876543210 :: Schema) (a0123456789876543210 :: Schema) :: Bool where + DisjointSym2 a0123456789876543210 a0123456789876543210 = Disjoint a0123456789876543210 a0123456789876543210 + type AttrNotInSym0 :: (~>) Attribute ((~>) Schema Bool) + data AttrNotInSym0 :: (~>) Attribute ((~>) Schema Bool) + where + AttrNotInSym0KindInference :: SameKind (Apply AttrNotInSym0 arg) (AttrNotInSym1 arg) => + AttrNotInSym0 a0123456789876543210 + type instance Apply AttrNotInSym0 a0123456789876543210 = AttrNotInSym1 a0123456789876543210 + instance SuppressUnusedWarnings AttrNotInSym0 where + suppressUnusedWarnings = snd ((,) AttrNotInSym0KindInference ()) + type AttrNotInSym1 :: Attribute -> (~>) Schema Bool + data AttrNotInSym1 (a0123456789876543210 :: Attribute) :: (~>) Schema Bool + where + AttrNotInSym1KindInference :: SameKind (Apply (AttrNotInSym1 a0123456789876543210) arg) (AttrNotInSym2 a0123456789876543210 arg) => + AttrNotInSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (AttrNotInSym1 a0123456789876543210) a0123456789876543210 = AttrNotIn a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (AttrNotInSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) AttrNotInSym1KindInference ()) + type AttrNotInSym2 :: Attribute -> Schema -> Bool + type family AttrNotInSym2 (a0123456789876543210 :: Attribute) (a0123456789876543210 :: Schema) :: Bool where + AttrNotInSym2 a0123456789876543210 a0123456789876543210 = AttrNotIn a0123456789876543210 a0123456789876543210 + type AppendSym0 :: (~>) Schema ((~>) Schema Schema) + data AppendSym0 :: (~>) Schema ((~>) Schema Schema) + where + AppendSym0KindInference :: SameKind (Apply AppendSym0 arg) (AppendSym1 arg) => + AppendSym0 a0123456789876543210 + type instance Apply AppendSym0 a0123456789876543210 = AppendSym1 a0123456789876543210 + instance SuppressUnusedWarnings AppendSym0 where + suppressUnusedWarnings = snd ((,) AppendSym0KindInference ()) + type AppendSym1 :: Schema -> (~>) Schema Schema + data AppendSym1 (a0123456789876543210 :: Schema) :: (~>) Schema Schema + where + AppendSym1KindInference :: SameKind (Apply (AppendSym1 a0123456789876543210) arg) (AppendSym2 a0123456789876543210 arg) => + AppendSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (AppendSym1 a0123456789876543210) a0123456789876543210 = Append a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (AppendSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) AppendSym1KindInference ()) + type AppendSym2 :: Schema -> Schema -> Schema + type family AppendSym2 (a0123456789876543210 :: Schema) (a0123456789876543210 :: Schema) :: Schema where + AppendSym2 a0123456789876543210 a0123456789876543210 = Append a0123456789876543210 a0123456789876543210 + type Lookup :: [AChar] -> Schema -> U + type family Lookup (a :: [AChar]) (a :: Schema) :: U where + Lookup _ (Sch '[]) = UndefinedSym0 + Lookup name (Sch ('(:) (Attr name' u) attrs)) = Case_0123456789876543210 name name' u attrs (Let0123456789876543210Scrutinee_0123456789876543210Sym4 name name' u attrs) + type Occurs :: [AChar] -> Schema -> Bool + type family Occurs (a :: [AChar]) (a :: Schema) :: Bool where + Occurs _ (Sch '[]) = FalseSym0 + Occurs name (Sch ('(:) (Attr name' _) attrs)) = Apply (Apply (||@#@$) (Apply (Apply (==@#@$) name) name')) (Apply (Apply OccursSym0 name) (Apply SchSym0 attrs)) + type Disjoint :: Schema -> Schema -> Bool + type family Disjoint (a :: Schema) (a :: Schema) :: Bool where + Disjoint (Sch '[]) _ = TrueSym0 + Disjoint (Sch ('(:) h t)) s = Apply (Apply (&&@#@$) (Apply (Apply AttrNotInSym0 h) s)) (Apply (Apply DisjointSym0 (Apply SchSym0 t)) s) + type AttrNotIn :: Attribute -> Schema -> Bool + type family AttrNotIn (a :: Attribute) (a :: Schema) :: Bool where + AttrNotIn _ (Sch '[]) = TrueSym0 + AttrNotIn (Attr name u) (Sch ('(:) (Attr name' _) t)) = Apply (Apply (&&@#@$) (Apply (Apply (/=@#@$) name) name')) (Apply (Apply AttrNotInSym0 (Apply (Apply AttrSym0 name) u)) (Apply SchSym0 t)) + type Append :: Schema -> Schema -> Schema + type family Append (a :: Schema) (a :: Schema) :: Schema where + Append (Sch s1) (Sch s2) = Apply SchSym0 (Apply (Apply (++@#@$) s1) s2) + type TFHelper_0123456789876543210 :: U -> U -> Bool + type family TFHelper_0123456789876543210 (a :: U) (a :: U) :: Bool where + TFHelper_0123456789876543210 BOOL BOOL = TrueSym0 + TFHelper_0123456789876543210 BOOL STRING = FalseSym0 + TFHelper_0123456789876543210 BOOL NAT = FalseSym0 + TFHelper_0123456789876543210 BOOL (VEC _ _) = FalseSym0 + TFHelper_0123456789876543210 STRING BOOL = FalseSym0 + TFHelper_0123456789876543210 STRING STRING = TrueSym0 + TFHelper_0123456789876543210 STRING NAT = FalseSym0 + TFHelper_0123456789876543210 STRING (VEC _ _) = FalseSym0 + TFHelper_0123456789876543210 NAT BOOL = FalseSym0 + TFHelper_0123456789876543210 NAT STRING = FalseSym0 + TFHelper_0123456789876543210 NAT NAT = TrueSym0 + TFHelper_0123456789876543210 NAT (VEC _ _) = FalseSym0 + TFHelper_0123456789876543210 (VEC _ _) BOOL = FalseSym0 + TFHelper_0123456789876543210 (VEC _ _) STRING = FalseSym0 + TFHelper_0123456789876543210 (VEC _ _) NAT = FalseSym0 + TFHelper_0123456789876543210 (VEC a_0123456789876543210 a_0123456789876543210) (VEC b_0123456789876543210 b_0123456789876543210) = Apply (Apply (&&@#@$) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210) + type TFHelper_0123456789876543210Sym0 :: (~>) U ((~>) U Bool) + data TFHelper_0123456789876543210Sym0 :: (~>) U ((~>) U Bool) + where + TFHelper_0123456789876543210Sym0KindInference :: SameKind (Apply TFHelper_0123456789876543210Sym0 arg) (TFHelper_0123456789876543210Sym1 arg) => + TFHelper_0123456789876543210Sym0 a0123456789876543210 + type instance Apply TFHelper_0123456789876543210Sym0 a0123456789876543210 = TFHelper_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings TFHelper_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) TFHelper_0123456789876543210Sym0KindInference ()) + type TFHelper_0123456789876543210Sym1 :: U -> (~>) U Bool + data TFHelper_0123456789876543210Sym1 (a0123456789876543210 :: U) :: (~>) U Bool + where + TFHelper_0123456789876543210Sym1KindInference :: SameKind (Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) arg) (TFHelper_0123456789876543210Sym2 a0123456789876543210 arg) => + TFHelper_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (TFHelper_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) TFHelper_0123456789876543210Sym1KindInference ()) + type TFHelper_0123456789876543210Sym2 :: U -> U -> Bool + type family TFHelper_0123456789876543210Sym2 (a0123456789876543210 :: U) (a0123456789876543210 :: U) :: Bool where + TFHelper_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PEq U where + type (==) a a = Apply (Apply TFHelper_0123456789876543210Sym0 a) a + type ShowsPrec_0123456789876543210 :: GHC.Num.Natural.Natural + -> U -> Symbol -> Symbol + type family ShowsPrec_0123456789876543210 (a :: GHC.Num.Natural.Natural) (a :: U) (a :: Symbol) :: Symbol where + ShowsPrec_0123456789876543210 _ BOOL a_0123456789876543210 = Apply (Apply ShowStringSym0 "BOOL") a_0123456789876543210 + ShowsPrec_0123456789876543210 _ STRING a_0123456789876543210 = Apply (Apply ShowStringSym0 "STRING") a_0123456789876543210 + ShowsPrec_0123456789876543210 _ NAT a_0123456789876543210 = Apply (Apply ShowStringSym0 "NAT") a_0123456789876543210 + ShowsPrec_0123456789876543210 p_0123456789876543210 (VEC arg_0123456789876543210 arg_0123456789876543210) a_0123456789876543210 = Apply (Apply (Apply ShowParenSym0 (Apply (Apply (>@#@$) p_0123456789876543210) (FromInteger 10))) (Apply (Apply (.@#@$) (Apply ShowStringSym0 "VEC ")) (Apply (Apply (.@#@$) (Apply (Apply ShowsPrecSym0 (FromInteger 11)) arg_0123456789876543210)) (Apply (Apply (.@#@$) ShowSpaceSym0) (Apply (Apply ShowsPrecSym0 (FromInteger 11)) arg_0123456789876543210))))) a_0123456789876543210 + type ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) U ((~>) Symbol Symbol)) + data ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) U ((~>) Symbol Symbol)) + where + ShowsPrec_0123456789876543210Sym0KindInference :: SameKind (Apply ShowsPrec_0123456789876543210Sym0 arg) (ShowsPrec_0123456789876543210Sym1 arg) => + ShowsPrec_0123456789876543210Sym0 a0123456789876543210 + type instance Apply ShowsPrec_0123456789876543210Sym0 a0123456789876543210 = ShowsPrec_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings ShowsPrec_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym0KindInference ()) + type ShowsPrec_0123456789876543210Sym1 :: GHC.Num.Natural.Natural + -> (~>) U ((~>) Symbol Symbol) + data ShowsPrec_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Num.Natural.Natural) :: (~>) U ((~>) Symbol Symbol) + where + ShowsPrec_0123456789876543210Sym1KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 arg) => + ShowsPrec_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym1KindInference ()) + type ShowsPrec_0123456789876543210Sym2 :: GHC.Num.Natural.Natural + -> U -> (~>) Symbol Symbol + data ShowsPrec_0123456789876543210Sym2 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: U) :: (~>) Symbol Symbol + where + ShowsPrec_0123456789876543210Sym2KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 arg) => + ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym2KindInference ()) + type ShowsPrec_0123456789876543210Sym3 :: GHC.Num.Natural.Natural + -> U -> Symbol -> Symbol + type family ShowsPrec_0123456789876543210Sym3 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: U) (a0123456789876543210 :: Symbol) :: Symbol where + ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PShow U where + type ShowsPrec a a a = Apply (Apply (Apply ShowsPrec_0123456789876543210Sym0 a) a) a + type ShowsPrec_0123456789876543210 :: GHC.Num.Natural.Natural + -> AChar -> Symbol -> Symbol + type family ShowsPrec_0123456789876543210 (a :: GHC.Num.Natural.Natural) (a :: AChar) (a :: Symbol) :: Symbol where + ShowsPrec_0123456789876543210 _ CA a_0123456789876543210 = Apply (Apply ShowStringSym0 "CA") a_0123456789876543210 + ShowsPrec_0123456789876543210 _ CB a_0123456789876543210 = Apply (Apply ShowStringSym0 "CB") a_0123456789876543210 + ShowsPrec_0123456789876543210 _ CC a_0123456789876543210 = Apply (Apply ShowStringSym0 "CC") a_0123456789876543210 + ShowsPrec_0123456789876543210 _ CD a_0123456789876543210 = Apply (Apply ShowStringSym0 "CD") a_0123456789876543210 + ShowsPrec_0123456789876543210 _ CE a_0123456789876543210 = Apply (Apply ShowStringSym0 "CE") a_0123456789876543210 + ShowsPrec_0123456789876543210 _ CF a_0123456789876543210 = Apply (Apply ShowStringSym0 "CF") a_0123456789876543210 + ShowsPrec_0123456789876543210 _ CG a_0123456789876543210 = Apply (Apply ShowStringSym0 "CG") a_0123456789876543210 + ShowsPrec_0123456789876543210 _ CH a_0123456789876543210 = Apply (Apply ShowStringSym0 "CH") a_0123456789876543210 + ShowsPrec_0123456789876543210 _ CI a_0123456789876543210 = Apply (Apply ShowStringSym0 "CI") a_0123456789876543210 + ShowsPrec_0123456789876543210 _ CJ a_0123456789876543210 = Apply (Apply ShowStringSym0 "CJ") a_0123456789876543210 + ShowsPrec_0123456789876543210 _ CK a_0123456789876543210 = Apply (Apply ShowStringSym0 "CK") a_0123456789876543210 + ShowsPrec_0123456789876543210 _ CL a_0123456789876543210 = Apply (Apply ShowStringSym0 "CL") a_0123456789876543210 + ShowsPrec_0123456789876543210 _ CM a_0123456789876543210 = Apply (Apply ShowStringSym0 "CM") a_0123456789876543210 + ShowsPrec_0123456789876543210 _ CN a_0123456789876543210 = Apply (Apply ShowStringSym0 "CN") a_0123456789876543210 + ShowsPrec_0123456789876543210 _ CO a_0123456789876543210 = Apply (Apply ShowStringSym0 "CO") a_0123456789876543210 + ShowsPrec_0123456789876543210 _ CP a_0123456789876543210 = Apply (Apply ShowStringSym0 "CP") a_0123456789876543210 + ShowsPrec_0123456789876543210 _ CQ a_0123456789876543210 = Apply (Apply ShowStringSym0 "CQ") a_0123456789876543210 + ShowsPrec_0123456789876543210 _ CR a_0123456789876543210 = Apply (Apply ShowStringSym0 "CR") a_0123456789876543210 + ShowsPrec_0123456789876543210 _ CS a_0123456789876543210 = Apply (Apply ShowStringSym0 "CS") a_0123456789876543210 + ShowsPrec_0123456789876543210 _ CT a_0123456789876543210 = Apply (Apply ShowStringSym0 "CT") a_0123456789876543210 + ShowsPrec_0123456789876543210 _ CU a_0123456789876543210 = Apply (Apply ShowStringSym0 "CU") a_0123456789876543210 + ShowsPrec_0123456789876543210 _ CV a_0123456789876543210 = Apply (Apply ShowStringSym0 "CV") a_0123456789876543210 + ShowsPrec_0123456789876543210 _ CW a_0123456789876543210 = Apply (Apply ShowStringSym0 "CW") a_0123456789876543210 + ShowsPrec_0123456789876543210 _ CX a_0123456789876543210 = Apply (Apply ShowStringSym0 "CX") a_0123456789876543210 + ShowsPrec_0123456789876543210 _ CY a_0123456789876543210 = Apply (Apply ShowStringSym0 "CY") a_0123456789876543210 + ShowsPrec_0123456789876543210 _ CZ a_0123456789876543210 = Apply (Apply ShowStringSym0 "CZ") a_0123456789876543210 + type ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) AChar ((~>) Symbol Symbol)) + data ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) AChar ((~>) Symbol Symbol)) + where + ShowsPrec_0123456789876543210Sym0KindInference :: SameKind (Apply ShowsPrec_0123456789876543210Sym0 arg) (ShowsPrec_0123456789876543210Sym1 arg) => + ShowsPrec_0123456789876543210Sym0 a0123456789876543210 + type instance Apply ShowsPrec_0123456789876543210Sym0 a0123456789876543210 = ShowsPrec_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings ShowsPrec_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym0KindInference ()) + type ShowsPrec_0123456789876543210Sym1 :: GHC.Num.Natural.Natural + -> (~>) AChar ((~>) Symbol Symbol) + data ShowsPrec_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Num.Natural.Natural) :: (~>) AChar ((~>) Symbol Symbol) + where + ShowsPrec_0123456789876543210Sym1KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 arg) => + ShowsPrec_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym1KindInference ()) + type ShowsPrec_0123456789876543210Sym2 :: GHC.Num.Natural.Natural + -> AChar -> (~>) Symbol Symbol + data ShowsPrec_0123456789876543210Sym2 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: AChar) :: (~>) Symbol Symbol + where + ShowsPrec_0123456789876543210Sym2KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 arg) => + ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym2KindInference ()) + type ShowsPrec_0123456789876543210Sym3 :: GHC.Num.Natural.Natural + -> AChar -> Symbol -> Symbol + type family ShowsPrec_0123456789876543210Sym3 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: AChar) (a0123456789876543210 :: Symbol) :: Symbol where + ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PShow AChar where + type ShowsPrec a a a = Apply (Apply (Apply ShowsPrec_0123456789876543210Sym0 a) a) a + type TFHelper_0123456789876543210 :: AChar -> AChar -> Bool + type family TFHelper_0123456789876543210 (a :: AChar) (a :: AChar) :: Bool where + TFHelper_0123456789876543210 CA CA = TrueSym0 + TFHelper_0123456789876543210 CA CB = FalseSym0 + TFHelper_0123456789876543210 CA CC = FalseSym0 + TFHelper_0123456789876543210 CA CD = FalseSym0 + TFHelper_0123456789876543210 CA CE = FalseSym0 + TFHelper_0123456789876543210 CA CF = FalseSym0 + TFHelper_0123456789876543210 CA CG = FalseSym0 + TFHelper_0123456789876543210 CA CH = FalseSym0 + TFHelper_0123456789876543210 CA CI = FalseSym0 + TFHelper_0123456789876543210 CA CJ = FalseSym0 + TFHelper_0123456789876543210 CA CK = FalseSym0 + TFHelper_0123456789876543210 CA CL = FalseSym0 + TFHelper_0123456789876543210 CA CM = FalseSym0 + TFHelper_0123456789876543210 CA CN = FalseSym0 + TFHelper_0123456789876543210 CA CO = FalseSym0 + TFHelper_0123456789876543210 CA CP = FalseSym0 + TFHelper_0123456789876543210 CA CQ = FalseSym0 + TFHelper_0123456789876543210 CA CR = FalseSym0 + TFHelper_0123456789876543210 CA CS = FalseSym0 + TFHelper_0123456789876543210 CA CT = FalseSym0 + TFHelper_0123456789876543210 CA CU = FalseSym0 + TFHelper_0123456789876543210 CA CV = FalseSym0 + TFHelper_0123456789876543210 CA CW = FalseSym0 + TFHelper_0123456789876543210 CA CX = FalseSym0 + TFHelper_0123456789876543210 CA CY = FalseSym0 + TFHelper_0123456789876543210 CA CZ = FalseSym0 + TFHelper_0123456789876543210 CB CA = FalseSym0 + TFHelper_0123456789876543210 CB CB = TrueSym0 + TFHelper_0123456789876543210 CB CC = FalseSym0 + TFHelper_0123456789876543210 CB CD = FalseSym0 + TFHelper_0123456789876543210 CB CE = FalseSym0 + TFHelper_0123456789876543210 CB CF = FalseSym0 + TFHelper_0123456789876543210 CB CG = FalseSym0 + TFHelper_0123456789876543210 CB CH = FalseSym0 + TFHelper_0123456789876543210 CB CI = FalseSym0 + TFHelper_0123456789876543210 CB CJ = FalseSym0 + TFHelper_0123456789876543210 CB CK = FalseSym0 + TFHelper_0123456789876543210 CB CL = FalseSym0 + TFHelper_0123456789876543210 CB CM = FalseSym0 + TFHelper_0123456789876543210 CB CN = FalseSym0 + TFHelper_0123456789876543210 CB CO = FalseSym0 + TFHelper_0123456789876543210 CB CP = FalseSym0 + TFHelper_0123456789876543210 CB CQ = FalseSym0 + TFHelper_0123456789876543210 CB CR = FalseSym0 + TFHelper_0123456789876543210 CB CS = FalseSym0 + TFHelper_0123456789876543210 CB CT = FalseSym0 + TFHelper_0123456789876543210 CB CU = FalseSym0 + TFHelper_0123456789876543210 CB CV = FalseSym0 + TFHelper_0123456789876543210 CB CW = FalseSym0 + TFHelper_0123456789876543210 CB CX = FalseSym0 + TFHelper_0123456789876543210 CB CY = FalseSym0 + TFHelper_0123456789876543210 CB CZ = FalseSym0 + TFHelper_0123456789876543210 CC CA = FalseSym0 + TFHelper_0123456789876543210 CC CB = FalseSym0 + TFHelper_0123456789876543210 CC CC = TrueSym0 + TFHelper_0123456789876543210 CC CD = FalseSym0 + TFHelper_0123456789876543210 CC CE = FalseSym0 + TFHelper_0123456789876543210 CC CF = FalseSym0 + TFHelper_0123456789876543210 CC CG = FalseSym0 + TFHelper_0123456789876543210 CC CH = FalseSym0 + TFHelper_0123456789876543210 CC CI = FalseSym0 + TFHelper_0123456789876543210 CC CJ = FalseSym0 + TFHelper_0123456789876543210 CC CK = FalseSym0 + TFHelper_0123456789876543210 CC CL = FalseSym0 + TFHelper_0123456789876543210 CC CM = FalseSym0 + TFHelper_0123456789876543210 CC CN = FalseSym0 + TFHelper_0123456789876543210 CC CO = FalseSym0 + TFHelper_0123456789876543210 CC CP = FalseSym0 + TFHelper_0123456789876543210 CC CQ = FalseSym0 + TFHelper_0123456789876543210 CC CR = FalseSym0 + TFHelper_0123456789876543210 CC CS = FalseSym0 + TFHelper_0123456789876543210 CC CT = FalseSym0 + TFHelper_0123456789876543210 CC CU = FalseSym0 + TFHelper_0123456789876543210 CC CV = FalseSym0 + TFHelper_0123456789876543210 CC CW = FalseSym0 + TFHelper_0123456789876543210 CC CX = FalseSym0 + TFHelper_0123456789876543210 CC CY = FalseSym0 + TFHelper_0123456789876543210 CC CZ = FalseSym0 + TFHelper_0123456789876543210 CD CA = FalseSym0 + TFHelper_0123456789876543210 CD CB = FalseSym0 + TFHelper_0123456789876543210 CD CC = FalseSym0 + TFHelper_0123456789876543210 CD CD = TrueSym0 + TFHelper_0123456789876543210 CD CE = FalseSym0 + TFHelper_0123456789876543210 CD CF = FalseSym0 + TFHelper_0123456789876543210 CD CG = FalseSym0 + TFHelper_0123456789876543210 CD CH = FalseSym0 + TFHelper_0123456789876543210 CD CI = FalseSym0 + TFHelper_0123456789876543210 CD CJ = FalseSym0 + TFHelper_0123456789876543210 CD CK = FalseSym0 + TFHelper_0123456789876543210 CD CL = FalseSym0 + TFHelper_0123456789876543210 CD CM = FalseSym0 + TFHelper_0123456789876543210 CD CN = FalseSym0 + TFHelper_0123456789876543210 CD CO = FalseSym0 + TFHelper_0123456789876543210 CD CP = FalseSym0 + TFHelper_0123456789876543210 CD CQ = FalseSym0 + TFHelper_0123456789876543210 CD CR = FalseSym0 + TFHelper_0123456789876543210 CD CS = FalseSym0 + TFHelper_0123456789876543210 CD CT = FalseSym0 + TFHelper_0123456789876543210 CD CU = FalseSym0 + TFHelper_0123456789876543210 CD CV = FalseSym0 + TFHelper_0123456789876543210 CD CW = FalseSym0 + TFHelper_0123456789876543210 CD CX = FalseSym0 + TFHelper_0123456789876543210 CD CY = FalseSym0 + TFHelper_0123456789876543210 CD CZ = FalseSym0 + TFHelper_0123456789876543210 CE CA = FalseSym0 + TFHelper_0123456789876543210 CE CB = FalseSym0 + TFHelper_0123456789876543210 CE CC = FalseSym0 + TFHelper_0123456789876543210 CE CD = FalseSym0 + TFHelper_0123456789876543210 CE CE = TrueSym0 + TFHelper_0123456789876543210 CE CF = FalseSym0 + TFHelper_0123456789876543210 CE CG = FalseSym0 + TFHelper_0123456789876543210 CE CH = FalseSym0 + TFHelper_0123456789876543210 CE CI = FalseSym0 + TFHelper_0123456789876543210 CE CJ = FalseSym0 + TFHelper_0123456789876543210 CE CK = FalseSym0 + TFHelper_0123456789876543210 CE CL = FalseSym0 + TFHelper_0123456789876543210 CE CM = FalseSym0 + TFHelper_0123456789876543210 CE CN = FalseSym0 + TFHelper_0123456789876543210 CE CO = FalseSym0 + TFHelper_0123456789876543210 CE CP = FalseSym0 + TFHelper_0123456789876543210 CE CQ = FalseSym0 + TFHelper_0123456789876543210 CE CR = FalseSym0 + TFHelper_0123456789876543210 CE CS = FalseSym0 + TFHelper_0123456789876543210 CE CT = FalseSym0 + TFHelper_0123456789876543210 CE CU = FalseSym0 + TFHelper_0123456789876543210 CE CV = FalseSym0 + TFHelper_0123456789876543210 CE CW = FalseSym0 + TFHelper_0123456789876543210 CE CX = FalseSym0 + TFHelper_0123456789876543210 CE CY = FalseSym0 + TFHelper_0123456789876543210 CE CZ = FalseSym0 + TFHelper_0123456789876543210 CF CA = FalseSym0 + TFHelper_0123456789876543210 CF CB = FalseSym0 + TFHelper_0123456789876543210 CF CC = FalseSym0 + TFHelper_0123456789876543210 CF CD = FalseSym0 + TFHelper_0123456789876543210 CF CE = FalseSym0 + TFHelper_0123456789876543210 CF CF = TrueSym0 + TFHelper_0123456789876543210 CF CG = FalseSym0 + TFHelper_0123456789876543210 CF CH = FalseSym0 + TFHelper_0123456789876543210 CF CI = FalseSym0 + TFHelper_0123456789876543210 CF CJ = FalseSym0 + TFHelper_0123456789876543210 CF CK = FalseSym0 + TFHelper_0123456789876543210 CF CL = FalseSym0 + TFHelper_0123456789876543210 CF CM = FalseSym0 + TFHelper_0123456789876543210 CF CN = FalseSym0 + TFHelper_0123456789876543210 CF CO = FalseSym0 + TFHelper_0123456789876543210 CF CP = FalseSym0 + TFHelper_0123456789876543210 CF CQ = FalseSym0 + TFHelper_0123456789876543210 CF CR = FalseSym0 + TFHelper_0123456789876543210 CF CS = FalseSym0 + TFHelper_0123456789876543210 CF CT = FalseSym0 + TFHelper_0123456789876543210 CF CU = FalseSym0 + TFHelper_0123456789876543210 CF CV = FalseSym0 + TFHelper_0123456789876543210 CF CW = FalseSym0 + TFHelper_0123456789876543210 CF CX = FalseSym0 + TFHelper_0123456789876543210 CF CY = FalseSym0 + TFHelper_0123456789876543210 CF CZ = FalseSym0 + TFHelper_0123456789876543210 CG CA = FalseSym0 + TFHelper_0123456789876543210 CG CB = FalseSym0 + TFHelper_0123456789876543210 CG CC = FalseSym0 + TFHelper_0123456789876543210 CG CD = FalseSym0 + TFHelper_0123456789876543210 CG CE = FalseSym0 + TFHelper_0123456789876543210 CG CF = FalseSym0 + TFHelper_0123456789876543210 CG CG = TrueSym0 + TFHelper_0123456789876543210 CG CH = FalseSym0 + TFHelper_0123456789876543210 CG CI = FalseSym0 + TFHelper_0123456789876543210 CG CJ = FalseSym0 + TFHelper_0123456789876543210 CG CK = FalseSym0 + TFHelper_0123456789876543210 CG CL = FalseSym0 + TFHelper_0123456789876543210 CG CM = FalseSym0 + TFHelper_0123456789876543210 CG CN = FalseSym0 + TFHelper_0123456789876543210 CG CO = FalseSym0 + TFHelper_0123456789876543210 CG CP = FalseSym0 + TFHelper_0123456789876543210 CG CQ = FalseSym0 + TFHelper_0123456789876543210 CG CR = FalseSym0 + TFHelper_0123456789876543210 CG CS = FalseSym0 + TFHelper_0123456789876543210 CG CT = FalseSym0 + TFHelper_0123456789876543210 CG CU = FalseSym0 + TFHelper_0123456789876543210 CG CV = FalseSym0 + TFHelper_0123456789876543210 CG CW = FalseSym0 + TFHelper_0123456789876543210 CG CX = FalseSym0 + TFHelper_0123456789876543210 CG CY = FalseSym0 + TFHelper_0123456789876543210 CG CZ = FalseSym0 + TFHelper_0123456789876543210 CH CA = FalseSym0 + TFHelper_0123456789876543210 CH CB = FalseSym0 + TFHelper_0123456789876543210 CH CC = FalseSym0 + TFHelper_0123456789876543210 CH CD = FalseSym0 + TFHelper_0123456789876543210 CH CE = FalseSym0 + TFHelper_0123456789876543210 CH CF = FalseSym0 + TFHelper_0123456789876543210 CH CG = FalseSym0 + TFHelper_0123456789876543210 CH CH = TrueSym0 + TFHelper_0123456789876543210 CH CI = FalseSym0 + TFHelper_0123456789876543210 CH CJ = FalseSym0 + TFHelper_0123456789876543210 CH CK = FalseSym0 + TFHelper_0123456789876543210 CH CL = FalseSym0 + TFHelper_0123456789876543210 CH CM = FalseSym0 + TFHelper_0123456789876543210 CH CN = FalseSym0 + TFHelper_0123456789876543210 CH CO = FalseSym0 + TFHelper_0123456789876543210 CH CP = FalseSym0 + TFHelper_0123456789876543210 CH CQ = FalseSym0 + TFHelper_0123456789876543210 CH CR = FalseSym0 + TFHelper_0123456789876543210 CH CS = FalseSym0 + TFHelper_0123456789876543210 CH CT = FalseSym0 + TFHelper_0123456789876543210 CH CU = FalseSym0 + TFHelper_0123456789876543210 CH CV = FalseSym0 + TFHelper_0123456789876543210 CH CW = FalseSym0 + TFHelper_0123456789876543210 CH CX = FalseSym0 + TFHelper_0123456789876543210 CH CY = FalseSym0 + TFHelper_0123456789876543210 CH CZ = FalseSym0 + TFHelper_0123456789876543210 CI CA = FalseSym0 + TFHelper_0123456789876543210 CI CB = FalseSym0 + TFHelper_0123456789876543210 CI CC = FalseSym0 + TFHelper_0123456789876543210 CI CD = FalseSym0 + TFHelper_0123456789876543210 CI CE = FalseSym0 + TFHelper_0123456789876543210 CI CF = FalseSym0 + TFHelper_0123456789876543210 CI CG = FalseSym0 + TFHelper_0123456789876543210 CI CH = FalseSym0 + TFHelper_0123456789876543210 CI CI = TrueSym0 + TFHelper_0123456789876543210 CI CJ = FalseSym0 + TFHelper_0123456789876543210 CI CK = FalseSym0 + TFHelper_0123456789876543210 CI CL = FalseSym0 + TFHelper_0123456789876543210 CI CM = FalseSym0 + TFHelper_0123456789876543210 CI CN = FalseSym0 + TFHelper_0123456789876543210 CI CO = FalseSym0 + TFHelper_0123456789876543210 CI CP = FalseSym0 + TFHelper_0123456789876543210 CI CQ = FalseSym0 + TFHelper_0123456789876543210 CI CR = FalseSym0 + TFHelper_0123456789876543210 CI CS = FalseSym0 + TFHelper_0123456789876543210 CI CT = FalseSym0 + TFHelper_0123456789876543210 CI CU = FalseSym0 + TFHelper_0123456789876543210 CI CV = FalseSym0 + TFHelper_0123456789876543210 CI CW = FalseSym0 + TFHelper_0123456789876543210 CI CX = FalseSym0 + TFHelper_0123456789876543210 CI CY = FalseSym0 + TFHelper_0123456789876543210 CI CZ = FalseSym0 + TFHelper_0123456789876543210 CJ CA = FalseSym0 + TFHelper_0123456789876543210 CJ CB = FalseSym0 + TFHelper_0123456789876543210 CJ CC = FalseSym0 + TFHelper_0123456789876543210 CJ CD = FalseSym0 + TFHelper_0123456789876543210 CJ CE = FalseSym0 + TFHelper_0123456789876543210 CJ CF = FalseSym0 + TFHelper_0123456789876543210 CJ CG = FalseSym0 + TFHelper_0123456789876543210 CJ CH = FalseSym0 + TFHelper_0123456789876543210 CJ CI = FalseSym0 + TFHelper_0123456789876543210 CJ CJ = TrueSym0 + TFHelper_0123456789876543210 CJ CK = FalseSym0 + TFHelper_0123456789876543210 CJ CL = FalseSym0 + TFHelper_0123456789876543210 CJ CM = FalseSym0 + TFHelper_0123456789876543210 CJ CN = FalseSym0 + TFHelper_0123456789876543210 CJ CO = FalseSym0 + TFHelper_0123456789876543210 CJ CP = FalseSym0 + TFHelper_0123456789876543210 CJ CQ = FalseSym0 + TFHelper_0123456789876543210 CJ CR = FalseSym0 + TFHelper_0123456789876543210 CJ CS = FalseSym0 + TFHelper_0123456789876543210 CJ CT = FalseSym0 + TFHelper_0123456789876543210 CJ CU = FalseSym0 + TFHelper_0123456789876543210 CJ CV = FalseSym0 + TFHelper_0123456789876543210 CJ CW = FalseSym0 + TFHelper_0123456789876543210 CJ CX = FalseSym0 + TFHelper_0123456789876543210 CJ CY = FalseSym0 + TFHelper_0123456789876543210 CJ CZ = FalseSym0 + TFHelper_0123456789876543210 CK CA = FalseSym0 + TFHelper_0123456789876543210 CK CB = FalseSym0 + TFHelper_0123456789876543210 CK CC = FalseSym0 + TFHelper_0123456789876543210 CK CD = FalseSym0 + TFHelper_0123456789876543210 CK CE = FalseSym0 + TFHelper_0123456789876543210 CK CF = FalseSym0 + TFHelper_0123456789876543210 CK CG = FalseSym0 + TFHelper_0123456789876543210 CK CH = FalseSym0 + TFHelper_0123456789876543210 CK CI = FalseSym0 + TFHelper_0123456789876543210 CK CJ = FalseSym0 + TFHelper_0123456789876543210 CK CK = TrueSym0 + TFHelper_0123456789876543210 CK CL = FalseSym0 + TFHelper_0123456789876543210 CK CM = FalseSym0 + TFHelper_0123456789876543210 CK CN = FalseSym0 + TFHelper_0123456789876543210 CK CO = FalseSym0 + TFHelper_0123456789876543210 CK CP = FalseSym0 + TFHelper_0123456789876543210 CK CQ = FalseSym0 + TFHelper_0123456789876543210 CK CR = FalseSym0 + TFHelper_0123456789876543210 CK CS = FalseSym0 + TFHelper_0123456789876543210 CK CT = FalseSym0 + TFHelper_0123456789876543210 CK CU = FalseSym0 + TFHelper_0123456789876543210 CK CV = FalseSym0 + TFHelper_0123456789876543210 CK CW = FalseSym0 + TFHelper_0123456789876543210 CK CX = FalseSym0 + TFHelper_0123456789876543210 CK CY = FalseSym0 + TFHelper_0123456789876543210 CK CZ = FalseSym0 + TFHelper_0123456789876543210 CL CA = FalseSym0 + TFHelper_0123456789876543210 CL CB = FalseSym0 + TFHelper_0123456789876543210 CL CC = FalseSym0 + TFHelper_0123456789876543210 CL CD = FalseSym0 + TFHelper_0123456789876543210 CL CE = FalseSym0 + TFHelper_0123456789876543210 CL CF = FalseSym0 + TFHelper_0123456789876543210 CL CG = FalseSym0 + TFHelper_0123456789876543210 CL CH = FalseSym0 + TFHelper_0123456789876543210 CL CI = FalseSym0 + TFHelper_0123456789876543210 CL CJ = FalseSym0 + TFHelper_0123456789876543210 CL CK = FalseSym0 + TFHelper_0123456789876543210 CL CL = TrueSym0 + TFHelper_0123456789876543210 CL CM = FalseSym0 + TFHelper_0123456789876543210 CL CN = FalseSym0 + TFHelper_0123456789876543210 CL CO = FalseSym0 + TFHelper_0123456789876543210 CL CP = FalseSym0 + TFHelper_0123456789876543210 CL CQ = FalseSym0 + TFHelper_0123456789876543210 CL CR = FalseSym0 + TFHelper_0123456789876543210 CL CS = FalseSym0 + TFHelper_0123456789876543210 CL CT = FalseSym0 + TFHelper_0123456789876543210 CL CU = FalseSym0 + TFHelper_0123456789876543210 CL CV = FalseSym0 + TFHelper_0123456789876543210 CL CW = FalseSym0 + TFHelper_0123456789876543210 CL CX = FalseSym0 + TFHelper_0123456789876543210 CL CY = FalseSym0 + TFHelper_0123456789876543210 CL CZ = FalseSym0 + TFHelper_0123456789876543210 CM CA = FalseSym0 + TFHelper_0123456789876543210 CM CB = FalseSym0 + TFHelper_0123456789876543210 CM CC = FalseSym0 + TFHelper_0123456789876543210 CM CD = FalseSym0 + TFHelper_0123456789876543210 CM CE = FalseSym0 + TFHelper_0123456789876543210 CM CF = FalseSym0 + TFHelper_0123456789876543210 CM CG = FalseSym0 + TFHelper_0123456789876543210 CM CH = FalseSym0 + TFHelper_0123456789876543210 CM CI = FalseSym0 + TFHelper_0123456789876543210 CM CJ = FalseSym0 + TFHelper_0123456789876543210 CM CK = FalseSym0 + TFHelper_0123456789876543210 CM CL = FalseSym0 + TFHelper_0123456789876543210 CM CM = TrueSym0 + TFHelper_0123456789876543210 CM CN = FalseSym0 + TFHelper_0123456789876543210 CM CO = FalseSym0 + TFHelper_0123456789876543210 CM CP = FalseSym0 + TFHelper_0123456789876543210 CM CQ = FalseSym0 + TFHelper_0123456789876543210 CM CR = FalseSym0 + TFHelper_0123456789876543210 CM CS = FalseSym0 + TFHelper_0123456789876543210 CM CT = FalseSym0 + TFHelper_0123456789876543210 CM CU = FalseSym0 + TFHelper_0123456789876543210 CM CV = FalseSym0 + TFHelper_0123456789876543210 CM CW = FalseSym0 + TFHelper_0123456789876543210 CM CX = FalseSym0 + TFHelper_0123456789876543210 CM CY = FalseSym0 + TFHelper_0123456789876543210 CM CZ = FalseSym0 + TFHelper_0123456789876543210 CN CA = FalseSym0 + TFHelper_0123456789876543210 CN CB = FalseSym0 + TFHelper_0123456789876543210 CN CC = FalseSym0 + TFHelper_0123456789876543210 CN CD = FalseSym0 + TFHelper_0123456789876543210 CN CE = FalseSym0 + TFHelper_0123456789876543210 CN CF = FalseSym0 + TFHelper_0123456789876543210 CN CG = FalseSym0 + TFHelper_0123456789876543210 CN CH = FalseSym0 + TFHelper_0123456789876543210 CN CI = FalseSym0 + TFHelper_0123456789876543210 CN CJ = FalseSym0 + TFHelper_0123456789876543210 CN CK = FalseSym0 + TFHelper_0123456789876543210 CN CL = FalseSym0 + TFHelper_0123456789876543210 CN CM = FalseSym0 + TFHelper_0123456789876543210 CN CN = TrueSym0 + TFHelper_0123456789876543210 CN CO = FalseSym0 + TFHelper_0123456789876543210 CN CP = FalseSym0 + TFHelper_0123456789876543210 CN CQ = FalseSym0 + TFHelper_0123456789876543210 CN CR = FalseSym0 + TFHelper_0123456789876543210 CN CS = FalseSym0 + TFHelper_0123456789876543210 CN CT = FalseSym0 + TFHelper_0123456789876543210 CN CU = FalseSym0 + TFHelper_0123456789876543210 CN CV = FalseSym0 + TFHelper_0123456789876543210 CN CW = FalseSym0 + TFHelper_0123456789876543210 CN CX = FalseSym0 + TFHelper_0123456789876543210 CN CY = FalseSym0 + TFHelper_0123456789876543210 CN CZ = FalseSym0 + TFHelper_0123456789876543210 CO CA = FalseSym0 + TFHelper_0123456789876543210 CO CB = FalseSym0 + TFHelper_0123456789876543210 CO CC = FalseSym0 + TFHelper_0123456789876543210 CO CD = FalseSym0 + TFHelper_0123456789876543210 CO CE = FalseSym0 + TFHelper_0123456789876543210 CO CF = FalseSym0 + TFHelper_0123456789876543210 CO CG = FalseSym0 + TFHelper_0123456789876543210 CO CH = FalseSym0 + TFHelper_0123456789876543210 CO CI = FalseSym0 + TFHelper_0123456789876543210 CO CJ = FalseSym0 + TFHelper_0123456789876543210 CO CK = FalseSym0 + TFHelper_0123456789876543210 CO CL = FalseSym0 + TFHelper_0123456789876543210 CO CM = FalseSym0 + TFHelper_0123456789876543210 CO CN = FalseSym0 + TFHelper_0123456789876543210 CO CO = TrueSym0 + TFHelper_0123456789876543210 CO CP = FalseSym0 + TFHelper_0123456789876543210 CO CQ = FalseSym0 + TFHelper_0123456789876543210 CO CR = FalseSym0 + TFHelper_0123456789876543210 CO CS = FalseSym0 + TFHelper_0123456789876543210 CO CT = FalseSym0 + TFHelper_0123456789876543210 CO CU = FalseSym0 + TFHelper_0123456789876543210 CO CV = FalseSym0 + TFHelper_0123456789876543210 CO CW = FalseSym0 + TFHelper_0123456789876543210 CO CX = FalseSym0 + TFHelper_0123456789876543210 CO CY = FalseSym0 + TFHelper_0123456789876543210 CO CZ = FalseSym0 + TFHelper_0123456789876543210 CP CA = FalseSym0 + TFHelper_0123456789876543210 CP CB = FalseSym0 + TFHelper_0123456789876543210 CP CC = FalseSym0 + TFHelper_0123456789876543210 CP CD = FalseSym0 + TFHelper_0123456789876543210 CP CE = FalseSym0 + TFHelper_0123456789876543210 CP CF = FalseSym0 + TFHelper_0123456789876543210 CP CG = FalseSym0 + TFHelper_0123456789876543210 CP CH = FalseSym0 + TFHelper_0123456789876543210 CP CI = FalseSym0 + TFHelper_0123456789876543210 CP CJ = FalseSym0 + TFHelper_0123456789876543210 CP CK = FalseSym0 + TFHelper_0123456789876543210 CP CL = FalseSym0 + TFHelper_0123456789876543210 CP CM = FalseSym0 + TFHelper_0123456789876543210 CP CN = FalseSym0 + TFHelper_0123456789876543210 CP CO = FalseSym0 + TFHelper_0123456789876543210 CP CP = TrueSym0 + TFHelper_0123456789876543210 CP CQ = FalseSym0 + TFHelper_0123456789876543210 CP CR = FalseSym0 + TFHelper_0123456789876543210 CP CS = FalseSym0 + TFHelper_0123456789876543210 CP CT = FalseSym0 + TFHelper_0123456789876543210 CP CU = FalseSym0 + TFHelper_0123456789876543210 CP CV = FalseSym0 + TFHelper_0123456789876543210 CP CW = FalseSym0 + TFHelper_0123456789876543210 CP CX = FalseSym0 + TFHelper_0123456789876543210 CP CY = FalseSym0 + TFHelper_0123456789876543210 CP CZ = FalseSym0 + TFHelper_0123456789876543210 CQ CA = FalseSym0 + TFHelper_0123456789876543210 CQ CB = FalseSym0 + TFHelper_0123456789876543210 CQ CC = FalseSym0 + TFHelper_0123456789876543210 CQ CD = FalseSym0 + TFHelper_0123456789876543210 CQ CE = FalseSym0 + TFHelper_0123456789876543210 CQ CF = FalseSym0 + TFHelper_0123456789876543210 CQ CG = FalseSym0 + TFHelper_0123456789876543210 CQ CH = FalseSym0 + TFHelper_0123456789876543210 CQ CI = FalseSym0 + TFHelper_0123456789876543210 CQ CJ = FalseSym0 + TFHelper_0123456789876543210 CQ CK = FalseSym0 + TFHelper_0123456789876543210 CQ CL = FalseSym0 + TFHelper_0123456789876543210 CQ CM = FalseSym0 + TFHelper_0123456789876543210 CQ CN = FalseSym0 + TFHelper_0123456789876543210 CQ CO = FalseSym0 + TFHelper_0123456789876543210 CQ CP = FalseSym0 + TFHelper_0123456789876543210 CQ CQ = TrueSym0 + TFHelper_0123456789876543210 CQ CR = FalseSym0 + TFHelper_0123456789876543210 CQ CS = FalseSym0 + TFHelper_0123456789876543210 CQ CT = FalseSym0 + TFHelper_0123456789876543210 CQ CU = FalseSym0 + TFHelper_0123456789876543210 CQ CV = FalseSym0 + TFHelper_0123456789876543210 CQ CW = FalseSym0 + TFHelper_0123456789876543210 CQ CX = FalseSym0 + TFHelper_0123456789876543210 CQ CY = FalseSym0 + TFHelper_0123456789876543210 CQ CZ = FalseSym0 + TFHelper_0123456789876543210 CR CA = FalseSym0 + TFHelper_0123456789876543210 CR CB = FalseSym0 + TFHelper_0123456789876543210 CR CC = FalseSym0 + TFHelper_0123456789876543210 CR CD = FalseSym0 + TFHelper_0123456789876543210 CR CE = FalseSym0 + TFHelper_0123456789876543210 CR CF = FalseSym0 + TFHelper_0123456789876543210 CR CG = FalseSym0 + TFHelper_0123456789876543210 CR CH = FalseSym0 + TFHelper_0123456789876543210 CR CI = FalseSym0 + TFHelper_0123456789876543210 CR CJ = FalseSym0 + TFHelper_0123456789876543210 CR CK = FalseSym0 + TFHelper_0123456789876543210 CR CL = FalseSym0 + TFHelper_0123456789876543210 CR CM = FalseSym0 + TFHelper_0123456789876543210 CR CN = FalseSym0 + TFHelper_0123456789876543210 CR CO = FalseSym0 + TFHelper_0123456789876543210 CR CP = FalseSym0 + TFHelper_0123456789876543210 CR CQ = FalseSym0 + TFHelper_0123456789876543210 CR CR = TrueSym0 + TFHelper_0123456789876543210 CR CS = FalseSym0 + TFHelper_0123456789876543210 CR CT = FalseSym0 + TFHelper_0123456789876543210 CR CU = FalseSym0 + TFHelper_0123456789876543210 CR CV = FalseSym0 + TFHelper_0123456789876543210 CR CW = FalseSym0 + TFHelper_0123456789876543210 CR CX = FalseSym0 + TFHelper_0123456789876543210 CR CY = FalseSym0 + TFHelper_0123456789876543210 CR CZ = FalseSym0 + TFHelper_0123456789876543210 CS CA = FalseSym0 + TFHelper_0123456789876543210 CS CB = FalseSym0 + TFHelper_0123456789876543210 CS CC = FalseSym0 + TFHelper_0123456789876543210 CS CD = FalseSym0 + TFHelper_0123456789876543210 CS CE = FalseSym0 + TFHelper_0123456789876543210 CS CF = FalseSym0 + TFHelper_0123456789876543210 CS CG = FalseSym0 + TFHelper_0123456789876543210 CS CH = FalseSym0 + TFHelper_0123456789876543210 CS CI = FalseSym0 + TFHelper_0123456789876543210 CS CJ = FalseSym0 + TFHelper_0123456789876543210 CS CK = FalseSym0 + TFHelper_0123456789876543210 CS CL = FalseSym0 + TFHelper_0123456789876543210 CS CM = FalseSym0 + TFHelper_0123456789876543210 CS CN = FalseSym0 + TFHelper_0123456789876543210 CS CO = FalseSym0 + TFHelper_0123456789876543210 CS CP = FalseSym0 + TFHelper_0123456789876543210 CS CQ = FalseSym0 + TFHelper_0123456789876543210 CS CR = FalseSym0 + TFHelper_0123456789876543210 CS CS = TrueSym0 + TFHelper_0123456789876543210 CS CT = FalseSym0 + TFHelper_0123456789876543210 CS CU = FalseSym0 + TFHelper_0123456789876543210 CS CV = FalseSym0 + TFHelper_0123456789876543210 CS CW = FalseSym0 + TFHelper_0123456789876543210 CS CX = FalseSym0 + TFHelper_0123456789876543210 CS CY = FalseSym0 + TFHelper_0123456789876543210 CS CZ = FalseSym0 + TFHelper_0123456789876543210 CT CA = FalseSym0 + TFHelper_0123456789876543210 CT CB = FalseSym0 + TFHelper_0123456789876543210 CT CC = FalseSym0 + TFHelper_0123456789876543210 CT CD = FalseSym0 + TFHelper_0123456789876543210 CT CE = FalseSym0 + TFHelper_0123456789876543210 CT CF = FalseSym0 + TFHelper_0123456789876543210 CT CG = FalseSym0 + TFHelper_0123456789876543210 CT CH = FalseSym0 + TFHelper_0123456789876543210 CT CI = FalseSym0 + TFHelper_0123456789876543210 CT CJ = FalseSym0 + TFHelper_0123456789876543210 CT CK = FalseSym0 + TFHelper_0123456789876543210 CT CL = FalseSym0 + TFHelper_0123456789876543210 CT CM = FalseSym0 + TFHelper_0123456789876543210 CT CN = FalseSym0 + TFHelper_0123456789876543210 CT CO = FalseSym0 + TFHelper_0123456789876543210 CT CP = FalseSym0 + TFHelper_0123456789876543210 CT CQ = FalseSym0 + TFHelper_0123456789876543210 CT CR = FalseSym0 + TFHelper_0123456789876543210 CT CS = FalseSym0 + TFHelper_0123456789876543210 CT CT = TrueSym0 + TFHelper_0123456789876543210 CT CU = FalseSym0 + TFHelper_0123456789876543210 CT CV = FalseSym0 + TFHelper_0123456789876543210 CT CW = FalseSym0 + TFHelper_0123456789876543210 CT CX = FalseSym0 + TFHelper_0123456789876543210 CT CY = FalseSym0 + TFHelper_0123456789876543210 CT CZ = FalseSym0 + TFHelper_0123456789876543210 CU CA = FalseSym0 + TFHelper_0123456789876543210 CU CB = FalseSym0 + TFHelper_0123456789876543210 CU CC = FalseSym0 + TFHelper_0123456789876543210 CU CD = FalseSym0 + TFHelper_0123456789876543210 CU CE = FalseSym0 + TFHelper_0123456789876543210 CU CF = FalseSym0 + TFHelper_0123456789876543210 CU CG = FalseSym0 + TFHelper_0123456789876543210 CU CH = FalseSym0 + TFHelper_0123456789876543210 CU CI = FalseSym0 + TFHelper_0123456789876543210 CU CJ = FalseSym0 + TFHelper_0123456789876543210 CU CK = FalseSym0 + TFHelper_0123456789876543210 CU CL = FalseSym0 + TFHelper_0123456789876543210 CU CM = FalseSym0 + TFHelper_0123456789876543210 CU CN = FalseSym0 + TFHelper_0123456789876543210 CU CO = FalseSym0 + TFHelper_0123456789876543210 CU CP = FalseSym0 + TFHelper_0123456789876543210 CU CQ = FalseSym0 + TFHelper_0123456789876543210 CU CR = FalseSym0 + TFHelper_0123456789876543210 CU CS = FalseSym0 + TFHelper_0123456789876543210 CU CT = FalseSym0 + TFHelper_0123456789876543210 CU CU = TrueSym0 + TFHelper_0123456789876543210 CU CV = FalseSym0 + TFHelper_0123456789876543210 CU CW = FalseSym0 + TFHelper_0123456789876543210 CU CX = FalseSym0 + TFHelper_0123456789876543210 CU CY = FalseSym0 + TFHelper_0123456789876543210 CU CZ = FalseSym0 + TFHelper_0123456789876543210 CV CA = FalseSym0 + TFHelper_0123456789876543210 CV CB = FalseSym0 + TFHelper_0123456789876543210 CV CC = FalseSym0 + TFHelper_0123456789876543210 CV CD = FalseSym0 + TFHelper_0123456789876543210 CV CE = FalseSym0 + TFHelper_0123456789876543210 CV CF = FalseSym0 + TFHelper_0123456789876543210 CV CG = FalseSym0 + TFHelper_0123456789876543210 CV CH = FalseSym0 + TFHelper_0123456789876543210 CV CI = FalseSym0 + TFHelper_0123456789876543210 CV CJ = FalseSym0 + TFHelper_0123456789876543210 CV CK = FalseSym0 + TFHelper_0123456789876543210 CV CL = FalseSym0 + TFHelper_0123456789876543210 CV CM = FalseSym0 + TFHelper_0123456789876543210 CV CN = FalseSym0 + TFHelper_0123456789876543210 CV CO = FalseSym0 + TFHelper_0123456789876543210 CV CP = FalseSym0 + TFHelper_0123456789876543210 CV CQ = FalseSym0 + TFHelper_0123456789876543210 CV CR = FalseSym0 + TFHelper_0123456789876543210 CV CS = FalseSym0 + TFHelper_0123456789876543210 CV CT = FalseSym0 + TFHelper_0123456789876543210 CV CU = FalseSym0 + TFHelper_0123456789876543210 CV CV = TrueSym0 + TFHelper_0123456789876543210 CV CW = FalseSym0 + TFHelper_0123456789876543210 CV CX = FalseSym0 + TFHelper_0123456789876543210 CV CY = FalseSym0 + TFHelper_0123456789876543210 CV CZ = FalseSym0 + TFHelper_0123456789876543210 CW CA = FalseSym0 + TFHelper_0123456789876543210 CW CB = FalseSym0 + TFHelper_0123456789876543210 CW CC = FalseSym0 + TFHelper_0123456789876543210 CW CD = FalseSym0 + TFHelper_0123456789876543210 CW CE = FalseSym0 + TFHelper_0123456789876543210 CW CF = FalseSym0 + TFHelper_0123456789876543210 CW CG = FalseSym0 + TFHelper_0123456789876543210 CW CH = FalseSym0 + TFHelper_0123456789876543210 CW CI = FalseSym0 + TFHelper_0123456789876543210 CW CJ = FalseSym0 + TFHelper_0123456789876543210 CW CK = FalseSym0 + TFHelper_0123456789876543210 CW CL = FalseSym0 + TFHelper_0123456789876543210 CW CM = FalseSym0 + TFHelper_0123456789876543210 CW CN = FalseSym0 + TFHelper_0123456789876543210 CW CO = FalseSym0 + TFHelper_0123456789876543210 CW CP = FalseSym0 + TFHelper_0123456789876543210 CW CQ = FalseSym0 + TFHelper_0123456789876543210 CW CR = FalseSym0 + TFHelper_0123456789876543210 CW CS = FalseSym0 + TFHelper_0123456789876543210 CW CT = FalseSym0 + TFHelper_0123456789876543210 CW CU = FalseSym0 + TFHelper_0123456789876543210 CW CV = FalseSym0 + TFHelper_0123456789876543210 CW CW = TrueSym0 + TFHelper_0123456789876543210 CW CX = FalseSym0 + TFHelper_0123456789876543210 CW CY = FalseSym0 + TFHelper_0123456789876543210 CW CZ = FalseSym0 + TFHelper_0123456789876543210 CX CA = FalseSym0 + TFHelper_0123456789876543210 CX CB = FalseSym0 + TFHelper_0123456789876543210 CX CC = FalseSym0 + TFHelper_0123456789876543210 CX CD = FalseSym0 + TFHelper_0123456789876543210 CX CE = FalseSym0 + TFHelper_0123456789876543210 CX CF = FalseSym0 + TFHelper_0123456789876543210 CX CG = FalseSym0 + TFHelper_0123456789876543210 CX CH = FalseSym0 + TFHelper_0123456789876543210 CX CI = FalseSym0 + TFHelper_0123456789876543210 CX CJ = FalseSym0 + TFHelper_0123456789876543210 CX CK = FalseSym0 + TFHelper_0123456789876543210 CX CL = FalseSym0 + TFHelper_0123456789876543210 CX CM = FalseSym0 + TFHelper_0123456789876543210 CX CN = FalseSym0 + TFHelper_0123456789876543210 CX CO = FalseSym0 + TFHelper_0123456789876543210 CX CP = FalseSym0 + TFHelper_0123456789876543210 CX CQ = FalseSym0 + TFHelper_0123456789876543210 CX CR = FalseSym0 + TFHelper_0123456789876543210 CX CS = FalseSym0 + TFHelper_0123456789876543210 CX CT = FalseSym0 + TFHelper_0123456789876543210 CX CU = FalseSym0 + TFHelper_0123456789876543210 CX CV = FalseSym0 + TFHelper_0123456789876543210 CX CW = FalseSym0 + TFHelper_0123456789876543210 CX CX = TrueSym0 + TFHelper_0123456789876543210 CX CY = FalseSym0 + TFHelper_0123456789876543210 CX CZ = FalseSym0 + TFHelper_0123456789876543210 CY CA = FalseSym0 + TFHelper_0123456789876543210 CY CB = FalseSym0 + TFHelper_0123456789876543210 CY CC = FalseSym0 + TFHelper_0123456789876543210 CY CD = FalseSym0 + TFHelper_0123456789876543210 CY CE = FalseSym0 + TFHelper_0123456789876543210 CY CF = FalseSym0 + TFHelper_0123456789876543210 CY CG = FalseSym0 + TFHelper_0123456789876543210 CY CH = FalseSym0 + TFHelper_0123456789876543210 CY CI = FalseSym0 + TFHelper_0123456789876543210 CY CJ = FalseSym0 + TFHelper_0123456789876543210 CY CK = FalseSym0 + TFHelper_0123456789876543210 CY CL = FalseSym0 + TFHelper_0123456789876543210 CY CM = FalseSym0 + TFHelper_0123456789876543210 CY CN = FalseSym0 + TFHelper_0123456789876543210 CY CO = FalseSym0 + TFHelper_0123456789876543210 CY CP = FalseSym0 + TFHelper_0123456789876543210 CY CQ = FalseSym0 + TFHelper_0123456789876543210 CY CR = FalseSym0 + TFHelper_0123456789876543210 CY CS = FalseSym0 + TFHelper_0123456789876543210 CY CT = FalseSym0 + TFHelper_0123456789876543210 CY CU = FalseSym0 + TFHelper_0123456789876543210 CY CV = FalseSym0 + TFHelper_0123456789876543210 CY CW = FalseSym0 + TFHelper_0123456789876543210 CY CX = FalseSym0 + TFHelper_0123456789876543210 CY CY = TrueSym0 + TFHelper_0123456789876543210 CY CZ = FalseSym0 + TFHelper_0123456789876543210 CZ CA = FalseSym0 + TFHelper_0123456789876543210 CZ CB = FalseSym0 + TFHelper_0123456789876543210 CZ CC = FalseSym0 + TFHelper_0123456789876543210 CZ CD = FalseSym0 + TFHelper_0123456789876543210 CZ CE = FalseSym0 + TFHelper_0123456789876543210 CZ CF = FalseSym0 + TFHelper_0123456789876543210 CZ CG = FalseSym0 + TFHelper_0123456789876543210 CZ CH = FalseSym0 + TFHelper_0123456789876543210 CZ CI = FalseSym0 + TFHelper_0123456789876543210 CZ CJ = FalseSym0 + TFHelper_0123456789876543210 CZ CK = FalseSym0 + TFHelper_0123456789876543210 CZ CL = FalseSym0 + TFHelper_0123456789876543210 CZ CM = FalseSym0 + TFHelper_0123456789876543210 CZ CN = FalseSym0 + TFHelper_0123456789876543210 CZ CO = FalseSym0 + TFHelper_0123456789876543210 CZ CP = FalseSym0 + TFHelper_0123456789876543210 CZ CQ = FalseSym0 + TFHelper_0123456789876543210 CZ CR = FalseSym0 + TFHelper_0123456789876543210 CZ CS = FalseSym0 + TFHelper_0123456789876543210 CZ CT = FalseSym0 + TFHelper_0123456789876543210 CZ CU = FalseSym0 + TFHelper_0123456789876543210 CZ CV = FalseSym0 + TFHelper_0123456789876543210 CZ CW = FalseSym0 + TFHelper_0123456789876543210 CZ CX = FalseSym0 + TFHelper_0123456789876543210 CZ CY = FalseSym0 + TFHelper_0123456789876543210 CZ CZ = TrueSym0 + type TFHelper_0123456789876543210Sym0 :: (~>) AChar ((~>) AChar Bool) + data TFHelper_0123456789876543210Sym0 :: (~>) AChar ((~>) AChar Bool) + where + TFHelper_0123456789876543210Sym0KindInference :: SameKind (Apply TFHelper_0123456789876543210Sym0 arg) (TFHelper_0123456789876543210Sym1 arg) => + TFHelper_0123456789876543210Sym0 a0123456789876543210 + type instance Apply TFHelper_0123456789876543210Sym0 a0123456789876543210 = TFHelper_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings TFHelper_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) TFHelper_0123456789876543210Sym0KindInference ()) + type TFHelper_0123456789876543210Sym1 :: AChar -> (~>) AChar Bool + data TFHelper_0123456789876543210Sym1 (a0123456789876543210 :: AChar) :: (~>) AChar Bool + where + TFHelper_0123456789876543210Sym1KindInference :: SameKind (Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) arg) (TFHelper_0123456789876543210Sym2 a0123456789876543210 arg) => + TFHelper_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (TFHelper_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) TFHelper_0123456789876543210Sym1KindInference ()) + type TFHelper_0123456789876543210Sym2 :: AChar -> AChar -> Bool + type family TFHelper_0123456789876543210Sym2 (a0123456789876543210 :: AChar) (a0123456789876543210 :: AChar) :: Bool where + TFHelper_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PEq AChar where + type (==) a a = Apply (Apply TFHelper_0123456789876543210Sym0 a) a + sLookup :: + (forall (t :: [AChar]) (t :: Schema). + Sing t + -> Sing t -> Sing (Apply (Apply LookupSym0 t) t :: U) :: Type) + sOccurs :: + (forall (t :: [AChar]) (t :: Schema). + Sing t + -> Sing t -> Sing (Apply (Apply OccursSym0 t) t :: Bool) :: Type) + sDisjoint :: + (forall (t :: Schema) (t :: Schema). + Sing t + -> Sing t -> Sing (Apply (Apply DisjointSym0 t) t :: Bool) :: Type) + sAttrNotIn :: + (forall (t :: Attribute) (t :: Schema). + Sing t + -> Sing t + -> Sing (Apply (Apply AttrNotInSym0 t) t :: Bool) :: Type) + sAppend :: + (forall (t :: Schema) (t :: Schema). + Sing t + -> Sing t -> Sing (Apply (Apply AppendSym0 t) t :: Schema) :: Type) + sLookup _ (SSch SNil) = sUndefined + sLookup + (sName :: Sing name) + (SSch (SCons (SAttr (sName' :: Sing name') (sU :: Sing u)) + (sAttrs :: Sing attrs))) + = let + sScrutinee_0123456789876543210 :: + Sing @_ (Let0123456789876543210Scrutinee_0123456789876543210Sym4 name name' u attrs) + sScrutinee_0123456789876543210 + = applySing (applySing (singFun2 @(==@#@$) (%==)) sName) sName' + in + GHC.Base.id + @(Sing (Case_0123456789876543210 name name' u attrs (Let0123456789876543210Scrutinee_0123456789876543210Sym4 name name' u attrs))) + (case sScrutinee_0123456789876543210 of + STrue -> sU + SFalse + -> applySing + (applySing (singFun2 @LookupSym0 sLookup) sName) + (applySing (singFun1 @SchSym0 SSch) sAttrs)) + sOccurs _ (SSch SNil) = SFalse + sOccurs + (sName :: Sing name) + (SSch (SCons (SAttr (sName' :: Sing name') _) + (sAttrs :: Sing attrs))) + = applySing + (applySing + (singFun2 @(||@#@$) (%||)) + (applySing (applySing (singFun2 @(==@#@$) (%==)) sName) sName')) + (applySing + (applySing (singFun2 @OccursSym0 sOccurs) sName) + (applySing (singFun1 @SchSym0 SSch) sAttrs)) + sDisjoint (SSch SNil) _ = STrue + sDisjoint + (SSch (SCons (sH :: Sing h) (sT :: Sing t))) + (sS :: Sing s) + = applySing + (applySing + (singFun2 @(&&@#@$) (%&&)) + (applySing (applySing (singFun2 @AttrNotInSym0 sAttrNotIn) sH) sS)) + (applySing + (applySing + (singFun2 @DisjointSym0 sDisjoint) + (applySing (singFun1 @SchSym0 SSch) sT)) + sS) + sAttrNotIn _ (SSch SNil) = STrue + sAttrNotIn + (SAttr (sName :: Sing name) (sU :: Sing u)) + (SSch (SCons (SAttr (sName' :: Sing name') _) (sT :: Sing t))) + = applySing + (applySing + (singFun2 @(&&@#@$) (%&&)) + (applySing (applySing (singFun2 @(/=@#@$) (%/=)) sName) sName')) + (applySing + (applySing + (singFun2 @AttrNotInSym0 sAttrNotIn) + (applySing (applySing (singFun2 @AttrSym0 SAttr) sName) sU)) + (applySing (singFun1 @SchSym0 SSch) sT)) + sAppend (SSch (sS1 :: Sing s1)) (SSch (sS2 :: Sing s2)) + = applySing + (singFun1 @SchSym0 SSch) + (applySing (applySing (singFun2 @(++@#@$) (%++)) sS1) sS2) + instance SingI (LookupSym0 :: (~>) [AChar] ((~>) Schema U)) where + sing = singFun2 @LookupSym0 sLookup + instance SingI d => + SingI (LookupSym1 (d :: [AChar]) :: (~>) Schema U) where + sing = singFun1 @(LookupSym1 (d :: [AChar])) (sLookup (sing @d)) + instance SingI1 (LookupSym1 :: [AChar] -> (~>) Schema U) where + liftSing (s :: Sing (d :: [AChar])) + = singFun1 @(LookupSym1 (d :: [AChar])) (sLookup s) + instance SingI (OccursSym0 :: (~>) [AChar] ((~>) Schema Bool)) where + sing = singFun2 @OccursSym0 sOccurs + instance SingI d => + SingI (OccursSym1 (d :: [AChar]) :: (~>) Schema Bool) where + sing = singFun1 @(OccursSym1 (d :: [AChar])) (sOccurs (sing @d)) + instance SingI1 (OccursSym1 :: [AChar] -> (~>) Schema Bool) where + liftSing (s :: Sing (d :: [AChar])) + = singFun1 @(OccursSym1 (d :: [AChar])) (sOccurs s) + instance SingI (DisjointSym0 :: (~>) Schema ((~>) Schema Bool)) where + sing = singFun2 @DisjointSym0 sDisjoint + instance SingI d => + SingI (DisjointSym1 (d :: Schema) :: (~>) Schema Bool) where + sing = singFun1 @(DisjointSym1 (d :: Schema)) (sDisjoint (sing @d)) + instance SingI1 (DisjointSym1 :: Schema -> (~>) Schema Bool) where + liftSing (s :: Sing (d :: Schema)) + = singFun1 @(DisjointSym1 (d :: Schema)) (sDisjoint s) + instance SingI (AttrNotInSym0 :: (~>) Attribute ((~>) Schema Bool)) where + sing = singFun2 @AttrNotInSym0 sAttrNotIn + instance SingI d => + SingI (AttrNotInSym1 (d :: Attribute) :: (~>) Schema Bool) where + sing + = singFun1 @(AttrNotInSym1 (d :: Attribute)) (sAttrNotIn (sing @d)) + instance SingI1 (AttrNotInSym1 :: Attribute + -> (~>) Schema Bool) where + liftSing (s :: Sing (d :: Attribute)) + = singFun1 @(AttrNotInSym1 (d :: Attribute)) (sAttrNotIn s) + instance SingI (AppendSym0 :: (~>) Schema ((~>) Schema Schema)) where + sing = singFun2 @AppendSym0 sAppend + instance SingI d => + SingI (AppendSym1 (d :: Schema) :: (~>) Schema Schema) where + sing = singFun1 @(AppendSym1 (d :: Schema)) (sAppend (sing @d)) + instance SingI1 (AppendSym1 :: Schema -> (~>) Schema Schema) where + liftSing (s :: Sing (d :: Schema)) + = singFun1 @(AppendSym1 (d :: Schema)) (sAppend s) + data SU :: U -> Type + where + SBOOL :: SU (BOOL :: U) + SSTRING :: SU (STRING :: U) + SNAT :: SU (NAT :: U) + SVEC :: forall (n :: U) (n :: Nat). + (Sing n) -> (Sing n) -> SU (VEC n n :: U) + type instance Sing @U = SU + instance SingKind U where + type Demote U = U + fromSing SBOOL = BOOL + fromSing SSTRING = STRING + fromSing SNAT = NAT + fromSing (SVEC b b) = VEC (fromSing b) (fromSing b) + toSing BOOL = SomeSing SBOOL + toSing STRING = SomeSing SSTRING + toSing NAT = SomeSing SNAT + toSing (VEC (b :: Demote U) (b :: Demote Nat)) + = case (,) (toSing b :: SomeSing U) (toSing b :: SomeSing Nat) of + (,) (SomeSing c) (SomeSing c) -> SomeSing (SVEC c c) + data SAChar :: AChar -> Type + where + SCA :: SAChar (CA :: AChar) + SCB :: SAChar (CB :: AChar) + SCC :: SAChar (CC :: AChar) + SCD :: SAChar (CD :: AChar) + SCE :: SAChar (CE :: AChar) + SCF :: SAChar (CF :: AChar) + SCG :: SAChar (CG :: AChar) + SCH :: SAChar (CH :: AChar) + SCI :: SAChar (CI :: AChar) + SCJ :: SAChar (CJ :: AChar) + SCK :: SAChar (CK :: AChar) + SCL :: SAChar (CL :: AChar) + SCM :: SAChar (CM :: AChar) + SCN :: SAChar (CN :: AChar) + SCO :: SAChar (CO :: AChar) + SCP :: SAChar (CP :: AChar) + SCQ :: SAChar (CQ :: AChar) + SCR :: SAChar (CR :: AChar) + SCS :: SAChar (CS :: AChar) + SCT :: SAChar (CT :: AChar) + SCU :: SAChar (CU :: AChar) + SCV :: SAChar (CV :: AChar) + SCW :: SAChar (CW :: AChar) + SCX :: SAChar (CX :: AChar) + SCY :: SAChar (CY :: AChar) + SCZ :: SAChar (CZ :: AChar) + type instance Sing @AChar = SAChar + instance SingKind AChar where + type Demote AChar = AChar + fromSing SCA = CA + fromSing SCB = CB + fromSing SCC = CC + fromSing SCD = CD + fromSing SCE = CE + fromSing SCF = CF + fromSing SCG = CG + fromSing SCH = CH + fromSing SCI = CI + fromSing SCJ = CJ + fromSing SCK = CK + fromSing SCL = CL + fromSing SCM = CM + fromSing SCN = CN + fromSing SCO = CO + fromSing SCP = CP + fromSing SCQ = CQ + fromSing SCR = CR + fromSing SCS = CS + fromSing SCT = CT + fromSing SCU = CU + fromSing SCV = CV + fromSing SCW = CW + fromSing SCX = CX + fromSing SCY = CY + fromSing SCZ = CZ + toSing CA = SomeSing SCA + toSing CB = SomeSing SCB + toSing CC = SomeSing SCC + toSing CD = SomeSing SCD + toSing CE = SomeSing SCE + toSing CF = SomeSing SCF + toSing CG = SomeSing SCG + toSing CH = SomeSing SCH + toSing CI = SomeSing SCI + toSing CJ = SomeSing SCJ + toSing CK = SomeSing SCK + toSing CL = SomeSing SCL + toSing CM = SomeSing SCM + toSing CN = SomeSing SCN + toSing CO = SomeSing SCO + toSing CP = SomeSing SCP + toSing CQ = SomeSing SCQ + toSing CR = SomeSing SCR + toSing CS = SomeSing SCS + toSing CT = SomeSing SCT + toSing CU = SomeSing SCU + toSing CV = SomeSing SCV + toSing CW = SomeSing SCW + toSing CX = SomeSing SCX + toSing CY = SomeSing SCY + toSing CZ = SomeSing SCZ + data SAttribute :: Attribute -> Type + where + SAttr :: forall (n :: [AChar]) (n :: U). + (Sing n) -> (Sing n) -> SAttribute (Attr n n :: Attribute) + type instance Sing @Attribute = SAttribute + instance SingKind Attribute where + type Demote Attribute = Attribute + fromSing (SAttr b b) = Attr (fromSing b) (fromSing b) + toSing (Attr (b :: Demote [AChar]) (b :: Demote U)) + = case + (,) (toSing b :: SomeSing [AChar]) (toSing b :: SomeSing U) + of + (,) (SomeSing c) (SomeSing c) -> SomeSing (SAttr c c) + data SSchema :: Schema -> Type + where + SSch :: forall (n :: [Attribute]). + (Sing n) -> SSchema (Sch n :: Schema) + type instance Sing @Schema = SSchema + instance SingKind Schema where + type Demote Schema = Schema + fromSing (SSch b) = Sch (fromSing b) + toSing (Sch (b :: Demote [Attribute])) + = case toSing b :: SomeSing [Attribute] of + SomeSing c -> SomeSing (SSch c) + instance (SEq U, SEq Nat) => SEq U where + (%==) :: + forall (t1 :: U) (t2 :: U). Sing t1 + -> Sing t2 + -> Sing (Apply (Apply ((==@#@$) :: TyFun U ((~>) U Bool) + -> Type) t1) t2) + (%==) SBOOL SBOOL = STrue + (%==) SBOOL SSTRING = SFalse + (%==) SBOOL SNAT = SFalse + (%==) SBOOL (SVEC _ _) = SFalse + (%==) SSTRING SBOOL = SFalse + (%==) SSTRING SSTRING = STrue + (%==) SSTRING SNAT = SFalse + (%==) SSTRING (SVEC _ _) = SFalse + (%==) SNAT SBOOL = SFalse + (%==) SNAT SSTRING = SFalse + (%==) SNAT SNAT = STrue + (%==) SNAT (SVEC _ _) = SFalse + (%==) (SVEC _ _) SBOOL = SFalse + (%==) (SVEC _ _) SSTRING = SFalse + (%==) (SVEC _ _) SNAT = SFalse + (%==) + (SVEC (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210)) + (SVEC (sB_0123456789876543210 :: Sing b_0123456789876543210) + (sB_0123456789876543210 :: Sing b_0123456789876543210)) + = applySing + (applySing + (singFun2 @(&&@#@$) (%&&)) + (applySing + (applySing (singFun2 @(==@#@$) (%==)) sA_0123456789876543210) + sB_0123456789876543210)) + (applySing + (applySing (singFun2 @(==@#@$) (%==)) sA_0123456789876543210) + sB_0123456789876543210) + instance (SShow U, SShow Nat) => SShow U where + sShowsPrec :: + forall (t1 :: GHC.Num.Natural.Natural) + (t2 :: U) + (t3 :: Symbol). Sing t1 + -> Sing t2 + -> Sing t3 + -> Sing (Apply (Apply (Apply (ShowsPrecSym0 :: TyFun GHC.Num.Natural.Natural ((~>) U ((~>) Symbol Symbol)) + -> Type) t1) t2) t3) + sShowsPrec + _ + SBOOL + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "BOOL")) + sA_0123456789876543210 + sShowsPrec + _ + SSTRING + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "STRING")) + sA_0123456789876543210 + sShowsPrec + _ + SNAT + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "NAT")) + sA_0123456789876543210 + sShowsPrec + (sP_0123456789876543210 :: Sing p_0123456789876543210) + (SVEC (sArg_0123456789876543210 :: Sing arg_0123456789876543210) + (sArg_0123456789876543210 :: Sing arg_0123456789876543210)) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (applySing + (singFun3 @ShowParenSym0 sShowParen) + (applySing + (applySing (singFun2 @(>@#@$) (%>)) sP_0123456789876543210) + (sFromInteger (sing :: Sing 10)))) + (applySing + (applySing + (singFun3 @(.@#@$) (%.)) + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "VEC "))) + (applySing + (applySing + (singFun3 @(.@#@$) (%.)) + (applySing + (applySing + (singFun3 @ShowsPrecSym0 sShowsPrec) + (sFromInteger (sing :: Sing 11))) + sArg_0123456789876543210)) + (applySing + (applySing + (singFun3 @(.@#@$) (%.)) (singFun1 @ShowSpaceSym0 sShowSpace)) + (applySing + (applySing + (singFun3 @ShowsPrecSym0 sShowsPrec) + (sFromInteger (sing :: Sing 11))) + sArg_0123456789876543210))))) + sA_0123456789876543210 + instance SShow AChar where + sShowsPrec :: + forall (t1 :: GHC.Num.Natural.Natural) + (t2 :: AChar) + (t3 :: Symbol). Sing t1 + -> Sing t2 + -> Sing t3 + -> Sing (Apply (Apply (Apply (ShowsPrecSym0 :: TyFun GHC.Num.Natural.Natural ((~>) AChar ((~>) Symbol Symbol)) + -> Type) t1) t2) t3) + sShowsPrec + _ + SCA + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "CA")) + sA_0123456789876543210 + sShowsPrec + _ + SCB + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "CB")) + sA_0123456789876543210 + sShowsPrec + _ + SCC + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "CC")) + sA_0123456789876543210 + sShowsPrec + _ + SCD + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "CD")) + sA_0123456789876543210 + sShowsPrec + _ + SCE + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "CE")) + sA_0123456789876543210 + sShowsPrec + _ + SCF + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "CF")) + sA_0123456789876543210 + sShowsPrec + _ + SCG + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "CG")) + sA_0123456789876543210 + sShowsPrec + _ + SCH + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "CH")) + sA_0123456789876543210 + sShowsPrec + _ + SCI + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "CI")) + sA_0123456789876543210 + sShowsPrec + _ + SCJ + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "CJ")) + sA_0123456789876543210 + sShowsPrec + _ + SCK + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "CK")) + sA_0123456789876543210 + sShowsPrec + _ + SCL + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "CL")) + sA_0123456789876543210 + sShowsPrec + _ + SCM + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "CM")) + sA_0123456789876543210 + sShowsPrec + _ + SCN + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "CN")) + sA_0123456789876543210 + sShowsPrec + _ + SCO + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "CO")) + sA_0123456789876543210 + sShowsPrec + _ + SCP + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "CP")) + sA_0123456789876543210 + sShowsPrec + _ + SCQ + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "CQ")) + sA_0123456789876543210 + sShowsPrec + _ + SCR + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "CR")) + sA_0123456789876543210 + sShowsPrec + _ + SCS + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "CS")) + sA_0123456789876543210 + sShowsPrec + _ + SCT + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "CT")) + sA_0123456789876543210 + sShowsPrec + _ + SCU + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "CU")) + sA_0123456789876543210 + sShowsPrec + _ + SCV + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "CV")) + sA_0123456789876543210 + sShowsPrec + _ + SCW + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "CW")) + sA_0123456789876543210 + sShowsPrec + _ + SCX + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "CX")) + sA_0123456789876543210 + sShowsPrec + _ + SCY + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "CY")) + sA_0123456789876543210 + sShowsPrec + _ + SCZ + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "CZ")) + sA_0123456789876543210 + instance SEq AChar where + (%==) :: + forall (t1 :: AChar) (t2 :: AChar). Sing t1 + -> Sing t2 + -> Sing (Apply (Apply ((==@#@$) :: TyFun AChar ((~>) AChar Bool) + -> Type) t1) t2) + (%==) SCA SCA = STrue + (%==) SCA SCB = SFalse + (%==) SCA SCC = SFalse + (%==) SCA SCD = SFalse + (%==) SCA SCE = SFalse + (%==) SCA SCF = SFalse + (%==) SCA SCG = SFalse + (%==) SCA SCH = SFalse + (%==) SCA SCI = SFalse + (%==) SCA SCJ = SFalse + (%==) SCA SCK = SFalse + (%==) SCA SCL = SFalse + (%==) SCA SCM = SFalse + (%==) SCA SCN = SFalse + (%==) SCA SCO = SFalse + (%==) SCA SCP = SFalse + (%==) SCA SCQ = SFalse + (%==) SCA SCR = SFalse + (%==) SCA SCS = SFalse + (%==) SCA SCT = SFalse + (%==) SCA SCU = SFalse + (%==) SCA SCV = SFalse + (%==) SCA SCW = SFalse + (%==) SCA SCX = SFalse + (%==) SCA SCY = SFalse + (%==) SCA SCZ = SFalse + (%==) SCB SCA = SFalse + (%==) SCB SCB = STrue + (%==) SCB SCC = SFalse + (%==) SCB SCD = SFalse + (%==) SCB SCE = SFalse + (%==) SCB SCF = SFalse + (%==) SCB SCG = SFalse + (%==) SCB SCH = SFalse + (%==) SCB SCI = SFalse + (%==) SCB SCJ = SFalse + (%==) SCB SCK = SFalse + (%==) SCB SCL = SFalse + (%==) SCB SCM = SFalse + (%==) SCB SCN = SFalse + (%==) SCB SCO = SFalse + (%==) SCB SCP = SFalse + (%==) SCB SCQ = SFalse + (%==) SCB SCR = SFalse + (%==) SCB SCS = SFalse + (%==) SCB SCT = SFalse + (%==) SCB SCU = SFalse + (%==) SCB SCV = SFalse + (%==) SCB SCW = SFalse + (%==) SCB SCX = SFalse + (%==) SCB SCY = SFalse + (%==) SCB SCZ = SFalse + (%==) SCC SCA = SFalse + (%==) SCC SCB = SFalse + (%==) SCC SCC = STrue + (%==) SCC SCD = SFalse + (%==) SCC SCE = SFalse + (%==) SCC SCF = SFalse + (%==) SCC SCG = SFalse + (%==) SCC SCH = SFalse + (%==) SCC SCI = SFalse + (%==) SCC SCJ = SFalse + (%==) SCC SCK = SFalse + (%==) SCC SCL = SFalse + (%==) SCC SCM = SFalse + (%==) SCC SCN = SFalse + (%==) SCC SCO = SFalse + (%==) SCC SCP = SFalse + (%==) SCC SCQ = SFalse + (%==) SCC SCR = SFalse + (%==) SCC SCS = SFalse + (%==) SCC SCT = SFalse + (%==) SCC SCU = SFalse + (%==) SCC SCV = SFalse + (%==) SCC SCW = SFalse + (%==) SCC SCX = SFalse + (%==) SCC SCY = SFalse + (%==) SCC SCZ = SFalse + (%==) SCD SCA = SFalse + (%==) SCD SCB = SFalse + (%==) SCD SCC = SFalse + (%==) SCD SCD = STrue + (%==) SCD SCE = SFalse + (%==) SCD SCF = SFalse + (%==) SCD SCG = SFalse + (%==) SCD SCH = SFalse + (%==) SCD SCI = SFalse + (%==) SCD SCJ = SFalse + (%==) SCD SCK = SFalse + (%==) SCD SCL = SFalse + (%==) SCD SCM = SFalse + (%==) SCD SCN = SFalse + (%==) SCD SCO = SFalse + (%==) SCD SCP = SFalse + (%==) SCD SCQ = SFalse + (%==) SCD SCR = SFalse + (%==) SCD SCS = SFalse + (%==) SCD SCT = SFalse + (%==) SCD SCU = SFalse + (%==) SCD SCV = SFalse + (%==) SCD SCW = SFalse + (%==) SCD SCX = SFalse + (%==) SCD SCY = SFalse + (%==) SCD SCZ = SFalse + (%==) SCE SCA = SFalse + (%==) SCE SCB = SFalse + (%==) SCE SCC = SFalse + (%==) SCE SCD = SFalse + (%==) SCE SCE = STrue + (%==) SCE SCF = SFalse + (%==) SCE SCG = SFalse + (%==) SCE SCH = SFalse + (%==) SCE SCI = SFalse + (%==) SCE SCJ = SFalse + (%==) SCE SCK = SFalse + (%==) SCE SCL = SFalse + (%==) SCE SCM = SFalse + (%==) SCE SCN = SFalse + (%==) SCE SCO = SFalse + (%==) SCE SCP = SFalse + (%==) SCE SCQ = SFalse + (%==) SCE SCR = SFalse + (%==) SCE SCS = SFalse + (%==) SCE SCT = SFalse + (%==) SCE SCU = SFalse + (%==) SCE SCV = SFalse + (%==) SCE SCW = SFalse + (%==) SCE SCX = SFalse + (%==) SCE SCY = SFalse + (%==) SCE SCZ = SFalse + (%==) SCF SCA = SFalse + (%==) SCF SCB = SFalse + (%==) SCF SCC = SFalse + (%==) SCF SCD = SFalse + (%==) SCF SCE = SFalse + (%==) SCF SCF = STrue + (%==) SCF SCG = SFalse + (%==) SCF SCH = SFalse + (%==) SCF SCI = SFalse + (%==) SCF SCJ = SFalse + (%==) SCF SCK = SFalse + (%==) SCF SCL = SFalse + (%==) SCF SCM = SFalse + (%==) SCF SCN = SFalse + (%==) SCF SCO = SFalse + (%==) SCF SCP = SFalse + (%==) SCF SCQ = SFalse + (%==) SCF SCR = SFalse + (%==) SCF SCS = SFalse + (%==) SCF SCT = SFalse + (%==) SCF SCU = SFalse + (%==) SCF SCV = SFalse + (%==) SCF SCW = SFalse + (%==) SCF SCX = SFalse + (%==) SCF SCY = SFalse + (%==) SCF SCZ = SFalse + (%==) SCG SCA = SFalse + (%==) SCG SCB = SFalse + (%==) SCG SCC = SFalse + (%==) SCG SCD = SFalse + (%==) SCG SCE = SFalse + (%==) SCG SCF = SFalse + (%==) SCG SCG = STrue + (%==) SCG SCH = SFalse + (%==) SCG SCI = SFalse + (%==) SCG SCJ = SFalse + (%==) SCG SCK = SFalse + (%==) SCG SCL = SFalse + (%==) SCG SCM = SFalse + (%==) SCG SCN = SFalse + (%==) SCG SCO = SFalse + (%==) SCG SCP = SFalse + (%==) SCG SCQ = SFalse + (%==) SCG SCR = SFalse + (%==) SCG SCS = SFalse + (%==) SCG SCT = SFalse + (%==) SCG SCU = SFalse + (%==) SCG SCV = SFalse + (%==) SCG SCW = SFalse + (%==) SCG SCX = SFalse + (%==) SCG SCY = SFalse + (%==) SCG SCZ = SFalse + (%==) SCH SCA = SFalse + (%==) SCH SCB = SFalse + (%==) SCH SCC = SFalse + (%==) SCH SCD = SFalse + (%==) SCH SCE = SFalse + (%==) SCH SCF = SFalse + (%==) SCH SCG = SFalse + (%==) SCH SCH = STrue + (%==) SCH SCI = SFalse + (%==) SCH SCJ = SFalse + (%==) SCH SCK = SFalse + (%==) SCH SCL = SFalse + (%==) SCH SCM = SFalse + (%==) SCH SCN = SFalse + (%==) SCH SCO = SFalse + (%==) SCH SCP = SFalse + (%==) SCH SCQ = SFalse + (%==) SCH SCR = SFalse + (%==) SCH SCS = SFalse + (%==) SCH SCT = SFalse + (%==) SCH SCU = SFalse + (%==) SCH SCV = SFalse + (%==) SCH SCW = SFalse + (%==) SCH SCX = SFalse + (%==) SCH SCY = SFalse + (%==) SCH SCZ = SFalse + (%==) SCI SCA = SFalse + (%==) SCI SCB = SFalse + (%==) SCI SCC = SFalse + (%==) SCI SCD = SFalse + (%==) SCI SCE = SFalse + (%==) SCI SCF = SFalse + (%==) SCI SCG = SFalse + (%==) SCI SCH = SFalse + (%==) SCI SCI = STrue + (%==) SCI SCJ = SFalse + (%==) SCI SCK = SFalse + (%==) SCI SCL = SFalse + (%==) SCI SCM = SFalse + (%==) SCI SCN = SFalse + (%==) SCI SCO = SFalse + (%==) SCI SCP = SFalse + (%==) SCI SCQ = SFalse + (%==) SCI SCR = SFalse + (%==) SCI SCS = SFalse + (%==) SCI SCT = SFalse + (%==) SCI SCU = SFalse + (%==) SCI SCV = SFalse + (%==) SCI SCW = SFalse + (%==) SCI SCX = SFalse + (%==) SCI SCY = SFalse + (%==) SCI SCZ = SFalse + (%==) SCJ SCA = SFalse + (%==) SCJ SCB = SFalse + (%==) SCJ SCC = SFalse + (%==) SCJ SCD = SFalse + (%==) SCJ SCE = SFalse + (%==) SCJ SCF = SFalse + (%==) SCJ SCG = SFalse + (%==) SCJ SCH = SFalse + (%==) SCJ SCI = SFalse + (%==) SCJ SCJ = STrue + (%==) SCJ SCK = SFalse + (%==) SCJ SCL = SFalse + (%==) SCJ SCM = SFalse + (%==) SCJ SCN = SFalse + (%==) SCJ SCO = SFalse + (%==) SCJ SCP = SFalse + (%==) SCJ SCQ = SFalse + (%==) SCJ SCR = SFalse + (%==) SCJ SCS = SFalse + (%==) SCJ SCT = SFalse + (%==) SCJ SCU = SFalse + (%==) SCJ SCV = SFalse + (%==) SCJ SCW = SFalse + (%==) SCJ SCX = SFalse + (%==) SCJ SCY = SFalse + (%==) SCJ SCZ = SFalse + (%==) SCK SCA = SFalse + (%==) SCK SCB = SFalse + (%==) SCK SCC = SFalse + (%==) SCK SCD = SFalse + (%==) SCK SCE = SFalse + (%==) SCK SCF = SFalse + (%==) SCK SCG = SFalse + (%==) SCK SCH = SFalse + (%==) SCK SCI = SFalse + (%==) SCK SCJ = SFalse + (%==) SCK SCK = STrue + (%==) SCK SCL = SFalse + (%==) SCK SCM = SFalse + (%==) SCK SCN = SFalse + (%==) SCK SCO = SFalse + (%==) SCK SCP = SFalse + (%==) SCK SCQ = SFalse + (%==) SCK SCR = SFalse + (%==) SCK SCS = SFalse + (%==) SCK SCT = SFalse + (%==) SCK SCU = SFalse + (%==) SCK SCV = SFalse + (%==) SCK SCW = SFalse + (%==) SCK SCX = SFalse + (%==) SCK SCY = SFalse + (%==) SCK SCZ = SFalse + (%==) SCL SCA = SFalse + (%==) SCL SCB = SFalse + (%==) SCL SCC = SFalse + (%==) SCL SCD = SFalse + (%==) SCL SCE = SFalse + (%==) SCL SCF = SFalse + (%==) SCL SCG = SFalse + (%==) SCL SCH = SFalse + (%==) SCL SCI = SFalse + (%==) SCL SCJ = SFalse + (%==) SCL SCK = SFalse + (%==) SCL SCL = STrue + (%==) SCL SCM = SFalse + (%==) SCL SCN = SFalse + (%==) SCL SCO = SFalse + (%==) SCL SCP = SFalse + (%==) SCL SCQ = SFalse + (%==) SCL SCR = SFalse + (%==) SCL SCS = SFalse + (%==) SCL SCT = SFalse + (%==) SCL SCU = SFalse + (%==) SCL SCV = SFalse + (%==) SCL SCW = SFalse + (%==) SCL SCX = SFalse + (%==) SCL SCY = SFalse + (%==) SCL SCZ = SFalse + (%==) SCM SCA = SFalse + (%==) SCM SCB = SFalse + (%==) SCM SCC = SFalse + (%==) SCM SCD = SFalse + (%==) SCM SCE = SFalse + (%==) SCM SCF = SFalse + (%==) SCM SCG = SFalse + (%==) SCM SCH = SFalse + (%==) SCM SCI = SFalse + (%==) SCM SCJ = SFalse + (%==) SCM SCK = SFalse + (%==) SCM SCL = SFalse + (%==) SCM SCM = STrue + (%==) SCM SCN = SFalse + (%==) SCM SCO = SFalse + (%==) SCM SCP = SFalse + (%==) SCM SCQ = SFalse + (%==) SCM SCR = SFalse + (%==) SCM SCS = SFalse + (%==) SCM SCT = SFalse + (%==) SCM SCU = SFalse + (%==) SCM SCV = SFalse + (%==) SCM SCW = SFalse + (%==) SCM SCX = SFalse + (%==) SCM SCY = SFalse + (%==) SCM SCZ = SFalse + (%==) SCN SCA = SFalse + (%==) SCN SCB = SFalse + (%==) SCN SCC = SFalse + (%==) SCN SCD = SFalse + (%==) SCN SCE = SFalse + (%==) SCN SCF = SFalse + (%==) SCN SCG = SFalse + (%==) SCN SCH = SFalse + (%==) SCN SCI = SFalse + (%==) SCN SCJ = SFalse + (%==) SCN SCK = SFalse + (%==) SCN SCL = SFalse + (%==) SCN SCM = SFalse + (%==) SCN SCN = STrue + (%==) SCN SCO = SFalse + (%==) SCN SCP = SFalse + (%==) SCN SCQ = SFalse + (%==) SCN SCR = SFalse + (%==) SCN SCS = SFalse + (%==) SCN SCT = SFalse + (%==) SCN SCU = SFalse + (%==) SCN SCV = SFalse + (%==) SCN SCW = SFalse + (%==) SCN SCX = SFalse + (%==) SCN SCY = SFalse + (%==) SCN SCZ = SFalse + (%==) SCO SCA = SFalse + (%==) SCO SCB = SFalse + (%==) SCO SCC = SFalse + (%==) SCO SCD = SFalse + (%==) SCO SCE = SFalse + (%==) SCO SCF = SFalse + (%==) SCO SCG = SFalse + (%==) SCO SCH = SFalse + (%==) SCO SCI = SFalse + (%==) SCO SCJ = SFalse + (%==) SCO SCK = SFalse + (%==) SCO SCL = SFalse + (%==) SCO SCM = SFalse + (%==) SCO SCN = SFalse + (%==) SCO SCO = STrue + (%==) SCO SCP = SFalse + (%==) SCO SCQ = SFalse + (%==) SCO SCR = SFalse + (%==) SCO SCS = SFalse + (%==) SCO SCT = SFalse + (%==) SCO SCU = SFalse + (%==) SCO SCV = SFalse + (%==) SCO SCW = SFalse + (%==) SCO SCX = SFalse + (%==) SCO SCY = SFalse + (%==) SCO SCZ = SFalse + (%==) SCP SCA = SFalse + (%==) SCP SCB = SFalse + (%==) SCP SCC = SFalse + (%==) SCP SCD = SFalse + (%==) SCP SCE = SFalse + (%==) SCP SCF = SFalse + (%==) SCP SCG = SFalse + (%==) SCP SCH = SFalse + (%==) SCP SCI = SFalse + (%==) SCP SCJ = SFalse + (%==) SCP SCK = SFalse + (%==) SCP SCL = SFalse + (%==) SCP SCM = SFalse + (%==) SCP SCN = SFalse + (%==) SCP SCO = SFalse + (%==) SCP SCP = STrue + (%==) SCP SCQ = SFalse + (%==) SCP SCR = SFalse + (%==) SCP SCS = SFalse + (%==) SCP SCT = SFalse + (%==) SCP SCU = SFalse + (%==) SCP SCV = SFalse + (%==) SCP SCW = SFalse + (%==) SCP SCX = SFalse + (%==) SCP SCY = SFalse + (%==) SCP SCZ = SFalse + (%==) SCQ SCA = SFalse + (%==) SCQ SCB = SFalse + (%==) SCQ SCC = SFalse + (%==) SCQ SCD = SFalse + (%==) SCQ SCE = SFalse + (%==) SCQ SCF = SFalse + (%==) SCQ SCG = SFalse + (%==) SCQ SCH = SFalse + (%==) SCQ SCI = SFalse + (%==) SCQ SCJ = SFalse + (%==) SCQ SCK = SFalse + (%==) SCQ SCL = SFalse + (%==) SCQ SCM = SFalse + (%==) SCQ SCN = SFalse + (%==) SCQ SCO = SFalse + (%==) SCQ SCP = SFalse + (%==) SCQ SCQ = STrue + (%==) SCQ SCR = SFalse + (%==) SCQ SCS = SFalse + (%==) SCQ SCT = SFalse + (%==) SCQ SCU = SFalse + (%==) SCQ SCV = SFalse + (%==) SCQ SCW = SFalse + (%==) SCQ SCX = SFalse + (%==) SCQ SCY = SFalse + (%==) SCQ SCZ = SFalse + (%==) SCR SCA = SFalse + (%==) SCR SCB = SFalse + (%==) SCR SCC = SFalse + (%==) SCR SCD = SFalse + (%==) SCR SCE = SFalse + (%==) SCR SCF = SFalse + (%==) SCR SCG = SFalse + (%==) SCR SCH = SFalse + (%==) SCR SCI = SFalse + (%==) SCR SCJ = SFalse + (%==) SCR SCK = SFalse + (%==) SCR SCL = SFalse + (%==) SCR SCM = SFalse + (%==) SCR SCN = SFalse + (%==) SCR SCO = SFalse + (%==) SCR SCP = SFalse + (%==) SCR SCQ = SFalse + (%==) SCR SCR = STrue + (%==) SCR SCS = SFalse + (%==) SCR SCT = SFalse + (%==) SCR SCU = SFalse + (%==) SCR SCV = SFalse + (%==) SCR SCW = SFalse + (%==) SCR SCX = SFalse + (%==) SCR SCY = SFalse + (%==) SCR SCZ = SFalse + (%==) SCS SCA = SFalse + (%==) SCS SCB = SFalse + (%==) SCS SCC = SFalse + (%==) SCS SCD = SFalse + (%==) SCS SCE = SFalse + (%==) SCS SCF = SFalse + (%==) SCS SCG = SFalse + (%==) SCS SCH = SFalse + (%==) SCS SCI = SFalse + (%==) SCS SCJ = SFalse + (%==) SCS SCK = SFalse + (%==) SCS SCL = SFalse + (%==) SCS SCM = SFalse + (%==) SCS SCN = SFalse + (%==) SCS SCO = SFalse + (%==) SCS SCP = SFalse + (%==) SCS SCQ = SFalse + (%==) SCS SCR = SFalse + (%==) SCS SCS = STrue + (%==) SCS SCT = SFalse + (%==) SCS SCU = SFalse + (%==) SCS SCV = SFalse + (%==) SCS SCW = SFalse + (%==) SCS SCX = SFalse + (%==) SCS SCY = SFalse + (%==) SCS SCZ = SFalse + (%==) SCT SCA = SFalse + (%==) SCT SCB = SFalse + (%==) SCT SCC = SFalse + (%==) SCT SCD = SFalse + (%==) SCT SCE = SFalse + (%==) SCT SCF = SFalse + (%==) SCT SCG = SFalse + (%==) SCT SCH = SFalse + (%==) SCT SCI = SFalse + (%==) SCT SCJ = SFalse + (%==) SCT SCK = SFalse + (%==) SCT SCL = SFalse + (%==) SCT SCM = SFalse + (%==) SCT SCN = SFalse + (%==) SCT SCO = SFalse + (%==) SCT SCP = SFalse + (%==) SCT SCQ = SFalse + (%==) SCT SCR = SFalse + (%==) SCT SCS = SFalse + (%==) SCT SCT = STrue + (%==) SCT SCU = SFalse + (%==) SCT SCV = SFalse + (%==) SCT SCW = SFalse + (%==) SCT SCX = SFalse + (%==) SCT SCY = SFalse + (%==) SCT SCZ = SFalse + (%==) SCU SCA = SFalse + (%==) SCU SCB = SFalse + (%==) SCU SCC = SFalse + (%==) SCU SCD = SFalse + (%==) SCU SCE = SFalse + (%==) SCU SCF = SFalse + (%==) SCU SCG = SFalse + (%==) SCU SCH = SFalse + (%==) SCU SCI = SFalse + (%==) SCU SCJ = SFalse + (%==) SCU SCK = SFalse + (%==) SCU SCL = SFalse + (%==) SCU SCM = SFalse + (%==) SCU SCN = SFalse + (%==) SCU SCO = SFalse + (%==) SCU SCP = SFalse + (%==) SCU SCQ = SFalse + (%==) SCU SCR = SFalse + (%==) SCU SCS = SFalse + (%==) SCU SCT = SFalse + (%==) SCU SCU = STrue + (%==) SCU SCV = SFalse + (%==) SCU SCW = SFalse + (%==) SCU SCX = SFalse + (%==) SCU SCY = SFalse + (%==) SCU SCZ = SFalse + (%==) SCV SCA = SFalse + (%==) SCV SCB = SFalse + (%==) SCV SCC = SFalse + (%==) SCV SCD = SFalse + (%==) SCV SCE = SFalse + (%==) SCV SCF = SFalse + (%==) SCV SCG = SFalse + (%==) SCV SCH = SFalse + (%==) SCV SCI = SFalse + (%==) SCV SCJ = SFalse + (%==) SCV SCK = SFalse + (%==) SCV SCL = SFalse + (%==) SCV SCM = SFalse + (%==) SCV SCN = SFalse + (%==) SCV SCO = SFalse + (%==) SCV SCP = SFalse + (%==) SCV SCQ = SFalse + (%==) SCV SCR = SFalse + (%==) SCV SCS = SFalse + (%==) SCV SCT = SFalse + (%==) SCV SCU = SFalse + (%==) SCV SCV = STrue + (%==) SCV SCW = SFalse + (%==) SCV SCX = SFalse + (%==) SCV SCY = SFalse + (%==) SCV SCZ = SFalse + (%==) SCW SCA = SFalse + (%==) SCW SCB = SFalse + (%==) SCW SCC = SFalse + (%==) SCW SCD = SFalse + (%==) SCW SCE = SFalse + (%==) SCW SCF = SFalse + (%==) SCW SCG = SFalse + (%==) SCW SCH = SFalse + (%==) SCW SCI = SFalse + (%==) SCW SCJ = SFalse + (%==) SCW SCK = SFalse + (%==) SCW SCL = SFalse + (%==) SCW SCM = SFalse + (%==) SCW SCN = SFalse + (%==) SCW SCO = SFalse + (%==) SCW SCP = SFalse + (%==) SCW SCQ = SFalse + (%==) SCW SCR = SFalse + (%==) SCW SCS = SFalse + (%==) SCW SCT = SFalse + (%==) SCW SCU = SFalse + (%==) SCW SCV = SFalse + (%==) SCW SCW = STrue + (%==) SCW SCX = SFalse + (%==) SCW SCY = SFalse + (%==) SCW SCZ = SFalse + (%==) SCX SCA = SFalse + (%==) SCX SCB = SFalse + (%==) SCX SCC = SFalse + (%==) SCX SCD = SFalse + (%==) SCX SCE = SFalse + (%==) SCX SCF = SFalse + (%==) SCX SCG = SFalse + (%==) SCX SCH = SFalse + (%==) SCX SCI = SFalse + (%==) SCX SCJ = SFalse + (%==) SCX SCK = SFalse + (%==) SCX SCL = SFalse + (%==) SCX SCM = SFalse + (%==) SCX SCN = SFalse + (%==) SCX SCO = SFalse + (%==) SCX SCP = SFalse + (%==) SCX SCQ = SFalse + (%==) SCX SCR = SFalse + (%==) SCX SCS = SFalse + (%==) SCX SCT = SFalse + (%==) SCX SCU = SFalse + (%==) SCX SCV = SFalse + (%==) SCX SCW = SFalse + (%==) SCX SCX = STrue + (%==) SCX SCY = SFalse + (%==) SCX SCZ = SFalse + (%==) SCY SCA = SFalse + (%==) SCY SCB = SFalse + (%==) SCY SCC = SFalse + (%==) SCY SCD = SFalse + (%==) SCY SCE = SFalse + (%==) SCY SCF = SFalse + (%==) SCY SCG = SFalse + (%==) SCY SCH = SFalse + (%==) SCY SCI = SFalse + (%==) SCY SCJ = SFalse + (%==) SCY SCK = SFalse + (%==) SCY SCL = SFalse + (%==) SCY SCM = SFalse + (%==) SCY SCN = SFalse + (%==) SCY SCO = SFalse + (%==) SCY SCP = SFalse + (%==) SCY SCQ = SFalse + (%==) SCY SCR = SFalse + (%==) SCY SCS = SFalse + (%==) SCY SCT = SFalse + (%==) SCY SCU = SFalse + (%==) SCY SCV = SFalse + (%==) SCY SCW = SFalse + (%==) SCY SCX = SFalse + (%==) SCY SCY = STrue + (%==) SCY SCZ = SFalse + (%==) SCZ SCA = SFalse + (%==) SCZ SCB = SFalse + (%==) SCZ SCC = SFalse + (%==) SCZ SCD = SFalse + (%==) SCZ SCE = SFalse + (%==) SCZ SCF = SFalse + (%==) SCZ SCG = SFalse + (%==) SCZ SCH = SFalse + (%==) SCZ SCI = SFalse + (%==) SCZ SCJ = SFalse + (%==) SCZ SCK = SFalse + (%==) SCZ SCL = SFalse + (%==) SCZ SCM = SFalse + (%==) SCZ SCN = SFalse + (%==) SCZ SCO = SFalse + (%==) SCZ SCP = SFalse + (%==) SCZ SCQ = SFalse + (%==) SCZ SCR = SFalse + (%==) SCZ SCS = SFalse + (%==) SCZ SCT = SFalse + (%==) SCZ SCU = SFalse + (%==) SCZ SCV = SFalse + (%==) SCZ SCW = SFalse + (%==) SCZ SCX = SFalse + (%==) SCZ SCY = SFalse + (%==) SCZ SCZ = STrue + instance (SDecide U, SDecide Nat) => SDecide U where + (%~) SBOOL SBOOL = Proved Refl + (%~) SBOOL SSTRING = Disproved (\ x -> case x of {}) + (%~) SBOOL SNAT = Disproved (\ x -> case x of {}) + (%~) SBOOL (SVEC _ _) = Disproved (\ x -> case x of {}) + (%~) SSTRING SBOOL = Disproved (\ x -> case x of {}) + (%~) SSTRING SSTRING = Proved Refl + (%~) SSTRING SNAT = Disproved (\ x -> case x of {}) + (%~) SSTRING (SVEC _ _) = Disproved (\ x -> case x of {}) + (%~) SNAT SBOOL = Disproved (\ x -> case x of {}) + (%~) SNAT SSTRING = Disproved (\ x -> case x of {}) + (%~) SNAT SNAT = Proved Refl + (%~) SNAT (SVEC _ _) = Disproved (\ x -> case x of {}) + (%~) (SVEC _ _) SBOOL = Disproved (\ x -> case x of {}) + (%~) (SVEC _ _) SSTRING = Disproved (\ x -> case x of {}) + (%~) (SVEC _ _) SNAT = Disproved (\ x -> case x of {}) + (%~) (SVEC a a) (SVEC b b) + = case (,) ((%~) a b) ((%~) a b) of + (,) (Proved Refl) (Proved Refl) -> Proved Refl + (,) (Disproved contra) _ + -> Disproved (\ refl -> case refl of Refl -> contra Refl) + (,) _ (Disproved contra) + -> Disproved (\ refl -> case refl of Refl -> contra Refl) + instance (SDecide U, SDecide Nat) => + Data.Type.Equality.TestEquality (SU :: U -> Type) where + Data.Type.Equality.testEquality + = Data.Singletons.Decide.decideEquality + instance (SDecide U, SDecide Nat) => + Data.Type.Coercion.TestCoercion (SU :: U -> Type) where + Data.Type.Coercion.testCoercion + = Data.Singletons.Decide.decideCoercion + instance SDecide AChar where + (%~) SCA SCA = Proved Refl + (%~) SCA SCB = Disproved (\ x -> case x of {}) + (%~) SCA SCC = Disproved (\ x -> case x of {}) + (%~) SCA SCD = Disproved (\ x -> case x of {}) + (%~) SCA SCE = Disproved (\ x -> case x of {}) + (%~) SCA SCF = Disproved (\ x -> case x of {}) + (%~) SCA SCG = Disproved (\ x -> case x of {}) + (%~) SCA SCH = Disproved (\ x -> case x of {}) + (%~) SCA SCI = Disproved (\ x -> case x of {}) + (%~) SCA SCJ = Disproved (\ x -> case x of {}) + (%~) SCA SCK = Disproved (\ x -> case x of {}) + (%~) SCA SCL = Disproved (\ x -> case x of {}) + (%~) SCA SCM = Disproved (\ x -> case x of {}) + (%~) SCA SCN = Disproved (\ x -> case x of {}) + (%~) SCA SCO = Disproved (\ x -> case x of {}) + (%~) SCA SCP = Disproved (\ x -> case x of {}) + (%~) SCA SCQ = Disproved (\ x -> case x of {}) + (%~) SCA SCR = Disproved (\ x -> case x of {}) + (%~) SCA SCS = Disproved (\ x -> case x of {}) + (%~) SCA SCT = Disproved (\ x -> case x of {}) + (%~) SCA SCU = Disproved (\ x -> case x of {}) + (%~) SCA SCV = Disproved (\ x -> case x of {}) + (%~) SCA SCW = Disproved (\ x -> case x of {}) + (%~) SCA SCX = Disproved (\ x -> case x of {}) + (%~) SCA SCY = Disproved (\ x -> case x of {}) + (%~) SCA SCZ = Disproved (\ x -> case x of {}) + (%~) SCB SCA = Disproved (\ x -> case x of {}) + (%~) SCB SCB = Proved Refl + (%~) SCB SCC = Disproved (\ x -> case x of {}) + (%~) SCB SCD = Disproved (\ x -> case x of {}) + (%~) SCB SCE = Disproved (\ x -> case x of {}) + (%~) SCB SCF = Disproved (\ x -> case x of {}) + (%~) SCB SCG = Disproved (\ x -> case x of {}) + (%~) SCB SCH = Disproved (\ x -> case x of {}) + (%~) SCB SCI = Disproved (\ x -> case x of {}) + (%~) SCB SCJ = Disproved (\ x -> case x of {}) + (%~) SCB SCK = Disproved (\ x -> case x of {}) + (%~) SCB SCL = Disproved (\ x -> case x of {}) + (%~) SCB SCM = Disproved (\ x -> case x of {}) + (%~) SCB SCN = Disproved (\ x -> case x of {}) + (%~) SCB SCO = Disproved (\ x -> case x of {}) + (%~) SCB SCP = Disproved (\ x -> case x of {}) + (%~) SCB SCQ = Disproved (\ x -> case x of {}) + (%~) SCB SCR = Disproved (\ x -> case x of {}) + (%~) SCB SCS = Disproved (\ x -> case x of {}) + (%~) SCB SCT = Disproved (\ x -> case x of {}) + (%~) SCB SCU = Disproved (\ x -> case x of {}) + (%~) SCB SCV = Disproved (\ x -> case x of {}) + (%~) SCB SCW = Disproved (\ x -> case x of {}) + (%~) SCB SCX = Disproved (\ x -> case x of {}) + (%~) SCB SCY = Disproved (\ x -> case x of {}) + (%~) SCB SCZ = Disproved (\ x -> case x of {}) + (%~) SCC SCA = Disproved (\ x -> case x of {}) + (%~) SCC SCB = Disproved (\ x -> case x of {}) + (%~) SCC SCC = Proved Refl + (%~) SCC SCD = Disproved (\ x -> case x of {}) + (%~) SCC SCE = Disproved (\ x -> case x of {}) + (%~) SCC SCF = Disproved (\ x -> case x of {}) + (%~) SCC SCG = Disproved (\ x -> case x of {}) + (%~) SCC SCH = Disproved (\ x -> case x of {}) + (%~) SCC SCI = Disproved (\ x -> case x of {}) + (%~) SCC SCJ = Disproved (\ x -> case x of {}) + (%~) SCC SCK = Disproved (\ x -> case x of {}) + (%~) SCC SCL = Disproved (\ x -> case x of {}) + (%~) SCC SCM = Disproved (\ x -> case x of {}) + (%~) SCC SCN = Disproved (\ x -> case x of {}) + (%~) SCC SCO = Disproved (\ x -> case x of {}) + (%~) SCC SCP = Disproved (\ x -> case x of {}) + (%~) SCC SCQ = Disproved (\ x -> case x of {}) + (%~) SCC SCR = Disproved (\ x -> case x of {}) + (%~) SCC SCS = Disproved (\ x -> case x of {}) + (%~) SCC SCT = Disproved (\ x -> case x of {}) + (%~) SCC SCU = Disproved (\ x -> case x of {}) + (%~) SCC SCV = Disproved (\ x -> case x of {}) + (%~) SCC SCW = Disproved (\ x -> case x of {}) + (%~) SCC SCX = Disproved (\ x -> case x of {}) + (%~) SCC SCY = Disproved (\ x -> case x of {}) + (%~) SCC SCZ = Disproved (\ x -> case x of {}) + (%~) SCD SCA = Disproved (\ x -> case x of {}) + (%~) SCD SCB = Disproved (\ x -> case x of {}) + (%~) SCD SCC = Disproved (\ x -> case x of {}) + (%~) SCD SCD = Proved Refl + (%~) SCD SCE = Disproved (\ x -> case x of {}) + (%~) SCD SCF = Disproved (\ x -> case x of {}) + (%~) SCD SCG = Disproved (\ x -> case x of {}) + (%~) SCD SCH = Disproved (\ x -> case x of {}) + (%~) SCD SCI = Disproved (\ x -> case x of {}) + (%~) SCD SCJ = Disproved (\ x -> case x of {}) + (%~) SCD SCK = Disproved (\ x -> case x of {}) + (%~) SCD SCL = Disproved (\ x -> case x of {}) + (%~) SCD SCM = Disproved (\ x -> case x of {}) + (%~) SCD SCN = Disproved (\ x -> case x of {}) + (%~) SCD SCO = Disproved (\ x -> case x of {}) + (%~) SCD SCP = Disproved (\ x -> case x of {}) + (%~) SCD SCQ = Disproved (\ x -> case x of {}) + (%~) SCD SCR = Disproved (\ x -> case x of {}) + (%~) SCD SCS = Disproved (\ x -> case x of {}) + (%~) SCD SCT = Disproved (\ x -> case x of {}) + (%~) SCD SCU = Disproved (\ x -> case x of {}) + (%~) SCD SCV = Disproved (\ x -> case x of {}) + (%~) SCD SCW = Disproved (\ x -> case x of {}) + (%~) SCD SCX = Disproved (\ x -> case x of {}) + (%~) SCD SCY = Disproved (\ x -> case x of {}) + (%~) SCD SCZ = Disproved (\ x -> case x of {}) + (%~) SCE SCA = Disproved (\ x -> case x of {}) + (%~) SCE SCB = Disproved (\ x -> case x of {}) + (%~) SCE SCC = Disproved (\ x -> case x of {}) + (%~) SCE SCD = Disproved (\ x -> case x of {}) + (%~) SCE SCE = Proved Refl + (%~) SCE SCF = Disproved (\ x -> case x of {}) + (%~) SCE SCG = Disproved (\ x -> case x of {}) + (%~) SCE SCH = Disproved (\ x -> case x of {}) + (%~) SCE SCI = Disproved (\ x -> case x of {}) + (%~) SCE SCJ = Disproved (\ x -> case x of {}) + (%~) SCE SCK = Disproved (\ x -> case x of {}) + (%~) SCE SCL = Disproved (\ x -> case x of {}) + (%~) SCE SCM = Disproved (\ x -> case x of {}) + (%~) SCE SCN = Disproved (\ x -> case x of {}) + (%~) SCE SCO = Disproved (\ x -> case x of {}) + (%~) SCE SCP = Disproved (\ x -> case x of {}) + (%~) SCE SCQ = Disproved (\ x -> case x of {}) + (%~) SCE SCR = Disproved (\ x -> case x of {}) + (%~) SCE SCS = Disproved (\ x -> case x of {}) + (%~) SCE SCT = Disproved (\ x -> case x of {}) + (%~) SCE SCU = Disproved (\ x -> case x of {}) + (%~) SCE SCV = Disproved (\ x -> case x of {}) + (%~) SCE SCW = Disproved (\ x -> case x of {}) + (%~) SCE SCX = Disproved (\ x -> case x of {}) + (%~) SCE SCY = Disproved (\ x -> case x of {}) + (%~) SCE SCZ = Disproved (\ x -> case x of {}) + (%~) SCF SCA = Disproved (\ x -> case x of {}) + (%~) SCF SCB = Disproved (\ x -> case x of {}) + (%~) SCF SCC = Disproved (\ x -> case x of {}) + (%~) SCF SCD = Disproved (\ x -> case x of {}) + (%~) SCF SCE = Disproved (\ x -> case x of {}) + (%~) SCF SCF = Proved Refl + (%~) SCF SCG = Disproved (\ x -> case x of {}) + (%~) SCF SCH = Disproved (\ x -> case x of {}) + (%~) SCF SCI = Disproved (\ x -> case x of {}) + (%~) SCF SCJ = Disproved (\ x -> case x of {}) + (%~) SCF SCK = Disproved (\ x -> case x of {}) + (%~) SCF SCL = Disproved (\ x -> case x of {}) + (%~) SCF SCM = Disproved (\ x -> case x of {}) + (%~) SCF SCN = Disproved (\ x -> case x of {}) + (%~) SCF SCO = Disproved (\ x -> case x of {}) + (%~) SCF SCP = Disproved (\ x -> case x of {}) + (%~) SCF SCQ = Disproved (\ x -> case x of {}) + (%~) SCF SCR = Disproved (\ x -> case x of {}) + (%~) SCF SCS = Disproved (\ x -> case x of {}) + (%~) SCF SCT = Disproved (\ x -> case x of {}) + (%~) SCF SCU = Disproved (\ x -> case x of {}) + (%~) SCF SCV = Disproved (\ x -> case x of {}) + (%~) SCF SCW = Disproved (\ x -> case x of {}) + (%~) SCF SCX = Disproved (\ x -> case x of {}) + (%~) SCF SCY = Disproved (\ x -> case x of {}) + (%~) SCF SCZ = Disproved (\ x -> case x of {}) + (%~) SCG SCA = Disproved (\ x -> case x of {}) + (%~) SCG SCB = Disproved (\ x -> case x of {}) + (%~) SCG SCC = Disproved (\ x -> case x of {}) + (%~) SCG SCD = Disproved (\ x -> case x of {}) + (%~) SCG SCE = Disproved (\ x -> case x of {}) + (%~) SCG SCF = Disproved (\ x -> case x of {}) + (%~) SCG SCG = Proved Refl + (%~) SCG SCH = Disproved (\ x -> case x of {}) + (%~) SCG SCI = Disproved (\ x -> case x of {}) + (%~) SCG SCJ = Disproved (\ x -> case x of {}) + (%~) SCG SCK = Disproved (\ x -> case x of {}) + (%~) SCG SCL = Disproved (\ x -> case x of {}) + (%~) SCG SCM = Disproved (\ x -> case x of {}) + (%~) SCG SCN = Disproved (\ x -> case x of {}) + (%~) SCG SCO = Disproved (\ x -> case x of {}) + (%~) SCG SCP = Disproved (\ x -> case x of {}) + (%~) SCG SCQ = Disproved (\ x -> case x of {}) + (%~) SCG SCR = Disproved (\ x -> case x of {}) + (%~) SCG SCS = Disproved (\ x -> case x of {}) + (%~) SCG SCT = Disproved (\ x -> case x of {}) + (%~) SCG SCU = Disproved (\ x -> case x of {}) + (%~) SCG SCV = Disproved (\ x -> case x of {}) + (%~) SCG SCW = Disproved (\ x -> case x of {}) + (%~) SCG SCX = Disproved (\ x -> case x of {}) + (%~) SCG SCY = Disproved (\ x -> case x of {}) + (%~) SCG SCZ = Disproved (\ x -> case x of {}) + (%~) SCH SCA = Disproved (\ x -> case x of {}) + (%~) SCH SCB = Disproved (\ x -> case x of {}) + (%~) SCH SCC = Disproved (\ x -> case x of {}) + (%~) SCH SCD = Disproved (\ x -> case x of {}) + (%~) SCH SCE = Disproved (\ x -> case x of {}) + (%~) SCH SCF = Disproved (\ x -> case x of {}) + (%~) SCH SCG = Disproved (\ x -> case x of {}) + (%~) SCH SCH = Proved Refl + (%~) SCH SCI = Disproved (\ x -> case x of {}) + (%~) SCH SCJ = Disproved (\ x -> case x of {}) + (%~) SCH SCK = Disproved (\ x -> case x of {}) + (%~) SCH SCL = Disproved (\ x -> case x of {}) + (%~) SCH SCM = Disproved (\ x -> case x of {}) + (%~) SCH SCN = Disproved (\ x -> case x of {}) + (%~) SCH SCO = Disproved (\ x -> case x of {}) + (%~) SCH SCP = Disproved (\ x -> case x of {}) + (%~) SCH SCQ = Disproved (\ x -> case x of {}) + (%~) SCH SCR = Disproved (\ x -> case x of {}) + (%~) SCH SCS = Disproved (\ x -> case x of {}) + (%~) SCH SCT = Disproved (\ x -> case x of {}) + (%~) SCH SCU = Disproved (\ x -> case x of {}) + (%~) SCH SCV = Disproved (\ x -> case x of {}) + (%~) SCH SCW = Disproved (\ x -> case x of {}) + (%~) SCH SCX = Disproved (\ x -> case x of {}) + (%~) SCH SCY = Disproved (\ x -> case x of {}) + (%~) SCH SCZ = Disproved (\ x -> case x of {}) + (%~) SCI SCA = Disproved (\ x -> case x of {}) + (%~) SCI SCB = Disproved (\ x -> case x of {}) + (%~) SCI SCC = Disproved (\ x -> case x of {}) + (%~) SCI SCD = Disproved (\ x -> case x of {}) + (%~) SCI SCE = Disproved (\ x -> case x of {}) + (%~) SCI SCF = Disproved (\ x -> case x of {}) + (%~) SCI SCG = Disproved (\ x -> case x of {}) + (%~) SCI SCH = Disproved (\ x -> case x of {}) + (%~) SCI SCI = Proved Refl + (%~) SCI SCJ = Disproved (\ x -> case x of {}) + (%~) SCI SCK = Disproved (\ x -> case x of {}) + (%~) SCI SCL = Disproved (\ x -> case x of {}) + (%~) SCI SCM = Disproved (\ x -> case x of {}) + (%~) SCI SCN = Disproved (\ x -> case x of {}) + (%~) SCI SCO = Disproved (\ x -> case x of {}) + (%~) SCI SCP = Disproved (\ x -> case x of {}) + (%~) SCI SCQ = Disproved (\ x -> case x of {}) + (%~) SCI SCR = Disproved (\ x -> case x of {}) + (%~) SCI SCS = Disproved (\ x -> case x of {}) + (%~) SCI SCT = Disproved (\ x -> case x of {}) + (%~) SCI SCU = Disproved (\ x -> case x of {}) + (%~) SCI SCV = Disproved (\ x -> case x of {}) + (%~) SCI SCW = Disproved (\ x -> case x of {}) + (%~) SCI SCX = Disproved (\ x -> case x of {}) + (%~) SCI SCY = Disproved (\ x -> case x of {}) + (%~) SCI SCZ = Disproved (\ x -> case x of {}) + (%~) SCJ SCA = Disproved (\ x -> case x of {}) + (%~) SCJ SCB = Disproved (\ x -> case x of {}) + (%~) SCJ SCC = Disproved (\ x -> case x of {}) + (%~) SCJ SCD = Disproved (\ x -> case x of {}) + (%~) SCJ SCE = Disproved (\ x -> case x of {}) + (%~) SCJ SCF = Disproved (\ x -> case x of {}) + (%~) SCJ SCG = Disproved (\ x -> case x of {}) + (%~) SCJ SCH = Disproved (\ x -> case x of {}) + (%~) SCJ SCI = Disproved (\ x -> case x of {}) + (%~) SCJ SCJ = Proved Refl + (%~) SCJ SCK = Disproved (\ x -> case x of {}) + (%~) SCJ SCL = Disproved (\ x -> case x of {}) + (%~) SCJ SCM = Disproved (\ x -> case x of {}) + (%~) SCJ SCN = Disproved (\ x -> case x of {}) + (%~) SCJ SCO = Disproved (\ x -> case x of {}) + (%~) SCJ SCP = Disproved (\ x -> case x of {}) + (%~) SCJ SCQ = Disproved (\ x -> case x of {}) + (%~) SCJ SCR = Disproved (\ x -> case x of {}) + (%~) SCJ SCS = Disproved (\ x -> case x of {}) + (%~) SCJ SCT = Disproved (\ x -> case x of {}) + (%~) SCJ SCU = Disproved (\ x -> case x of {}) + (%~) SCJ SCV = Disproved (\ x -> case x of {}) + (%~) SCJ SCW = Disproved (\ x -> case x of {}) + (%~) SCJ SCX = Disproved (\ x -> case x of {}) + (%~) SCJ SCY = Disproved (\ x -> case x of {}) + (%~) SCJ SCZ = Disproved (\ x -> case x of {}) + (%~) SCK SCA = Disproved (\ x -> case x of {}) + (%~) SCK SCB = Disproved (\ x -> case x of {}) + (%~) SCK SCC = Disproved (\ x -> case x of {}) + (%~) SCK SCD = Disproved (\ x -> case x of {}) + (%~) SCK SCE = Disproved (\ x -> case x of {}) + (%~) SCK SCF = Disproved (\ x -> case x of {}) + (%~) SCK SCG = Disproved (\ x -> case x of {}) + (%~) SCK SCH = Disproved (\ x -> case x of {}) + (%~) SCK SCI = Disproved (\ x -> case x of {}) + (%~) SCK SCJ = Disproved (\ x -> case x of {}) + (%~) SCK SCK = Proved Refl + (%~) SCK SCL = Disproved (\ x -> case x of {}) + (%~) SCK SCM = Disproved (\ x -> case x of {}) + (%~) SCK SCN = Disproved (\ x -> case x of {}) + (%~) SCK SCO = Disproved (\ x -> case x of {}) + (%~) SCK SCP = Disproved (\ x -> case x of {}) + (%~) SCK SCQ = Disproved (\ x -> case x of {}) + (%~) SCK SCR = Disproved (\ x -> case x of {}) + (%~) SCK SCS = Disproved (\ x -> case x of {}) + (%~) SCK SCT = Disproved (\ x -> case x of {}) + (%~) SCK SCU = Disproved (\ x -> case x of {}) + (%~) SCK SCV = Disproved (\ x -> case x of {}) + (%~) SCK SCW = Disproved (\ x -> case x of {}) + (%~) SCK SCX = Disproved (\ x -> case x of {}) + (%~) SCK SCY = Disproved (\ x -> case x of {}) + (%~) SCK SCZ = Disproved (\ x -> case x of {}) + (%~) SCL SCA = Disproved (\ x -> case x of {}) + (%~) SCL SCB = Disproved (\ x -> case x of {}) + (%~) SCL SCC = Disproved (\ x -> case x of {}) + (%~) SCL SCD = Disproved (\ x -> case x of {}) + (%~) SCL SCE = Disproved (\ x -> case x of {}) + (%~) SCL SCF = Disproved (\ x -> case x of {}) + (%~) SCL SCG = Disproved (\ x -> case x of {}) + (%~) SCL SCH = Disproved (\ x -> case x of {}) + (%~) SCL SCI = Disproved (\ x -> case x of {}) + (%~) SCL SCJ = Disproved (\ x -> case x of {}) + (%~) SCL SCK = Disproved (\ x -> case x of {}) + (%~) SCL SCL = Proved Refl + (%~) SCL SCM = Disproved (\ x -> case x of {}) + (%~) SCL SCN = Disproved (\ x -> case x of {}) + (%~) SCL SCO = Disproved (\ x -> case x of {}) + (%~) SCL SCP = Disproved (\ x -> case x of {}) + (%~) SCL SCQ = Disproved (\ x -> case x of {}) + (%~) SCL SCR = Disproved (\ x -> case x of {}) + (%~) SCL SCS = Disproved (\ x -> case x of {}) + (%~) SCL SCT = Disproved (\ x -> case x of {}) + (%~) SCL SCU = Disproved (\ x -> case x of {}) + (%~) SCL SCV = Disproved (\ x -> case x of {}) + (%~) SCL SCW = Disproved (\ x -> case x of {}) + (%~) SCL SCX = Disproved (\ x -> case x of {}) + (%~) SCL SCY = Disproved (\ x -> case x of {}) + (%~) SCL SCZ = Disproved (\ x -> case x of {}) + (%~) SCM SCA = Disproved (\ x -> case x of {}) + (%~) SCM SCB = Disproved (\ x -> case x of {}) + (%~) SCM SCC = Disproved (\ x -> case x of {}) + (%~) SCM SCD = Disproved (\ x -> case x of {}) + (%~) SCM SCE = Disproved (\ x -> case x of {}) + (%~) SCM SCF = Disproved (\ x -> case x of {}) + (%~) SCM SCG = Disproved (\ x -> case x of {}) + (%~) SCM SCH = Disproved (\ x -> case x of {}) + (%~) SCM SCI = Disproved (\ x -> case x of {}) + (%~) SCM SCJ = Disproved (\ x -> case x of {}) + (%~) SCM SCK = Disproved (\ x -> case x of {}) + (%~) SCM SCL = Disproved (\ x -> case x of {}) + (%~) SCM SCM = Proved Refl + (%~) SCM SCN = Disproved (\ x -> case x of {}) + (%~) SCM SCO = Disproved (\ x -> case x of {}) + (%~) SCM SCP = Disproved (\ x -> case x of {}) + (%~) SCM SCQ = Disproved (\ x -> case x of {}) + (%~) SCM SCR = Disproved (\ x -> case x of {}) + (%~) SCM SCS = Disproved (\ x -> case x of {}) + (%~) SCM SCT = Disproved (\ x -> case x of {}) + (%~) SCM SCU = Disproved (\ x -> case x of {}) + (%~) SCM SCV = Disproved (\ x -> case x of {}) + (%~) SCM SCW = Disproved (\ x -> case x of {}) + (%~) SCM SCX = Disproved (\ x -> case x of {}) + (%~) SCM SCY = Disproved (\ x -> case x of {}) + (%~) SCM SCZ = Disproved (\ x -> case x of {}) + (%~) SCN SCA = Disproved (\ x -> case x of {}) + (%~) SCN SCB = Disproved (\ x -> case x of {}) + (%~) SCN SCC = Disproved (\ x -> case x of {}) + (%~) SCN SCD = Disproved (\ x -> case x of {}) + (%~) SCN SCE = Disproved (\ x -> case x of {}) + (%~) SCN SCF = Disproved (\ x -> case x of {}) + (%~) SCN SCG = Disproved (\ x -> case x of {}) + (%~) SCN SCH = Disproved (\ x -> case x of {}) + (%~) SCN SCI = Disproved (\ x -> case x of {}) + (%~) SCN SCJ = Disproved (\ x -> case x of {}) + (%~) SCN SCK = Disproved (\ x -> case x of {}) + (%~) SCN SCL = Disproved (\ x -> case x of {}) + (%~) SCN SCM = Disproved (\ x -> case x of {}) + (%~) SCN SCN = Proved Refl + (%~) SCN SCO = Disproved (\ x -> case x of {}) + (%~) SCN SCP = Disproved (\ x -> case x of {}) + (%~) SCN SCQ = Disproved (\ x -> case x of {}) + (%~) SCN SCR = Disproved (\ x -> case x of {}) + (%~) SCN SCS = Disproved (\ x -> case x of {}) + (%~) SCN SCT = Disproved (\ x -> case x of {}) + (%~) SCN SCU = Disproved (\ x -> case x of {}) + (%~) SCN SCV = Disproved (\ x -> case x of {}) + (%~) SCN SCW = Disproved (\ x -> case x of {}) + (%~) SCN SCX = Disproved (\ x -> case x of {}) + (%~) SCN SCY = Disproved (\ x -> case x of {}) + (%~) SCN SCZ = Disproved (\ x -> case x of {}) + (%~) SCO SCA = Disproved (\ x -> case x of {}) + (%~) SCO SCB = Disproved (\ x -> case x of {}) + (%~) SCO SCC = Disproved (\ x -> case x of {}) + (%~) SCO SCD = Disproved (\ x -> case x of {}) + (%~) SCO SCE = Disproved (\ x -> case x of {}) + (%~) SCO SCF = Disproved (\ x -> case x of {}) + (%~) SCO SCG = Disproved (\ x -> case x of {}) + (%~) SCO SCH = Disproved (\ x -> case x of {}) + (%~) SCO SCI = Disproved (\ x -> case x of {}) + (%~) SCO SCJ = Disproved (\ x -> case x of {}) + (%~) SCO SCK = Disproved (\ x -> case x of {}) + (%~) SCO SCL = Disproved (\ x -> case x of {}) + (%~) SCO SCM = Disproved (\ x -> case x of {}) + (%~) SCO SCN = Disproved (\ x -> case x of {}) + (%~) SCO SCO = Proved Refl + (%~) SCO SCP = Disproved (\ x -> case x of {}) + (%~) SCO SCQ = Disproved (\ x -> case x of {}) + (%~) SCO SCR = Disproved (\ x -> case x of {}) + (%~) SCO SCS = Disproved (\ x -> case x of {}) + (%~) SCO SCT = Disproved (\ x -> case x of {}) + (%~) SCO SCU = Disproved (\ x -> case x of {}) + (%~) SCO SCV = Disproved (\ x -> case x of {}) + (%~) SCO SCW = Disproved (\ x -> case x of {}) + (%~) SCO SCX = Disproved (\ x -> case x of {}) + (%~) SCO SCY = Disproved (\ x -> case x of {}) + (%~) SCO SCZ = Disproved (\ x -> case x of {}) + (%~) SCP SCA = Disproved (\ x -> case x of {}) + (%~) SCP SCB = Disproved (\ x -> case x of {}) + (%~) SCP SCC = Disproved (\ x -> case x of {}) + (%~) SCP SCD = Disproved (\ x -> case x of {}) + (%~) SCP SCE = Disproved (\ x -> case x of {}) + (%~) SCP SCF = Disproved (\ x -> case x of {}) + (%~) SCP SCG = Disproved (\ x -> case x of {}) + (%~) SCP SCH = Disproved (\ x -> case x of {}) + (%~) SCP SCI = Disproved (\ x -> case x of {}) + (%~) SCP SCJ = Disproved (\ x -> case x of {}) + (%~) SCP SCK = Disproved (\ x -> case x of {}) + (%~) SCP SCL = Disproved (\ x -> case x of {}) + (%~) SCP SCM = Disproved (\ x -> case x of {}) + (%~) SCP SCN = Disproved (\ x -> case x of {}) + (%~) SCP SCO = Disproved (\ x -> case x of {}) + (%~) SCP SCP = Proved Refl + (%~) SCP SCQ = Disproved (\ x -> case x of {}) + (%~) SCP SCR = Disproved (\ x -> case x of {}) + (%~) SCP SCS = Disproved (\ x -> case x of {}) + (%~) SCP SCT = Disproved (\ x -> case x of {}) + (%~) SCP SCU = Disproved (\ x -> case x of {}) + (%~) SCP SCV = Disproved (\ x -> case x of {}) + (%~) SCP SCW = Disproved (\ x -> case x of {}) + (%~) SCP SCX = Disproved (\ x -> case x of {}) + (%~) SCP SCY = Disproved (\ x -> case x of {}) + (%~) SCP SCZ = Disproved (\ x -> case x of {}) + (%~) SCQ SCA = Disproved (\ x -> case x of {}) + (%~) SCQ SCB = Disproved (\ x -> case x of {}) + (%~) SCQ SCC = Disproved (\ x -> case x of {}) + (%~) SCQ SCD = Disproved (\ x -> case x of {}) + (%~) SCQ SCE = Disproved (\ x -> case x of {}) + (%~) SCQ SCF = Disproved (\ x -> case x of {}) + (%~) SCQ SCG = Disproved (\ x -> case x of {}) + (%~) SCQ SCH = Disproved (\ x -> case x of {}) + (%~) SCQ SCI = Disproved (\ x -> case x of {}) + (%~) SCQ SCJ = Disproved (\ x -> case x of {}) + (%~) SCQ SCK = Disproved (\ x -> case x of {}) + (%~) SCQ SCL = Disproved (\ x -> case x of {}) + (%~) SCQ SCM = Disproved (\ x -> case x of {}) + (%~) SCQ SCN = Disproved (\ x -> case x of {}) + (%~) SCQ SCO = Disproved (\ x -> case x of {}) + (%~) SCQ SCP = Disproved (\ x -> case x of {}) + (%~) SCQ SCQ = Proved Refl + (%~) SCQ SCR = Disproved (\ x -> case x of {}) + (%~) SCQ SCS = Disproved (\ x -> case x of {}) + (%~) SCQ SCT = Disproved (\ x -> case x of {}) + (%~) SCQ SCU = Disproved (\ x -> case x of {}) + (%~) SCQ SCV = Disproved (\ x -> case x of {}) + (%~) SCQ SCW = Disproved (\ x -> case x of {}) + (%~) SCQ SCX = Disproved (\ x -> case x of {}) + (%~) SCQ SCY = Disproved (\ x -> case x of {}) + (%~) SCQ SCZ = Disproved (\ x -> case x of {}) + (%~) SCR SCA = Disproved (\ x -> case x of {}) + (%~) SCR SCB = Disproved (\ x -> case x of {}) + (%~) SCR SCC = Disproved (\ x -> case x of {}) + (%~) SCR SCD = Disproved (\ x -> case x of {}) + (%~) SCR SCE = Disproved (\ x -> case x of {}) + (%~) SCR SCF = Disproved (\ x -> case x of {}) + (%~) SCR SCG = Disproved (\ x -> case x of {}) + (%~) SCR SCH = Disproved (\ x -> case x of {}) + (%~) SCR SCI = Disproved (\ x -> case x of {}) + (%~) SCR SCJ = Disproved (\ x -> case x of {}) + (%~) SCR SCK = Disproved (\ x -> case x of {}) + (%~) SCR SCL = Disproved (\ x -> case x of {}) + (%~) SCR SCM = Disproved (\ x -> case x of {}) + (%~) SCR SCN = Disproved (\ x -> case x of {}) + (%~) SCR SCO = Disproved (\ x -> case x of {}) + (%~) SCR SCP = Disproved (\ x -> case x of {}) + (%~) SCR SCQ = Disproved (\ x -> case x of {}) + (%~) SCR SCR = Proved Refl + (%~) SCR SCS = Disproved (\ x -> case x of {}) + (%~) SCR SCT = Disproved (\ x -> case x of {}) + (%~) SCR SCU = Disproved (\ x -> case x of {}) + (%~) SCR SCV = Disproved (\ x -> case x of {}) + (%~) SCR SCW = Disproved (\ x -> case x of {}) + (%~) SCR SCX = Disproved (\ x -> case x of {}) + (%~) SCR SCY = Disproved (\ x -> case x of {}) + (%~) SCR SCZ = Disproved (\ x -> case x of {}) + (%~) SCS SCA = Disproved (\ x -> case x of {}) + (%~) SCS SCB = Disproved (\ x -> case x of {}) + (%~) SCS SCC = Disproved (\ x -> case x of {}) + (%~) SCS SCD = Disproved (\ x -> case x of {}) + (%~) SCS SCE = Disproved (\ x -> case x of {}) + (%~) SCS SCF = Disproved (\ x -> case x of {}) + (%~) SCS SCG = Disproved (\ x -> case x of {}) + (%~) SCS SCH = Disproved (\ x -> case x of {}) + (%~) SCS SCI = Disproved (\ x -> case x of {}) + (%~) SCS SCJ = Disproved (\ x -> case x of {}) + (%~) SCS SCK = Disproved (\ x -> case x of {}) + (%~) SCS SCL = Disproved (\ x -> case x of {}) + (%~) SCS SCM = Disproved (\ x -> case x of {}) + (%~) SCS SCN = Disproved (\ x -> case x of {}) + (%~) SCS SCO = Disproved (\ x -> case x of {}) + (%~) SCS SCP = Disproved (\ x -> case x of {}) + (%~) SCS SCQ = Disproved (\ x -> case x of {}) + (%~) SCS SCR = Disproved (\ x -> case x of {}) + (%~) SCS SCS = Proved Refl + (%~) SCS SCT = Disproved (\ x -> case x of {}) + (%~) SCS SCU = Disproved (\ x -> case x of {}) + (%~) SCS SCV = Disproved (\ x -> case x of {}) + (%~) SCS SCW = Disproved (\ x -> case x of {}) + (%~) SCS SCX = Disproved (\ x -> case x of {}) + (%~) SCS SCY = Disproved (\ x -> case x of {}) + (%~) SCS SCZ = Disproved (\ x -> case x of {}) + (%~) SCT SCA = Disproved (\ x -> case x of {}) + (%~) SCT SCB = Disproved (\ x -> case x of {}) + (%~) SCT SCC = Disproved (\ x -> case x of {}) + (%~) SCT SCD = Disproved (\ x -> case x of {}) + (%~) SCT SCE = Disproved (\ x -> case x of {}) + (%~) SCT SCF = Disproved (\ x -> case x of {}) + (%~) SCT SCG = Disproved (\ x -> case x of {}) + (%~) SCT SCH = Disproved (\ x -> case x of {}) + (%~) SCT SCI = Disproved (\ x -> case x of {}) + (%~) SCT SCJ = Disproved (\ x -> case x of {}) + (%~) SCT SCK = Disproved (\ x -> case x of {}) + (%~) SCT SCL = Disproved (\ x -> case x of {}) + (%~) SCT SCM = Disproved (\ x -> case x of {}) + (%~) SCT SCN = Disproved (\ x -> case x of {}) + (%~) SCT SCO = Disproved (\ x -> case x of {}) + (%~) SCT SCP = Disproved (\ x -> case x of {}) + (%~) SCT SCQ = Disproved (\ x -> case x of {}) + (%~) SCT SCR = Disproved (\ x -> case x of {}) + (%~) SCT SCS = Disproved (\ x -> case x of {}) + (%~) SCT SCT = Proved Refl + (%~) SCT SCU = Disproved (\ x -> case x of {}) + (%~) SCT SCV = Disproved (\ x -> case x of {}) + (%~) SCT SCW = Disproved (\ x -> case x of {}) + (%~) SCT SCX = Disproved (\ x -> case x of {}) + (%~) SCT SCY = Disproved (\ x -> case x of {}) + (%~) SCT SCZ = Disproved (\ x -> case x of {}) + (%~) SCU SCA = Disproved (\ x -> case x of {}) + (%~) SCU SCB = Disproved (\ x -> case x of {}) + (%~) SCU SCC = Disproved (\ x -> case x of {}) + (%~) SCU SCD = Disproved (\ x -> case x of {}) + (%~) SCU SCE = Disproved (\ x -> case x of {}) + (%~) SCU SCF = Disproved (\ x -> case x of {}) + (%~) SCU SCG = Disproved (\ x -> case x of {}) + (%~) SCU SCH = Disproved (\ x -> case x of {}) + (%~) SCU SCI = Disproved (\ x -> case x of {}) + (%~) SCU SCJ = Disproved (\ x -> case x of {}) + (%~) SCU SCK = Disproved (\ x -> case x of {}) + (%~) SCU SCL = Disproved (\ x -> case x of {}) + (%~) SCU SCM = Disproved (\ x -> case x of {}) + (%~) SCU SCN = Disproved (\ x -> case x of {}) + (%~) SCU SCO = Disproved (\ x -> case x of {}) + (%~) SCU SCP = Disproved (\ x -> case x of {}) + (%~) SCU SCQ = Disproved (\ x -> case x of {}) + (%~) SCU SCR = Disproved (\ x -> case x of {}) + (%~) SCU SCS = Disproved (\ x -> case x of {}) + (%~) SCU SCT = Disproved (\ x -> case x of {}) + (%~) SCU SCU = Proved Refl + (%~) SCU SCV = Disproved (\ x -> case x of {}) + (%~) SCU SCW = Disproved (\ x -> case x of {}) + (%~) SCU SCX = Disproved (\ x -> case x of {}) + (%~) SCU SCY = Disproved (\ x -> case x of {}) + (%~) SCU SCZ = Disproved (\ x -> case x of {}) + (%~) SCV SCA = Disproved (\ x -> case x of {}) + (%~) SCV SCB = Disproved (\ x -> case x of {}) + (%~) SCV SCC = Disproved (\ x -> case x of {}) + (%~) SCV SCD = Disproved (\ x -> case x of {}) + (%~) SCV SCE = Disproved (\ x -> case x of {}) + (%~) SCV SCF = Disproved (\ x -> case x of {}) + (%~) SCV SCG = Disproved (\ x -> case x of {}) + (%~) SCV SCH = Disproved (\ x -> case x of {}) + (%~) SCV SCI = Disproved (\ x -> case x of {}) + (%~) SCV SCJ = Disproved (\ x -> case x of {}) + (%~) SCV SCK = Disproved (\ x -> case x of {}) + (%~) SCV SCL = Disproved (\ x -> case x of {}) + (%~) SCV SCM = Disproved (\ x -> case x of {}) + (%~) SCV SCN = Disproved (\ x -> case x of {}) + (%~) SCV SCO = Disproved (\ x -> case x of {}) + (%~) SCV SCP = Disproved (\ x -> case x of {}) + (%~) SCV SCQ = Disproved (\ x -> case x of {}) + (%~) SCV SCR = Disproved (\ x -> case x of {}) + (%~) SCV SCS = Disproved (\ x -> case x of {}) + (%~) SCV SCT = Disproved (\ x -> case x of {}) + (%~) SCV SCU = Disproved (\ x -> case x of {}) + (%~) SCV SCV = Proved Refl + (%~) SCV SCW = Disproved (\ x -> case x of {}) + (%~) SCV SCX = Disproved (\ x -> case x of {}) + (%~) SCV SCY = Disproved (\ x -> case x of {}) + (%~) SCV SCZ = Disproved (\ x -> case x of {}) + (%~) SCW SCA = Disproved (\ x -> case x of {}) + (%~) SCW SCB = Disproved (\ x -> case x of {}) + (%~) SCW SCC = Disproved (\ x -> case x of {}) + (%~) SCW SCD = Disproved (\ x -> case x of {}) + (%~) SCW SCE = Disproved (\ x -> case x of {}) + (%~) SCW SCF = Disproved (\ x -> case x of {}) + (%~) SCW SCG = Disproved (\ x -> case x of {}) + (%~) SCW SCH = Disproved (\ x -> case x of {}) + (%~) SCW SCI = Disproved (\ x -> case x of {}) + (%~) SCW SCJ = Disproved (\ x -> case x of {}) + (%~) SCW SCK = Disproved (\ x -> case x of {}) + (%~) SCW SCL = Disproved (\ x -> case x of {}) + (%~) SCW SCM = Disproved (\ x -> case x of {}) + (%~) SCW SCN = Disproved (\ x -> case x of {}) + (%~) SCW SCO = Disproved (\ x -> case x of {}) + (%~) SCW SCP = Disproved (\ x -> case x of {}) + (%~) SCW SCQ = Disproved (\ x -> case x of {}) + (%~) SCW SCR = Disproved (\ x -> case x of {}) + (%~) SCW SCS = Disproved (\ x -> case x of {}) + (%~) SCW SCT = Disproved (\ x -> case x of {}) + (%~) SCW SCU = Disproved (\ x -> case x of {}) + (%~) SCW SCV = Disproved (\ x -> case x of {}) + (%~) SCW SCW = Proved Refl + (%~) SCW SCX = Disproved (\ x -> case x of {}) + (%~) SCW SCY = Disproved (\ x -> case x of {}) + (%~) SCW SCZ = Disproved (\ x -> case x of {}) + (%~) SCX SCA = Disproved (\ x -> case x of {}) + (%~) SCX SCB = Disproved (\ x -> case x of {}) + (%~) SCX SCC = Disproved (\ x -> case x of {}) + (%~) SCX SCD = Disproved (\ x -> case x of {}) + (%~) SCX SCE = Disproved (\ x -> case x of {}) + (%~) SCX SCF = Disproved (\ x -> case x of {}) + (%~) SCX SCG = Disproved (\ x -> case x of {}) + (%~) SCX SCH = Disproved (\ x -> case x of {}) + (%~) SCX SCI = Disproved (\ x -> case x of {}) + (%~) SCX SCJ = Disproved (\ x -> case x of {}) + (%~) SCX SCK = Disproved (\ x -> case x of {}) + (%~) SCX SCL = Disproved (\ x -> case x of {}) + (%~) SCX SCM = Disproved (\ x -> case x of {}) + (%~) SCX SCN = Disproved (\ x -> case x of {}) + (%~) SCX SCO = Disproved (\ x -> case x of {}) + (%~) SCX SCP = Disproved (\ x -> case x of {}) + (%~) SCX SCQ = Disproved (\ x -> case x of {}) + (%~) SCX SCR = Disproved (\ x -> case x of {}) + (%~) SCX SCS = Disproved (\ x -> case x of {}) + (%~) SCX SCT = Disproved (\ x -> case x of {}) + (%~) SCX SCU = Disproved (\ x -> case x of {}) + (%~) SCX SCV = Disproved (\ x -> case x of {}) + (%~) SCX SCW = Disproved (\ x -> case x of {}) + (%~) SCX SCX = Proved Refl + (%~) SCX SCY = Disproved (\ x -> case x of {}) + (%~) SCX SCZ = Disproved (\ x -> case x of {}) + (%~) SCY SCA = Disproved (\ x -> case x of {}) + (%~) SCY SCB = Disproved (\ x -> case x of {}) + (%~) SCY SCC = Disproved (\ x -> case x of {}) + (%~) SCY SCD = Disproved (\ x -> case x of {}) + (%~) SCY SCE = Disproved (\ x -> case x of {}) + (%~) SCY SCF = Disproved (\ x -> case x of {}) + (%~) SCY SCG = Disproved (\ x -> case x of {}) + (%~) SCY SCH = Disproved (\ x -> case x of {}) + (%~) SCY SCI = Disproved (\ x -> case x of {}) + (%~) SCY SCJ = Disproved (\ x -> case x of {}) + (%~) SCY SCK = Disproved (\ x -> case x of {}) + (%~) SCY SCL = Disproved (\ x -> case x of {}) + (%~) SCY SCM = Disproved (\ x -> case x of {}) + (%~) SCY SCN = Disproved (\ x -> case x of {}) + (%~) SCY SCO = Disproved (\ x -> case x of {}) + (%~) SCY SCP = Disproved (\ x -> case x of {}) + (%~) SCY SCQ = Disproved (\ x -> case x of {}) + (%~) SCY SCR = Disproved (\ x -> case x of {}) + (%~) SCY SCS = Disproved (\ x -> case x of {}) + (%~) SCY SCT = Disproved (\ x -> case x of {}) + (%~) SCY SCU = Disproved (\ x -> case x of {}) + (%~) SCY SCV = Disproved (\ x -> case x of {}) + (%~) SCY SCW = Disproved (\ x -> case x of {}) + (%~) SCY SCX = Disproved (\ x -> case x of {}) + (%~) SCY SCY = Proved Refl + (%~) SCY SCZ = Disproved (\ x -> case x of {}) + (%~) SCZ SCA = Disproved (\ x -> case x of {}) + (%~) SCZ SCB = Disproved (\ x -> case x of {}) + (%~) SCZ SCC = Disproved (\ x -> case x of {}) + (%~) SCZ SCD = Disproved (\ x -> case x of {}) + (%~) SCZ SCE = Disproved (\ x -> case x of {}) + (%~) SCZ SCF = Disproved (\ x -> case x of {}) + (%~) SCZ SCG = Disproved (\ x -> case x of {}) + (%~) SCZ SCH = Disproved (\ x -> case x of {}) + (%~) SCZ SCI = Disproved (\ x -> case x of {}) + (%~) SCZ SCJ = Disproved (\ x -> case x of {}) + (%~) SCZ SCK = Disproved (\ x -> case x of {}) + (%~) SCZ SCL = Disproved (\ x -> case x of {}) + (%~) SCZ SCM = Disproved (\ x -> case x of {}) + (%~) SCZ SCN = Disproved (\ x -> case x of {}) + (%~) SCZ SCO = Disproved (\ x -> case x of {}) + (%~) SCZ SCP = Disproved (\ x -> case x of {}) + (%~) SCZ SCQ = Disproved (\ x -> case x of {}) + (%~) SCZ SCR = Disproved (\ x -> case x of {}) + (%~) SCZ SCS = Disproved (\ x -> case x of {}) + (%~) SCZ SCT = Disproved (\ x -> case x of {}) + (%~) SCZ SCU = Disproved (\ x -> case x of {}) + (%~) SCZ SCV = Disproved (\ x -> case x of {}) + (%~) SCZ SCW = Disproved (\ x -> case x of {}) + (%~) SCZ SCX = Disproved (\ x -> case x of {}) + (%~) SCZ SCY = Disproved (\ x -> case x of {}) + (%~) SCZ SCZ = Proved Refl + instance Data.Type.Equality.TestEquality (SAChar :: AChar + -> Type) where + Data.Type.Equality.testEquality + = Data.Singletons.Decide.decideEquality + instance Data.Type.Coercion.TestCoercion (SAChar :: AChar + -> Type) where + Data.Type.Coercion.testCoercion + = Data.Singletons.Decide.decideCoercion + deriving instance (Data.Singletons.ShowSing.ShowSing U, + Data.Singletons.ShowSing.ShowSing Nat) => + Show (SU (z :: U)) + deriving instance Show (SAChar (z :: AChar)) + instance SingI BOOL where + sing = SBOOL + instance SingI STRING where + sing = SSTRING + instance SingI NAT where + sing = SNAT + instance (SingI n, SingI n) => + SingI (VEC (n :: U) (n :: Nat)) where + sing = SVEC sing sing + instance SingI n => SingI1 (VEC (n :: U)) where + liftSing = SVEC sing + instance SingI2 VEC where + liftSing2 = SVEC + instance SingI (VECSym0 :: (~>) U ((~>) Nat U)) where + sing = singFun2 @VECSym0 SVEC + instance SingI d => SingI (VECSym1 (d :: U) :: (~>) Nat U) where + sing = singFun1 @(VECSym1 (d :: U)) (SVEC (sing @d)) + instance SingI1 (VECSym1 :: U -> (~>) Nat U) where + liftSing (s :: Sing (d :: U)) + = singFun1 @(VECSym1 (d :: U)) (SVEC s) + instance SingI CA where + sing = SCA + instance SingI CB where + sing = SCB + instance SingI CC where + sing = SCC + instance SingI CD where + sing = SCD + instance SingI CE where + sing = SCE + instance SingI CF where + sing = SCF + instance SingI CG where + sing = SCG + instance SingI CH where + sing = SCH + instance SingI CI where + sing = SCI + instance SingI CJ where + sing = SCJ + instance SingI CK where + sing = SCK + instance SingI CL where + sing = SCL + instance SingI CM where + sing = SCM + instance SingI CN where + sing = SCN + instance SingI CO where + sing = SCO + instance SingI CP where + sing = SCP + instance SingI CQ where + sing = SCQ + instance SingI CR where + sing = SCR + instance SingI CS where + sing = SCS + instance SingI CT where + sing = SCT + instance SingI CU where + sing = SCU + instance SingI CV where + sing = SCV + instance SingI CW where + sing = SCW + instance SingI CX where + sing = SCX + instance SingI CY where + sing = SCY + instance SingI CZ where + sing = SCZ + instance (SingI n, SingI n) => + SingI (Attr (n :: [AChar]) (n :: U)) where + sing = SAttr sing sing + instance SingI n => SingI1 (Attr (n :: [AChar])) where + liftSing = SAttr sing + instance SingI2 Attr where + liftSing2 = SAttr + instance SingI (AttrSym0 :: (~>) [AChar] ((~>) U Attribute)) where + sing = singFun2 @AttrSym0 SAttr + instance SingI d => + SingI (AttrSym1 (d :: [AChar]) :: (~>) U Attribute) where + sing = singFun1 @(AttrSym1 (d :: [AChar])) (SAttr (sing @d)) + instance SingI1 (AttrSym1 :: [AChar] -> (~>) U Attribute) where + liftSing (s :: Sing (d :: [AChar])) + = singFun1 @(AttrSym1 (d :: [AChar])) (SAttr s) + instance SingI n => SingI (Sch (n :: [Attribute])) where + sing = SSch sing + instance SingI1 Sch where + liftSing = SSch + instance SingI (SchSym0 :: (~>) [Attribute] Schema) where + sing = singFun1 @SchSym0 SSch +GradingClient/Database.hs:0:0:: Splicing declarations + return [] ======> +GradingClient/Database.hs:(0,0)-(0,0): Splicing expression + cases ''Row [| r |] [| changeId (n ++ (getId r)) r |] + ======> + case r of + EmptyRow _ -> changeId ((++) n (getId r)) r + ConsRow _ _ -> changeId ((++) n (getId r)) r
tests/compile-and-dump/GradingClient/Database.hs view
@@ -1,545 +1,545 @@-{- Database.hs--(c) Richard Eisenberg 2012-rae@cs.brynmawr.edu--This file contains the full code for the database interface example-presented in /Dependently typed programming with singletons/---}---- The OverlappingInstances is needed only to allow the InC and SubsetC classes.--- This is simply a convenience so that GHC can infer the necessary proofs of--- schema inclusion. The library could easily be designed without this flag,--- but it would require a client to explicity build proof terms from--- InProof and Subset.--module GradingClient.Database where--import Control.Monad-import Control.Monad.Except ( throwError )-import Data.Kind (Type)-import qualified Data.List as List-import Data.Singletons.Base.TH-import Prelude hiding ( tail, id )-import Prelude.Singletons hiding ( Lookup, sLookup, LookupSym0, LookupSym1, LookupSym2 )-import Text.Show.Singletons--$(singletons [d|- -- Basic Nat type- data Nat = Zero | Succ Nat deriving (Eq, Ord)- |])---- Conversions to any from Integers-fromNat :: Nat -> Integer-fromNat Zero = 0-fromNat (Succ n) = (fromNat n) + 1--toNat :: Integer -> Nat-toNat 0 = Zero-toNat n | n > 0 = Succ (toNat (n - 1))-toNat _ = error "Converting negative to Nat"---- Display and read Nats using decimal digits-instance Show Nat where- show = show . fromNat-instance Read Nat where- readsPrec n s = map (\(a,rest) -> (toNat a,rest)) $ readsPrec n s--$(singletons [d|- -- Our "U"niverse of types. These types can be stored in our database.- data U = BOOL- | STRING- | NAT- | VEC U Nat deriving (Read, Eq, Show)-- -- A re-definition of Char as an algebraic data type.- -- This is necessary to allow for promotion and type-level Strings.- data AChar = CA | CB | CC | CD | CE | CF | CG | CH | CI- | CJ | CK | CL | CM | CN | CO | CP | CQ | CR- | CS | CT | CU | CV | CW | CX | CY | CZ- deriving (Read, Show, Eq)-- -- A named attribute in our database- data Attribute = Attr [AChar] U-- -- A schema is an ordered list of named attributes- data Schema = Sch [Attribute]-- -- append two schemas- append :: Schema -> Schema -> Schema- append (Sch s1) (Sch s2) = Sch (s1 ++ s2)-- -- predicate to check that a schema is free of a certain attribute- attrNotIn :: Attribute -> Schema -> Bool- attrNotIn _ (Sch []) = True- attrNotIn (Attr name u) (Sch ((Attr name' _) : t)) =- (name /= name') && (attrNotIn (Attr name u) (Sch t))-- -- predicate to check that two schemas are disjoint- disjoint :: Schema -> Schema -> Bool- disjoint (Sch []) _ = True- disjoint (Sch (h : t)) s = (attrNotIn h s) && (disjoint (Sch t) s)-- -- predicate to check if a name occurs in a schema- occurs :: [AChar] -> Schema -> Bool- occurs _ (Sch []) = False- occurs name (Sch ((Attr name' _) : attrs)) =- name == name' || occurs name (Sch attrs)-- -- looks up an element type from a schema- lookup :: [AChar] -> Schema -> U- lookup _ (Sch []) = undefined- lookup name (Sch ((Attr name' u) : attrs)) =- if name == name' then u else lookup name (Sch attrs)- |])---- The El type family gives us the type associated with a constructor--- of U:-type family El (u :: U) :: Type-type instance El BOOL = Bool-type instance El STRING = String-type instance El NAT = Nat-type instance El (VEC u n) = Vec (El u) n---- Length-indexed vectors-data Vec :: Type -> Nat -> Type where- VNil :: Vec a Zero- VCons :: a -> Vec a n -> Vec a (Succ n)---- Read instances are keyed by the index of the vector to aid in parsing-instance Read (Vec a Zero) where- readsPrec _ s = [(VNil, s)]-instance (Read a, Read (Vec a n)) => Read (Vec a (Succ n)) where- readsPrec n s = do- (a, rest) <- readsPrec n s- (tail, restrest) <- readsPrec n rest- return (VCons a tail, restrest)---- Because the Read instances are keyed by the length of the vector,--- it is not obvious to the compiler that all Vecs have a Read instance.--- We must make a short inductive proof of this fact.---- First, we define a datatype to store the resulting instance, keyed--- by the parameters to Vec:-data VecReadInstance a n where- VecReadInstance :: Read (Vec a n) => VecReadInstance a n---- Then, we make a function that produces an instance of Read for a--- Vec, given the datatype it is over and its length, both encoded--- using singleton types:-vecReadInstance :: Read (El u) => SU u -> SNat n -> VecReadInstance (El u) n-vecReadInstance _ SZero = VecReadInstance-vecReadInstance u (SSucc n) = case vecReadInstance u n of- VecReadInstance -> VecReadInstance---- The Show instance can be straightforwardly defined:-instance Show a => Show (Vec a n) where- show VNil = ""- show (VCons h t) = (show h) ++ " " ++ (show t)---- We need to be able to Read and Show elements of our database, so--- we must know that any type of the form (El u) for some (u :: U)--- has a Read and Show instance. Because we can't declare this instance--- directly (as, in general, declaring an instance of a type family--- would be unsound), we provide inductive proofs that these instances--- exist:-data ElUReadInstance u where- ElUReadInstance :: Read (El u) => ElUReadInstance u--elUReadInstance :: Sing u -> ElUReadInstance u-elUReadInstance SBOOL = ElUReadInstance-elUReadInstance SSTRING = ElUReadInstance-elUReadInstance SNAT = ElUReadInstance-elUReadInstance (SVEC u n) = case elUReadInstance u of- ElUReadInstance -> case vecReadInstance u n of- VecReadInstance -> ElUReadInstance--data ElUShowInstance u where- ElUShowInstance :: Show (El u) => ElUShowInstance u--elUShowInstance :: Sing u -> ElUShowInstance u-elUShowInstance SBOOL = ElUShowInstance-elUShowInstance SSTRING = ElUShowInstance-elUShowInstance SNAT = ElUShowInstance-elUShowInstance (SVEC u _) = case elUShowInstance u of- ElUShowInstance -> ElUShowInstance--showAttrProof :: Sing (Attr nm u) -> ElUShowInstance u-showAttrProof (SAttr _ u) = elUShowInstance u---- A Row is one row of our database table, keyed by its schema.-data Row :: Schema -> Type where- EmptyRow :: [Int] -> Row (Sch '[]) -- the Ints are the unique id of the row- ConsRow :: El u -> Row (Sch s) -> Row (Sch ((Attr name u) ': s))---- We build Show instances for a Row element by element:-instance Show (Row (Sch '[])) where- show (EmptyRow n) = "(id=" ++ (show n) ++ ")"-instance (Show (El u), Show (Row (Sch attrs))) =>- Show (Row (Sch ((Attr name u) ': attrs))) where- show (ConsRow h t) = case t of- EmptyRow n -> (show h) ++ " (id=" ++ (show n) ++ ")"- _ -> (show h) ++ ", " ++ (show t)---- A Handle in our system is an abstract handle to a loaded table.--- The constructor is not exported. In our simplistic case, we--- just store the list of rows. A more sophisticated implementation--- could store some identifier to the connection to an external database.-data Handle :: Schema -> Type where- Handle :: [Row s] -> Handle s---- The following functions parse our very simple flat file database format.---- The file, with a name ending in ".dat", consists of a sequence of lines,--- where each line contains one entry in the table. There is no row separator;--- if a row contains n pieces of data, that row is represented in n lines in--- the file.---- A schema is stored in a file of the same name, except ending in ".schema".--- Each line in the file is a constructor of U indicating the type of the--- corresponding row element.---- Use Either for error handling in parsing functions-type ErrorM = Either String---- This function is relatively uninteresting except for its use of--- pattern matching to introduce the instances of Read and Show for--- elements-readRow :: Int -> SSchema s -> [String] -> ErrorM (Row s, [String])-readRow id (SSch SNil) strs =- return (EmptyRow [id], strs)-readRow _ (SSch (SCons _ _)) [] =- throwError "Ran out of data while processing row"-readRow id (SSch (SCons (SAttr _ u) at)) (sh:st) = do- (rowTail, strTail) <- readRow id (SSch at) st- case elUReadInstance u of- ElUReadInstance ->- let results = readsPrec 0 sh in- if null results- then throwError $ "No parse of " ++ sh ++ " as a " ++- (show (fromSing u))- else- let item = fst $ head results in- case elUShowInstance u of- ElUShowInstance -> return (ConsRow item rowTail, strTail)--readRows :: SSchema s -> [String] -> [Row s] -> ErrorM [Row s]-readRows _ [] soFar = return soFar-readRows sch lst soFar = do- (row, rest) <- readRow (length soFar) sch lst- readRows sch rest (row : soFar)---- Given the name of a database and its schema, return a handle to the--- database.-connect :: String -> SSchema s -> IO (Handle s)-connect name schema = do- schString <- readFile (name ++ ".schema")- let schEntries = lines schString- usFound = map read schEntries -- load schema just using "read"- (Sch attrs) = fromSing schema- usExpected = map (\(Attr _ u) -> u) attrs- unless (usFound == usExpected) -- compare found schema with expected- (fail "Expected schema does not match found schema")- dataString <- readFile (name ++ ".dat")- let dataEntries = lines dataString- result = readRows schema dataEntries [] -- read actual data- case result of- Left errorMsg -> fail errorMsg- Right rows -> return $ Handle rows---- In order to define strongly-typed projection from a row, we need to have a notion--- that one schema is a subset of another. We permit the schemas to have their columns--- in different orders. We define this subset relation via two inductively defined--- propositions. In Haskell, these inductively defined propositions take the form of--- GADTs. In their original form, they would look like this:-{--data InProof :: Attribute -> Schema -> Type where- InElt :: InProof attr (Sch (attr ': schTail))- InTail :: InProof attr (Sch attrs) -> InProof attr (Sch (a ': attrs))--data SubsetProof :: Schema -> Schema -> Type where- SubsetEmpty :: SubsetProof (Sch '[]) s'- SubsetCons :: InProof attr s' -> SubsetProof (Sch attrs) s' ->- SubsetProof (Sch (attr ': attrs)) s'--}--- However, it would be convenient to users of the database library not to require--- building these proofs manually. So, we define type classes so that the compiler--- builds the proofs automatically. To make everything work well together, we also--- make the parameters to the proof GADT constructors implicit -- i.e. in the form--- of type class constraints.--data InProof :: Attribute -> Schema -> Type where- InElt :: InProof attr (Sch (attr ': schTail))- InTail :: InC name u (Sch attrs) => InProof (Attr name u) (Sch (a ': attrs))--class InC (name :: [AChar]) (u :: U) (sch :: Schema) where- inProof :: InProof (Attr name u) sch-instance InC name u (Sch ((Attr name u) ': schTail)) where- inProof = InElt-instance InC name u (Sch attrs) => InC name u (Sch (a ': attrs)) where- inProof = InTail--data SubsetProof :: Schema -> Schema -> Type where- SubsetEmpty :: SubsetProof (Sch '[]) s'- SubsetCons :: (InC name u s', SubsetC (Sch attrs) s') =>- SubsetProof (Sch ((Attr name u) ': attrs)) s'--class SubsetC (s :: Schema) (s' :: Schema) where- subset :: SubsetProof s s'--instance SubsetC (Sch '[]) s' where- subset = SubsetEmpty-instance (InC name u s', SubsetC (Sch attrs) s') =>- SubsetC (Sch ((Attr name u) ': attrs)) s' where- subset = SubsetCons---- To access the data in a structured (and well-typed!) way, we use--- an RA (short for Relational Algebra). An RA is indexed by the schema--- of the data it produces.-data RA :: Schema -> Type where- -- The RA includes all data represented by the handle.- Read :: Handle s -> RA s-- -- The RA is a union of the rows represented by the two RAs provided.- -- Note that the schemas of the two RAs must be the same for this- -- constructor use to type-check.- Union :: RA s -> RA s -> RA s-- -- The RA is the list of rows in the first RA, omitting those in the- -- second. Once again, the schemas must match.- Diff :: RA s -> RA s -> RA s-- -- The RA is a Cartesian product of the two RAs provided. Note that- -- the schemas of the two provided RAs must be disjoint.- Product :: (Disjoint s s' ~ True, SingI s, SingI s') =>- RA s -> RA s' -> RA (Append s s')-- -- The RA is a projection conforming to the schema provided. The- -- type-checker ensures that this schema is a subset of the data- -- included in the provided RA.- Project :: (SubsetC s' s, SingI s) =>- SSchema s' -> RA s -> RA s'-- -- The RA contains only those rows of the provided RA for which- -- the provided expression evaluates to True. Note that the- -- schema of the provided RA and the resultant RA are the same- -- because the columns of data are the same. Also note that- -- the expression must return a Bool for this to type-check.- Select :: Expr s BOOL -> RA s -> RA s---- Other constructors would be added in a more robust database--- implementation.---- An Expr is used with the Select constructor to choose some--- subset of rows from a table. Expressions are indexed by the--- schema over which they operate and the return value they--- produce.-data Expr :: Schema -> U -> Type where- -- Equality among two elements- Equal :: Eq (El u) => Expr s u -> Expr s u -> Expr s BOOL-- -- A less-than comparison among two Nats- LessThan :: Expr s NAT -> Expr s NAT -> Expr s BOOL-- -- A literal number- LiteralNat :: Integer -> Expr s NAT-- -- Projection in an expression -- evaluates to the value- -- of the named attribute.- Element :: (Occurs nm s ~ True) =>- SSchema s -> Sing nm -> Expr s (Lookup nm s)-- -- A more robust implementation would include more constructors---- Retrieves the id from a row. Ids are used when computing unions and--- differences.-getId :: Row s -> [Int]-getId (EmptyRow n) = n-getId (ConsRow _ t) = getId t---- Changes the id of a row to a new value-changeId :: [Int] -> Row s -> Row s-changeId n (EmptyRow _) = EmptyRow n-changeId n (ConsRow h t) = ConsRow h (changeId n t)---- Equality for rows based on ids.-eqRow :: Row s -> Row s -> Bool-eqRow r1 r2 = getId r1 == getId r2---- Equality for attributes based on names-eqAttr :: Attribute -> Attribute -> Bool-eqAttr (Attr nm _) (Attr nm' _) = nm == nm'---- Appends two rows. There are three suspicious case statements -- they are--- suspicious in that the different branches are all exactly identical. Here--- is why they are needed:---- The two case statements on r are necessary to deconstruct the index in the--- type of r; GHC does not use the fact that s' must be (Sch a') for some a'.--- By doing a case analysis on r, GHC uses the types given in the different--- constructors for Row, both of which give the form of s' as (Sch a'). This--- deconstruction is necessary for the type family Append to compute, because--- Append is defined only when its second argument is of the form (Sch a').---- The case statement on rowAppend t r is necessary to avoid potential--- overlapping instances for the SingRep class; the instances are needed for--- the call to ConsRow. The potential for overlapping instances comes from--- ambiguity in the component types of (Append s s'). By doing case analysis--- on rowAppend t r, these variables become fixed, and the potential for--- overlapping instances disappears.---- We use the "cases" Singletons library operation to produce the case--- analysis in the first clause. This "cases" operation produces a case--- statement where each branch is identical and each constructor parameter--- is ignored. The "cases" operation does not work for the second clause--- because the code in the clause depends on definitions generated earlier.--- Template Haskell restricts certain dependencies between auto-generated--- code blocks to prevent the possibility of circular dependencies.--- In this case, if the $(singletons ...) blocks above were in a different--- module, the "cases" operation would be applicable here.--$( return [] )--rowAppend :: Row s -> Row s' -> Row (Append s s')-rowAppend (EmptyRow n) r = $(cases ''Row [| r |]- [| changeId (n ++ (getId r)) r |])-rowAppend (ConsRow h t) r = case r of- EmptyRow _ ->- case rowAppend t r of- EmptyRow _ -> ConsRow h (rowAppend t r)- ConsRow _ _ -> ConsRow h (rowAppend t r)- ConsRow _ _ ->- case rowAppend t r of- EmptyRow _ -> ConsRow h (rowAppend t r)- ConsRow _ _ -> ConsRow h (rowAppend t r)---- Choose the elements of one list based on truth values in another-choose :: [Bool] -> [a] -> [a]-choose [] _ = []-choose (False : btail) (_ : t) = choose btail t-choose (True : btail) (h : t) = h : (choose btail t)-choose _ [] = []---- The query function is the eliminator for an RA. It returns a list of--- rows containing the data produced by the RA.-query :: forall s. SingI s => RA s -> IO [Row s]-query (Read (Handle rows)) = return rows-query (Union ra rb) = do- rowsa <- query ra- rowsb <- query rb- return $ List.unionBy eqRow rowsa rowsb-query (Diff ra rb) = do- rowsa <- query ra- rowsb <- query rb- return $ List.deleteFirstsBy eqRow rowsa rowsb-query (Product ra rb) = do- rowsa <- query ra- rowsb <- query rb- return $ do -- entering the [] Monad- rowa <- rowsa- rowb <- rowsb- return $ rowAppend rowa rowb-query (Project sch ra) = do- rows <- query ra- return $ map (projectRow sch) rows- where -- The projectRow function uses the relationship encoded in the Subset- -- relation to project the requested columns of data in a type-safe manner.-- -- It recurs on the structure of the provided schema, creating the output- -- row to be in the same order as the input schema. This is necessary for- -- the output to type-check, as it is indexed by the input schema.-- -- We use explicit quantification to get access to scoped type variables.- projectRow :: forall (sch :: Schema) (s' :: Schema).- SubsetC sch s' => SSchema sch -> Row s' -> Row sch-- -- Base case: empty schema- projectRow (SSch SNil) r = EmptyRow (getId r)-- -- In the recursive case, we need to pattern-match on the proof that- -- the provided schema is a subset of the provided RA. We extract this- -- proof (of type SubsetProof s s') from the SubsetC instance using the- -- subset method.- projectRow (SSch (SCons attr tail)) r =- case subset :: SubsetProof sch s' of-- -- Because we know that the schema is non-empty, the only possibility- -- here is SubsetCons:- SubsetCons ->- let rtail = projectRow (SSch tail) r in- case attr of- SAttr _ u -> case elUShowInstance u of- ElUShowInstance -> ConsRow (extractElt attr r) rtail-- -- GHC correctly determines that this case is impossible if it is- -- not commented.- -- SubsetEmpty -> undefined <== IMPOSSIBLE-- -- However, the current version of GHC (7.5) does not suppress warnings- -- for incomplete pattern matches when the remaining cases are impossible.- -- So, we include this case (impossible to reach for any terminated value)- -- to suppress the warning.-- -- Retrieves the element, looked up by the name of the provided attribute,- -- from a row. The explicit quantification is necessary to create the scoped- -- type variables to use in the return type of <<inProof>>- extractElt :: forall nm u sch. InC nm u sch =>- Sing (Attr nm u) -> Row sch -> El u- extractElt attr r = case inProof :: InProof (Attr nm u) sch of- InElt -> case r of- ConsRow h _ -> h- -- EmptyRow _ -> undefined <== IMPOSSIBLE- InTail -> case r of- ConsRow _ t -> extractElt attr t- -- EmptyRow _ -> undefined <== IMPOSSBLE--query (Select expr r) = do- rows <- query r- let vals = map (eval expr) rows- return $ choose vals rows- where -- Evaluates an expression- eval :: forall s' u. SingI s' => Expr s' u -> Row s' -> El u- eval (Element _ (name :: Sing name)) row =- case row of- -- EmptyRow _ -> undefined <== IMPOSSIBLE- ConsRow h t -> case row of- (ConsRow _ _ :: Row (Sch ((Attr name' u') ': attrs))) ->- case sing :: Sing s' of- -- SSch SNil -> undefined <== IMPOSSIBLE- SSch (SCons (SAttr name' _) stail) ->- case name %== name' of- STrue -> h- SFalse -> withSingI stail (eval (Element (SSch stail) name) t)-- eval (Equal (e1 :: Expr s' u') e2) row =- let v1 = eval e1 row- v2 = eval e2 row in- v1 == v2-- -- Note that the types really help us here: the LessThan constructor is- -- defined only over Expr s NAT, so we know that evaluating e1 and e2 will- -- yield Nats, which are a member of the Ord type class.- eval (LessThan e1 e2) row =- let v1 = eval e1 row- v2 = eval e2 row in- v1 < v2-- eval (LiteralNat x) _ = toNat x--data G a where- GCons :: G ('Sch (a ': b))--data H a where- HCons :: H ('Sch (a ': b))- HNil :: H ('Sch '[])--data J a where- JCons :: J (a ': b)- JNil :: J '[]--eval :: G s -> Sing s -> ()-eval GCons s =- case s of- -- SSch SNil -> undefined -- <== IMPOSSIBLE- SSch (SCons _ _) -> undefined+{- Database.hs + +(c) Richard Eisenberg 2012 +rae@cs.brynmawr.edu + +This file contains the full code for the database interface example +presented in /Dependently typed programming with singletons/ + +-} + +-- The OverlappingInstances is needed only to allow the InC and SubsetC classes. +-- This is simply a convenience so that GHC can infer the necessary proofs of +-- schema inclusion. The library could easily be designed without this flag, +-- but it would require a client to explicity build proof terms from +-- InProof and Subset. + +module GradingClient.Database where + +import Control.Monad +import Control.Monad.Except ( throwError ) +import Data.Kind (Type) +import qualified Data.List as List +import Data.Singletons.Base.TH +import Prelude hiding ( tail, id ) +import Prelude.Singletons hiding ( Lookup, sLookup, LookupSym0, LookupSym1, LookupSym2 ) +import Text.Show.Singletons + +$(singletons [d| + -- Basic Nat type + data Nat = Zero | Succ Nat deriving (Eq, Ord) + |]) + +-- Conversions to any from Integers +fromNat :: Nat -> Integer +fromNat Zero = 0 +fromNat (Succ n) = (fromNat n) + 1 + +toNat :: Integer -> Nat +toNat 0 = Zero +toNat n | n > 0 = Succ (toNat (n - 1)) +toNat _ = error "Converting negative to Nat" + +-- Display and read Nats using decimal digits +instance Show Nat where + show = show . fromNat +instance Read Nat where + readsPrec n s = map (\(a,rest) -> (toNat a,rest)) $ readsPrec n s + +$(singletons [d| + -- Our "U"niverse of types. These types can be stored in our database. + data U = BOOL + | STRING + | NAT + | VEC U Nat deriving (Read, Eq, Show) + + -- A re-definition of Char as an algebraic data type. + -- This is necessary to allow for promotion and type-level Strings. + data AChar = CA | CB | CC | CD | CE | CF | CG | CH | CI + | CJ | CK | CL | CM | CN | CO | CP | CQ | CR + | CS | CT | CU | CV | CW | CX | CY | CZ + deriving (Read, Show, Eq) + + -- A named attribute in our database + data Attribute = Attr [AChar] U + + -- A schema is an ordered list of named attributes + data Schema = Sch [Attribute] + + -- append two schemas + append :: Schema -> Schema -> Schema + append (Sch s1) (Sch s2) = Sch (s1 ++ s2) + + -- predicate to check that a schema is free of a certain attribute + attrNotIn :: Attribute -> Schema -> Bool + attrNotIn _ (Sch []) = True + attrNotIn (Attr name u) (Sch ((Attr name' _) : t)) = + (name /= name') && (attrNotIn (Attr name u) (Sch t)) + + -- predicate to check that two schemas are disjoint + disjoint :: Schema -> Schema -> Bool + disjoint (Sch []) _ = True + disjoint (Sch (h : t)) s = (attrNotIn h s) && (disjoint (Sch t) s) + + -- predicate to check if a name occurs in a schema + occurs :: [AChar] -> Schema -> Bool + occurs _ (Sch []) = False + occurs name (Sch ((Attr name' _) : attrs)) = + name == name' || occurs name (Sch attrs) + + -- looks up an element type from a schema + lookup :: [AChar] -> Schema -> U + lookup _ (Sch []) = undefined + lookup name (Sch ((Attr name' u) : attrs)) = + if name == name' then u else lookup name (Sch attrs) + |]) + +-- The El type family gives us the type associated with a constructor +-- of U: +type family El (u :: U) :: Type +type instance El BOOL = Bool +type instance El STRING = String +type instance El NAT = Nat +type instance El (VEC u n) = Vec (El u) n + +-- Length-indexed vectors +data Vec :: Type -> Nat -> Type where + VNil :: Vec a Zero + VCons :: a -> Vec a n -> Vec a (Succ n) + +-- Read instances are keyed by the index of the vector to aid in parsing +instance Read (Vec a Zero) where + readsPrec _ s = [(VNil, s)] +instance (Read a, Read (Vec a n)) => Read (Vec a (Succ n)) where + readsPrec n s = do + (a, rest) <- readsPrec n s + (tail, restrest) <- readsPrec n rest + return (VCons a tail, restrest) + +-- Because the Read instances are keyed by the length of the vector, +-- it is not obvious to the compiler that all Vecs have a Read instance. +-- We must make a short inductive proof of this fact. + +-- First, we define a datatype to store the resulting instance, keyed +-- by the parameters to Vec: +data VecReadInstance a n where + VecReadInstance :: Read (Vec a n) => VecReadInstance a n + +-- Then, we make a function that produces an instance of Read for a +-- Vec, given the datatype it is over and its length, both encoded +-- using singleton types: +vecReadInstance :: Read (El u) => SU u -> SNat n -> VecReadInstance (El u) n +vecReadInstance _ SZero = VecReadInstance +vecReadInstance u (SSucc n) = case vecReadInstance u n of + VecReadInstance -> VecReadInstance + +-- The Show instance can be straightforwardly defined: +instance Show a => Show (Vec a n) where + show VNil = "" + show (VCons h t) = (show h) ++ " " ++ (show t) + +-- We need to be able to Read and Show elements of our database, so +-- we must know that any type of the form (El u) for some (u :: U) +-- has a Read and Show instance. Because we can't declare this instance +-- directly (as, in general, declaring an instance of a type family +-- would be unsound), we provide inductive proofs that these instances +-- exist: +data ElUReadInstance u where + ElUReadInstance :: Read (El u) => ElUReadInstance u + +elUReadInstance :: Sing u -> ElUReadInstance u +elUReadInstance SBOOL = ElUReadInstance +elUReadInstance SSTRING = ElUReadInstance +elUReadInstance SNAT = ElUReadInstance +elUReadInstance (SVEC u n) = case elUReadInstance u of + ElUReadInstance -> case vecReadInstance u n of + VecReadInstance -> ElUReadInstance + +data ElUShowInstance u where + ElUShowInstance :: Show (El u) => ElUShowInstance u + +elUShowInstance :: Sing u -> ElUShowInstance u +elUShowInstance SBOOL = ElUShowInstance +elUShowInstance SSTRING = ElUShowInstance +elUShowInstance SNAT = ElUShowInstance +elUShowInstance (SVEC u _) = case elUShowInstance u of + ElUShowInstance -> ElUShowInstance + +showAttrProof :: Sing (Attr nm u) -> ElUShowInstance u +showAttrProof (SAttr _ u) = elUShowInstance u + +-- A Row is one row of our database table, keyed by its schema. +data Row :: Schema -> Type where + EmptyRow :: [Int] -> Row (Sch '[]) -- the Ints are the unique id of the row + ConsRow :: El u -> Row (Sch s) -> Row (Sch ((Attr name u) ': s)) + +-- We build Show instances for a Row element by element: +instance Show (Row (Sch '[])) where + show (EmptyRow n) = "(id=" ++ (show n) ++ ")" +instance (Show (El u), Show (Row (Sch attrs))) => + Show (Row (Sch ((Attr name u) ': attrs))) where + show (ConsRow h t) = case t of + EmptyRow n -> (show h) ++ " (id=" ++ (show n) ++ ")" + _ -> (show h) ++ ", " ++ (show t) + +-- A Handle in our system is an abstract handle to a loaded table. +-- The constructor is not exported. In our simplistic case, we +-- just store the list of rows. A more sophisticated implementation +-- could store some identifier to the connection to an external database. +data Handle :: Schema -> Type where + Handle :: [Row s] -> Handle s + +-- The following functions parse our very simple flat file database format. + +-- The file, with a name ending in ".dat", consists of a sequence of lines, +-- where each line contains one entry in the table. There is no row separator; +-- if a row contains n pieces of data, that row is represented in n lines in +-- the file. + +-- A schema is stored in a file of the same name, except ending in ".schema". +-- Each line in the file is a constructor of U indicating the type of the +-- corresponding row element. + +-- Use Either for error handling in parsing functions +type ErrorM = Either String + +-- This function is relatively uninteresting except for its use of +-- pattern matching to introduce the instances of Read and Show for +-- elements +readRow :: Int -> SSchema s -> [String] -> ErrorM (Row s, [String]) +readRow id (SSch SNil) strs = + return (EmptyRow [id], strs) +readRow _ (SSch (SCons _ _)) [] = + throwError "Ran out of data while processing row" +readRow id (SSch (SCons (SAttr _ u) at)) (sh:st) = do + (rowTail, strTail) <- readRow id (SSch at) st + case elUReadInstance u of + ElUReadInstance -> + let results = readsPrec 0 sh in + if null results + then throwError $ "No parse of " ++ sh ++ " as a " ++ + (show (fromSing u)) + else + let item = fst $ head results in + case elUShowInstance u of + ElUShowInstance -> return (ConsRow item rowTail, strTail) + +readRows :: SSchema s -> [String] -> [Row s] -> ErrorM [Row s] +readRows _ [] soFar = return soFar +readRows sch lst soFar = do + (row, rest) <- readRow (length soFar) sch lst + readRows sch rest (row : soFar) + +-- Given the name of a database and its schema, return a handle to the +-- database. +connect :: String -> SSchema s -> IO (Handle s) +connect name schema = do + schString <- readFile (name ++ ".schema") + let schEntries = lines schString + usFound = map read schEntries -- load schema just using "read" + (Sch attrs) = fromSing schema + usExpected = map (\(Attr _ u) -> u) attrs + unless (usFound == usExpected) -- compare found schema with expected + (fail "Expected schema does not match found schema") + dataString <- readFile (name ++ ".dat") + let dataEntries = lines dataString + result = readRows schema dataEntries [] -- read actual data + case result of + Left errorMsg -> fail errorMsg + Right rows -> return $ Handle rows + +-- In order to define strongly-typed projection from a row, we need to have a notion +-- that one schema is a subset of another. We permit the schemas to have their columns +-- in different orders. We define this subset relation via two inductively defined +-- propositions. In Haskell, these inductively defined propositions take the form of +-- GADTs. In their original form, they would look like this: +{- +data InProof :: Attribute -> Schema -> Type where + InElt :: InProof attr (Sch (attr ': schTail)) + InTail :: InProof attr (Sch attrs) -> InProof attr (Sch (a ': attrs)) + +data SubsetProof :: Schema -> Schema -> Type where + SubsetEmpty :: SubsetProof (Sch '[]) s' + SubsetCons :: InProof attr s' -> SubsetProof (Sch attrs) s' -> + SubsetProof (Sch (attr ': attrs)) s' +-} +-- However, it would be convenient to users of the database library not to require +-- building these proofs manually. So, we define type classes so that the compiler +-- builds the proofs automatically. To make everything work well together, we also +-- make the parameters to the proof GADT constructors implicit -- i.e. in the form +-- of type class constraints. + +data InProof :: Attribute -> Schema -> Type where + InElt :: InProof attr (Sch (attr ': schTail)) + InTail :: InC name u (Sch attrs) => InProof (Attr name u) (Sch (a ': attrs)) + +class InC (name :: [AChar]) (u :: U) (sch :: Schema) where + inProof :: InProof (Attr name u) sch +instance InC name u (Sch ((Attr name u) ': schTail)) where + inProof = InElt +instance InC name u (Sch attrs) => InC name u (Sch (a ': attrs)) where + inProof = InTail + +data SubsetProof :: Schema -> Schema -> Type where + SubsetEmpty :: SubsetProof (Sch '[]) s' + SubsetCons :: (InC name u s', SubsetC (Sch attrs) s') => + SubsetProof (Sch ((Attr name u) ': attrs)) s' + +class SubsetC (s :: Schema) (s' :: Schema) where + subset :: SubsetProof s s' + +instance SubsetC (Sch '[]) s' where + subset = SubsetEmpty +instance (InC name u s', SubsetC (Sch attrs) s') => + SubsetC (Sch ((Attr name u) ': attrs)) s' where + subset = SubsetCons + +-- To access the data in a structured (and well-typed!) way, we use +-- an RA (short for Relational Algebra). An RA is indexed by the schema +-- of the data it produces. +data RA :: Schema -> Type where + -- The RA includes all data represented by the handle. + Read :: Handle s -> RA s + + -- The RA is a union of the rows represented by the two RAs provided. + -- Note that the schemas of the two RAs must be the same for this + -- constructor use to type-check. + Union :: RA s -> RA s -> RA s + + -- The RA is the list of rows in the first RA, omitting those in the + -- second. Once again, the schemas must match. + Diff :: RA s -> RA s -> RA s + + -- The RA is a Cartesian product of the two RAs provided. Note that + -- the schemas of the two provided RAs must be disjoint. + Product :: (Disjoint s s' ~ True, SingI s, SingI s') => + RA s -> RA s' -> RA (Append s s') + + -- The RA is a projection conforming to the schema provided. The + -- type-checker ensures that this schema is a subset of the data + -- included in the provided RA. + Project :: (SubsetC s' s, SingI s) => + SSchema s' -> RA s -> RA s' + + -- The RA contains only those rows of the provided RA for which + -- the provided expression evaluates to True. Note that the + -- schema of the provided RA and the resultant RA are the same + -- because the columns of data are the same. Also note that + -- the expression must return a Bool for this to type-check. + Select :: Expr s BOOL -> RA s -> RA s + +-- Other constructors would be added in a more robust database +-- implementation. + +-- An Expr is used with the Select constructor to choose some +-- subset of rows from a table. Expressions are indexed by the +-- schema over which they operate and the return value they +-- produce. +data Expr :: Schema -> U -> Type where + -- Equality among two elements + Equal :: Eq (El u) => Expr s u -> Expr s u -> Expr s BOOL + + -- A less-than comparison among two Nats + LessThan :: Expr s NAT -> Expr s NAT -> Expr s BOOL + + -- A literal number + LiteralNat :: Integer -> Expr s NAT + + -- Projection in an expression -- evaluates to the value + -- of the named attribute. + Element :: (Occurs nm s ~ True) => + SSchema s -> Sing nm -> Expr s (Lookup nm s) + + -- A more robust implementation would include more constructors + +-- Retrieves the id from a row. Ids are used when computing unions and +-- differences. +getId :: Row s -> [Int] +getId (EmptyRow n) = n +getId (ConsRow _ t) = getId t + +-- Changes the id of a row to a new value +changeId :: [Int] -> Row s -> Row s +changeId n (EmptyRow _) = EmptyRow n +changeId n (ConsRow h t) = ConsRow h (changeId n t) + +-- Equality for rows based on ids. +eqRow :: Row s -> Row s -> Bool +eqRow r1 r2 = getId r1 == getId r2 + +-- Equality for attributes based on names +eqAttr :: Attribute -> Attribute -> Bool +eqAttr (Attr nm _) (Attr nm' _) = nm == nm' + +-- Appends two rows. There are three suspicious case statements -- they are +-- suspicious in that the different branches are all exactly identical. Here +-- is why they are needed: + +-- The two case statements on r are necessary to deconstruct the index in the +-- type of r; GHC does not use the fact that s' must be (Sch a') for some a'. +-- By doing a case analysis on r, GHC uses the types given in the different +-- constructors for Row, both of which give the form of s' as (Sch a'). This +-- deconstruction is necessary for the type family Append to compute, because +-- Append is defined only when its second argument is of the form (Sch a'). + +-- The case statement on rowAppend t r is necessary to avoid potential +-- overlapping instances for the SingRep class; the instances are needed for +-- the call to ConsRow. The potential for overlapping instances comes from +-- ambiguity in the component types of (Append s s'). By doing case analysis +-- on rowAppend t r, these variables become fixed, and the potential for +-- overlapping instances disappears. + +-- We use the "cases" Singletons library operation to produce the case +-- analysis in the first clause. This "cases" operation produces a case +-- statement where each branch is identical and each constructor parameter +-- is ignored. The "cases" operation does not work for the second clause +-- because the code in the clause depends on definitions generated earlier. +-- Template Haskell restricts certain dependencies between auto-generated +-- code blocks to prevent the possibility of circular dependencies. +-- In this case, if the $(singletons ...) blocks above were in a different +-- module, the "cases" operation would be applicable here. + +$( return [] ) + +rowAppend :: Row s -> Row s' -> Row (Append s s') +rowAppend (EmptyRow n) r = $(cases ''Row [| r |] + [| changeId (n ++ (getId r)) r |]) +rowAppend (ConsRow h t) r = case r of + EmptyRow _ -> + case rowAppend t r of + EmptyRow _ -> ConsRow h (rowAppend t r) + ConsRow _ _ -> ConsRow h (rowAppend t r) + ConsRow _ _ -> + case rowAppend t r of + EmptyRow _ -> ConsRow h (rowAppend t r) + ConsRow _ _ -> ConsRow h (rowAppend t r) + +-- Choose the elements of one list based on truth values in another +choose :: [Bool] -> [a] -> [a] +choose [] _ = [] +choose (False : btail) (_ : t) = choose btail t +choose (True : btail) (h : t) = h : (choose btail t) +choose _ [] = [] + +-- The query function is the eliminator for an RA. It returns a list of +-- rows containing the data produced by the RA. +query :: forall s. SingI s => RA s -> IO [Row s] +query (Read (Handle rows)) = return rows +query (Union ra rb) = do + rowsa <- query ra + rowsb <- query rb + return $ List.unionBy eqRow rowsa rowsb +query (Diff ra rb) = do + rowsa <- query ra + rowsb <- query rb + return $ List.deleteFirstsBy eqRow rowsa rowsb +query (Product ra rb) = do + rowsa <- query ra + rowsb <- query rb + return $ do -- entering the [] Monad + rowa <- rowsa + rowb <- rowsb + return $ rowAppend rowa rowb +query (Project sch ra) = do + rows <- query ra + return $ map (projectRow sch) rows + where -- The projectRow function uses the relationship encoded in the Subset + -- relation to project the requested columns of data in a type-safe manner. + + -- It recurs on the structure of the provided schema, creating the output + -- row to be in the same order as the input schema. This is necessary for + -- the output to type-check, as it is indexed by the input schema. + + -- We use explicit quantification to get access to scoped type variables. + projectRow :: forall (sch :: Schema) (s' :: Schema). + SubsetC sch s' => SSchema sch -> Row s' -> Row sch + + -- Base case: empty schema + projectRow (SSch SNil) r = EmptyRow (getId r) + + -- In the recursive case, we need to pattern-match on the proof that + -- the provided schema is a subset of the provided RA. We extract this + -- proof (of type SubsetProof s s') from the SubsetC instance using the + -- subset method. + projectRow (SSch (SCons attr tail)) r = + case subset :: SubsetProof sch s' of + + -- Because we know that the schema is non-empty, the only possibility + -- here is SubsetCons: + SubsetCons -> + let rtail = projectRow (SSch tail) r in + case attr of + SAttr _ u -> case elUShowInstance u of + ElUShowInstance -> ConsRow (extractElt attr r) rtail + + -- GHC correctly determines that this case is impossible if it is + -- not commented. + -- SubsetEmpty -> undefined <== IMPOSSIBLE + + -- However, the current version of GHC (7.5) does not suppress warnings + -- for incomplete pattern matches when the remaining cases are impossible. + -- So, we include this case (impossible to reach for any terminated value) + -- to suppress the warning. + + -- Retrieves the element, looked up by the name of the provided attribute, + -- from a row. The explicit quantification is necessary to create the scoped + -- type variables to use in the return type of <<inProof>> + extractElt :: forall nm u sch. InC nm u sch => + Sing (Attr nm u) -> Row sch -> El u + extractElt attr r = case inProof :: InProof (Attr nm u) sch of + InElt -> case r of + ConsRow h _ -> h + -- EmptyRow _ -> undefined <== IMPOSSIBLE + InTail -> case r of + ConsRow _ t -> extractElt attr t + -- EmptyRow _ -> undefined <== IMPOSSBLE + +query (Select expr r) = do + rows <- query r + let vals = map (eval expr) rows + return $ choose vals rows + where -- Evaluates an expression + eval :: forall s' u. SingI s' => Expr s' u -> Row s' -> El u + eval (Element _ (name :: Sing name)) row = + case row of + -- EmptyRow _ -> undefined <== IMPOSSIBLE + ConsRow h t -> case row of + (ConsRow _ _ :: Row (Sch ((Attr name' u') ': attrs))) -> + case sing :: Sing s' of + -- SSch SNil -> undefined <== IMPOSSIBLE + SSch (SCons (SAttr name' _) stail) -> + case name %== name' of + STrue -> h + SFalse -> withSingI stail (eval (Element (SSch stail) name) t) + + eval (Equal (e1 :: Expr s' u') e2) row = + let v1 = eval e1 row + v2 = eval e2 row in + v1 == v2 + + -- Note that the types really help us here: the LessThan constructor is + -- defined only over Expr s NAT, so we know that evaluating e1 and e2 will + -- yield Nats, which are a member of the Ord type class. + eval (LessThan e1 e2) row = + let v1 = eval e1 row + v2 = eval e2 row in + v1 < v2 + + eval (LiteralNat x) _ = toNat x + +data G a where + GCons :: G ('Sch (a ': b)) + +data H a where + HCons :: H ('Sch (a ': b)) + HNil :: H ('Sch '[]) + +data J a where + JCons :: J (a ': b) + JNil :: J '[] + +eval :: G s -> Sing s -> () +eval GCons s = + case s of + -- SSch SNil -> undefined -- <== IMPOSSIBLE + SSch (SCons _ _) -> undefined
tests/compile-and-dump/GradingClient/Main.golden view
@@ -1,144 +1,169 @@-GradingClient/Main.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| lastName, firstName, yearName, gradeName, majorName :: [AChar]- lastName = [CL, CA, CS, CT]- firstName = [CF, CI, CR, CS, CT]- yearName = [CY, CE, CA, CR]- gradeName = [CG, CR, CA, CD, CE]- majorName = [CM, CA, CJ, CO, CR]- gradingSchema :: Schema- gradingSchema- = Sch- [Attr lastName STRING, Attr firstName STRING, Attr yearName NAT,- Attr gradeName NAT, Attr majorName BOOL]- names :: Schema- names = Sch [Attr firstName STRING, Attr lastName STRING] |]- ======>- lastName :: [AChar]- firstName :: [AChar]- yearName :: [AChar]- gradeName :: [AChar]- majorName :: [AChar]- lastName = [CL, CA, CS, CT]- firstName = [CF, CI, CR, CS, CT]- yearName = [CY, CE, CA, CR]- gradeName = [CG, CR, CA, CD, CE]- majorName = [CM, CA, CJ, CO, CR]- gradingSchema :: Schema- gradingSchema- = Sch- [(Attr lastName) STRING, (Attr firstName) STRING,- (Attr yearName) NAT, (Attr gradeName) NAT, (Attr majorName) BOOL]- names :: Schema- names = Sch [(Attr firstName) STRING, (Attr lastName) STRING]- type NamesSym0 :: Schema- type family NamesSym0 :: Schema where- NamesSym0 = Names- type GradingSchemaSym0 :: Schema- type family GradingSchemaSym0 :: Schema where- GradingSchemaSym0 = GradingSchema- type MajorNameSym0 :: [AChar]- type family MajorNameSym0 :: [AChar] where- MajorNameSym0 = MajorName- type GradeNameSym0 :: [AChar]- type family GradeNameSym0 :: [AChar] where- GradeNameSym0 = GradeName- type YearNameSym0 :: [AChar]- type family YearNameSym0 :: [AChar] where- YearNameSym0 = YearName- type FirstNameSym0 :: [AChar]- type family FirstNameSym0 :: [AChar] where- FirstNameSym0 = FirstName- type LastNameSym0 :: [AChar]- type family LastNameSym0 :: [AChar] where- LastNameSym0 = LastName- type Names :: Schema- type family Names :: Schema where- Names = Apply SchSym0 (Apply (Apply (:@#@$) (Apply (Apply AttrSym0 FirstNameSym0) STRINGSym0)) (Apply (Apply (:@#@$) (Apply (Apply AttrSym0 LastNameSym0) STRINGSym0)) NilSym0))- type GradingSchema :: Schema- type family GradingSchema :: Schema where- GradingSchema = Apply SchSym0 (Apply (Apply (:@#@$) (Apply (Apply AttrSym0 LastNameSym0) STRINGSym0)) (Apply (Apply (:@#@$) (Apply (Apply AttrSym0 FirstNameSym0) STRINGSym0)) (Apply (Apply (:@#@$) (Apply (Apply AttrSym0 YearNameSym0) NATSym0)) (Apply (Apply (:@#@$) (Apply (Apply AttrSym0 GradeNameSym0) NATSym0)) (Apply (Apply (:@#@$) (Apply (Apply AttrSym0 MajorNameSym0) BOOLSym0)) NilSym0)))))- type MajorName :: [AChar]- type family MajorName :: [AChar] where- MajorName = Apply (Apply (:@#@$) CMSym0) (Apply (Apply (:@#@$) CASym0) (Apply (Apply (:@#@$) CJSym0) (Apply (Apply (:@#@$) COSym0) (Apply (Apply (:@#@$) CRSym0) NilSym0))))- type GradeName :: [AChar]- type family GradeName :: [AChar] where- GradeName = Apply (Apply (:@#@$) CGSym0) (Apply (Apply (:@#@$) CRSym0) (Apply (Apply (:@#@$) CASym0) (Apply (Apply (:@#@$) CDSym0) (Apply (Apply (:@#@$) CESym0) NilSym0))))- type YearName :: [AChar]- type family YearName :: [AChar] where- YearName = Apply (Apply (:@#@$) CYSym0) (Apply (Apply (:@#@$) CESym0) (Apply (Apply (:@#@$) CASym0) (Apply (Apply (:@#@$) CRSym0) NilSym0)))- type FirstName :: [AChar]- type family FirstName :: [AChar] where- FirstName = Apply (Apply (:@#@$) CFSym0) (Apply (Apply (:@#@$) CISym0) (Apply (Apply (:@#@$) CRSym0) (Apply (Apply (:@#@$) CSSym0) (Apply (Apply (:@#@$) CTSym0) NilSym0))))- type LastName :: [AChar]- type family LastName :: [AChar] where- LastName = Apply (Apply (:@#@$) CLSym0) (Apply (Apply (:@#@$) CASym0) (Apply (Apply (:@#@$) CSSym0) (Apply (Apply (:@#@$) CTSym0) NilSym0)))- sNames :: Sing (NamesSym0 :: Schema)- sGradingSchema :: Sing (GradingSchemaSym0 :: Schema)- sMajorName :: Sing (MajorNameSym0 :: [AChar])- sGradeName :: Sing (GradeNameSym0 :: [AChar])- sYearName :: Sing (YearNameSym0 :: [AChar])- sFirstName :: Sing (FirstNameSym0 :: [AChar])- sLastName :: Sing (LastNameSym0 :: [AChar])- sNames- = (applySing ((singFun1 @SchSym0) SSch))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing ((applySing ((singFun2 @AttrSym0) SAttr)) sFirstName))- SSTRING)))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing ((applySing ((singFun2 @AttrSym0) SAttr)) sLastName))- SSTRING)))- SNil))- sGradingSchema- = (applySing ((singFun1 @SchSym0) SSch))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing ((applySing ((singFun2 @AttrSym0) SAttr)) sLastName))- SSTRING)))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing ((applySing ((singFun2 @AttrSym0) SAttr)) sFirstName))- SSTRING)))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing ((applySing ((singFun2 @AttrSym0) SAttr)) sYearName))- SNAT)))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing ((applySing ((singFun2 @AttrSym0) SAttr)) sGradeName))- SNAT)))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing ((applySing ((singFun2 @AttrSym0) SAttr)) sMajorName))- SBOOL)))- SNil)))))- sMajorName- = (applySing ((applySing ((singFun2 @(:@#@$)) SCons)) SCM))- ((applySing ((applySing ((singFun2 @(:@#@$)) SCons)) SCA))- ((applySing ((applySing ((singFun2 @(:@#@$)) SCons)) SCJ))- ((applySing ((applySing ((singFun2 @(:@#@$)) SCons)) SCO))- ((applySing ((applySing ((singFun2 @(:@#@$)) SCons)) SCR)) SNil))))- sGradeName- = (applySing ((applySing ((singFun2 @(:@#@$)) SCons)) SCG))- ((applySing ((applySing ((singFun2 @(:@#@$)) SCons)) SCR))- ((applySing ((applySing ((singFun2 @(:@#@$)) SCons)) SCA))- ((applySing ((applySing ((singFun2 @(:@#@$)) SCons)) SCD))- ((applySing ((applySing ((singFun2 @(:@#@$)) SCons)) SCE)) SNil))))- sYearName- = (applySing ((applySing ((singFun2 @(:@#@$)) SCons)) SCY))- ((applySing ((applySing ((singFun2 @(:@#@$)) SCons)) SCE))- ((applySing ((applySing ((singFun2 @(:@#@$)) SCons)) SCA))- ((applySing ((applySing ((singFun2 @(:@#@$)) SCons)) SCR)) SNil)))- sFirstName- = (applySing ((applySing ((singFun2 @(:@#@$)) SCons)) SCF))- ((applySing ((applySing ((singFun2 @(:@#@$)) SCons)) SCI))- ((applySing ((applySing ((singFun2 @(:@#@$)) SCons)) SCR))- ((applySing ((applySing ((singFun2 @(:@#@$)) SCons)) SCS))- ((applySing ((applySing ((singFun2 @(:@#@$)) SCons)) SCT)) SNil))))- sLastName- = (applySing ((applySing ((singFun2 @(:@#@$)) SCons)) SCL))- ((applySing ((applySing ((singFun2 @(:@#@$)) SCons)) SCA))- ((applySing ((applySing ((singFun2 @(:@#@$)) SCons)) SCS))- ((applySing ((applySing ((singFun2 @(:@#@$)) SCons)) SCT)) SNil)))+GradingClient/Main.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| lastName, firstName, yearName, gradeName, majorName :: [AChar] + lastName = [CL, CA, CS, CT] + firstName = [CF, CI, CR, CS, CT] + yearName = [CY, CE, CA, CR] + gradeName = [CG, CR, CA, CD, CE] + majorName = [CM, CA, CJ, CO, CR] + gradingSchema :: Schema + gradingSchema + = Sch + [Attr lastName STRING, Attr firstName STRING, Attr yearName NAT, + Attr gradeName NAT, Attr majorName BOOL] + names :: Schema + names = Sch [Attr firstName STRING, Attr lastName STRING] |] + ======> + lastName :: [AChar] + firstName :: [AChar] + yearName :: [AChar] + gradeName :: [AChar] + majorName :: [AChar] + lastName = [CL, CA, CS, CT] + firstName = [CF, CI, CR, CS, CT] + yearName = [CY, CE, CA, CR] + gradeName = [CG, CR, CA, CD, CE] + majorName = [CM, CA, CJ, CO, CR] + gradingSchema :: Schema + gradingSchema + = Sch + [Attr lastName STRING, Attr firstName STRING, Attr yearName NAT, + Attr gradeName NAT, Attr majorName BOOL] + names :: Schema + names = Sch [Attr firstName STRING, Attr lastName STRING] + type NamesSym0 :: Schema + type family NamesSym0 :: Schema where + NamesSym0 = Names + type GradingSchemaSym0 :: Schema + type family GradingSchemaSym0 :: Schema where + GradingSchemaSym0 = GradingSchema + type MajorNameSym0 :: [AChar] + type family MajorNameSym0 :: [AChar] where + MajorNameSym0 = MajorName + type GradeNameSym0 :: [AChar] + type family GradeNameSym0 :: [AChar] where + GradeNameSym0 = GradeName + type YearNameSym0 :: [AChar] + type family YearNameSym0 :: [AChar] where + YearNameSym0 = YearName + type FirstNameSym0 :: [AChar] + type family FirstNameSym0 :: [AChar] where + FirstNameSym0 = FirstName + type LastNameSym0 :: [AChar] + type family LastNameSym0 :: [AChar] where + LastNameSym0 = LastName + type Names :: Schema + type family Names :: Schema where + Names = Apply SchSym0 (Apply (Apply (:@#@$) (Apply (Apply AttrSym0 FirstNameSym0) STRINGSym0)) (Apply (Apply (:@#@$) (Apply (Apply AttrSym0 LastNameSym0) STRINGSym0)) NilSym0)) + type GradingSchema :: Schema + type family GradingSchema :: Schema where + GradingSchema = Apply SchSym0 (Apply (Apply (:@#@$) (Apply (Apply AttrSym0 LastNameSym0) STRINGSym0)) (Apply (Apply (:@#@$) (Apply (Apply AttrSym0 FirstNameSym0) STRINGSym0)) (Apply (Apply (:@#@$) (Apply (Apply AttrSym0 YearNameSym0) NATSym0)) (Apply (Apply (:@#@$) (Apply (Apply AttrSym0 GradeNameSym0) NATSym0)) (Apply (Apply (:@#@$) (Apply (Apply AttrSym0 MajorNameSym0) BOOLSym0)) NilSym0))))) + type MajorName :: [AChar] + type family MajorName :: [AChar] where + MajorName = Apply (Apply (:@#@$) CMSym0) (Apply (Apply (:@#@$) CASym0) (Apply (Apply (:@#@$) CJSym0) (Apply (Apply (:@#@$) COSym0) (Apply (Apply (:@#@$) CRSym0) NilSym0)))) + type GradeName :: [AChar] + type family GradeName :: [AChar] where + GradeName = Apply (Apply (:@#@$) CGSym0) (Apply (Apply (:@#@$) CRSym0) (Apply (Apply (:@#@$) CASym0) (Apply (Apply (:@#@$) CDSym0) (Apply (Apply (:@#@$) CESym0) NilSym0)))) + type YearName :: [AChar] + type family YearName :: [AChar] where + YearName = Apply (Apply (:@#@$) CYSym0) (Apply (Apply (:@#@$) CESym0) (Apply (Apply (:@#@$) CASym0) (Apply (Apply (:@#@$) CRSym0) NilSym0))) + type FirstName :: [AChar] + type family FirstName :: [AChar] where + FirstName = Apply (Apply (:@#@$) CFSym0) (Apply (Apply (:@#@$) CISym0) (Apply (Apply (:@#@$) CRSym0) (Apply (Apply (:@#@$) CSSym0) (Apply (Apply (:@#@$) CTSym0) NilSym0)))) + type LastName :: [AChar] + type family LastName :: [AChar] where + LastName = Apply (Apply (:@#@$) CLSym0) (Apply (Apply (:@#@$) CASym0) (Apply (Apply (:@#@$) CSSym0) (Apply (Apply (:@#@$) CTSym0) NilSym0))) + sNames :: (Sing (NamesSym0 :: Schema) :: Type) + sGradingSchema :: (Sing (GradingSchemaSym0 :: Schema) :: Type) + sMajorName :: (Sing (MajorNameSym0 :: [AChar]) :: Type) + sGradeName :: (Sing (GradeNameSym0 :: [AChar]) :: Type) + sYearName :: (Sing (YearNameSym0 :: [AChar]) :: Type) + sFirstName :: (Sing (FirstNameSym0 :: [AChar]) :: Type) + sLastName :: (Sing (LastNameSym0 :: [AChar]) :: Type) + sNames + = applySing + (singFun1 @SchSym0 SSch) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing + (applySing (singFun2 @AttrSym0 SAttr) sFirstName) SSTRING)) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing + (applySing (singFun2 @AttrSym0 SAttr) sLastName) SSTRING)) + SNil)) + sGradingSchema + = applySing + (singFun1 @SchSym0 SSch) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing + (applySing (singFun2 @AttrSym0 SAttr) sLastName) SSTRING)) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing + (applySing (singFun2 @AttrSym0 SAttr) sFirstName) SSTRING)) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing (applySing (singFun2 @AttrSym0 SAttr) sYearName) SNAT)) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing (applySing (singFun2 @AttrSym0 SAttr) sGradeName) SNAT)) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing + (applySing (singFun2 @AttrSym0 SAttr) sMajorName) SBOOL)) + SNil))))) + sMajorName + = applySing + (applySing (singFun2 @(:@#@$) SCons) SCM) + (applySing + (applySing (singFun2 @(:@#@$) SCons) SCA) + (applySing + (applySing (singFun2 @(:@#@$) SCons) SCJ) + (applySing + (applySing (singFun2 @(:@#@$) SCons) SCO) + (applySing (applySing (singFun2 @(:@#@$) SCons) SCR) SNil)))) + sGradeName + = applySing + (applySing (singFun2 @(:@#@$) SCons) SCG) + (applySing + (applySing (singFun2 @(:@#@$) SCons) SCR) + (applySing + (applySing (singFun2 @(:@#@$) SCons) SCA) + (applySing + (applySing (singFun2 @(:@#@$) SCons) SCD) + (applySing (applySing (singFun2 @(:@#@$) SCons) SCE) SNil)))) + sYearName + = applySing + (applySing (singFun2 @(:@#@$) SCons) SCY) + (applySing + (applySing (singFun2 @(:@#@$) SCons) SCE) + (applySing + (applySing (singFun2 @(:@#@$) SCons) SCA) + (applySing (applySing (singFun2 @(:@#@$) SCons) SCR) SNil))) + sFirstName + = applySing + (applySing (singFun2 @(:@#@$) SCons) SCF) + (applySing + (applySing (singFun2 @(:@#@$) SCons) SCI) + (applySing + (applySing (singFun2 @(:@#@$) SCons) SCR) + (applySing + (applySing (singFun2 @(:@#@$) SCons) SCS) + (applySing (applySing (singFun2 @(:@#@$) SCons) SCT) SNil)))) + sLastName + = applySing + (applySing (singFun2 @(:@#@$) SCons) SCL) + (applySing + (applySing (singFun2 @(:@#@$) SCons) SCA) + (applySing + (applySing (singFun2 @(:@#@$) SCons) SCS) + (applySing (applySing (singFun2 @(:@#@$) SCons) SCT) SNil)))
tests/compile-and-dump/GradingClient/Main.hs view
@@ -1,52 +1,52 @@-{- GradingClient.hs--(c) Richard Eisenberg 2012-rae@cs.brynmawr.edu--This file accesses the database described in Database.hs and performs-some basic queries on it.---}--module Main where--import Data.List.Singletons-import Data.Singletons-import Data.Singletons.TH-import GradingClient.Database--$(singletons [d|- lastName, firstName, yearName, gradeName, majorName :: [AChar]- lastName = [CL, CA, CS, CT]- firstName = [CF, CI, CR, CS, CT]- yearName = [CY, CE, CA, CR]- gradeName = [CG, CR, CA, CD, CE]- majorName = [CM, CA, CJ, CO, CR]-- gradingSchema :: Schema- gradingSchema = Sch [Attr lastName STRING,- Attr firstName STRING,- Attr yearName NAT,- Attr gradeName NAT,- Attr majorName BOOL]-- names :: Schema- names = Sch [Attr firstName STRING,- Attr lastName STRING]- |])--main :: IO ()-main = do- h <- connect "grades" sGradingSchema- let ra = Read h-- allStudents <- query $ Project sNames ra- putStrLn $ "Names of all students: " ++ (show allStudents) ++ "\n"-- majors <- query $ Select (Element sGradingSchema sMajorName) ra- putStrLn $ "Students in major: " ++ (show majors) ++ "\n"-- b_students <-- query $ Project sNames $- Select (LessThan (Element sGradingSchema sGradeName) (LiteralNat 90)) ra- putStrLn $ "Names of students with grade < 90: " ++ (show b_students) ++ "\n"+{- GradingClient.hs + +(c) Richard Eisenberg 2012 +rae@cs.brynmawr.edu + +This file accesses the database described in Database.hs and performs +some basic queries on it. + +-} + +module Main where + +import Data.List.Singletons +import Data.Singletons +import Data.Singletons.TH +import GradingClient.Database + +$(singletons [d| + lastName, firstName, yearName, gradeName, majorName :: [AChar] + lastName = [CL, CA, CS, CT] + firstName = [CF, CI, CR, CS, CT] + yearName = [CY, CE, CA, CR] + gradeName = [CG, CR, CA, CD, CE] + majorName = [CM, CA, CJ, CO, CR] + + gradingSchema :: Schema + gradingSchema = Sch [Attr lastName STRING, + Attr firstName STRING, + Attr yearName NAT, + Attr gradeName NAT, + Attr majorName BOOL] + + names :: Schema + names = Sch [Attr firstName STRING, + Attr lastName STRING] + |]) + +main :: IO () +main = do + h <- connect "grades" sGradingSchema + let ra = Read h + + allStudents <- query $ Project sNames ra + putStrLn $ "Names of all students: " ++ (show allStudents) ++ "\n" + + majors <- query $ Select (Element sGradingSchema sMajorName) ra + putStrLn $ "Students in major: " ++ (show majors) ++ "\n" + + b_students <- + query $ Project sNames $ + Select (LessThan (Element sGradingSchema sGradeName) (LiteralNat 90)) ra + putStrLn $ "Names of students with grade < 90: " ++ (show b_students) ++ "\n"
tests/compile-and-dump/InsertionSort/InsertionSortImp.golden view
@@ -1,219 +1,224 @@-InsertionSort/InsertionSortImp.hs:(0,0)-(0,0): Splicing declarations- singletons [d| data Nat = Zero | Succ Nat |]- ======>- data Nat = Zero | Succ Nat- type ZeroSym0 :: Nat- type family ZeroSym0 :: Nat where- ZeroSym0 = Zero- type SuccSym0 :: (~>) Nat Nat- data SuccSym0 :: (~>) Nat Nat- where- SuccSym0KindInference :: SameKind (Apply SuccSym0 arg) (SuccSym1 arg) =>- SuccSym0 a0123456789876543210- type instance Apply SuccSym0 a0123456789876543210 = Succ a0123456789876543210- instance SuppressUnusedWarnings SuccSym0 where- suppressUnusedWarnings = snd (((,) SuccSym0KindInference) ())- type SuccSym1 :: Nat -> Nat- type family SuccSym1 (a0123456789876543210 :: Nat) :: Nat where- SuccSym1 a0123456789876543210 = Succ a0123456789876543210- data SNat :: Nat -> Type- where- SZero :: SNat (Zero :: Nat)- SSucc :: forall (n :: Nat). (Sing n) -> SNat (Succ n :: Nat)- type instance Sing @Nat = SNat- instance SingKind Nat where- type Demote Nat = Nat- fromSing SZero = Zero- fromSing (SSucc b) = Succ (fromSing b)- toSing Zero = SomeSing SZero- toSing (Succ (b :: Demote Nat))- = case toSing b :: SomeSing Nat of SomeSing c -> SomeSing (SSucc c)- instance SingI Zero where- sing = SZero- instance SingI n => SingI (Succ (n :: Nat)) where- sing = SSucc sing- instance SingI1 Succ where- liftSing = SSucc- instance SingI (SuccSym0 :: (~>) Nat Nat) where- sing = (singFun1 @SuccSym0) SSucc-InsertionSort/InsertionSortImp.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| leq :: Nat -> Nat -> Bool- leq Zero _ = True- leq (Succ _) Zero = False- leq (Succ a) (Succ b) = leq a b- insert :: Nat -> [Nat] -> [Nat]- insert n [] = [n]- insert n (h : t)- = if leq n h then (n : h : t) else h : (insert n t)- insertionSort :: [Nat] -> [Nat]- insertionSort [] = []- insertionSort (h : t) = insert h (insertionSort t) |]- ======>- leq :: Nat -> Nat -> Bool- leq Zero _ = True- leq (Succ _) Zero = False- leq (Succ a) (Succ b) = (leq a) b- insert :: Nat -> [Nat] -> [Nat]- insert n [] = [n]- insert n (h : t)- = if (leq n) h then (n : (h : t)) else (h : (insert n) t)- insertionSort :: [Nat] -> [Nat]- insertionSort [] = []- insertionSort (h : t) = (insert h) (insertionSort t)- data Let0123456789876543210Scrutinee_0123456789876543210Sym0 n0123456789876543210- where- Let0123456789876543210Scrutinee_0123456789876543210Sym0KindInference :: SameKind (Apply Let0123456789876543210Scrutinee_0123456789876543210Sym0 arg) (Let0123456789876543210Scrutinee_0123456789876543210Sym1 arg) =>- Let0123456789876543210Scrutinee_0123456789876543210Sym0 n0123456789876543210- type instance Apply Let0123456789876543210Scrutinee_0123456789876543210Sym0 n0123456789876543210 = Let0123456789876543210Scrutinee_0123456789876543210Sym1 n0123456789876543210- instance SuppressUnusedWarnings Let0123456789876543210Scrutinee_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd- (((,)- Let0123456789876543210Scrutinee_0123456789876543210Sym0KindInference)- ())- data Let0123456789876543210Scrutinee_0123456789876543210Sym1 n0123456789876543210 h0123456789876543210- where- Let0123456789876543210Scrutinee_0123456789876543210Sym1KindInference :: SameKind (Apply (Let0123456789876543210Scrutinee_0123456789876543210Sym1 n0123456789876543210) arg) (Let0123456789876543210Scrutinee_0123456789876543210Sym2 n0123456789876543210 arg) =>- Let0123456789876543210Scrutinee_0123456789876543210Sym1 n0123456789876543210 h0123456789876543210- type instance Apply (Let0123456789876543210Scrutinee_0123456789876543210Sym1 n0123456789876543210) h0123456789876543210 = Let0123456789876543210Scrutinee_0123456789876543210Sym2 n0123456789876543210 h0123456789876543210- instance SuppressUnusedWarnings (Let0123456789876543210Scrutinee_0123456789876543210Sym1 n0123456789876543210) where- suppressUnusedWarnings- = snd- (((,)- Let0123456789876543210Scrutinee_0123456789876543210Sym1KindInference)- ())- data Let0123456789876543210Scrutinee_0123456789876543210Sym2 n0123456789876543210 h0123456789876543210 t0123456789876543210- where- Let0123456789876543210Scrutinee_0123456789876543210Sym2KindInference :: SameKind (Apply (Let0123456789876543210Scrutinee_0123456789876543210Sym2 n0123456789876543210 h0123456789876543210) arg) (Let0123456789876543210Scrutinee_0123456789876543210Sym3 n0123456789876543210 h0123456789876543210 arg) =>- Let0123456789876543210Scrutinee_0123456789876543210Sym2 n0123456789876543210 h0123456789876543210 t0123456789876543210- type instance Apply (Let0123456789876543210Scrutinee_0123456789876543210Sym2 n0123456789876543210 h0123456789876543210) t0123456789876543210 = Let0123456789876543210Scrutinee_0123456789876543210 n0123456789876543210 h0123456789876543210 t0123456789876543210- instance SuppressUnusedWarnings (Let0123456789876543210Scrutinee_0123456789876543210Sym2 n0123456789876543210 h0123456789876543210) where- suppressUnusedWarnings- = snd- (((,)- Let0123456789876543210Scrutinee_0123456789876543210Sym2KindInference)- ())- type family Let0123456789876543210Scrutinee_0123456789876543210Sym3 n0123456789876543210 h0123456789876543210 t0123456789876543210 where- Let0123456789876543210Scrutinee_0123456789876543210Sym3 n0123456789876543210 h0123456789876543210 t0123456789876543210 = Let0123456789876543210Scrutinee_0123456789876543210 n0123456789876543210 h0123456789876543210 t0123456789876543210- type family Let0123456789876543210Scrutinee_0123456789876543210 n h t where- Let0123456789876543210Scrutinee_0123456789876543210 n h t = Apply (Apply LeqSym0 n) h- type family Case_0123456789876543210 n h t t where- Case_0123456789876543210 n h t 'True = Apply (Apply (:@#@$) n) (Apply (Apply (:@#@$) h) t)- Case_0123456789876543210 n h t 'False = Apply (Apply (:@#@$) h) (Apply (Apply InsertSym0 n) t)- type InsertionSortSym0 :: (~>) [Nat] [Nat]- data InsertionSortSym0 :: (~>) [Nat] [Nat]- where- InsertionSortSym0KindInference :: SameKind (Apply InsertionSortSym0 arg) (InsertionSortSym1 arg) =>- InsertionSortSym0 a0123456789876543210- type instance Apply InsertionSortSym0 a0123456789876543210 = InsertionSort a0123456789876543210- instance SuppressUnusedWarnings InsertionSortSym0 where- suppressUnusedWarnings- = snd (((,) InsertionSortSym0KindInference) ())- type InsertionSortSym1 :: [Nat] -> [Nat]- type family InsertionSortSym1 (a0123456789876543210 :: [Nat]) :: [Nat] where- InsertionSortSym1 a0123456789876543210 = InsertionSort a0123456789876543210- type InsertSym0 :: (~>) Nat ((~>) [Nat] [Nat])- data InsertSym0 :: (~>) Nat ((~>) [Nat] [Nat])- where- InsertSym0KindInference :: SameKind (Apply InsertSym0 arg) (InsertSym1 arg) =>- InsertSym0 a0123456789876543210- type instance Apply InsertSym0 a0123456789876543210 = InsertSym1 a0123456789876543210- instance SuppressUnusedWarnings InsertSym0 where- suppressUnusedWarnings = snd (((,) InsertSym0KindInference) ())- type InsertSym1 :: Nat -> (~>) [Nat] [Nat]- data InsertSym1 (a0123456789876543210 :: Nat) :: (~>) [Nat] [Nat]- where- InsertSym1KindInference :: SameKind (Apply (InsertSym1 a0123456789876543210) arg) (InsertSym2 a0123456789876543210 arg) =>- InsertSym1 a0123456789876543210 a0123456789876543210- type instance Apply (InsertSym1 a0123456789876543210) a0123456789876543210 = Insert a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (InsertSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) InsertSym1KindInference) ())- type InsertSym2 :: Nat -> [Nat] -> [Nat]- type family InsertSym2 (a0123456789876543210 :: Nat) (a0123456789876543210 :: [Nat]) :: [Nat] where- InsertSym2 a0123456789876543210 a0123456789876543210 = Insert a0123456789876543210 a0123456789876543210- type LeqSym0 :: (~>) Nat ((~>) Nat Bool)- data LeqSym0 :: (~>) Nat ((~>) Nat Bool)- where- LeqSym0KindInference :: SameKind (Apply LeqSym0 arg) (LeqSym1 arg) =>- LeqSym0 a0123456789876543210- type instance Apply LeqSym0 a0123456789876543210 = LeqSym1 a0123456789876543210- instance SuppressUnusedWarnings LeqSym0 where- suppressUnusedWarnings = snd (((,) LeqSym0KindInference) ())- type LeqSym1 :: Nat -> (~>) Nat Bool- data LeqSym1 (a0123456789876543210 :: Nat) :: (~>) Nat Bool- where- LeqSym1KindInference :: SameKind (Apply (LeqSym1 a0123456789876543210) arg) (LeqSym2 a0123456789876543210 arg) =>- LeqSym1 a0123456789876543210 a0123456789876543210- type instance Apply (LeqSym1 a0123456789876543210) a0123456789876543210 = Leq a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (LeqSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) LeqSym1KindInference) ())- type LeqSym2 :: Nat -> Nat -> Bool- type family LeqSym2 (a0123456789876543210 :: Nat) (a0123456789876543210 :: Nat) :: Bool where- LeqSym2 a0123456789876543210 a0123456789876543210 = Leq a0123456789876543210 a0123456789876543210- type InsertionSort :: [Nat] -> [Nat]- type family InsertionSort (a :: [Nat]) :: [Nat] where- InsertionSort '[] = NilSym0- InsertionSort ('(:) h t) = Apply (Apply InsertSym0 h) (Apply InsertionSortSym0 t)- type Insert :: Nat -> [Nat] -> [Nat]- type family Insert (a :: Nat) (a :: [Nat]) :: [Nat] where- Insert n '[] = Apply (Apply (:@#@$) n) NilSym0- Insert n ('(:) h t) = Case_0123456789876543210 n h t (Let0123456789876543210Scrutinee_0123456789876543210Sym3 n h t)- type Leq :: Nat -> Nat -> Bool- type family Leq (a :: Nat) (a :: Nat) :: Bool where- Leq 'Zero _ = TrueSym0- Leq ('Succ _) 'Zero = FalseSym0- Leq ('Succ a) ('Succ b) = Apply (Apply LeqSym0 a) b- sInsertionSort ::- forall (t :: [Nat]). Sing t- -> Sing (Apply InsertionSortSym0 t :: [Nat])- sInsert ::- forall (t :: Nat) (t :: [Nat]). Sing t- -> Sing t -> Sing (Apply (Apply InsertSym0 t) t :: [Nat])- sLeq ::- forall (t :: Nat) (t :: Nat). Sing t- -> Sing t -> Sing (Apply (Apply LeqSym0 t) t :: Bool)- sInsertionSort SNil = SNil- sInsertionSort (SCons (sH :: Sing h) (sT :: Sing t))- = (applySing ((applySing ((singFun2 @InsertSym0) sInsert)) sH))- ((applySing ((singFun1 @InsertionSortSym0) sInsertionSort)) sT)- sInsert (sN :: Sing n) SNil- = (applySing ((applySing ((singFun2 @(:@#@$)) SCons)) sN)) SNil- sInsert (sN :: Sing n) (SCons (sH :: Sing h) (sT :: Sing t))- = let- sScrutinee_0123456789876543210 ::- Sing @_ (Let0123456789876543210Scrutinee_0123456789876543210Sym3 n h t)- sScrutinee_0123456789876543210- = (applySing ((applySing ((singFun2 @LeqSym0) sLeq)) sN)) sH- in- (id- @(Sing (Case_0123456789876543210 n h t (Let0123456789876543210Scrutinee_0123456789876543210Sym3 n h t) :: [Nat])))- (case sScrutinee_0123456789876543210 of- STrue- -> (applySing ((applySing ((singFun2 @(:@#@$)) SCons)) sN))- ((applySing ((applySing ((singFun2 @(:@#@$)) SCons)) sH)) sT)- SFalse- -> (applySing ((applySing ((singFun2 @(:@#@$)) SCons)) sH))- ((applySing ((applySing ((singFun2 @InsertSym0) sInsert)) sN)) sT))- sLeq SZero _ = STrue- sLeq (SSucc _) SZero = SFalse- sLeq (SSucc (sA :: Sing a)) (SSucc (sB :: Sing b))- = (applySing ((applySing ((singFun2 @LeqSym0) sLeq)) sA)) sB- instance SingI (InsertionSortSym0 :: (~>) [Nat] [Nat]) where- sing = (singFun1 @InsertionSortSym0) sInsertionSort- instance SingI (InsertSym0 :: (~>) Nat ((~>) [Nat] [Nat])) where- sing = (singFun2 @InsertSym0) sInsert- instance SingI d =>- SingI (InsertSym1 (d :: Nat) :: (~>) [Nat] [Nat]) where- sing = (singFun1 @(InsertSym1 (d :: Nat))) (sInsert (sing @d))- instance SingI1 (InsertSym1 :: Nat -> (~>) [Nat] [Nat]) where- liftSing (s :: Sing (d :: Nat))- = (singFun1 @(InsertSym1 (d :: Nat))) (sInsert s)- instance SingI (LeqSym0 :: (~>) Nat ((~>) Nat Bool)) where- sing = (singFun2 @LeqSym0) sLeq- instance SingI d =>- SingI (LeqSym1 (d :: Nat) :: (~>) Nat Bool) where- sing = (singFun1 @(LeqSym1 (d :: Nat))) (sLeq (sing @d))- instance SingI1 (LeqSym1 :: Nat -> (~>) Nat Bool) where- liftSing (s :: Sing (d :: Nat))- = (singFun1 @(LeqSym1 (d :: Nat))) (sLeq s)+InsertionSort/InsertionSortImp.hs:(0,0)-(0,0): Splicing declarations + singletons [d| data Nat = Zero | Succ Nat |] + ======> + data Nat = Zero | Succ Nat + type ZeroSym0 :: Nat + type family ZeroSym0 :: Nat where + ZeroSym0 = Zero + type SuccSym0 :: (~>) Nat Nat + data SuccSym0 :: (~>) Nat Nat + where + SuccSym0KindInference :: SameKind (Apply SuccSym0 arg) (SuccSym1 arg) => + SuccSym0 a0123456789876543210 + type instance Apply SuccSym0 a0123456789876543210 = Succ a0123456789876543210 + instance SuppressUnusedWarnings SuccSym0 where + suppressUnusedWarnings = snd ((,) SuccSym0KindInference ()) + type SuccSym1 :: Nat -> Nat + type family SuccSym1 (a0123456789876543210 :: Nat) :: Nat where + SuccSym1 a0123456789876543210 = Succ a0123456789876543210 + data SNat :: Nat -> Type + where + SZero :: SNat (Zero :: Nat) + SSucc :: forall (n :: Nat). (Sing n) -> SNat (Succ n :: Nat) + type instance Sing @Nat = SNat + instance SingKind Nat where + type Demote Nat = Nat + fromSing SZero = Zero + fromSing (SSucc b) = Succ (fromSing b) + toSing Zero = SomeSing SZero + toSing (Succ (b :: Demote Nat)) + = case toSing b :: SomeSing Nat of SomeSing c -> SomeSing (SSucc c) + instance SingI Zero where + sing = SZero + instance SingI n => SingI (Succ (n :: Nat)) where + sing = SSucc sing + instance SingI1 Succ where + liftSing = SSucc + instance SingI (SuccSym0 :: (~>) Nat Nat) where + sing = singFun1 @SuccSym0 SSucc +InsertionSort/InsertionSortImp.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| leq :: Nat -> Nat -> Bool + leq Zero _ = True + leq (Succ _) Zero = False + leq (Succ a) (Succ b) = leq a b + insert :: Nat -> [Nat] -> [Nat] + insert n [] = [n] + insert n (h : t) + = if leq n h then (n : h : t) else h : (insert n t) + insertionSort :: [Nat] -> [Nat] + insertionSort [] = [] + insertionSort (h : t) = insert h (insertionSort t) |] + ======> + leq :: Nat -> Nat -> Bool + leq Zero _ = True + leq (Succ _) Zero = False + leq (Succ a) (Succ b) = leq a b + insert :: Nat -> [Nat] -> [Nat] + insert n [] = [n] + insert n (h : t) + = if leq n h then (n : (h : t)) else (h : insert n t) + insertionSort :: [Nat] -> [Nat] + insertionSort [] = [] + insertionSort (h : t) = insert h (insertionSort t) + data Let0123456789876543210Scrutinee_0123456789876543210Sym0 n0123456789876543210 + where + Let0123456789876543210Scrutinee_0123456789876543210Sym0KindInference :: SameKind (Apply Let0123456789876543210Scrutinee_0123456789876543210Sym0 arg) (Let0123456789876543210Scrutinee_0123456789876543210Sym1 arg) => + Let0123456789876543210Scrutinee_0123456789876543210Sym0 n0123456789876543210 + type instance Apply Let0123456789876543210Scrutinee_0123456789876543210Sym0 n0123456789876543210 = Let0123456789876543210Scrutinee_0123456789876543210Sym1 n0123456789876543210 + instance SuppressUnusedWarnings Let0123456789876543210Scrutinee_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd + ((,) + Let0123456789876543210Scrutinee_0123456789876543210Sym0KindInference + ()) + data Let0123456789876543210Scrutinee_0123456789876543210Sym1 n0123456789876543210 h0123456789876543210 + where + Let0123456789876543210Scrutinee_0123456789876543210Sym1KindInference :: SameKind (Apply (Let0123456789876543210Scrutinee_0123456789876543210Sym1 n0123456789876543210) arg) (Let0123456789876543210Scrutinee_0123456789876543210Sym2 n0123456789876543210 arg) => + Let0123456789876543210Scrutinee_0123456789876543210Sym1 n0123456789876543210 h0123456789876543210 + type instance Apply (Let0123456789876543210Scrutinee_0123456789876543210Sym1 n0123456789876543210) h0123456789876543210 = Let0123456789876543210Scrutinee_0123456789876543210Sym2 n0123456789876543210 h0123456789876543210 + instance SuppressUnusedWarnings (Let0123456789876543210Scrutinee_0123456789876543210Sym1 n0123456789876543210) where + suppressUnusedWarnings + = snd + ((,) + Let0123456789876543210Scrutinee_0123456789876543210Sym1KindInference + ()) + data Let0123456789876543210Scrutinee_0123456789876543210Sym2 n0123456789876543210 h0123456789876543210 t0123456789876543210 + where + Let0123456789876543210Scrutinee_0123456789876543210Sym2KindInference :: SameKind (Apply (Let0123456789876543210Scrutinee_0123456789876543210Sym2 n0123456789876543210 h0123456789876543210) arg) (Let0123456789876543210Scrutinee_0123456789876543210Sym3 n0123456789876543210 h0123456789876543210 arg) => + Let0123456789876543210Scrutinee_0123456789876543210Sym2 n0123456789876543210 h0123456789876543210 t0123456789876543210 + type instance Apply (Let0123456789876543210Scrutinee_0123456789876543210Sym2 n0123456789876543210 h0123456789876543210) t0123456789876543210 = Let0123456789876543210Scrutinee_0123456789876543210 n0123456789876543210 h0123456789876543210 t0123456789876543210 + instance SuppressUnusedWarnings (Let0123456789876543210Scrutinee_0123456789876543210Sym2 n0123456789876543210 h0123456789876543210) where + suppressUnusedWarnings + = snd + ((,) + Let0123456789876543210Scrutinee_0123456789876543210Sym2KindInference + ()) + type family Let0123456789876543210Scrutinee_0123456789876543210Sym3 n0123456789876543210 h0123456789876543210 t0123456789876543210 where + Let0123456789876543210Scrutinee_0123456789876543210Sym3 n0123456789876543210 h0123456789876543210 t0123456789876543210 = Let0123456789876543210Scrutinee_0123456789876543210 n0123456789876543210 h0123456789876543210 t0123456789876543210 + type family Let0123456789876543210Scrutinee_0123456789876543210 n h t where + Let0123456789876543210Scrutinee_0123456789876543210 n h t = Apply (Apply LeqSym0 n) h + type family Case_0123456789876543210 n h t t where + Case_0123456789876543210 n h t 'True = Apply (Apply (:@#@$) n) (Apply (Apply (:@#@$) h) t) + Case_0123456789876543210 n h t 'False = Apply (Apply (:@#@$) h) (Apply (Apply InsertSym0 n) t) + type InsertionSortSym0 :: (~>) [Nat] [Nat] + data InsertionSortSym0 :: (~>) [Nat] [Nat] + where + InsertionSortSym0KindInference :: SameKind (Apply InsertionSortSym0 arg) (InsertionSortSym1 arg) => + InsertionSortSym0 a0123456789876543210 + type instance Apply InsertionSortSym0 a0123456789876543210 = InsertionSort a0123456789876543210 + instance SuppressUnusedWarnings InsertionSortSym0 where + suppressUnusedWarnings + = snd ((,) InsertionSortSym0KindInference ()) + type InsertionSortSym1 :: [Nat] -> [Nat] + type family InsertionSortSym1 (a0123456789876543210 :: [Nat]) :: [Nat] where + InsertionSortSym1 a0123456789876543210 = InsertionSort a0123456789876543210 + type InsertSym0 :: (~>) Nat ((~>) [Nat] [Nat]) + data InsertSym0 :: (~>) Nat ((~>) [Nat] [Nat]) + where + InsertSym0KindInference :: SameKind (Apply InsertSym0 arg) (InsertSym1 arg) => + InsertSym0 a0123456789876543210 + type instance Apply InsertSym0 a0123456789876543210 = InsertSym1 a0123456789876543210 + instance SuppressUnusedWarnings InsertSym0 where + suppressUnusedWarnings = snd ((,) InsertSym0KindInference ()) + type InsertSym1 :: Nat -> (~>) [Nat] [Nat] + data InsertSym1 (a0123456789876543210 :: Nat) :: (~>) [Nat] [Nat] + where + InsertSym1KindInference :: SameKind (Apply (InsertSym1 a0123456789876543210) arg) (InsertSym2 a0123456789876543210 arg) => + InsertSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (InsertSym1 a0123456789876543210) a0123456789876543210 = Insert a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (InsertSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) InsertSym1KindInference ()) + type InsertSym2 :: Nat -> [Nat] -> [Nat] + type family InsertSym2 (a0123456789876543210 :: Nat) (a0123456789876543210 :: [Nat]) :: [Nat] where + InsertSym2 a0123456789876543210 a0123456789876543210 = Insert a0123456789876543210 a0123456789876543210 + type LeqSym0 :: (~>) Nat ((~>) Nat Bool) + data LeqSym0 :: (~>) Nat ((~>) Nat Bool) + where + LeqSym0KindInference :: SameKind (Apply LeqSym0 arg) (LeqSym1 arg) => + LeqSym0 a0123456789876543210 + type instance Apply LeqSym0 a0123456789876543210 = LeqSym1 a0123456789876543210 + instance SuppressUnusedWarnings LeqSym0 where + suppressUnusedWarnings = snd ((,) LeqSym0KindInference ()) + type LeqSym1 :: Nat -> (~>) Nat Bool + data LeqSym1 (a0123456789876543210 :: Nat) :: (~>) Nat Bool + where + LeqSym1KindInference :: SameKind (Apply (LeqSym1 a0123456789876543210) arg) (LeqSym2 a0123456789876543210 arg) => + LeqSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (LeqSym1 a0123456789876543210) a0123456789876543210 = Leq a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (LeqSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) LeqSym1KindInference ()) + type LeqSym2 :: Nat -> Nat -> Bool + type family LeqSym2 (a0123456789876543210 :: Nat) (a0123456789876543210 :: Nat) :: Bool where + LeqSym2 a0123456789876543210 a0123456789876543210 = Leq a0123456789876543210 a0123456789876543210 + type InsertionSort :: [Nat] -> [Nat] + type family InsertionSort (a :: [Nat]) :: [Nat] where + InsertionSort '[] = NilSym0 + InsertionSort ('(:) h t) = Apply (Apply InsertSym0 h) (Apply InsertionSortSym0 t) + type Insert :: Nat -> [Nat] -> [Nat] + type family Insert (a :: Nat) (a :: [Nat]) :: [Nat] where + Insert n '[] = Apply (Apply (:@#@$) n) NilSym0 + Insert n ('(:) h t) = Case_0123456789876543210 n h t (Let0123456789876543210Scrutinee_0123456789876543210Sym3 n h t) + type Leq :: Nat -> Nat -> Bool + type family Leq (a :: Nat) (a :: Nat) :: Bool where + Leq 'Zero _ = TrueSym0 + Leq ('Succ _) 'Zero = FalseSym0 + Leq ('Succ a) ('Succ b) = Apply (Apply LeqSym0 a) b + sInsertionSort :: + (forall (t :: [Nat]). + Sing t -> Sing (Apply InsertionSortSym0 t :: [Nat]) :: Type) + sInsert :: + (forall (t :: Nat) (t :: [Nat]). + Sing t + -> Sing t -> Sing (Apply (Apply InsertSym0 t) t :: [Nat]) :: Type) + sLeq :: + (forall (t :: Nat) (t :: Nat). + Sing t + -> Sing t -> Sing (Apply (Apply LeqSym0 t) t :: Bool) :: Type) + sInsertionSort SNil = SNil + sInsertionSort (SCons (sH :: Sing h) (sT :: Sing t)) + = applySing + (applySing (singFun2 @InsertSym0 sInsert) sH) + (applySing (singFun1 @InsertionSortSym0 sInsertionSort) sT) + sInsert (sN :: Sing n) SNil + = applySing (applySing (singFun2 @(:@#@$) SCons) sN) SNil + sInsert (sN :: Sing n) (SCons (sH :: Sing h) (sT :: Sing t)) + = let + sScrutinee_0123456789876543210 :: + Sing @_ (Let0123456789876543210Scrutinee_0123456789876543210Sym3 n h t) + sScrutinee_0123456789876543210 + = applySing (applySing (singFun2 @LeqSym0 sLeq) sN) sH + in + id + @(Sing (Case_0123456789876543210 n h t (Let0123456789876543210Scrutinee_0123456789876543210Sym3 n h t))) + (case sScrutinee_0123456789876543210 of + STrue + -> applySing + (applySing (singFun2 @(:@#@$) SCons) sN) + (applySing (applySing (singFun2 @(:@#@$) SCons) sH) sT) + SFalse + -> applySing + (applySing (singFun2 @(:@#@$) SCons) sH) + (applySing (applySing (singFun2 @InsertSym0 sInsert) sN) sT)) + sLeq SZero _ = STrue + sLeq (SSucc _) SZero = SFalse + sLeq (SSucc (sA :: Sing a)) (SSucc (sB :: Sing b)) + = applySing (applySing (singFun2 @LeqSym0 sLeq) sA) sB + instance SingI (InsertionSortSym0 :: (~>) [Nat] [Nat]) where + sing = singFun1 @InsertionSortSym0 sInsertionSort + instance SingI (InsertSym0 :: (~>) Nat ((~>) [Nat] [Nat])) where + sing = singFun2 @InsertSym0 sInsert + instance SingI d => + SingI (InsertSym1 (d :: Nat) :: (~>) [Nat] [Nat]) where + sing = singFun1 @(InsertSym1 (d :: Nat)) (sInsert (sing @d)) + instance SingI1 (InsertSym1 :: Nat -> (~>) [Nat] [Nat]) where + liftSing (s :: Sing (d :: Nat)) + = singFun1 @(InsertSym1 (d :: Nat)) (sInsert s) + instance SingI (LeqSym0 :: (~>) Nat ((~>) Nat Bool)) where + sing = singFun2 @LeqSym0 sLeq + instance SingI d => + SingI (LeqSym1 (d :: Nat) :: (~>) Nat Bool) where + sing = singFun1 @(LeqSym1 (d :: Nat)) (sLeq (sing @d)) + instance SingI1 (LeqSym1 :: Nat -> (~>) Nat Bool) where + liftSing (s :: Sing (d :: Nat)) + = singFun1 @(LeqSym1 (d :: Nat)) (sLeq s)
tests/compile-and-dump/InsertionSort/InsertionSortImp.hs view
@@ -1,199 +1,199 @@-{- InsertionSortImp.hs--(c) Richard Eisenberg 2012-rae@cs.brynmawr.edu--This file contains an implementation of insertion sort over natural numbers,-along with a Haskell proof that the sort algorithm is correct. The code below-uses a combination of GADTs and class instances to record the progress and-result of the proof.--Ideally, the GADTs would be defined so that the constructors take no explicit-parameters --- the information would all be encoded in the constraints to the-constructors. However, due to the nature of the permutation relation, a class-instance definition corresponding to the constructor PermIns would require-existentially-quantified type variables (the l2 variable in the declaration of-PermIns). Type variables in an instance constraint but not mentioned in the-instance head are inherently ambiguous. The compiler would never be able to-infer the value of the variables. Thus, it is not possible to make a class-PermutationC analogous to PermutationProof in the way that AscendingC is-analogous to AscendingProof. (Note that it may be possible to fundamentally-rewrite the inductive definition of the permutation relation to avoid-existentially-quantified variables. We have not attempted that here.)--If there were a way to offer an explicit dictionary when satisfying a constraint,-this problem could be avoided, as the variable in question could be made-unambiguous.---}--module InsertionSort.InsertionSortImp where--import Data.Kind (Type)-import Data.Singletons.TH-import Prelude.Singletons--data Dict c where- Dict :: c => Dict c---- Natural numbers, defined with singleton counterparts-$(singletons [d|- data Nat = Zero | Succ Nat- |])---- convenience functions for testing purposes-toNat :: Int -> Nat-toNat 0 = Zero-toNat n | n > 0 = Succ (toNat (n - 1))-toNat _ = error "Converting negative to Nat"--fromNat :: Nat -> Int-fromNat Zero = 0-fromNat (Succ n) = 1 + (fromNat n)---- A less-than-or-equal relation among naturals-class (a :: Nat) :<=: (b :: Nat)-instance Zero :<=: a-instance (a :<=: b) => (Succ a) :<=: (Succ b)---- A proof term asserting that a list of naturals is in ascending order-data AscendingProof :: [Nat] -> Type where- AscEmpty :: AscendingProof '[]- AscOne :: AscendingProof '[n]- AscCons :: (a :<=: b, AscendingC (b ': rest)) => AscendingProof (a ': b ': rest)---- The class constraint (implicit parameter definition) corresponding to--- AscendingProof-class AscendingC (lst :: [Nat]) where- ascendingProof :: AscendingProof lst---- The instances correspond to the constructors of AscendingProof-instance AscendingC '[] where- ascendingProof = AscEmpty-instance AscendingC '[n] where- ascendingProof = AscOne-instance (a :<=: b, AscendingC (b ': rest)) => AscendingC (a ': b ': rest) where- ascendingProof = AscCons---- A proof term asserting that l2 is the list produced when x is inserted--- (anywhere) into list l1-data InsertionProof (x :: k) (l1 :: [k]) (l2 :: [k]) where- InsHere :: InsertionProof x l (x ': l)- InsLater :: InsertionC x l1 l2 => InsertionProof x (y ': l1) (y ': l2)---- The class constraint corresponding to InsertionProof-class InsertionC (x :: k) (l1 :: [k]) (l2 :: [k]) where- insertionProof :: InsertionProof x l1 l2--instance InsertionC x l (x ': l) where- insertionProof = InsHere-instance InsertionC x l1 l2 => InsertionC x (y ': l1) (y ': l2) where- insertionProof = InsLater---- A proof term asserting that l1 and l2 are permutations of each other-data PermutationProof (l1 :: [k]) (l2 :: [k]) where- PermId :: PermutationProof l l- PermIns :: InsertionC x l2 l2' => PermutationProof l1 l2 ->- PermutationProof (x ': l1) l2'---- Here is the definition of insertion sort about which we will be reasoning:-$(singletons [d|- leq :: Nat -> Nat -> Bool- leq Zero _ = True- leq (Succ _) Zero = False- leq (Succ a) (Succ b) = leq a b-- insert :: Nat -> [Nat] -> [Nat]- insert n [] = [n]- insert n (h:t) = if leq n h then (n:h:t) else h:(insert n t)-- insertionSort :: [Nat] -> [Nat]- insertionSort [] = []- insertionSort (h:t) = insert h (insertionSort t)- |])---- A lemma that states if sLeq a b is STrue, then (a :<=: b)--- This is necessary to convert from the boolean definition of <= to the--- corresponding constraint-sLeq_true__le :: (Leq a b ~ True) => SNat a -> SNat b -> Dict (a :<=: b)-sLeq_true__le a b = case (a, b) of- (SZero, SZero) -> Dict- (SZero, SSucc _) -> Dict- -- (SSucc _, SZero) -> undefined <== IMPOSSIBLE- (SSucc a', SSucc b') -> case sLeq_true__le a' b' of- Dict -> Dict---- A lemma that states if sLeq a b is SFalse, then (b :<=: a)-sLeq_false__nle :: (Leq a b ~ False) => SNat a -> SNat b -> Dict (b :<=: a)-sLeq_false__nle a b = case (a, b) of- -- (SZero, SZero) -> undefined <== IMPOSSIBLE- -- (SZero, SSucc _) -> undefined <== IMPOSSIBLE- (SSucc _, SZero) -> Dict- (SSucc a', SSucc b') -> case sLeq_false__nle a' b' of- Dict -> Dict---- A lemma that states that inserting into an ascending list produces an--- ascending list-insert_ascending :: forall n lst.- AscendingC lst => SNat n -> SList lst -> Dict (AscendingC (Insert n lst))-insert_ascending n lst =- case ascendingProof :: AscendingProof lst of- AscEmpty -> Dict -- If lst is empty, then we're done- AscOne -> case lst of -- If lst has one element...- -- SNil -> undefined <== IMPOSSIBLE- SCons h _ -> case sLeq n h of -- then check if n is <= h- STrue -> case sLeq_true__le n h of Dict -> Dict -- if so, we're done- SFalse -> case sLeq_false__nle n h of Dict -> Dict -- if not, we're done- AscCons -> case lst of -- Otherwise, if lst is more than one element...- -- SNil -> undefined <== IMPOSSIBLE- SCons h t -> case sLeq n h of -- then check if n is <= h- STrue -> case sLeq_true__le n h of Dict -> Dict -- if so, we're done- SFalse -> case sLeq_false__nle n h of -- if not, things are harder...- Dict -> case t of -- destruct t: lst is (h : h2 : t2)- -- SNil -> undefined <== IMPOSSIBLE- SCons h2 _ -> case sLeq n h2 of -- is n <= h2?- STrue -> -- if so, we're done- case sLeq_true__le n h2 of Dict -> Dict- SFalse -> -- otherwise, show that (Insert n t) is sorted- case insert_ascending n t of Dict -> Dict -- and we're done---- A lemma that states that inserting n into lst produces a new list with n--- inserted into lst.-insert_insertion :: SNat n -> SList lst -> Dict (InsertionC n lst (Insert n lst))-insert_insertion n lst =- case lst of- SNil -> Dict -- if lst is empty, we're done- SCons h t -> case sLeq n h of -- otherwise, is n <= h?- STrue -> Dict -- if so, we're done- SFalse -> case insert_insertion n t of Dict -> Dict -- otherwise, recur---- A lemma that states that the result of an insertion sort is in ascending order-insertionSort_ascending :: SList lst -> Dict (AscendingC (InsertionSort lst))-insertionSort_ascending lst = case lst of- SNil -> Dict -- if the list is empty, we're done-- -- otherwise, we recur to find that insertionSort on t produces an ascending list,- -- and then we use the fact that inserting into an ascending list produces an- -- ascending list- SCons h t -> case insertionSort_ascending t of- Dict -> case insert_ascending h (sInsertionSort t) of Dict -> Dict---- A lemma that states that the result of an insertion sort is a permutation--- of its input-insertionSort_permutes :: SList lst -> PermutationProof lst (InsertionSort lst)-insertionSort_permutes lst = case lst of- SNil -> PermId -- if the list is empty, we're done-- -- otherwise, we wish to use PermIns. We must know that t is a permutation of- -- the insertion sort of t and that inserting h into the insertion sort of t- -- works correctly:- SCons h t ->- case insert_insertion h (sInsertionSort t) of- Dict -> PermIns (insertionSort_permutes t)---- A theorem that states that the insertion sort of a list is both ascending--- and a permutation of the original-insertionSort_correct :: SList lst -> (Dict (AscendingC (InsertionSort lst)),- PermutationProof lst (InsertionSort lst))-insertionSort_correct lst = (insertionSort_ascending lst,- insertionSort_permutes lst)+{- InsertionSortImp.hs + +(c) Richard Eisenberg 2012 +rae@cs.brynmawr.edu + +This file contains an implementation of insertion sort over natural numbers, +along with a Haskell proof that the sort algorithm is correct. The code below +uses a combination of GADTs and class instances to record the progress and +result of the proof. + +Ideally, the GADTs would be defined so that the constructors take no explicit +parameters --- the information would all be encoded in the constraints to the +constructors. However, due to the nature of the permutation relation, a class +instance definition corresponding to the constructor PermIns would require +existentially-quantified type variables (the l2 variable in the declaration of +PermIns). Type variables in an instance constraint but not mentioned in the +instance head are inherently ambiguous. The compiler would never be able to +infer the value of the variables. Thus, it is not possible to make a class +PermutationC analogous to PermutationProof in the way that AscendingC is +analogous to AscendingProof. (Note that it may be possible to fundamentally +rewrite the inductive definition of the permutation relation to avoid +existentially-quantified variables. We have not attempted that here.) + +If there were a way to offer an explicit dictionary when satisfying a constraint, +this problem could be avoided, as the variable in question could be made +unambiguous. + +-} + +module InsertionSort.InsertionSortImp where + +import Data.Kind (Type) +import Data.Singletons.TH +import Prelude.Singletons + +data Dict c where + Dict :: c => Dict c + +-- Natural numbers, defined with singleton counterparts +$(singletons [d| + data Nat = Zero | Succ Nat + |]) + +-- convenience functions for testing purposes +toNat :: Int -> Nat +toNat 0 = Zero +toNat n | n > 0 = Succ (toNat (n - 1)) +toNat _ = error "Converting negative to Nat" + +fromNat :: Nat -> Int +fromNat Zero = 0 +fromNat (Succ n) = 1 + (fromNat n) + +-- A less-than-or-equal relation among naturals +class (a :: Nat) :<=: (b :: Nat) +instance Zero :<=: a +instance (a :<=: b) => (Succ a) :<=: (Succ b) + +-- A proof term asserting that a list of naturals is in ascending order +data AscendingProof :: [Nat] -> Type where + AscEmpty :: AscendingProof '[] + AscOne :: AscendingProof '[n] + AscCons :: (a :<=: b, AscendingC (b ': rest)) => AscendingProof (a ': b ': rest) + +-- The class constraint (implicit parameter definition) corresponding to +-- AscendingProof +class AscendingC (lst :: [Nat]) where + ascendingProof :: AscendingProof lst + +-- The instances correspond to the constructors of AscendingProof +instance AscendingC '[] where + ascendingProof = AscEmpty +instance AscendingC '[n] where + ascendingProof = AscOne +instance (a :<=: b, AscendingC (b ': rest)) => AscendingC (a ': b ': rest) where + ascendingProof = AscCons + +-- A proof term asserting that l2 is the list produced when x is inserted +-- (anywhere) into list l1 +data InsertionProof (x :: k) (l1 :: [k]) (l2 :: [k]) where + InsHere :: InsertionProof x l (x ': l) + InsLater :: InsertionC x l1 l2 => InsertionProof x (y ': l1) (y ': l2) + +-- The class constraint corresponding to InsertionProof +class InsertionC (x :: k) (l1 :: [k]) (l2 :: [k]) where + insertionProof :: InsertionProof x l1 l2 + +instance InsertionC x l (x ': l) where + insertionProof = InsHere +instance InsertionC x l1 l2 => InsertionC x (y ': l1) (y ': l2) where + insertionProof = InsLater + +-- A proof term asserting that l1 and l2 are permutations of each other +data PermutationProof (l1 :: [k]) (l2 :: [k]) where + PermId :: PermutationProof l l + PermIns :: InsertionC x l2 l2' => PermutationProof l1 l2 -> + PermutationProof (x ': l1) l2' + +-- Here is the definition of insertion sort about which we will be reasoning: +$(singletons [d| + leq :: Nat -> Nat -> Bool + leq Zero _ = True + leq (Succ _) Zero = False + leq (Succ a) (Succ b) = leq a b + + insert :: Nat -> [Nat] -> [Nat] + insert n [] = [n] + insert n (h:t) = if leq n h then (n:h:t) else h:(insert n t) + + insertionSort :: [Nat] -> [Nat] + insertionSort [] = [] + insertionSort (h:t) = insert h (insertionSort t) + |]) + +-- A lemma that states if sLeq a b is STrue, then (a :<=: b) +-- This is necessary to convert from the boolean definition of <= to the +-- corresponding constraint +sLeq_true__le :: (Leq a b ~ True) => SNat a -> SNat b -> Dict (a :<=: b) +sLeq_true__le a b = case (a, b) of + (SZero, SZero) -> Dict + (SZero, SSucc _) -> Dict + -- (SSucc _, SZero) -> undefined <== IMPOSSIBLE + (SSucc a', SSucc b') -> case sLeq_true__le a' b' of + Dict -> Dict + +-- A lemma that states if sLeq a b is SFalse, then (b :<=: a) +sLeq_false__nle :: (Leq a b ~ False) => SNat a -> SNat b -> Dict (b :<=: a) +sLeq_false__nle a b = case (a, b) of + -- (SZero, SZero) -> undefined <== IMPOSSIBLE + -- (SZero, SSucc _) -> undefined <== IMPOSSIBLE + (SSucc _, SZero) -> Dict + (SSucc a', SSucc b') -> case sLeq_false__nle a' b' of + Dict -> Dict + +-- A lemma that states that inserting into an ascending list produces an +-- ascending list +insert_ascending :: forall n lst. + AscendingC lst => SNat n -> SList lst -> Dict (AscendingC (Insert n lst)) +insert_ascending n lst = + case ascendingProof :: AscendingProof lst of + AscEmpty -> Dict -- If lst is empty, then we're done + AscOne -> case lst of -- If lst has one element... + -- SNil -> undefined <== IMPOSSIBLE + SCons h _ -> case sLeq n h of -- then check if n is <= h + STrue -> case sLeq_true__le n h of Dict -> Dict -- if so, we're done + SFalse -> case sLeq_false__nle n h of Dict -> Dict -- if not, we're done + AscCons -> case lst of -- Otherwise, if lst is more than one element... + -- SNil -> undefined <== IMPOSSIBLE + SCons h t -> case sLeq n h of -- then check if n is <= h + STrue -> case sLeq_true__le n h of Dict -> Dict -- if so, we're done + SFalse -> case sLeq_false__nle n h of -- if not, things are harder... + Dict -> case t of -- destruct t: lst is (h : h2 : t2) + -- SNil -> undefined <== IMPOSSIBLE + SCons h2 _ -> case sLeq n h2 of -- is n <= h2? + STrue -> -- if so, we're done + case sLeq_true__le n h2 of Dict -> Dict + SFalse -> -- otherwise, show that (Insert n t) is sorted + case insert_ascending n t of Dict -> Dict -- and we're done + +-- A lemma that states that inserting n into lst produces a new list with n +-- inserted into lst. +insert_insertion :: SNat n -> SList lst -> Dict (InsertionC n lst (Insert n lst)) +insert_insertion n lst = + case lst of + SNil -> Dict -- if lst is empty, we're done + SCons h t -> case sLeq n h of -- otherwise, is n <= h? + STrue -> Dict -- if so, we're done + SFalse -> case insert_insertion n t of Dict -> Dict -- otherwise, recur + +-- A lemma that states that the result of an insertion sort is in ascending order +insertionSort_ascending :: SList lst -> Dict (AscendingC (InsertionSort lst)) +insertionSort_ascending lst = case lst of + SNil -> Dict -- if the list is empty, we're done + + -- otherwise, we recur to find that insertionSort on t produces an ascending list, + -- and then we use the fact that inserting into an ascending list produces an + -- ascending list + SCons h t -> case insertionSort_ascending t of + Dict -> case insert_ascending h (sInsertionSort t) of Dict -> Dict + +-- A lemma that states that the result of an insertion sort is a permutation +-- of its input +insertionSort_permutes :: SList lst -> PermutationProof lst (InsertionSort lst) +insertionSort_permutes lst = case lst of + SNil -> PermId -- if the list is empty, we're done + + -- otherwise, we wish to use PermIns. We must know that t is a permutation of + -- the insertion sort of t and that inserting h into the insertion sort of t + -- works correctly: + SCons h t -> + case insert_insertion h (sInsertionSort t) of + Dict -> PermIns (insertionSort_permutes t) + +-- A theorem that states that the insertion sort of a list is both ascending +-- and a permutation of the original +insertionSort_correct :: SList lst -> (Dict (AscendingC (InsertionSort lst)), + PermutationProof lst (InsertionSort lst)) +insertionSort_correct lst = (insertionSort_ascending lst, + insertionSort_permutes lst)
tests/compile-and-dump/Promote/Constructors.golden view
@@ -1,73 +1,73 @@-Promote/Constructors.hs:(0,0)-(0,0): Splicing declarations- promote- [d| data Foo = Foo | Foo :+ Foo- data Bar = Bar Bar Bar Bar Bar Foo |]- ======>- data Foo = Foo | Foo :+ Foo- data Bar = Bar Bar Bar Bar Bar Foo- type FooSym0 :: Foo- type family FooSym0 :: Foo where- FooSym0 = Foo- type (:+@#@$) :: (~>) Foo ((~>) Foo Foo)- data (:+@#@$) :: (~>) Foo ((~>) Foo Foo)- where- (::+@#@$###) :: SameKind (Apply (:+@#@$) arg) ((:+@#@$$) arg) =>- (:+@#@$) a0123456789876543210- type instance Apply (:+@#@$) a0123456789876543210 = (:+@#@$$) a0123456789876543210- instance SuppressUnusedWarnings (:+@#@$) where- suppressUnusedWarnings = snd (((,) (::+@#@$###)) ())- type (:+@#@$$) :: Foo -> (~>) Foo Foo- data (:+@#@$$) (a0123456789876543210 :: Foo) :: (~>) Foo Foo- where- (::+@#@$$###) :: SameKind (Apply ((:+@#@$$) a0123456789876543210) arg) ((:+@#@$$$) a0123456789876543210 arg) =>- (:+@#@$$) a0123456789876543210 a0123456789876543210- type instance Apply ((:+@#@$$) a0123456789876543210) a0123456789876543210 = (:+) a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings ((:+@#@$$) a0123456789876543210) where- suppressUnusedWarnings = snd (((,) (::+@#@$$###)) ())- type (:+@#@$$$) :: Foo -> Foo -> Foo- type family (:+@#@$$$) (a0123456789876543210 :: Foo) (a0123456789876543210 :: Foo) :: Foo where- (:+@#@$$$) a0123456789876543210 a0123456789876543210 = (:+) a0123456789876543210 a0123456789876543210- type BarSym0 :: (~>) Bar ((~>) Bar ((~>) Bar ((~>) Bar ((~>) Foo Bar))))- data BarSym0 :: (~>) Bar ((~>) Bar ((~>) Bar ((~>) Bar ((~>) Foo Bar))))- where- BarSym0KindInference :: SameKind (Apply BarSym0 arg) (BarSym1 arg) =>- BarSym0 a0123456789876543210- type instance Apply BarSym0 a0123456789876543210 = BarSym1 a0123456789876543210- instance SuppressUnusedWarnings BarSym0 where- suppressUnusedWarnings = snd (((,) BarSym0KindInference) ())- type BarSym1 :: Bar- -> (~>) Bar ((~>) Bar ((~>) Bar ((~>) Foo Bar)))- data BarSym1 (a0123456789876543210 :: Bar) :: (~>) Bar ((~>) Bar ((~>) Bar ((~>) Foo Bar)))- where- BarSym1KindInference :: SameKind (Apply (BarSym1 a0123456789876543210) arg) (BarSym2 a0123456789876543210 arg) =>- BarSym1 a0123456789876543210 a0123456789876543210- type instance Apply (BarSym1 a0123456789876543210) a0123456789876543210 = BarSym2 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (BarSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) BarSym1KindInference) ())- type BarSym2 :: Bar -> Bar -> (~>) Bar ((~>) Bar ((~>) Foo Bar))- data BarSym2 (a0123456789876543210 :: Bar) (a0123456789876543210 :: Bar) :: (~>) Bar ((~>) Bar ((~>) Foo Bar))- where- BarSym2KindInference :: SameKind (Apply (BarSym2 a0123456789876543210 a0123456789876543210) arg) (BarSym3 a0123456789876543210 a0123456789876543210 arg) =>- BarSym2 a0123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply (BarSym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = BarSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (BarSym2 a0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) BarSym2KindInference) ())- type BarSym3 :: Bar -> Bar -> Bar -> (~>) Bar ((~>) Foo Bar)- data BarSym3 (a0123456789876543210 :: Bar) (a0123456789876543210 :: Bar) (a0123456789876543210 :: Bar) :: (~>) Bar ((~>) Foo Bar)- where- BarSym3KindInference :: SameKind (Apply (BarSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210) arg) (BarSym4 a0123456789876543210 a0123456789876543210 a0123456789876543210 arg) =>- BarSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply (BarSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210) a0123456789876543210 = BarSym4 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (BarSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) BarSym3KindInference) ())- type BarSym4 :: Bar -> Bar -> Bar -> Bar -> (~>) Foo Bar- data BarSym4 (a0123456789876543210 :: Bar) (a0123456789876543210 :: Bar) (a0123456789876543210 :: Bar) (a0123456789876543210 :: Bar) :: (~>) Foo Bar- where- BarSym4KindInference :: SameKind (Apply (BarSym4 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210) arg) (BarSym5 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 arg) =>- BarSym4 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply (BarSym4 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210) a0123456789876543210 = Bar a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (BarSym4 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) BarSym4KindInference) ())- type BarSym5 :: Bar -> Bar -> Bar -> Bar -> Foo -> Bar- type family BarSym5 (a0123456789876543210 :: Bar) (a0123456789876543210 :: Bar) (a0123456789876543210 :: Bar) (a0123456789876543210 :: Bar) (a0123456789876543210 :: Foo) :: Bar where- BarSym5 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 = Bar a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210+Promote/Constructors.hs:(0,0)-(0,0): Splicing declarations + promote + [d| data Foo = Foo | Foo :+ Foo + data Bar = Bar Bar Bar Bar Bar Foo |] + ======> + data Foo = Foo | Foo :+ Foo + data Bar = Bar Bar Bar Bar Bar Foo + type FooSym0 :: Foo + type family FooSym0 :: Foo where + FooSym0 = Foo + type (:+@#@$) :: (~>) Foo ((~>) Foo Foo) + data (:+@#@$) :: (~>) Foo ((~>) Foo Foo) + where + (::+@#@$###) :: SameKind (Apply (:+@#@$) arg) ((:+@#@$$) arg) => + (:+@#@$) a0123456789876543210 + type instance Apply (:+@#@$) a0123456789876543210 = (:+@#@$$) a0123456789876543210 + instance SuppressUnusedWarnings (:+@#@$) where + suppressUnusedWarnings = snd ((,) (::+@#@$###) ()) + type (:+@#@$$) :: Foo -> (~>) Foo Foo + data (:+@#@$$) (a0123456789876543210 :: Foo) :: (~>) Foo Foo + where + (::+@#@$$###) :: SameKind (Apply ((:+@#@$$) a0123456789876543210) arg) ((:+@#@$$$) a0123456789876543210 arg) => + (:+@#@$$) a0123456789876543210 a0123456789876543210 + type instance Apply ((:+@#@$$) a0123456789876543210) a0123456789876543210 = (:+) a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings ((:+@#@$$) a0123456789876543210) where + suppressUnusedWarnings = snd ((,) (::+@#@$$###) ()) + type (:+@#@$$$) :: Foo -> Foo -> Foo + type family (:+@#@$$$) (a0123456789876543210 :: Foo) (a0123456789876543210 :: Foo) :: Foo where + (:+@#@$$$) a0123456789876543210 a0123456789876543210 = (:+) a0123456789876543210 a0123456789876543210 + type BarSym0 :: (~>) Bar ((~>) Bar ((~>) Bar ((~>) Bar ((~>) Foo Bar)))) + data BarSym0 :: (~>) Bar ((~>) Bar ((~>) Bar ((~>) Bar ((~>) Foo Bar)))) + where + BarSym0KindInference :: SameKind (Apply BarSym0 arg) (BarSym1 arg) => + BarSym0 a0123456789876543210 + type instance Apply BarSym0 a0123456789876543210 = BarSym1 a0123456789876543210 + instance SuppressUnusedWarnings BarSym0 where + suppressUnusedWarnings = snd ((,) BarSym0KindInference ()) + type BarSym1 :: Bar + -> (~>) Bar ((~>) Bar ((~>) Bar ((~>) Foo Bar))) + data BarSym1 (a0123456789876543210 :: Bar) :: (~>) Bar ((~>) Bar ((~>) Bar ((~>) Foo Bar))) + where + BarSym1KindInference :: SameKind (Apply (BarSym1 a0123456789876543210) arg) (BarSym2 a0123456789876543210 arg) => + BarSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (BarSym1 a0123456789876543210) a0123456789876543210 = BarSym2 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (BarSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) BarSym1KindInference ()) + type BarSym2 :: Bar -> Bar -> (~>) Bar ((~>) Bar ((~>) Foo Bar)) + data BarSym2 (a0123456789876543210 :: Bar) (a0123456789876543210 :: Bar) :: (~>) Bar ((~>) Bar ((~>) Foo Bar)) + where + BarSym2KindInference :: SameKind (Apply (BarSym2 a0123456789876543210 a0123456789876543210) arg) (BarSym3 a0123456789876543210 a0123456789876543210 arg) => + BarSym2 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply (BarSym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = BarSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (BarSym2 a0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) BarSym2KindInference ()) + type BarSym3 :: Bar -> Bar -> Bar -> (~>) Bar ((~>) Foo Bar) + data BarSym3 (a0123456789876543210 :: Bar) (a0123456789876543210 :: Bar) (a0123456789876543210 :: Bar) :: (~>) Bar ((~>) Foo Bar) + where + BarSym3KindInference :: SameKind (Apply (BarSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210) arg) (BarSym4 a0123456789876543210 a0123456789876543210 a0123456789876543210 arg) => + BarSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply (BarSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210) a0123456789876543210 = BarSym4 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (BarSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) BarSym3KindInference ()) + type BarSym4 :: Bar -> Bar -> Bar -> Bar -> (~>) Foo Bar + data BarSym4 (a0123456789876543210 :: Bar) (a0123456789876543210 :: Bar) (a0123456789876543210 :: Bar) (a0123456789876543210 :: Bar) :: (~>) Foo Bar + where + BarSym4KindInference :: SameKind (Apply (BarSym4 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210) arg) (BarSym5 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 arg) => + BarSym4 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply (BarSym4 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210) a0123456789876543210 = Bar a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (BarSym4 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) BarSym4KindInference ()) + type BarSym5 :: Bar -> Bar -> Bar -> Bar -> Foo -> Bar + type family BarSym5 (a0123456789876543210 :: Bar) (a0123456789876543210 :: Bar) (a0123456789876543210 :: Bar) (a0123456789876543210 :: Bar) (a0123456789876543210 :: Foo) :: Bar where + BarSym5 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 = Bar a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210
tests/compile-and-dump/Promote/Constructors.hs view
@@ -1,12 +1,12 @@-module Promote.Constructors where--import Data.Singletons.TH---- Tests defunctionalization symbol generation for :--- * infix constructors--- * constructors with arity > 2--$(promote [d|- data Foo = Foo | Foo :+ Foo- data Bar = Bar Bar Bar Bar Bar Foo- |])+module Promote.Constructors where + +import Data.Singletons.TH + +-- Tests defunctionalization symbol generation for : +-- * infix constructors +-- * constructors with arity > 2 + +$(promote [d| + data Foo = Foo | Foo :+ Foo + data Bar = Bar Bar Bar Bar Bar Foo + |])
tests/compile-and-dump/Promote/GenDefunSymbols.golden view
@@ -1,63 +1,63 @@-Promote/GenDefunSymbols.hs:0:0:: Splicing declarations- genDefunSymbols [''LiftMaybe, ''NatT, ''(:+)]- ======>- type LiftMaybeSym0 :: forall (a :: Type)- (b :: Type). (~>) ((~>) a b) ((~>) (Maybe a) (Maybe b))- data LiftMaybeSym0 :: (~>) ((~>) a b) ((~>) (Maybe a) (Maybe b))- where- LiftMaybeSym0KindInference :: Data.Singletons.SameKind (Apply LiftMaybeSym0 arg) (LiftMaybeSym1 arg) =>- LiftMaybeSym0 a0123456789876543210- type instance Apply LiftMaybeSym0 a0123456789876543210 = LiftMaybeSym1 a0123456789876543210- instance Data.Singletons.TH.SuppressUnusedWarnings.SuppressUnusedWarnings LiftMaybeSym0 where- Data.Singletons.TH.SuppressUnusedWarnings.suppressUnusedWarnings- = snd (((,) LiftMaybeSym0KindInference) ())- type LiftMaybeSym1 :: forall (a :: Type) (b :: Type). (~>) a b- -> (~>) (Maybe a) (Maybe b)- data LiftMaybeSym1 (a0123456789876543210 :: (~>) a b) :: (~>) (Maybe a) (Maybe b)- where- LiftMaybeSym1KindInference :: Data.Singletons.SameKind (Apply (LiftMaybeSym1 a0123456789876543210) arg) (LiftMaybeSym2 a0123456789876543210 arg) =>- LiftMaybeSym1 a0123456789876543210 a0123456789876543210- type instance Apply (LiftMaybeSym1 a0123456789876543210) a0123456789876543210 = LiftMaybe a0123456789876543210 a0123456789876543210- instance Data.Singletons.TH.SuppressUnusedWarnings.SuppressUnusedWarnings (LiftMaybeSym1 a0123456789876543210) where- Data.Singletons.TH.SuppressUnusedWarnings.suppressUnusedWarnings- = snd (((,) LiftMaybeSym1KindInference) ())- type LiftMaybeSym2 :: forall (a :: Type) (b :: Type). (~>) a b- -> Maybe a -> Maybe b- type family LiftMaybeSym2 (a0123456789876543210 :: (~>) a b) (a0123456789876543210 :: Maybe a) :: Maybe b where- LiftMaybeSym2 a0123456789876543210 a0123456789876543210 = LiftMaybe a0123456789876543210 a0123456789876543210- type ZeroSym0 :: NatT- type family ZeroSym0 :: NatT where- ZeroSym0 = 'Zero- type SuccSym0 :: (~>) NatT NatT- data SuccSym0 :: (~>) NatT NatT- where- SuccSym0KindInference :: Data.Singletons.SameKind (Apply SuccSym0 arg) (SuccSym1 arg) =>- SuccSym0 a0123456789876543210- type instance Apply SuccSym0 a0123456789876543210 = 'Succ a0123456789876543210- instance Data.Singletons.TH.SuppressUnusedWarnings.SuppressUnusedWarnings SuccSym0 where- Data.Singletons.TH.SuppressUnusedWarnings.suppressUnusedWarnings- = snd (((,) SuccSym0KindInference) ())- type SuccSym1 :: NatT -> NatT- type family SuccSym1 (a0123456789876543210 :: NatT) :: NatT where- SuccSym1 a0123456789876543210 = 'Succ a0123456789876543210- type (:+@#@$) :: (~>) Natural ((~>) Natural Natural)- data (:+@#@$) :: (~>) Natural ((~>) Natural Natural)- where- (::+@#@$###) :: Data.Singletons.SameKind (Apply (:+@#@$) arg) ((:+@#@$$) arg) =>- (:+@#@$) a0123456789876543210- type instance Apply (:+@#@$) a0123456789876543210 = (:+@#@$$) a0123456789876543210- instance Data.Singletons.TH.SuppressUnusedWarnings.SuppressUnusedWarnings (:+@#@$) where- Data.Singletons.TH.SuppressUnusedWarnings.suppressUnusedWarnings- = snd (((,) (::+@#@$###)) ())- type (:+@#@$$) :: Natural -> (~>) Natural Natural- data (:+@#@$$) (a0123456789876543210 :: Natural) :: (~>) Natural Natural- where- (::+@#@$$###) :: Data.Singletons.SameKind (Apply ((:+@#@$$) a0123456789876543210) arg) ((:+@#@$$$) a0123456789876543210 arg) =>- (:+@#@$$) a0123456789876543210 a0123456789876543210- type instance Apply ((:+@#@$$) a0123456789876543210) a0123456789876543210 = (:+) a0123456789876543210 a0123456789876543210- instance Data.Singletons.TH.SuppressUnusedWarnings.SuppressUnusedWarnings ((:+@#@$$) a0123456789876543210) where- Data.Singletons.TH.SuppressUnusedWarnings.suppressUnusedWarnings- = snd (((,) (::+@#@$$###)) ())- type (:+@#@$$$) :: Natural -> Natural -> Natural- type family (:+@#@$$$) (a0123456789876543210 :: Natural) (a0123456789876543210 :: Natural) :: Natural where- (:+@#@$$$) a0123456789876543210 a0123456789876543210 = (:+) a0123456789876543210 a0123456789876543210+Promote/GenDefunSymbols.hs:0:0:: Splicing declarations + genDefunSymbols [''LiftMaybe, ''NatT, ''(:+)] + ======> + type LiftMaybeSym0 :: forall (a :: Type) + (b :: Type). (~>) ((~>) a b) ((~>) (Maybe a) (Maybe b)) + data LiftMaybeSym0 :: (~>) ((~>) a b) ((~>) (Maybe a) (Maybe b)) + where + LiftMaybeSym0KindInference :: Data.Singletons.SameKind (Apply LiftMaybeSym0 arg) (LiftMaybeSym1 arg) => + LiftMaybeSym0 a0123456789876543210 + type instance Apply LiftMaybeSym0 a0123456789876543210 = LiftMaybeSym1 a0123456789876543210 + instance Data.Singletons.TH.SuppressUnusedWarnings.SuppressUnusedWarnings LiftMaybeSym0 where + Data.Singletons.TH.SuppressUnusedWarnings.suppressUnusedWarnings + = snd ((,) LiftMaybeSym0KindInference ()) + type LiftMaybeSym1 :: forall (a :: Type) (b :: Type). (~>) a b + -> (~>) (Maybe a) (Maybe b) + data LiftMaybeSym1 (a0123456789876543210 :: (~>) a b) :: (~>) (Maybe a) (Maybe b) + where + LiftMaybeSym1KindInference :: Data.Singletons.SameKind (Apply (LiftMaybeSym1 a0123456789876543210) arg) (LiftMaybeSym2 a0123456789876543210 arg) => + LiftMaybeSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (LiftMaybeSym1 a0123456789876543210) a0123456789876543210 = LiftMaybe a0123456789876543210 a0123456789876543210 + instance Data.Singletons.TH.SuppressUnusedWarnings.SuppressUnusedWarnings (LiftMaybeSym1 a0123456789876543210) where + Data.Singletons.TH.SuppressUnusedWarnings.suppressUnusedWarnings + = snd ((,) LiftMaybeSym1KindInference ()) + type LiftMaybeSym2 :: forall (a :: Type) (b :: Type). (~>) a b + -> Maybe a -> Maybe b + type family LiftMaybeSym2 (a0123456789876543210 :: (~>) a b) (a0123456789876543210 :: Maybe a) :: Maybe b where + LiftMaybeSym2 a0123456789876543210 a0123456789876543210 = LiftMaybe a0123456789876543210 a0123456789876543210 + type ZeroSym0 :: NatT + type family ZeroSym0 :: NatT where + ZeroSym0 = 'Zero + type SuccSym0 :: (~>) NatT NatT + data SuccSym0 :: (~>) NatT NatT + where + SuccSym0KindInference :: Data.Singletons.SameKind (Apply SuccSym0 arg) (SuccSym1 arg) => + SuccSym0 a0123456789876543210 + type instance Apply SuccSym0 a0123456789876543210 = 'Succ a0123456789876543210 + instance Data.Singletons.TH.SuppressUnusedWarnings.SuppressUnusedWarnings SuccSym0 where + Data.Singletons.TH.SuppressUnusedWarnings.suppressUnusedWarnings + = snd ((,) SuccSym0KindInference ()) + type SuccSym1 :: NatT -> NatT + type family SuccSym1 (a0123456789876543210 :: NatT) :: NatT where + SuccSym1 a0123456789876543210 = 'Succ a0123456789876543210 + type (:+@#@$) :: (~>) Natural ((~>) Natural Natural) + data (:+@#@$) :: (~>) Natural ((~>) Natural Natural) + where + (::+@#@$###) :: Data.Singletons.SameKind (Apply (:+@#@$) arg) ((:+@#@$$) arg) => + (:+@#@$) a0123456789876543210 + type instance Apply (:+@#@$) a0123456789876543210 = (:+@#@$$) a0123456789876543210 + instance Data.Singletons.TH.SuppressUnusedWarnings.SuppressUnusedWarnings (:+@#@$) where + Data.Singletons.TH.SuppressUnusedWarnings.suppressUnusedWarnings + = snd ((,) (::+@#@$###) ()) + type (:+@#@$$) :: Natural -> (~>) Natural Natural + data (:+@#@$$) (a0123456789876543210 :: Natural) :: (~>) Natural Natural + where + (::+@#@$$###) :: Data.Singletons.SameKind (Apply ((:+@#@$$) a0123456789876543210) arg) ((:+@#@$$$) a0123456789876543210 arg) => + (:+@#@$$) a0123456789876543210 a0123456789876543210 + type instance Apply ((:+@#@$$) a0123456789876543210) a0123456789876543210 = (:+) a0123456789876543210 a0123456789876543210 + instance Data.Singletons.TH.SuppressUnusedWarnings.SuppressUnusedWarnings ((:+@#@$$) a0123456789876543210) where + Data.Singletons.TH.SuppressUnusedWarnings.suppressUnusedWarnings + = snd ((,) (::+@#@$$###) ()) + type (:+@#@$$$) :: Natural -> Natural -> Natural + type family (:+@#@$$$) (a0123456789876543210 :: Natural) (a0123456789876543210 :: Natural) :: Natural where + (:+@#@$$$) a0123456789876543210 a0123456789876543210 = (:+) a0123456789876543210 a0123456789876543210
tests/compile-and-dump/Promote/GenDefunSymbols.hs view
@@ -1,16 +1,16 @@-module Promote.GenDefunSymbols where--import Data.Singletons (Apply, type (~>))-import Data.Singletons.TH (genDefunSymbols)-import GHC.TypeLits hiding (type (*))-import Data.Kind (Type)--type family LiftMaybe (f :: a ~> b) (x :: Maybe a) :: Maybe b where- LiftMaybe f Nothing = Nothing- LiftMaybe f (Just a) = Just (Apply f a)--data NatT = Zero | Succ NatT--type a :+ b = a + b--$(genDefunSymbols [ ''LiftMaybe, ''NatT, ''(:+) ])+module Promote.GenDefunSymbols where + +import Data.Singletons (Apply, type (~>)) +import Data.Singletons.TH (genDefunSymbols) +import GHC.TypeLits hiding (type (*)) +import Data.Kind (Type) + +type family LiftMaybe (f :: a ~> b) (x :: Maybe a) :: Maybe b where + LiftMaybe f Nothing = Nothing + LiftMaybe f (Just a) = Just (Apply f a) + +data NatT = Zero | Succ NatT + +type a :+ b = a + b + +$(genDefunSymbols [ ''LiftMaybe, ''NatT, ''(:+) ])
tests/compile-and-dump/Promote/Newtypes.golden view
@@ -1,73 +1,73 @@-Promote/Newtypes.hs:(0,0)-(0,0): Splicing declarations- promote- [d| newtype Foo- = Foo Nat- deriving (Eq)- newtype Bar = Bar {unBar :: Nat} |]- ======>- newtype Foo- = Foo Nat- deriving Eq- newtype Bar = Bar {unBar :: Nat}- type FooSym0 :: (~>) Nat Foo- data FooSym0 :: (~>) Nat Foo- where- FooSym0KindInference :: SameKind (Apply FooSym0 arg) (FooSym1 arg) =>- FooSym0 a0123456789876543210- type instance Apply FooSym0 a0123456789876543210 = Foo a0123456789876543210- instance SuppressUnusedWarnings FooSym0 where- suppressUnusedWarnings = snd (((,) FooSym0KindInference) ())- type FooSym1 :: Nat -> Foo- type family FooSym1 (a0123456789876543210 :: Nat) :: Foo where- FooSym1 a0123456789876543210 = Foo a0123456789876543210- type BarSym0 :: (~>) Nat Bar- data BarSym0 :: (~>) Nat Bar- where- BarSym0KindInference :: SameKind (Apply BarSym0 arg) (BarSym1 arg) =>- BarSym0 a0123456789876543210- type instance Apply BarSym0 a0123456789876543210 = Bar a0123456789876543210- instance SuppressUnusedWarnings BarSym0 where- suppressUnusedWarnings = snd (((,) BarSym0KindInference) ())- type BarSym1 :: Nat -> Bar- type family BarSym1 (a0123456789876543210 :: Nat) :: Bar where- BarSym1 a0123456789876543210 = Bar a0123456789876543210- type UnBarSym0 :: (~>) Bar Nat- data UnBarSym0 :: (~>) Bar Nat- where- UnBarSym0KindInference :: SameKind (Apply UnBarSym0 arg) (UnBarSym1 arg) =>- UnBarSym0 a0123456789876543210- type instance Apply UnBarSym0 a0123456789876543210 = UnBar a0123456789876543210- instance SuppressUnusedWarnings UnBarSym0 where- suppressUnusedWarnings = snd (((,) UnBarSym0KindInference) ())- type UnBarSym1 :: Bar -> Nat- type family UnBarSym1 (a0123456789876543210 :: Bar) :: Nat where- UnBarSym1 a0123456789876543210 = UnBar a0123456789876543210- type UnBar :: Bar -> Nat- type family UnBar (a :: Bar) :: Nat where- UnBar (Bar field) = field- type TFHelper_0123456789876543210 :: Foo -> Foo -> Bool- type family TFHelper_0123456789876543210 (a :: Foo) (a :: Foo) :: Bool where- TFHelper_0123456789876543210 (Foo a_0123456789876543210) (Foo b_0123456789876543210) = Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210- type TFHelper_0123456789876543210Sym0 :: (~>) Foo ((~>) Foo Bool)- data TFHelper_0123456789876543210Sym0 :: (~>) Foo ((~>) Foo Bool)- where- TFHelper_0123456789876543210Sym0KindInference :: SameKind (Apply TFHelper_0123456789876543210Sym0 arg) (TFHelper_0123456789876543210Sym1 arg) =>- TFHelper_0123456789876543210Sym0 a0123456789876543210- type instance Apply TFHelper_0123456789876543210Sym0 a0123456789876543210 = TFHelper_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings TFHelper_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) TFHelper_0123456789876543210Sym0KindInference) ())- type TFHelper_0123456789876543210Sym1 :: Foo -> (~>) Foo Bool- data TFHelper_0123456789876543210Sym1 (a0123456789876543210 :: Foo) :: (~>) Foo Bool- where- TFHelper_0123456789876543210Sym1KindInference :: SameKind (Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) arg) (TFHelper_0123456789876543210Sym2 a0123456789876543210 arg) =>- TFHelper_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (TFHelper_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) TFHelper_0123456789876543210Sym1KindInference) ())- type TFHelper_0123456789876543210Sym2 :: Foo -> Foo -> Bool- type family TFHelper_0123456789876543210Sym2 (a0123456789876543210 :: Foo) (a0123456789876543210 :: Foo) :: Bool where- TFHelper_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210- instance PEq Foo where- type (==) a a = Apply (Apply TFHelper_0123456789876543210Sym0 a) a+Promote/Newtypes.hs:(0,0)-(0,0): Splicing declarations + promote + [d| newtype Foo + = Foo Nat + deriving (Eq) + newtype Bar = Bar {unBar :: Nat} |] + ======> + newtype Foo + = Foo Nat + deriving Eq + newtype Bar = Bar {unBar :: Nat} + type FooSym0 :: (~>) Nat Foo + data FooSym0 :: (~>) Nat Foo + where + FooSym0KindInference :: SameKind (Apply FooSym0 arg) (FooSym1 arg) => + FooSym0 a0123456789876543210 + type instance Apply FooSym0 a0123456789876543210 = Foo a0123456789876543210 + instance SuppressUnusedWarnings FooSym0 where + suppressUnusedWarnings = snd ((,) FooSym0KindInference ()) + type FooSym1 :: Nat -> Foo + type family FooSym1 (a0123456789876543210 :: Nat) :: Foo where + FooSym1 a0123456789876543210 = Foo a0123456789876543210 + type BarSym0 :: (~>) Nat Bar + data BarSym0 :: (~>) Nat Bar + where + BarSym0KindInference :: SameKind (Apply BarSym0 arg) (BarSym1 arg) => + BarSym0 a0123456789876543210 + type instance Apply BarSym0 a0123456789876543210 = Bar a0123456789876543210 + instance SuppressUnusedWarnings BarSym0 where + suppressUnusedWarnings = snd ((,) BarSym0KindInference ()) + type BarSym1 :: Nat -> Bar + type family BarSym1 (a0123456789876543210 :: Nat) :: Bar where + BarSym1 a0123456789876543210 = Bar a0123456789876543210 + type UnBarSym0 :: (~>) Bar Nat + data UnBarSym0 :: (~>) Bar Nat + where + UnBarSym0KindInference :: SameKind (Apply UnBarSym0 arg) (UnBarSym1 arg) => + UnBarSym0 a0123456789876543210 + type instance Apply UnBarSym0 a0123456789876543210 = UnBar a0123456789876543210 + instance SuppressUnusedWarnings UnBarSym0 where + suppressUnusedWarnings = snd ((,) UnBarSym0KindInference ()) + type UnBarSym1 :: Bar -> Nat + type family UnBarSym1 (a0123456789876543210 :: Bar) :: Nat where + UnBarSym1 a0123456789876543210 = UnBar a0123456789876543210 + type UnBar :: Bar -> Nat + type family UnBar (a :: Bar) :: Nat where + UnBar (Bar field) = field + type TFHelper_0123456789876543210 :: Foo -> Foo -> Bool + type family TFHelper_0123456789876543210 (a :: Foo) (a :: Foo) :: Bool where + TFHelper_0123456789876543210 (Foo a_0123456789876543210) (Foo b_0123456789876543210) = Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210 + type TFHelper_0123456789876543210Sym0 :: (~>) Foo ((~>) Foo Bool) + data TFHelper_0123456789876543210Sym0 :: (~>) Foo ((~>) Foo Bool) + where + TFHelper_0123456789876543210Sym0KindInference :: SameKind (Apply TFHelper_0123456789876543210Sym0 arg) (TFHelper_0123456789876543210Sym1 arg) => + TFHelper_0123456789876543210Sym0 a0123456789876543210 + type instance Apply TFHelper_0123456789876543210Sym0 a0123456789876543210 = TFHelper_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings TFHelper_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) TFHelper_0123456789876543210Sym0KindInference ()) + type TFHelper_0123456789876543210Sym1 :: Foo -> (~>) Foo Bool + data TFHelper_0123456789876543210Sym1 (a0123456789876543210 :: Foo) :: (~>) Foo Bool + where + TFHelper_0123456789876543210Sym1KindInference :: SameKind (Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) arg) (TFHelper_0123456789876543210Sym2 a0123456789876543210 arg) => + TFHelper_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (TFHelper_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) TFHelper_0123456789876543210Sym1KindInference ()) + type TFHelper_0123456789876543210Sym2 :: Foo -> Foo -> Bool + type family TFHelper_0123456789876543210Sym2 (a0123456789876543210 :: Foo) (a0123456789876543210 :: Foo) :: Bool where + TFHelper_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PEq Foo where + type (==) a a = Apply (Apply TFHelper_0123456789876543210Sym0 a) a
tests/compile-and-dump/Promote/Newtypes.hs view
@@ -1,9 +1,9 @@-module Promote.Newtypes where--import Data.Singletons.Base.TH-import Singletons.Nat--$(promote [d|- newtype Foo = Foo Nat deriving (Eq)- newtype Bar = Bar { unBar :: Nat }- |])+module Promote.Newtypes where + +import Data.Singletons.Base.TH +import Singletons.Nat + +$(promote [d| + newtype Foo = Foo Nat deriving (Eq) + newtype Bar = Bar { unBar :: Nat } + |])
tests/compile-and-dump/Promote/Pragmas.golden view
@@ -1,15 +1,15 @@-Promote/Pragmas.hs:(0,0)-(0,0): Splicing declarations- promote- [d| {-# INLINE foo #-}- foo :: Bool- foo = True |]- ======>- {-# INLINE foo #-}- foo :: Bool- foo = True- type FooSym0 :: Bool- type family FooSym0 :: Bool where- FooSym0 = Foo- type Foo :: Bool- type family Foo :: Bool where- Foo = TrueSym0+Promote/Pragmas.hs:(0,0)-(0,0): Splicing declarations + promote + [d| {-# INLINE foo #-} + foo :: Bool + foo = True |] + ======> + {-# INLINE foo #-} + foo :: Bool + foo = True + type FooSym0 :: Bool + type family FooSym0 :: Bool where + FooSym0 = Foo + type Foo :: Bool + type family Foo :: Bool where + Foo = TrueSym0
tests/compile-and-dump/Promote/Pragmas.hs view
@@ -1,10 +1,10 @@-module Promote.Pragmas where--import Data.Singletons.TH-import Prelude.Singletons--$(promote [d|- {-# INLINE foo #-}- foo :: Bool- foo = True- |])+module Promote.Pragmas where + +import Data.Singletons.TH +import Prelude.Singletons + +$(promote [d| + {-# INLINE foo #-} + foo :: Bool + foo = True + |])
tests/compile-and-dump/Promote/Prelude.golden view
@@ -1,21 +1,21 @@-Promote/Prelude.hs:(0,0)-(0,0): Splicing declarations- promoteOnly- [d| odd :: Natural -> Bool- odd 0 = False- odd n = not . odd $ n - 1 |]- ======>- type OddSym0 :: (~>) Natural Bool- data OddSym0 :: (~>) Natural Bool- where- OddSym0KindInference :: SameKind (Apply OddSym0 arg) (OddSym1 arg) =>- OddSym0 a0123456789876543210- type instance Apply OddSym0 a0123456789876543210 = Odd a0123456789876543210- instance SuppressUnusedWarnings OddSym0 where- suppressUnusedWarnings = snd (((,) OddSym0KindInference) ())- type OddSym1 :: Natural -> Bool- type family OddSym1 (a0123456789876543210 :: Natural) :: Bool where- OddSym1 a0123456789876543210 = Odd a0123456789876543210- type Odd :: Natural -> Bool- type family Odd (a :: Natural) :: Bool where- Odd 0 = FalseSym0- Odd n = Apply (Apply ($@#@$) (Apply (Apply (.@#@$) NotSym0) OddSym0)) (Apply (Apply (-@#@$) n) (FromInteger 1))+Promote/Prelude.hs:(0,0)-(0,0): Splicing declarations + promoteOnly + [d| odd :: Natural -> Bool + odd 0 = False + odd n = not . odd $ n - 1 |] + ======> + type OddSym0 :: (~>) Natural Bool + data OddSym0 :: (~>) Natural Bool + where + OddSym0KindInference :: SameKind (Apply OddSym0 arg) (OddSym1 arg) => + OddSym0 a0123456789876543210 + type instance Apply OddSym0 a0123456789876543210 = Odd a0123456789876543210 + instance SuppressUnusedWarnings OddSym0 where + suppressUnusedWarnings = snd ((,) OddSym0KindInference ()) + type OddSym1 :: Natural -> Bool + type family OddSym1 (a0123456789876543210 :: Natural) :: Bool where + OddSym1 a0123456789876543210 = Odd a0123456789876543210 + type Odd :: Natural -> Bool + type family Odd (a :: Natural) :: Bool where + Odd 0 = FalseSym0 + Odd n = Apply (Apply ($@#@$) (Apply (Apply (.@#@$) NotSym0) OddSym0)) (Apply (Apply (-@#@$) n) (FromInteger 1))
tests/compile-and-dump/Promote/Prelude.hs view
@@ -1,132 +1,132 @@-module Promote.Prelude where--import Data.List.Singletons-import Data.Singletons.TH-import GHC.TypeLits-import Prelude.Singletons--lengthTest1a :: Proxy (Length '[True, True, True, True])-lengthTest1a = Proxy--lengthTest1b :: Proxy 4-lengthTest1b = lengthTest1a--lengthTest2a :: Proxy (Length '[])-lengthTest2a = Proxy--lengthTest2b :: Proxy 0-lengthTest2b = lengthTest2a--sumTest1a :: Proxy (Sum '[1, 2, 3, 4])-sumTest1a = Proxy--sumTest1b :: Proxy 10-sumTest1b = sumTest1a--sumTest2a :: Proxy (Sum '[])-sumTest2a = Proxy--sumTest2b :: Proxy 0-sumTest2b = sumTest2a--productTest1a :: Proxy (Product '[1, 2, 3, 4])-productTest1a = Proxy--productTest1b :: Proxy 24-productTest1b = productTest1a--productTest2a :: Proxy (Product '[])-productTest2a = Proxy--productTest2b :: Proxy 1-productTest2b = productTest2a--takeTest1a :: Proxy (Take 2 '[1, 2, 3, 4])-takeTest1a = Proxy--takeTest1b :: Proxy '[1, 2]-takeTest1b = takeTest1a--takeTest2a :: Proxy (Take 2 '[])-takeTest2a = Proxy--takeTest2b :: Proxy '[]-takeTest2b = takeTest2a--dropTest1a :: Proxy (Drop 2 '[1, 2, 3, 4])-dropTest1a = Proxy--dropTest1b :: Proxy '[3, 4]-dropTest1b = dropTest1a--dropTest2a :: Proxy (Drop 2 '[])-dropTest2a = Proxy--dropTest2b :: Proxy '[]-dropTest2b = dropTest2a--splitAtTest1a :: Proxy (SplitAt 2 '[1, 2, 3, 4])-splitAtTest1a = Proxy--splitAtTest1b :: Proxy ( '( '[1,2], '[3, 4] ) )-splitAtTest1b = splitAtTest1a--splitAtTest2a :: Proxy (SplitAt 2 '[])-splitAtTest2a = splitAtTest2b--splitAtTest2b :: Proxy ( '( '[], '[] ) )-splitAtTest2b = Proxy--indexingTest1a :: Proxy ('[4, 3, 2, 1] !! 1)-indexingTest1a = Proxy--indexingTest1b :: Proxy 3-indexingTest1b = indexingTest1a--indexingTest2a :: Proxy ('[] !! 0)-indexingTest2a = Proxy--indexingTest2b :: Proxy (Error "Data.Singletons.List.!!: index too large")-indexingTest2b = indexingTest2a--replicateTest1a :: Proxy (Replicate 2 True)-replicateTest1a = Proxy--replicateTest1b :: Proxy '[True, True]-replicateTest1b = replicateTest1a--replicateTest2a :: Proxy (Replicate 0 True)-replicateTest2a = replicateTest2b--replicateTest2b :: Proxy '[]-replicateTest2b = Proxy--$(promoteOnly [d|- odd :: Natural -> Bool- odd 0 = False- odd n = not . odd $ n - 1- |])--findIndexTest1a :: Proxy (FindIndex OddSym0 '[2,4,6,7])-findIndexTest1a = Proxy--findIndexTest1b :: Proxy (Just 3)-findIndexTest1b = findIndexTest1a--findIndicesTest1a :: Proxy (FindIndices OddSym0 '[1,3,5,2,4,6,7])-findIndicesTest1a = Proxy--findIndicesTest1b :: Proxy '[0,1,2,6]-findIndicesTest1b = findIndicesTest1a--transposeTest1a :: Proxy (Transpose '[[1,2,3]])-transposeTest1a = Proxy--transposeTest1b :: Proxy ('[ '[1], '[2], '[3]])-transposeTest1b = transposeTest1a--transposeTest2a :: Proxy (Transpose '[ '[1], '[2], '[3]])-transposeTest2a = Proxy--transposeTest2b :: Proxy ('[ '[1,2,3]])-transposeTest2b = transposeTest2a+module Promote.Prelude where + +import Data.List.Singletons +import Data.Singletons.TH +import GHC.TypeLits +import Prelude.Singletons + +lengthTest1a :: Proxy (Length '[True, True, True, True]) +lengthTest1a = Proxy + +lengthTest1b :: Proxy 4 +lengthTest1b = lengthTest1a + +lengthTest2a :: Proxy (Length '[]) +lengthTest2a = Proxy + +lengthTest2b :: Proxy 0 +lengthTest2b = lengthTest2a + +sumTest1a :: Proxy (Sum '[1, 2, 3, 4]) +sumTest1a = Proxy + +sumTest1b :: Proxy 10 +sumTest1b = sumTest1a + +sumTest2a :: Proxy (Sum '[]) +sumTest2a = Proxy + +sumTest2b :: Proxy 0 +sumTest2b = sumTest2a + +productTest1a :: Proxy (Product '[1, 2, 3, 4]) +productTest1a = Proxy + +productTest1b :: Proxy 24 +productTest1b = productTest1a + +productTest2a :: Proxy (Product '[]) +productTest2a = Proxy + +productTest2b :: Proxy 1 +productTest2b = productTest2a + +takeTest1a :: Proxy (Take 2 '[1, 2, 3, 4]) +takeTest1a = Proxy + +takeTest1b :: Proxy '[1, 2] +takeTest1b = takeTest1a + +takeTest2a :: Proxy (Take 2 '[]) +takeTest2a = Proxy + +takeTest2b :: Proxy '[] +takeTest2b = takeTest2a + +dropTest1a :: Proxy (Drop 2 '[1, 2, 3, 4]) +dropTest1a = Proxy + +dropTest1b :: Proxy '[3, 4] +dropTest1b = dropTest1a + +dropTest2a :: Proxy (Drop 2 '[]) +dropTest2a = Proxy + +dropTest2b :: Proxy '[] +dropTest2b = dropTest2a + +splitAtTest1a :: Proxy (SplitAt 2 '[1, 2, 3, 4]) +splitAtTest1a = Proxy + +splitAtTest1b :: Proxy ( '( '[1,2], '[3, 4] ) ) +splitAtTest1b = splitAtTest1a + +splitAtTest2a :: Proxy (SplitAt 2 '[]) +splitAtTest2a = splitAtTest2b + +splitAtTest2b :: Proxy ( '( '[], '[] ) ) +splitAtTest2b = Proxy + +indexingTest1a :: Proxy ('[4, 3, 2, 1] !! 1) +indexingTest1a = Proxy + +indexingTest1b :: Proxy 3 +indexingTest1b = indexingTest1a + +indexingTest2a :: Proxy ('[] !! 0) +indexingTest2a = Proxy + +indexingTest2b :: Proxy (Error "Data.Singletons.List.!!: index too large") +indexingTest2b = indexingTest2a + +replicateTest1a :: Proxy (Replicate 2 True) +replicateTest1a = Proxy + +replicateTest1b :: Proxy '[True, True] +replicateTest1b = replicateTest1a + +replicateTest2a :: Proxy (Replicate 0 True) +replicateTest2a = replicateTest2b + +replicateTest2b :: Proxy '[] +replicateTest2b = Proxy + +$(promoteOnly [d| + odd :: Natural -> Bool + odd 0 = False + odd n = not . odd $ n - 1 + |]) + +findIndexTest1a :: Proxy (FindIndex OddSym0 '[2,4,6,7]) +findIndexTest1a = Proxy + +findIndexTest1b :: Proxy (Just 3) +findIndexTest1b = findIndexTest1a + +findIndicesTest1a :: Proxy (FindIndices OddSym0 '[1,3,5,2,4,6,7]) +findIndicesTest1a = Proxy + +findIndicesTest1b :: Proxy '[0,1,2,6] +findIndicesTest1b = findIndicesTest1a + +transposeTest1a :: Proxy (Transpose '[[1,2,3]]) +transposeTest1a = Proxy + +transposeTest1b :: Proxy ('[ '[1], '[2], '[3]]) +transposeTest1b = transposeTest1a + +transposeTest2a :: Proxy (Transpose '[ '[1], '[2], '[3]]) +transposeTest2a = Proxy + +transposeTest2b :: Proxy ('[ '[1,2,3]]) +transposeTest2b = transposeTest2a
tests/compile-and-dump/Promote/T180.golden view
@@ -1,59 +1,59 @@-Promote/T180.hs:(0,0)-(0,0): Splicing declarations- promote- [d| z (X1 x) = x- z (X2 x) = x- - data X = X1 {y :: Symbol} | X2 {y :: Symbol} |]- ======>- data X = X1 {y :: Symbol} | X2 {y :: Symbol}- z (X1 x) = x- z (X2 x) = x- type X1Sym0 :: (~>) Symbol X- data X1Sym0 :: (~>) Symbol X- where- X1Sym0KindInference :: SameKind (Apply X1Sym0 arg) (X1Sym1 arg) =>- X1Sym0 a0123456789876543210- type instance Apply X1Sym0 a0123456789876543210 = X1 a0123456789876543210- instance SuppressUnusedWarnings X1Sym0 where- suppressUnusedWarnings = snd (((,) X1Sym0KindInference) ())- type X1Sym1 :: Symbol -> X- type family X1Sym1 (a0123456789876543210 :: Symbol) :: X where- X1Sym1 a0123456789876543210 = X1 a0123456789876543210- type X2Sym0 :: (~>) Symbol X- data X2Sym0 :: (~>) Symbol X- where- X2Sym0KindInference :: SameKind (Apply X2Sym0 arg) (X2Sym1 arg) =>- X2Sym0 a0123456789876543210- type instance Apply X2Sym0 a0123456789876543210 = X2 a0123456789876543210- instance SuppressUnusedWarnings X2Sym0 where- suppressUnusedWarnings = snd (((,) X2Sym0KindInference) ())- type X2Sym1 :: Symbol -> X- type family X2Sym1 (a0123456789876543210 :: Symbol) :: X where- X2Sym1 a0123456789876543210 = X2 a0123456789876543210- data ZSym0 a0123456789876543210- where- ZSym0KindInference :: SameKind (Apply ZSym0 arg) (ZSym1 arg) =>- ZSym0 a0123456789876543210- type instance Apply ZSym0 a0123456789876543210 = Z a0123456789876543210- instance SuppressUnusedWarnings ZSym0 where- suppressUnusedWarnings = snd (((,) ZSym0KindInference) ())- type family ZSym1 a0123456789876543210 where- ZSym1 a0123456789876543210 = Z a0123456789876543210- type YSym0 :: (~>) X Symbol- data YSym0 :: (~>) X Symbol- where- YSym0KindInference :: SameKind (Apply YSym0 arg) (YSym1 arg) =>- YSym0 a0123456789876543210- type instance Apply YSym0 a0123456789876543210 = Y a0123456789876543210- instance SuppressUnusedWarnings YSym0 where- suppressUnusedWarnings = snd (((,) YSym0KindInference) ())- type YSym1 :: X -> Symbol- type family YSym1 (a0123456789876543210 :: X) :: Symbol where- YSym1 a0123456789876543210 = Y a0123456789876543210- type family Z a where- Z (X1 x) = x- Z (X2 x) = x- type Y :: X -> Symbol- type family Y (a :: X) :: Symbol where- Y (X1 field) = field- Y (X2 field) = field+Promote/T180.hs:(0,0)-(0,0): Splicing declarations + promote + [d| z (X1 x) = x + z (X2 x) = x + + data X = X1 {y :: Symbol} | X2 {y :: Symbol} |] + ======> + data X = X1 {y :: Symbol} | X2 {y :: Symbol} + z (X1 x) = x + z (X2 x) = x + type X1Sym0 :: (~>) Symbol X + data X1Sym0 :: (~>) Symbol X + where + X1Sym0KindInference :: SameKind (Apply X1Sym0 arg) (X1Sym1 arg) => + X1Sym0 a0123456789876543210 + type instance Apply X1Sym0 a0123456789876543210 = X1 a0123456789876543210 + instance SuppressUnusedWarnings X1Sym0 where + suppressUnusedWarnings = snd ((,) X1Sym0KindInference ()) + type X1Sym1 :: Symbol -> X + type family X1Sym1 (a0123456789876543210 :: Symbol) :: X where + X1Sym1 a0123456789876543210 = X1 a0123456789876543210 + type X2Sym0 :: (~>) Symbol X + data X2Sym0 :: (~>) Symbol X + where + X2Sym0KindInference :: SameKind (Apply X2Sym0 arg) (X2Sym1 arg) => + X2Sym0 a0123456789876543210 + type instance Apply X2Sym0 a0123456789876543210 = X2 a0123456789876543210 + instance SuppressUnusedWarnings X2Sym0 where + suppressUnusedWarnings = snd ((,) X2Sym0KindInference ()) + type X2Sym1 :: Symbol -> X + type family X2Sym1 (a0123456789876543210 :: Symbol) :: X where + X2Sym1 a0123456789876543210 = X2 a0123456789876543210 + data ZSym0 a0123456789876543210 + where + ZSym0KindInference :: SameKind (Apply ZSym0 arg) (ZSym1 arg) => + ZSym0 a0123456789876543210 + type instance Apply ZSym0 a0123456789876543210 = Z a0123456789876543210 + instance SuppressUnusedWarnings ZSym0 where + suppressUnusedWarnings = snd ((,) ZSym0KindInference ()) + type family ZSym1 a0123456789876543210 where + ZSym1 a0123456789876543210 = Z a0123456789876543210 + type YSym0 :: (~>) X Symbol + data YSym0 :: (~>) X Symbol + where + YSym0KindInference :: SameKind (Apply YSym0 arg) (YSym1 arg) => + YSym0 a0123456789876543210 + type instance Apply YSym0 a0123456789876543210 = Y a0123456789876543210 + instance SuppressUnusedWarnings YSym0 where + suppressUnusedWarnings = snd ((,) YSym0KindInference ()) + type YSym1 :: X -> Symbol + type family YSym1 (a0123456789876543210 :: X) :: Symbol where + YSym1 a0123456789876543210 = Y a0123456789876543210 + type family Z a where + Z (X1 x) = x + Z (X2 x) = x + type Y :: X -> Symbol + type family Y (a :: X) :: Symbol where + Y (X1 field) = field + Y (X2 field) = field
tests/compile-and-dump/Promote/T180.hs view
@@ -1,10 +1,10 @@-module T180 where--import Data.Singletons.TH-import Prelude.Singletons--promote [d|- data X = X1 {y :: Symbol} | X2 {y :: Symbol}- z (X1 x) = x- z (X2 x) = x- |]+module T180 where + +import Data.Singletons.TH +import Prelude.Singletons + +promote [d| + data X = X1 {y :: Symbol} | X2 {y :: Symbol} + z (X1 x) = x + z (X2 x) = x + |]
tests/compile-and-dump/Promote/T361.golden view
@@ -1,27 +1,27 @@-Promote/T361.hs:0:0:: Splicing declarations- genDefunSymbols [''Proxy]- ======>- type ProxySym0 :: forall k (t :: k). Proxy (t :: k)- type family ProxySym0 :: Proxy (t :: k) where- ProxySym0 = 'Proxy-Promote/T361.hs:(0,0)-(0,0): Splicing declarations- promote- [d| f :: Proxy 1 -> Proxy 2- f Proxy = Proxy |]- ======>- f :: Proxy 1 -> Proxy 2- f Proxy = Proxy- type FSym0 :: (~>) (Proxy 1) (Proxy 2)- data FSym0 :: (~>) (Proxy 1) (Proxy 2)- where- FSym0KindInference :: SameKind (Apply FSym0 arg) (FSym1 arg) =>- FSym0 a0123456789876543210- type instance Apply FSym0 a0123456789876543210 = F a0123456789876543210- instance SuppressUnusedWarnings FSym0 where- suppressUnusedWarnings = snd (((,) FSym0KindInference) ())- type FSym1 :: Proxy 1 -> Proxy 2- type family FSym1 (a0123456789876543210 :: Proxy 1) :: Proxy 2 where- FSym1 a0123456789876543210 = F a0123456789876543210- type F :: Proxy 1 -> Proxy 2- type family F (a :: Proxy 1) :: Proxy 2 where- F 'Proxy = ProxySym0+Promote/T361.hs:0:0:: Splicing declarations + genDefunSymbols [''Proxy] + ======> + type ProxySym0 :: forall k (t :: k). Proxy (t :: k) + type family ProxySym0 :: Proxy (t :: k) where + ProxySym0 = 'Proxy +Promote/T361.hs:(0,0)-(0,0): Splicing declarations + promote + [d| f :: Proxy 1 -> Proxy 2 + f Proxy = Proxy |] + ======> + f :: Proxy 1 -> Proxy 2 + f Proxy = Proxy + type FSym0 :: (~>) (Proxy 1) (Proxy 2) + data FSym0 :: (~>) (Proxy 1) (Proxy 2) + where + FSym0KindInference :: SameKind (Apply FSym0 arg) (FSym1 arg) => + FSym0 a0123456789876543210 + type instance Apply FSym0 a0123456789876543210 = F a0123456789876543210 + instance SuppressUnusedWarnings FSym0 where + suppressUnusedWarnings = snd ((,) FSym0KindInference ()) + type FSym1 :: Proxy 1 -> Proxy 2 + type family FSym1 (a0123456789876543210 :: Proxy 1) :: Proxy 2 where + FSym1 a0123456789876543210 = F a0123456789876543210 + type F :: Proxy 1 -> Proxy 2 + type family F (a :: Proxy 1) :: Proxy 2 where + F 'Proxy = ProxySym0
tests/compile-and-dump/Promote/T361.hs view
@@ -1,11 +1,11 @@-module T361 where--import Data.Proxy-import Data.Singletons.TH--$(genDefunSymbols [''Proxy])--$(promote [d|- f :: Proxy 1 -> Proxy 2- f Proxy = Proxy- |])+module T361 where + +import Data.Proxy +import Data.Singletons.TH + +$(genDefunSymbols [''Proxy]) + +$(promote [d| + f :: Proxy 1 -> Proxy 2 + f Proxy = Proxy + |])
tests/compile-and-dump/Singletons/AsPattern.golden view
@@ -1,406 +1,405 @@-Singletons/AsPattern.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| maybePlus :: Maybe Nat -> Maybe Nat- maybePlus (Just n) = Just (plus (Succ Zero) n)- maybePlus p@Nothing = p- bar :: Maybe Nat -> Maybe Nat- bar x@(Just _) = x- bar Nothing = Nothing- baz_ :: Maybe Baz -> Maybe Baz- baz_ p@Nothing = p- baz_ p@(Just (Baz _ _ _)) = p- tup :: (Nat, Nat) -> (Nat, Nat)- tup p@(_, _) = p- foo :: [Nat] -> [Nat]- foo p@[] = p- foo p@[_] = p- foo p@(_ : _ : _) = p- - data Baz = Baz Nat Nat Nat |]- ======>- maybePlus :: Maybe Nat -> Maybe Nat- maybePlus (Just n) = Just ((plus (Succ Zero)) n)- maybePlus p@Nothing = p- bar :: Maybe Nat -> Maybe Nat- bar x@(Just _) = x- bar Nothing = Nothing- data Baz = Baz Nat Nat Nat- baz_ :: Maybe Baz -> Maybe Baz- baz_ p@Nothing = p- baz_ p@(Just (Baz _ _ _)) = p- tup :: (Nat, Nat) -> (Nat, Nat)- tup p@(_, _) = p- foo :: [Nat] -> [Nat]- foo p@[] = p- foo p@[_] = p- foo p@(_ : (_ : _)) = p- type BazSym0 :: (~>) Nat ((~>) Nat ((~>) Nat Baz))- data BazSym0 :: (~>) Nat ((~>) Nat ((~>) Nat Baz))- where- BazSym0KindInference :: SameKind (Apply BazSym0 arg) (BazSym1 arg) =>- BazSym0 a0123456789876543210- type instance Apply BazSym0 a0123456789876543210 = BazSym1 a0123456789876543210- instance SuppressUnusedWarnings BazSym0 where- suppressUnusedWarnings = snd (((,) BazSym0KindInference) ())- type BazSym1 :: Nat -> (~>) Nat ((~>) Nat Baz)- data BazSym1 (a0123456789876543210 :: Nat) :: (~>) Nat ((~>) Nat Baz)- where- BazSym1KindInference :: SameKind (Apply (BazSym1 a0123456789876543210) arg) (BazSym2 a0123456789876543210 arg) =>- BazSym1 a0123456789876543210 a0123456789876543210- type instance Apply (BazSym1 a0123456789876543210) a0123456789876543210 = BazSym2 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (BazSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) BazSym1KindInference) ())- type BazSym2 :: Nat -> Nat -> (~>) Nat Baz- data BazSym2 (a0123456789876543210 :: Nat) (a0123456789876543210 :: Nat) :: (~>) Nat Baz- where- BazSym2KindInference :: SameKind (Apply (BazSym2 a0123456789876543210 a0123456789876543210) arg) (BazSym3 a0123456789876543210 a0123456789876543210 arg) =>- BazSym2 a0123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply (BazSym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = Baz a0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (BazSym2 a0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) BazSym2KindInference) ())- type BazSym3 :: Nat -> Nat -> Nat -> Baz- type family BazSym3 (a0123456789876543210 :: Nat) (a0123456789876543210 :: Nat) (a0123456789876543210 :: Nat) :: Baz where- BazSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = Baz a0123456789876543210 a0123456789876543210 a0123456789876543210- type family Let0123456789876543210PSym0 where- Let0123456789876543210PSym0 = Let0123456789876543210P- type family Let0123456789876543210P where- Let0123456789876543210P = NilSym0- data Let0123456789876543210PSym0 wild_01234567898765432100123456789876543210- where- Let0123456789876543210PSym0KindInference :: SameKind (Apply Let0123456789876543210PSym0 arg) (Let0123456789876543210PSym1 arg) =>- Let0123456789876543210PSym0 wild_01234567898765432100123456789876543210- type instance Apply Let0123456789876543210PSym0 wild_01234567898765432100123456789876543210 = Let0123456789876543210P wild_01234567898765432100123456789876543210- instance SuppressUnusedWarnings Let0123456789876543210PSym0 where- suppressUnusedWarnings- = snd (((,) Let0123456789876543210PSym0KindInference) ())- type family Let0123456789876543210PSym1 wild_01234567898765432100123456789876543210 where- Let0123456789876543210PSym1 wild_01234567898765432100123456789876543210 = Let0123456789876543210P wild_01234567898765432100123456789876543210- type family Let0123456789876543210P wild_0123456789876543210 where- Let0123456789876543210P wild_0123456789876543210 = Apply (Apply (:@#@$) wild_0123456789876543210) NilSym0- data Let0123456789876543210PSym0 wild_01234567898765432100123456789876543210- where- Let0123456789876543210PSym0KindInference :: SameKind (Apply Let0123456789876543210PSym0 arg) (Let0123456789876543210PSym1 arg) =>- Let0123456789876543210PSym0 wild_01234567898765432100123456789876543210- type instance Apply Let0123456789876543210PSym0 wild_01234567898765432100123456789876543210 = Let0123456789876543210PSym1 wild_01234567898765432100123456789876543210- instance SuppressUnusedWarnings Let0123456789876543210PSym0 where- suppressUnusedWarnings- = snd (((,) Let0123456789876543210PSym0KindInference) ())- data Let0123456789876543210PSym1 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210- where- Let0123456789876543210PSym1KindInference :: SameKind (Apply (Let0123456789876543210PSym1 wild_01234567898765432100123456789876543210) arg) (Let0123456789876543210PSym2 wild_01234567898765432100123456789876543210 arg) =>- Let0123456789876543210PSym1 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210- type instance Apply (Let0123456789876543210PSym1 wild_01234567898765432100123456789876543210) wild_01234567898765432100123456789876543210 = Let0123456789876543210PSym2 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Let0123456789876543210PSym1 wild_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Let0123456789876543210PSym1KindInference) ())- data Let0123456789876543210PSym2 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210- where- Let0123456789876543210PSym2KindInference :: SameKind (Apply (Let0123456789876543210PSym2 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210) arg) (Let0123456789876543210PSym3 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 arg) =>- Let0123456789876543210PSym2 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210- type instance Apply (Let0123456789876543210PSym2 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210) wild_01234567898765432100123456789876543210 = Let0123456789876543210P wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Let0123456789876543210PSym2 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Let0123456789876543210PSym2KindInference) ())- type family Let0123456789876543210PSym3 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 where- Let0123456789876543210PSym3 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 = Let0123456789876543210P wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210- type family Let0123456789876543210P wild_0123456789876543210 wild_0123456789876543210 wild_0123456789876543210 where- Let0123456789876543210P wild_0123456789876543210 wild_0123456789876543210 wild_0123456789876543210 = Apply (Apply (:@#@$) wild_0123456789876543210) (Apply (Apply (:@#@$) wild_0123456789876543210) wild_0123456789876543210)- data Let0123456789876543210PSym0 wild_01234567898765432100123456789876543210- where- Let0123456789876543210PSym0KindInference :: SameKind (Apply Let0123456789876543210PSym0 arg) (Let0123456789876543210PSym1 arg) =>- Let0123456789876543210PSym0 wild_01234567898765432100123456789876543210- type instance Apply Let0123456789876543210PSym0 wild_01234567898765432100123456789876543210 = Let0123456789876543210PSym1 wild_01234567898765432100123456789876543210- instance SuppressUnusedWarnings Let0123456789876543210PSym0 where- suppressUnusedWarnings- = snd (((,) Let0123456789876543210PSym0KindInference) ())- data Let0123456789876543210PSym1 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210- where- Let0123456789876543210PSym1KindInference :: SameKind (Apply (Let0123456789876543210PSym1 wild_01234567898765432100123456789876543210) arg) (Let0123456789876543210PSym2 wild_01234567898765432100123456789876543210 arg) =>- Let0123456789876543210PSym1 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210- type instance Apply (Let0123456789876543210PSym1 wild_01234567898765432100123456789876543210) wild_01234567898765432100123456789876543210 = Let0123456789876543210P wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Let0123456789876543210PSym1 wild_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Let0123456789876543210PSym1KindInference) ())- type family Let0123456789876543210PSym2 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 where- Let0123456789876543210PSym2 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 = Let0123456789876543210P wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210- type family Let0123456789876543210P wild_0123456789876543210 wild_0123456789876543210 where- Let0123456789876543210P wild_0123456789876543210 wild_0123456789876543210 = Apply (Apply Tuple2Sym0 wild_0123456789876543210) wild_0123456789876543210- type family Let0123456789876543210PSym0 where- Let0123456789876543210PSym0 = Let0123456789876543210P- type family Let0123456789876543210P where- Let0123456789876543210P = NothingSym0- data Let0123456789876543210PSym0 wild_01234567898765432100123456789876543210- where- Let0123456789876543210PSym0KindInference :: SameKind (Apply Let0123456789876543210PSym0 arg) (Let0123456789876543210PSym1 arg) =>- Let0123456789876543210PSym0 wild_01234567898765432100123456789876543210- type instance Apply Let0123456789876543210PSym0 wild_01234567898765432100123456789876543210 = Let0123456789876543210PSym1 wild_01234567898765432100123456789876543210- instance SuppressUnusedWarnings Let0123456789876543210PSym0 where- suppressUnusedWarnings- = snd (((,) Let0123456789876543210PSym0KindInference) ())- data Let0123456789876543210PSym1 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210- where- Let0123456789876543210PSym1KindInference :: SameKind (Apply (Let0123456789876543210PSym1 wild_01234567898765432100123456789876543210) arg) (Let0123456789876543210PSym2 wild_01234567898765432100123456789876543210 arg) =>- Let0123456789876543210PSym1 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210- type instance Apply (Let0123456789876543210PSym1 wild_01234567898765432100123456789876543210) wild_01234567898765432100123456789876543210 = Let0123456789876543210PSym2 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Let0123456789876543210PSym1 wild_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Let0123456789876543210PSym1KindInference) ())- data Let0123456789876543210PSym2 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210- where- Let0123456789876543210PSym2KindInference :: SameKind (Apply (Let0123456789876543210PSym2 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210) arg) (Let0123456789876543210PSym3 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 arg) =>- Let0123456789876543210PSym2 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210- type instance Apply (Let0123456789876543210PSym2 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210) wild_01234567898765432100123456789876543210 = Let0123456789876543210P wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Let0123456789876543210PSym2 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Let0123456789876543210PSym2KindInference) ())- type family Let0123456789876543210PSym3 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 where- Let0123456789876543210PSym3 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 = Let0123456789876543210P wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210- type family Let0123456789876543210P wild_0123456789876543210 wild_0123456789876543210 wild_0123456789876543210 where- Let0123456789876543210P wild_0123456789876543210 wild_0123456789876543210 wild_0123456789876543210 = Apply JustSym0 (Apply (Apply (Apply BazSym0 wild_0123456789876543210) wild_0123456789876543210) wild_0123456789876543210)- data Let0123456789876543210XSym0 wild_01234567898765432100123456789876543210- where- Let0123456789876543210XSym0KindInference :: SameKind (Apply Let0123456789876543210XSym0 arg) (Let0123456789876543210XSym1 arg) =>- Let0123456789876543210XSym0 wild_01234567898765432100123456789876543210- type instance Apply Let0123456789876543210XSym0 wild_01234567898765432100123456789876543210 = Let0123456789876543210X wild_01234567898765432100123456789876543210- instance SuppressUnusedWarnings Let0123456789876543210XSym0 where- suppressUnusedWarnings- = snd (((,) Let0123456789876543210XSym0KindInference) ())- type family Let0123456789876543210XSym1 wild_01234567898765432100123456789876543210 where- Let0123456789876543210XSym1 wild_01234567898765432100123456789876543210 = Let0123456789876543210X wild_01234567898765432100123456789876543210- type family Let0123456789876543210X wild_0123456789876543210 where- Let0123456789876543210X wild_0123456789876543210 = Apply JustSym0 wild_0123456789876543210- type family Let0123456789876543210PSym0 where- Let0123456789876543210PSym0 = Let0123456789876543210P- type family Let0123456789876543210P where- Let0123456789876543210P = NothingSym0- type FooSym0 :: (~>) [Nat] [Nat]- data FooSym0 :: (~>) [Nat] [Nat]- where- FooSym0KindInference :: SameKind (Apply FooSym0 arg) (FooSym1 arg) =>- FooSym0 a0123456789876543210- type instance Apply FooSym0 a0123456789876543210 = Foo a0123456789876543210- instance SuppressUnusedWarnings FooSym0 where- suppressUnusedWarnings = snd (((,) FooSym0KindInference) ())- type FooSym1 :: [Nat] -> [Nat]- type family FooSym1 (a0123456789876543210 :: [Nat]) :: [Nat] where- FooSym1 a0123456789876543210 = Foo a0123456789876543210- type TupSym0 :: (~>) (Nat, Nat) (Nat, Nat)- data TupSym0 :: (~>) (Nat, Nat) (Nat, Nat)- where- TupSym0KindInference :: SameKind (Apply TupSym0 arg) (TupSym1 arg) =>- TupSym0 a0123456789876543210- type instance Apply TupSym0 a0123456789876543210 = Tup a0123456789876543210- instance SuppressUnusedWarnings TupSym0 where- suppressUnusedWarnings = snd (((,) TupSym0KindInference) ())- type TupSym1 :: (Nat, Nat) -> (Nat, Nat)- type family TupSym1 (a0123456789876543210 :: (Nat, Nat)) :: (Nat,- Nat) where- TupSym1 a0123456789876543210 = Tup a0123456789876543210- type Baz_Sym0 :: (~>) (Maybe Baz) (Maybe Baz)- data Baz_Sym0 :: (~>) (Maybe Baz) (Maybe Baz)- where- Baz_Sym0KindInference :: SameKind (Apply Baz_Sym0 arg) (Baz_Sym1 arg) =>- Baz_Sym0 a0123456789876543210- type instance Apply Baz_Sym0 a0123456789876543210 = Baz_ a0123456789876543210- instance SuppressUnusedWarnings Baz_Sym0 where- suppressUnusedWarnings = snd (((,) Baz_Sym0KindInference) ())- type Baz_Sym1 :: Maybe Baz -> Maybe Baz- type family Baz_Sym1 (a0123456789876543210 :: Maybe Baz) :: Maybe Baz where- Baz_Sym1 a0123456789876543210 = Baz_ a0123456789876543210- type BarSym0 :: (~>) (Maybe Nat) (Maybe Nat)- data BarSym0 :: (~>) (Maybe Nat) (Maybe Nat)- where- BarSym0KindInference :: SameKind (Apply BarSym0 arg) (BarSym1 arg) =>- BarSym0 a0123456789876543210- type instance Apply BarSym0 a0123456789876543210 = Bar a0123456789876543210- instance SuppressUnusedWarnings BarSym0 where- suppressUnusedWarnings = snd (((,) BarSym0KindInference) ())- type BarSym1 :: Maybe Nat -> Maybe Nat- type family BarSym1 (a0123456789876543210 :: Maybe Nat) :: Maybe Nat where- BarSym1 a0123456789876543210 = Bar a0123456789876543210- type MaybePlusSym0 :: (~>) (Maybe Nat) (Maybe Nat)- data MaybePlusSym0 :: (~>) (Maybe Nat) (Maybe Nat)- where- MaybePlusSym0KindInference :: SameKind (Apply MaybePlusSym0 arg) (MaybePlusSym1 arg) =>- MaybePlusSym0 a0123456789876543210- type instance Apply MaybePlusSym0 a0123456789876543210 = MaybePlus a0123456789876543210- instance SuppressUnusedWarnings MaybePlusSym0 where- suppressUnusedWarnings = snd (((,) MaybePlusSym0KindInference) ())- type MaybePlusSym1 :: Maybe Nat -> Maybe Nat- type family MaybePlusSym1 (a0123456789876543210 :: Maybe Nat) :: Maybe Nat where- MaybePlusSym1 a0123456789876543210 = MaybePlus a0123456789876543210- type Foo :: [Nat] -> [Nat]- type family Foo (a :: [Nat]) :: [Nat] where- Foo '[] = Let0123456789876543210PSym0- Foo '[wild_0123456789876543210] = Let0123456789876543210PSym1 wild_0123456789876543210- Foo ('(:) wild_0123456789876543210 ('(:) wild_0123456789876543210 wild_0123456789876543210)) = Let0123456789876543210PSym3 wild_0123456789876543210 wild_0123456789876543210 wild_0123456789876543210- type Tup :: (Nat, Nat) -> (Nat, Nat)- type family Tup (a :: (Nat, Nat)) :: (Nat, Nat) where- Tup '(wild_0123456789876543210,- wild_0123456789876543210) = Let0123456789876543210PSym2 wild_0123456789876543210 wild_0123456789876543210- type Baz_ :: Maybe Baz -> Maybe Baz- type family Baz_ (a :: Maybe Baz) :: Maybe Baz where- Baz_ 'Nothing = Let0123456789876543210PSym0- Baz_ ('Just (Baz wild_0123456789876543210 wild_0123456789876543210 wild_0123456789876543210)) = Let0123456789876543210PSym3 wild_0123456789876543210 wild_0123456789876543210 wild_0123456789876543210- type Bar :: Maybe Nat -> Maybe Nat- type family Bar (a :: Maybe Nat) :: Maybe Nat where- Bar ('Just wild_0123456789876543210) = Let0123456789876543210XSym1 wild_0123456789876543210- Bar 'Nothing = NothingSym0- type MaybePlus :: Maybe Nat -> Maybe Nat- type family MaybePlus (a :: Maybe Nat) :: Maybe Nat where- MaybePlus ('Just n) = Apply JustSym0 (Apply (Apply PlusSym0 (Apply SuccSym0 ZeroSym0)) n)- MaybePlus 'Nothing = Let0123456789876543210PSym0- sFoo ::- forall (t :: [Nat]). Sing t -> Sing (Apply FooSym0 t :: [Nat])- sTup ::- forall (t :: (Nat, Nat)). Sing t- -> Sing (Apply TupSym0 t :: (Nat, Nat))- sBaz_ ::- forall (t :: Maybe Baz). Sing t- -> Sing (Apply Baz_Sym0 t :: Maybe Baz)- sBar ::- forall (t :: Maybe Nat). Sing t- -> Sing (Apply BarSym0 t :: Maybe Nat)- sMaybePlus ::- forall (t :: Maybe Nat). Sing t- -> Sing (Apply MaybePlusSym0 t :: Maybe Nat)- sFoo SNil- = let- sP :: Sing @_ Let0123456789876543210PSym0- sP = SNil- in sP- sFoo- (SCons (sWild_0123456789876543210 :: Sing wild_0123456789876543210)- SNil)- = let- sP ::- Sing @_ (Let0123456789876543210PSym1 wild_0123456789876543210)- sP- = (applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- sWild_0123456789876543210))- SNil- in sP- sFoo- (SCons (sWild_0123456789876543210 :: Sing wild_0123456789876543210)- (SCons (sWild_0123456789876543210 :: Sing wild_0123456789876543210)- (sWild_0123456789876543210 :: Sing wild_0123456789876543210)))- = let- sP ::- Sing @_ (Let0123456789876543210PSym3 wild_0123456789876543210 wild_0123456789876543210 wild_0123456789876543210)- sP- = (applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- sWild_0123456789876543210))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- sWild_0123456789876543210))- sWild_0123456789876543210)- in sP- sTup- (STuple2 (sWild_0123456789876543210 :: Sing wild_0123456789876543210)- (sWild_0123456789876543210 :: Sing wild_0123456789876543210))- = let- sP ::- Sing @_ (Let0123456789876543210PSym2 wild_0123456789876543210 wild_0123456789876543210)- sP- = (applySing- ((applySing ((singFun2 @Tuple2Sym0) STuple2))- sWild_0123456789876543210))- sWild_0123456789876543210- in sP- sBaz_ SNothing- = let- sP :: Sing @_ Let0123456789876543210PSym0- sP = SNothing- in sP- sBaz_- (SJust (SBaz (sWild_0123456789876543210 :: Sing wild_0123456789876543210)- (sWild_0123456789876543210 :: Sing wild_0123456789876543210)- (sWild_0123456789876543210 :: Sing wild_0123456789876543210)))- = let- sP ::- Sing @_ (Let0123456789876543210PSym3 wild_0123456789876543210 wild_0123456789876543210 wild_0123456789876543210)- sP- = (applySing ((singFun1 @JustSym0) SJust))- ((applySing- ((applySing- ((applySing ((singFun3 @BazSym0) SBaz)) sWild_0123456789876543210))- sWild_0123456789876543210))- sWild_0123456789876543210)- in sP- sBar- (SJust (sWild_0123456789876543210 :: Sing wild_0123456789876543210))- = let- sX ::- Sing @_ (Let0123456789876543210XSym1 wild_0123456789876543210)- sX- = (applySing ((singFun1 @JustSym0) SJust))- sWild_0123456789876543210- in sX- sBar SNothing = SNothing- sMaybePlus (SJust (sN :: Sing n))- = (applySing ((singFun1 @JustSym0) SJust))- ((applySing- ((applySing ((singFun2 @PlusSym0) sPlus))- ((applySing ((singFun1 @SuccSym0) SSucc)) SZero)))- sN)- sMaybePlus SNothing- = let- sP :: Sing @_ Let0123456789876543210PSym0- sP = SNothing- in sP- instance SingI (FooSym0 :: (~>) [Nat] [Nat]) where- sing = (singFun1 @FooSym0) sFoo- instance SingI (TupSym0 :: (~>) (Nat, Nat) (Nat, Nat)) where- sing = (singFun1 @TupSym0) sTup- instance SingI (Baz_Sym0 :: (~>) (Maybe Baz) (Maybe Baz)) where- sing = (singFun1 @Baz_Sym0) sBaz_- instance SingI (BarSym0 :: (~>) (Maybe Nat) (Maybe Nat)) where- sing = (singFun1 @BarSym0) sBar- instance SingI (MaybePlusSym0 :: (~>) (Maybe Nat) (Maybe Nat)) where- sing = (singFun1 @MaybePlusSym0) sMaybePlus- data SBaz :: Baz -> Type- where- SBaz :: forall (n :: Nat) (n :: Nat) (n :: Nat).- (Sing n) -> (Sing n) -> (Sing n) -> SBaz (Baz n n n :: Baz)- type instance Sing @Baz = SBaz- instance SingKind Baz where- type Demote Baz = Baz- fromSing (SBaz b b b)- = ((Baz (fromSing b)) (fromSing b)) (fromSing b)- toSing (Baz (b :: Demote Nat) (b :: Demote Nat) (b :: Demote Nat))- = case- (((,,) (toSing b :: SomeSing Nat)) (toSing b :: SomeSing Nat))- (toSing b :: SomeSing Nat)- of- (,,) (SomeSing c) (SomeSing c) (SomeSing c)- -> SomeSing (((SBaz c) c) c)- instance (SingI n, SingI n, SingI n) =>- SingI (Baz (n :: Nat) (n :: Nat) (n :: Nat)) where- sing = ((SBaz sing) sing) sing- instance (SingI n, SingI n) =>- SingI1 (Baz (n :: Nat) (n :: Nat)) where- liftSing = (SBaz sing) sing- instance SingI n => SingI2 (Baz (n :: Nat)) where- liftSing2 = SBaz sing- instance SingI (BazSym0 :: (~>) Nat ((~>) Nat ((~>) Nat Baz))) where- sing = (singFun3 @BazSym0) SBaz- instance SingI d =>- SingI (BazSym1 (d :: Nat) :: (~>) Nat ((~>) Nat Baz)) where- sing = (singFun2 @(BazSym1 (d :: Nat))) (SBaz (sing @d))- instance SingI1 (BazSym1 :: Nat -> (~>) Nat ((~>) Nat Baz)) where- liftSing (s :: Sing (d :: Nat))- = (singFun2 @(BazSym1 (d :: Nat))) (SBaz s)- instance (SingI d, SingI d) =>- SingI (BazSym2 (d :: Nat) (d :: Nat) :: (~>) Nat Baz) where- sing- = (singFun1 @(BazSym2 (d :: Nat) (d :: Nat)))- ((SBaz (sing @d)) (sing @d))- instance SingI d =>- SingI1 (BazSym2 (d :: Nat) :: Nat -> (~>) Nat Baz) where- liftSing (s :: Sing (d :: Nat))- = (singFun1 @(BazSym2 (d :: Nat) (d :: Nat))) ((SBaz (sing @d)) s)- instance SingI2 (BazSym2 :: Nat -> Nat -> (~>) Nat Baz) where- liftSing2 (s :: Sing (d :: Nat)) (s :: Sing (d :: Nat))- = (singFun1 @(BazSym2 (d :: Nat) (d :: Nat))) ((SBaz s) s)+Singletons/AsPattern.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| maybePlus :: Maybe Nat -> Maybe Nat + maybePlus (Just n) = Just (plus (Succ Zero) n) + maybePlus p@Nothing = p + bar :: Maybe Nat -> Maybe Nat + bar x@(Just _) = x + bar Nothing = Nothing + baz_ :: Maybe Baz -> Maybe Baz + baz_ p@Nothing = p + baz_ p@(Just (Baz _ _ _)) = p + tup :: (Nat, Nat) -> (Nat, Nat) + tup p@(_, _) = p + foo :: [Nat] -> [Nat] + foo p@[] = p + foo p@[_] = p + foo p@(_ : _ : _) = p + + data Baz = Baz Nat Nat Nat |] + ======> + maybePlus :: Maybe Nat -> Maybe Nat + maybePlus (Just n) = Just (plus (Succ Zero) n) + maybePlus p@Nothing = p + bar :: Maybe Nat -> Maybe Nat + bar x@(Just _) = x + bar Nothing = Nothing + data Baz = Baz Nat Nat Nat + baz_ :: Maybe Baz -> Maybe Baz + baz_ p@Nothing = p + baz_ p@(Just (Baz _ _ _)) = p + tup :: (Nat, Nat) -> (Nat, Nat) + tup p@(_, _) = p + foo :: [Nat] -> [Nat] + foo p@[] = p + foo p@[_] = p + foo p@(_ : (_ : _)) = p + type BazSym0 :: (~>) Nat ((~>) Nat ((~>) Nat Baz)) + data BazSym0 :: (~>) Nat ((~>) Nat ((~>) Nat Baz)) + where + BazSym0KindInference :: SameKind (Apply BazSym0 arg) (BazSym1 arg) => + BazSym0 a0123456789876543210 + type instance Apply BazSym0 a0123456789876543210 = BazSym1 a0123456789876543210 + instance SuppressUnusedWarnings BazSym0 where + suppressUnusedWarnings = snd ((,) BazSym0KindInference ()) + type BazSym1 :: Nat -> (~>) Nat ((~>) Nat Baz) + data BazSym1 (a0123456789876543210 :: Nat) :: (~>) Nat ((~>) Nat Baz) + where + BazSym1KindInference :: SameKind (Apply (BazSym1 a0123456789876543210) arg) (BazSym2 a0123456789876543210 arg) => + BazSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (BazSym1 a0123456789876543210) a0123456789876543210 = BazSym2 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (BazSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) BazSym1KindInference ()) + type BazSym2 :: Nat -> Nat -> (~>) Nat Baz + data BazSym2 (a0123456789876543210 :: Nat) (a0123456789876543210 :: Nat) :: (~>) Nat Baz + where + BazSym2KindInference :: SameKind (Apply (BazSym2 a0123456789876543210 a0123456789876543210) arg) (BazSym3 a0123456789876543210 a0123456789876543210 arg) => + BazSym2 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply (BazSym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = Baz a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (BazSym2 a0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) BazSym2KindInference ()) + type BazSym3 :: Nat -> Nat -> Nat -> Baz + type family BazSym3 (a0123456789876543210 :: Nat) (a0123456789876543210 :: Nat) (a0123456789876543210 :: Nat) :: Baz where + BazSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = Baz a0123456789876543210 a0123456789876543210 a0123456789876543210 + type family Let0123456789876543210PSym0 where + Let0123456789876543210PSym0 = Let0123456789876543210P + type family Let0123456789876543210P where + Let0123456789876543210P = NilSym0 + data Let0123456789876543210PSym0 wild_01234567898765432100123456789876543210 + where + Let0123456789876543210PSym0KindInference :: SameKind (Apply Let0123456789876543210PSym0 arg) (Let0123456789876543210PSym1 arg) => + Let0123456789876543210PSym0 wild_01234567898765432100123456789876543210 + type instance Apply Let0123456789876543210PSym0 wild_01234567898765432100123456789876543210 = Let0123456789876543210P wild_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings Let0123456789876543210PSym0 where + suppressUnusedWarnings + = snd ((,) Let0123456789876543210PSym0KindInference ()) + type family Let0123456789876543210PSym1 wild_01234567898765432100123456789876543210 where + Let0123456789876543210PSym1 wild_01234567898765432100123456789876543210 = Let0123456789876543210P wild_01234567898765432100123456789876543210 + type family Let0123456789876543210P wild_0123456789876543210 where + Let0123456789876543210P wild_0123456789876543210 = Apply (Apply (:@#@$) wild_0123456789876543210) NilSym0 + data Let0123456789876543210PSym0 wild_01234567898765432100123456789876543210 + where + Let0123456789876543210PSym0KindInference :: SameKind (Apply Let0123456789876543210PSym0 arg) (Let0123456789876543210PSym1 arg) => + Let0123456789876543210PSym0 wild_01234567898765432100123456789876543210 + type instance Apply Let0123456789876543210PSym0 wild_01234567898765432100123456789876543210 = Let0123456789876543210PSym1 wild_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings Let0123456789876543210PSym0 where + suppressUnusedWarnings + = snd ((,) Let0123456789876543210PSym0KindInference ()) + data Let0123456789876543210PSym1 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 + where + Let0123456789876543210PSym1KindInference :: SameKind (Apply (Let0123456789876543210PSym1 wild_01234567898765432100123456789876543210) arg) (Let0123456789876543210PSym2 wild_01234567898765432100123456789876543210 arg) => + Let0123456789876543210PSym1 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 + type instance Apply (Let0123456789876543210PSym1 wild_01234567898765432100123456789876543210) wild_01234567898765432100123456789876543210 = Let0123456789876543210PSym2 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Let0123456789876543210PSym1 wild_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Let0123456789876543210PSym1KindInference ()) + data Let0123456789876543210PSym2 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 + where + Let0123456789876543210PSym2KindInference :: SameKind (Apply (Let0123456789876543210PSym2 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210) arg) (Let0123456789876543210PSym3 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 arg) => + Let0123456789876543210PSym2 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 + type instance Apply (Let0123456789876543210PSym2 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210) wild_01234567898765432100123456789876543210 = Let0123456789876543210P wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Let0123456789876543210PSym2 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Let0123456789876543210PSym2KindInference ()) + type family Let0123456789876543210PSym3 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 where + Let0123456789876543210PSym3 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 = Let0123456789876543210P wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 + type family Let0123456789876543210P wild_0123456789876543210 wild_0123456789876543210 wild_0123456789876543210 where + Let0123456789876543210P wild_0123456789876543210 wild_0123456789876543210 wild_0123456789876543210 = Apply (Apply (:@#@$) wild_0123456789876543210) (Apply (Apply (:@#@$) wild_0123456789876543210) wild_0123456789876543210) + data Let0123456789876543210PSym0 wild_01234567898765432100123456789876543210 + where + Let0123456789876543210PSym0KindInference :: SameKind (Apply Let0123456789876543210PSym0 arg) (Let0123456789876543210PSym1 arg) => + Let0123456789876543210PSym0 wild_01234567898765432100123456789876543210 + type instance Apply Let0123456789876543210PSym0 wild_01234567898765432100123456789876543210 = Let0123456789876543210PSym1 wild_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings Let0123456789876543210PSym0 where + suppressUnusedWarnings + = snd ((,) Let0123456789876543210PSym0KindInference ()) + data Let0123456789876543210PSym1 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 + where + Let0123456789876543210PSym1KindInference :: SameKind (Apply (Let0123456789876543210PSym1 wild_01234567898765432100123456789876543210) arg) (Let0123456789876543210PSym2 wild_01234567898765432100123456789876543210 arg) => + Let0123456789876543210PSym1 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 + type instance Apply (Let0123456789876543210PSym1 wild_01234567898765432100123456789876543210) wild_01234567898765432100123456789876543210 = Let0123456789876543210P wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Let0123456789876543210PSym1 wild_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Let0123456789876543210PSym1KindInference ()) + type family Let0123456789876543210PSym2 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 where + Let0123456789876543210PSym2 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 = Let0123456789876543210P wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 + type family Let0123456789876543210P wild_0123456789876543210 wild_0123456789876543210 where + Let0123456789876543210P wild_0123456789876543210 wild_0123456789876543210 = Apply (Apply Tuple2Sym0 wild_0123456789876543210) wild_0123456789876543210 + type family Let0123456789876543210PSym0 where + Let0123456789876543210PSym0 = Let0123456789876543210P + type family Let0123456789876543210P where + Let0123456789876543210P = NothingSym0 + data Let0123456789876543210PSym0 wild_01234567898765432100123456789876543210 + where + Let0123456789876543210PSym0KindInference :: SameKind (Apply Let0123456789876543210PSym0 arg) (Let0123456789876543210PSym1 arg) => + Let0123456789876543210PSym0 wild_01234567898765432100123456789876543210 + type instance Apply Let0123456789876543210PSym0 wild_01234567898765432100123456789876543210 = Let0123456789876543210PSym1 wild_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings Let0123456789876543210PSym0 where + suppressUnusedWarnings + = snd ((,) Let0123456789876543210PSym0KindInference ()) + data Let0123456789876543210PSym1 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 + where + Let0123456789876543210PSym1KindInference :: SameKind (Apply (Let0123456789876543210PSym1 wild_01234567898765432100123456789876543210) arg) (Let0123456789876543210PSym2 wild_01234567898765432100123456789876543210 arg) => + Let0123456789876543210PSym1 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 + type instance Apply (Let0123456789876543210PSym1 wild_01234567898765432100123456789876543210) wild_01234567898765432100123456789876543210 = Let0123456789876543210PSym2 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Let0123456789876543210PSym1 wild_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Let0123456789876543210PSym1KindInference ()) + data Let0123456789876543210PSym2 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 + where + Let0123456789876543210PSym2KindInference :: SameKind (Apply (Let0123456789876543210PSym2 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210) arg) (Let0123456789876543210PSym3 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 arg) => + Let0123456789876543210PSym2 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 + type instance Apply (Let0123456789876543210PSym2 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210) wild_01234567898765432100123456789876543210 = Let0123456789876543210P wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Let0123456789876543210PSym2 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Let0123456789876543210PSym2KindInference ()) + type family Let0123456789876543210PSym3 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 where + Let0123456789876543210PSym3 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 = Let0123456789876543210P wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 wild_01234567898765432100123456789876543210 + type family Let0123456789876543210P wild_0123456789876543210 wild_0123456789876543210 wild_0123456789876543210 where + Let0123456789876543210P wild_0123456789876543210 wild_0123456789876543210 wild_0123456789876543210 = Apply JustSym0 (Apply (Apply (Apply BazSym0 wild_0123456789876543210) wild_0123456789876543210) wild_0123456789876543210) + data Let0123456789876543210XSym0 wild_01234567898765432100123456789876543210 + where + Let0123456789876543210XSym0KindInference :: SameKind (Apply Let0123456789876543210XSym0 arg) (Let0123456789876543210XSym1 arg) => + Let0123456789876543210XSym0 wild_01234567898765432100123456789876543210 + type instance Apply Let0123456789876543210XSym0 wild_01234567898765432100123456789876543210 = Let0123456789876543210X wild_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings Let0123456789876543210XSym0 where + suppressUnusedWarnings + = snd ((,) Let0123456789876543210XSym0KindInference ()) + type family Let0123456789876543210XSym1 wild_01234567898765432100123456789876543210 where + Let0123456789876543210XSym1 wild_01234567898765432100123456789876543210 = Let0123456789876543210X wild_01234567898765432100123456789876543210 + type family Let0123456789876543210X wild_0123456789876543210 where + Let0123456789876543210X wild_0123456789876543210 = Apply JustSym0 wild_0123456789876543210 + type family Let0123456789876543210PSym0 where + Let0123456789876543210PSym0 = Let0123456789876543210P + type family Let0123456789876543210P where + Let0123456789876543210P = NothingSym0 + type FooSym0 :: (~>) [Nat] [Nat] + data FooSym0 :: (~>) [Nat] [Nat] + where + FooSym0KindInference :: SameKind (Apply FooSym0 arg) (FooSym1 arg) => + FooSym0 a0123456789876543210 + type instance Apply FooSym0 a0123456789876543210 = Foo a0123456789876543210 + instance SuppressUnusedWarnings FooSym0 where + suppressUnusedWarnings = snd ((,) FooSym0KindInference ()) + type FooSym1 :: [Nat] -> [Nat] + type family FooSym1 (a0123456789876543210 :: [Nat]) :: [Nat] where + FooSym1 a0123456789876543210 = Foo a0123456789876543210 + type TupSym0 :: (~>) (Nat, Nat) (Nat, Nat) + data TupSym0 :: (~>) (Nat, Nat) (Nat, Nat) + where + TupSym0KindInference :: SameKind (Apply TupSym0 arg) (TupSym1 arg) => + TupSym0 a0123456789876543210 + type instance Apply TupSym0 a0123456789876543210 = Tup a0123456789876543210 + instance SuppressUnusedWarnings TupSym0 where + suppressUnusedWarnings = snd ((,) TupSym0KindInference ()) + type TupSym1 :: (Nat, Nat) -> (Nat, Nat) + type family TupSym1 (a0123456789876543210 :: (Nat, Nat)) :: (Nat, + Nat) where + TupSym1 a0123456789876543210 = Tup a0123456789876543210 + type Baz_Sym0 :: (~>) (Maybe Baz) (Maybe Baz) + data Baz_Sym0 :: (~>) (Maybe Baz) (Maybe Baz) + where + Baz_Sym0KindInference :: SameKind (Apply Baz_Sym0 arg) (Baz_Sym1 arg) => + Baz_Sym0 a0123456789876543210 + type instance Apply Baz_Sym0 a0123456789876543210 = Baz_ a0123456789876543210 + instance SuppressUnusedWarnings Baz_Sym0 where + suppressUnusedWarnings = snd ((,) Baz_Sym0KindInference ()) + type Baz_Sym1 :: Maybe Baz -> Maybe Baz + type family Baz_Sym1 (a0123456789876543210 :: Maybe Baz) :: Maybe Baz where + Baz_Sym1 a0123456789876543210 = Baz_ a0123456789876543210 + type BarSym0 :: (~>) (Maybe Nat) (Maybe Nat) + data BarSym0 :: (~>) (Maybe Nat) (Maybe Nat) + where + BarSym0KindInference :: SameKind (Apply BarSym0 arg) (BarSym1 arg) => + BarSym0 a0123456789876543210 + type instance Apply BarSym0 a0123456789876543210 = Bar a0123456789876543210 + instance SuppressUnusedWarnings BarSym0 where + suppressUnusedWarnings = snd ((,) BarSym0KindInference ()) + type BarSym1 :: Maybe Nat -> Maybe Nat + type family BarSym1 (a0123456789876543210 :: Maybe Nat) :: Maybe Nat where + BarSym1 a0123456789876543210 = Bar a0123456789876543210 + type MaybePlusSym0 :: (~>) (Maybe Nat) (Maybe Nat) + data MaybePlusSym0 :: (~>) (Maybe Nat) (Maybe Nat) + where + MaybePlusSym0KindInference :: SameKind (Apply MaybePlusSym0 arg) (MaybePlusSym1 arg) => + MaybePlusSym0 a0123456789876543210 + type instance Apply MaybePlusSym0 a0123456789876543210 = MaybePlus a0123456789876543210 + instance SuppressUnusedWarnings MaybePlusSym0 where + suppressUnusedWarnings = snd ((,) MaybePlusSym0KindInference ()) + type MaybePlusSym1 :: Maybe Nat -> Maybe Nat + type family MaybePlusSym1 (a0123456789876543210 :: Maybe Nat) :: Maybe Nat where + MaybePlusSym1 a0123456789876543210 = MaybePlus a0123456789876543210 + type Foo :: [Nat] -> [Nat] + type family Foo (a :: [Nat]) :: [Nat] where + Foo '[] = Let0123456789876543210PSym0 + Foo '[wild_0123456789876543210] = Let0123456789876543210PSym1 wild_0123456789876543210 + Foo ('(:) wild_0123456789876543210 ('(:) wild_0123456789876543210 wild_0123456789876543210)) = Let0123456789876543210PSym3 wild_0123456789876543210 wild_0123456789876543210 wild_0123456789876543210 + type Tup :: (Nat, Nat) -> (Nat, Nat) + type family Tup (a :: (Nat, Nat)) :: (Nat, Nat) where + Tup '(wild_0123456789876543210, + wild_0123456789876543210) = Let0123456789876543210PSym2 wild_0123456789876543210 wild_0123456789876543210 + type Baz_ :: Maybe Baz -> Maybe Baz + type family Baz_ (a :: Maybe Baz) :: Maybe Baz where + Baz_ 'Nothing = Let0123456789876543210PSym0 + Baz_ ('Just (Baz wild_0123456789876543210 wild_0123456789876543210 wild_0123456789876543210)) = Let0123456789876543210PSym3 wild_0123456789876543210 wild_0123456789876543210 wild_0123456789876543210 + type Bar :: Maybe Nat -> Maybe Nat + type family Bar (a :: Maybe Nat) :: Maybe Nat where + Bar ('Just wild_0123456789876543210) = Let0123456789876543210XSym1 wild_0123456789876543210 + Bar 'Nothing = NothingSym0 + type MaybePlus :: Maybe Nat -> Maybe Nat + type family MaybePlus (a :: Maybe Nat) :: Maybe Nat where + MaybePlus ('Just n) = Apply JustSym0 (Apply (Apply PlusSym0 (Apply SuccSym0 ZeroSym0)) n) + MaybePlus 'Nothing = Let0123456789876543210PSym0 + sFoo :: + (forall (t :: [Nat]). + Sing t -> Sing (Apply FooSym0 t :: [Nat]) :: Type) + sTup :: + (forall (t :: (Nat, Nat)). + Sing t -> Sing (Apply TupSym0 t :: (Nat, Nat)) :: Type) + sBaz_ :: + (forall (t :: Maybe Baz). + Sing t -> Sing (Apply Baz_Sym0 t :: Maybe Baz) :: Type) + sBar :: + (forall (t :: Maybe Nat). + Sing t -> Sing (Apply BarSym0 t :: Maybe Nat) :: Type) + sMaybePlus :: + (forall (t :: Maybe Nat). + Sing t -> Sing (Apply MaybePlusSym0 t :: Maybe Nat) :: Type) + sFoo SNil + = let + sP :: Sing @_ Let0123456789876543210PSym0 + sP = SNil + in sP + sFoo + (SCons (sWild_0123456789876543210 :: Sing wild_0123456789876543210) + SNil) + = let + sP :: + Sing @_ (Let0123456789876543210PSym1 wild_0123456789876543210) + sP + = applySing + (applySing (singFun2 @(:@#@$) SCons) sWild_0123456789876543210) + SNil + in sP + sFoo + (SCons (sWild_0123456789876543210 :: Sing wild_0123456789876543210) + (SCons (sWild_0123456789876543210 :: Sing wild_0123456789876543210) + (sWild_0123456789876543210 :: Sing wild_0123456789876543210))) + = let + sP :: + Sing @_ (Let0123456789876543210PSym3 wild_0123456789876543210 wild_0123456789876543210 wild_0123456789876543210) + sP + = applySing + (applySing (singFun2 @(:@#@$) SCons) sWild_0123456789876543210) + (applySing + (applySing (singFun2 @(:@#@$) SCons) sWild_0123456789876543210) + sWild_0123456789876543210) + in sP + sTup + (STuple2 (sWild_0123456789876543210 :: Sing wild_0123456789876543210) + (sWild_0123456789876543210 :: Sing wild_0123456789876543210)) + = let + sP :: + Sing @_ (Let0123456789876543210PSym2 wild_0123456789876543210 wild_0123456789876543210) + sP + = applySing + (applySing + (singFun2 @Tuple2Sym0 STuple2) sWild_0123456789876543210) + sWild_0123456789876543210 + in sP + sBaz_ SNothing + = let + sP :: Sing @_ Let0123456789876543210PSym0 + sP = SNothing + in sP + sBaz_ + (SJust (SBaz (sWild_0123456789876543210 :: Sing wild_0123456789876543210) + (sWild_0123456789876543210 :: Sing wild_0123456789876543210) + (sWild_0123456789876543210 :: Sing wild_0123456789876543210))) + = let + sP :: + Sing @_ (Let0123456789876543210PSym3 wild_0123456789876543210 wild_0123456789876543210 wild_0123456789876543210) + sP + = applySing + (singFun1 @JustSym0 SJust) + (applySing + (applySing + (applySing (singFun3 @BazSym0 SBaz) sWild_0123456789876543210) + sWild_0123456789876543210) + sWild_0123456789876543210) + in sP + sBar + (SJust (sWild_0123456789876543210 :: Sing wild_0123456789876543210)) + = let + sX :: + Sing @_ (Let0123456789876543210XSym1 wild_0123456789876543210) + sX = applySing (singFun1 @JustSym0 SJust) sWild_0123456789876543210 + in sX + sBar SNothing = SNothing + sMaybePlus (SJust (sN :: Sing n)) + = applySing + (singFun1 @JustSym0 SJust) + (applySing + (applySing + (singFun2 @PlusSym0 sPlus) + (applySing (singFun1 @SuccSym0 SSucc) SZero)) + sN) + sMaybePlus SNothing + = let + sP :: Sing @_ Let0123456789876543210PSym0 + sP = SNothing + in sP + instance SingI (FooSym0 :: (~>) [Nat] [Nat]) where + sing = singFun1 @FooSym0 sFoo + instance SingI (TupSym0 :: (~>) (Nat, Nat) (Nat, Nat)) where + sing = singFun1 @TupSym0 sTup + instance SingI (Baz_Sym0 :: (~>) (Maybe Baz) (Maybe Baz)) where + sing = singFun1 @Baz_Sym0 sBaz_ + instance SingI (BarSym0 :: (~>) (Maybe Nat) (Maybe Nat)) where + sing = singFun1 @BarSym0 sBar + instance SingI (MaybePlusSym0 :: (~>) (Maybe Nat) (Maybe Nat)) where + sing = singFun1 @MaybePlusSym0 sMaybePlus + data SBaz :: Baz -> Type + where + SBaz :: forall (n :: Nat) (n :: Nat) (n :: Nat). + (Sing n) -> (Sing n) -> (Sing n) -> SBaz (Baz n n n :: Baz) + type instance Sing @Baz = SBaz + instance SingKind Baz where + type Demote Baz = Baz + fromSing (SBaz b b b) = Baz (fromSing b) (fromSing b) (fromSing b) + toSing (Baz (b :: Demote Nat) (b :: Demote Nat) (b :: Demote Nat)) + = case + (,,) + (toSing b :: SomeSing Nat) (toSing b :: SomeSing Nat) + (toSing b :: SomeSing Nat) + of + (,,) (SomeSing c) (SomeSing c) (SomeSing c) + -> SomeSing (SBaz c c c) + instance (SingI n, SingI n, SingI n) => + SingI (Baz (n :: Nat) (n :: Nat) (n :: Nat)) where + sing = SBaz sing sing sing + instance (SingI n, SingI n) => + SingI1 (Baz (n :: Nat) (n :: Nat)) where + liftSing = SBaz sing sing + instance SingI n => SingI2 (Baz (n :: Nat)) where + liftSing2 = SBaz sing + instance SingI (BazSym0 :: (~>) Nat ((~>) Nat ((~>) Nat Baz))) where + sing = singFun3 @BazSym0 SBaz + instance SingI d => + SingI (BazSym1 (d :: Nat) :: (~>) Nat ((~>) Nat Baz)) where + sing = singFun2 @(BazSym1 (d :: Nat)) (SBaz (sing @d)) + instance SingI1 (BazSym1 :: Nat -> (~>) Nat ((~>) Nat Baz)) where + liftSing (s :: Sing (d :: Nat)) + = singFun2 @(BazSym1 (d :: Nat)) (SBaz s) + instance (SingI d, SingI d) => + SingI (BazSym2 (d :: Nat) (d :: Nat) :: (~>) Nat Baz) where + sing + = singFun1 + @(BazSym2 (d :: Nat) (d :: Nat)) (SBaz (sing @d) (sing @d)) + instance SingI d => + SingI1 (BazSym2 (d :: Nat) :: Nat -> (~>) Nat Baz) where + liftSing (s :: Sing (d :: Nat)) + = singFun1 @(BazSym2 (d :: Nat) (d :: Nat)) (SBaz (sing @d) s) + instance SingI2 (BazSym2 :: Nat -> Nat -> (~>) Nat Baz) where + liftSing2 (s :: Sing (d :: Nat)) (s :: Sing (d :: Nat)) + = singFun1 @(BazSym2 (d :: Nat) (d :: Nat)) (SBaz s s)
tests/compile-and-dump/Singletons/AsPattern.hs view
@@ -1,30 +1,30 @@-module Singletons.AsPattern where--import Data.List.Singletons-import Data.Maybe.Singletons-import Data.Singletons.Base.TH-import Singletons.Nat--$(singletons [d|- maybePlus :: Maybe Nat -> Maybe Nat- maybePlus (Just n) = Just (plus (Succ Zero) n)- maybePlus p@Nothing = p-- bar :: Maybe Nat -> Maybe Nat- bar x@(Just _) = x- bar Nothing = Nothing-- data Baz = Baz Nat Nat Nat-- baz_ :: Maybe Baz -> Maybe Baz- baz_ p@Nothing = p- baz_ p@(Just (Baz _ _ _)) = p-- tup :: (Nat, Nat) -> (Nat, Nat)- tup p@(_, _) = p-- foo :: [Nat] -> [Nat]- foo p@[] = p- foo p@[_] = p- foo p@(_:_:_) = p- |])+module Singletons.AsPattern where + +import Data.List.Singletons +import Data.Maybe.Singletons +import Data.Singletons.Base.TH +import Singletons.Nat + +$(singletons [d| + maybePlus :: Maybe Nat -> Maybe Nat + maybePlus (Just n) = Just (plus (Succ Zero) n) + maybePlus p@Nothing = p + + bar :: Maybe Nat -> Maybe Nat + bar x@(Just _) = x + bar Nothing = Nothing + + data Baz = Baz Nat Nat Nat + + baz_ :: Maybe Baz -> Maybe Baz + baz_ p@Nothing = p + baz_ p@(Just (Baz _ _ _)) = p + + tup :: (Nat, Nat) -> (Nat, Nat) + tup p@(_, _) = p + + foo :: [Nat] -> [Nat] + foo p@[] = p + foo p@[_] = p + foo p@(_:_:_) = p + |])
tests/compile-and-dump/Singletons/BadBoundedDeriving.golden view
@@ -1,6 +1,6 @@--Singletons/BadBoundedDeriving.hs:0:0: error:- Can't derive Bounded instance for Foo_0 a_1.- |-5 | $(singletons [d|- | ^^^^^^^^^^^^^^^...+ +Singletons/BadBoundedDeriving.hs:0:0: error: [GHC-39584] + Can't derive Bounded instance for Foo_0 a_1. + | +5 | $(singletons [d| + | ^^^^^^^^^^^^^^^...
tests/compile-and-dump/Singletons/BadBoundedDeriving.hs view
@@ -1,7 +1,7 @@-module Singletons.BadBoundedDeriving where--import Data.Singletons.TH--$(singletons [d|- data Foo a = Foo | Bar a deriving (Bounded)- |])+module Singletons.BadBoundedDeriving where + +import Data.Singletons.TH + +$(singletons [d| + data Foo a = Foo | Bar a deriving (Bounded) + |])
tests/compile-and-dump/Singletons/BadEnumDeriving.golden view
@@ -1,6 +1,6 @@--Singletons/BadEnumDeriving.hs:0:0: error:- Can't derive Enum instance for Foo_0 a_1.- |-5 | $(singletons [d|- | ^^^^^^^^^^^^^^^...+ +Singletons/BadEnumDeriving.hs:0:0: error: [GHC-39584] + Can't derive Enum instance for Foo_0 a_1. + | +5 | $(singletons [d| + | ^^^^^^^^^^^^^^^...
tests/compile-and-dump/Singletons/BadEnumDeriving.hs view
@@ -1,8 +1,8 @@-module Singletons.BadEnumDeriving where--import Data.Singletons.TH--$(singletons [d|- data Foo a = Foo a- deriving Enum- |])+module Singletons.BadEnumDeriving where + +import Data.Singletons.TH + +$(singletons [d| + data Foo a = Foo a + deriving Enum + |])
tests/compile-and-dump/Singletons/BoundedDeriving.golden view
@@ -1,291 +1,291 @@-Singletons/BoundedDeriving.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| data Foo1- = Foo1- deriving (Bounded)- data Foo2- = A | B | C | D | E- deriving (Bounded)- data Foo3 a- = Foo3 a- deriving (Bounded)- data Foo4 (a :: Type) (b :: Type)- = Foo41 | Foo42- deriving Bounded- data Pair- = Pair Bool Bool- deriving Bounded |]- ======>- data Foo1- = Foo1- deriving Bounded- data Foo2- = A | B | C | D | E- deriving Bounded- data Foo3 a- = Foo3 a- deriving Bounded- data Foo4 (a :: Type) (b :: Type)- = Foo41 | Foo42- deriving Bounded- data Pair- = Pair Bool Bool- deriving Bounded- type Foo1Sym0 :: Foo1- type family Foo1Sym0 :: Foo1 where- Foo1Sym0 = Foo1- type ASym0 :: Foo2- type family ASym0 :: Foo2 where- ASym0 = A- type BSym0 :: Foo2- type family BSym0 :: Foo2 where- BSym0 = B- type CSym0 :: Foo2- type family CSym0 :: Foo2 where- CSym0 = C- type DSym0 :: Foo2- type family DSym0 :: Foo2 where- DSym0 = D- type ESym0 :: Foo2- type family ESym0 :: Foo2 where- ESym0 = E- type Foo3Sym0 :: forall a. (~>) a (Foo3 a)- data Foo3Sym0 :: (~>) a (Foo3 a)- where- Foo3Sym0KindInference :: SameKind (Apply Foo3Sym0 arg) (Foo3Sym1 arg) =>- Foo3Sym0 a0123456789876543210- type instance Apply Foo3Sym0 a0123456789876543210 = Foo3 a0123456789876543210- instance SuppressUnusedWarnings Foo3Sym0 where- suppressUnusedWarnings = snd (((,) Foo3Sym0KindInference) ())- type Foo3Sym1 :: forall a. a -> Foo3 a- type family Foo3Sym1 (a0123456789876543210 :: a) :: Foo3 a where- Foo3Sym1 a0123456789876543210 = Foo3 a0123456789876543210- type Foo41Sym0 :: forall (a :: Type)- (b :: Type). Foo4 (a :: Type) (b :: Type)- type family Foo41Sym0 :: Foo4 (a :: Type) (b :: Type) where- Foo41Sym0 = Foo41- type Foo42Sym0 :: forall (a :: Type)- (b :: Type). Foo4 (a :: Type) (b :: Type)- type family Foo42Sym0 :: Foo4 (a :: Type) (b :: Type) where- Foo42Sym0 = Foo42- type PairSym0 :: (~>) Bool ((~>) Bool Pair)- data PairSym0 :: (~>) Bool ((~>) Bool Pair)- where- PairSym0KindInference :: SameKind (Apply PairSym0 arg) (PairSym1 arg) =>- PairSym0 a0123456789876543210- type instance Apply PairSym0 a0123456789876543210 = PairSym1 a0123456789876543210- instance SuppressUnusedWarnings PairSym0 where- suppressUnusedWarnings = snd (((,) PairSym0KindInference) ())- type PairSym1 :: Bool -> (~>) Bool Pair- data PairSym1 (a0123456789876543210 :: Bool) :: (~>) Bool Pair- where- PairSym1KindInference :: SameKind (Apply (PairSym1 a0123456789876543210) arg) (PairSym2 a0123456789876543210 arg) =>- PairSym1 a0123456789876543210 a0123456789876543210- type instance Apply (PairSym1 a0123456789876543210) a0123456789876543210 = Pair a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (PairSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) PairSym1KindInference) ())- type PairSym2 :: Bool -> Bool -> Pair- type family PairSym2 (a0123456789876543210 :: Bool) (a0123456789876543210 :: Bool) :: Pair where- PairSym2 a0123456789876543210 a0123456789876543210 = Pair a0123456789876543210 a0123456789876543210- type MinBound_0123456789876543210 :: Foo1- type family MinBound_0123456789876543210 :: Foo1 where- MinBound_0123456789876543210 = Foo1Sym0- type MinBound_0123456789876543210Sym0 :: Foo1- type family MinBound_0123456789876543210Sym0 :: Foo1 where- MinBound_0123456789876543210Sym0 = MinBound_0123456789876543210- type MaxBound_0123456789876543210 :: Foo1- type family MaxBound_0123456789876543210 :: Foo1 where- MaxBound_0123456789876543210 = Foo1Sym0- type MaxBound_0123456789876543210Sym0 :: Foo1- type family MaxBound_0123456789876543210Sym0 :: Foo1 where- MaxBound_0123456789876543210Sym0 = MaxBound_0123456789876543210- instance PBounded Foo1 where- type MinBound = MinBound_0123456789876543210Sym0- type MaxBound = MaxBound_0123456789876543210Sym0- type MinBound_0123456789876543210 :: Foo2- type family MinBound_0123456789876543210 :: Foo2 where- MinBound_0123456789876543210 = ASym0- type MinBound_0123456789876543210Sym0 :: Foo2- type family MinBound_0123456789876543210Sym0 :: Foo2 where- MinBound_0123456789876543210Sym0 = MinBound_0123456789876543210- type MaxBound_0123456789876543210 :: Foo2- type family MaxBound_0123456789876543210 :: Foo2 where- MaxBound_0123456789876543210 = ESym0- type MaxBound_0123456789876543210Sym0 :: Foo2- type family MaxBound_0123456789876543210Sym0 :: Foo2 where- MaxBound_0123456789876543210Sym0 = MaxBound_0123456789876543210- instance PBounded Foo2 where- type MinBound = MinBound_0123456789876543210Sym0- type MaxBound = MaxBound_0123456789876543210Sym0- type MinBound_0123456789876543210 :: Foo3 a- type family MinBound_0123456789876543210 :: Foo3 a where- MinBound_0123456789876543210 = Apply Foo3Sym0 MinBoundSym0- type MinBound_0123456789876543210Sym0 :: Foo3 a- type family MinBound_0123456789876543210Sym0 :: Foo3 a where- MinBound_0123456789876543210Sym0 = MinBound_0123456789876543210- type MaxBound_0123456789876543210 :: Foo3 a- type family MaxBound_0123456789876543210 :: Foo3 a where- MaxBound_0123456789876543210 = Apply Foo3Sym0 MaxBoundSym0- type MaxBound_0123456789876543210Sym0 :: Foo3 a- type family MaxBound_0123456789876543210Sym0 :: Foo3 a where- MaxBound_0123456789876543210Sym0 = MaxBound_0123456789876543210- instance PBounded (Foo3 a) where- type MinBound = MinBound_0123456789876543210Sym0- type MaxBound = MaxBound_0123456789876543210Sym0- type MinBound_0123456789876543210 :: Foo4 a b- type family MinBound_0123456789876543210 :: Foo4 a b where- MinBound_0123456789876543210 = Foo41Sym0- type MinBound_0123456789876543210Sym0 :: Foo4 a b- type family MinBound_0123456789876543210Sym0 :: Foo4 a b where- MinBound_0123456789876543210Sym0 = MinBound_0123456789876543210- type MaxBound_0123456789876543210 :: Foo4 a b- type family MaxBound_0123456789876543210 :: Foo4 a b where- MaxBound_0123456789876543210 = Foo42Sym0- type MaxBound_0123456789876543210Sym0 :: Foo4 a b- type family MaxBound_0123456789876543210Sym0 :: Foo4 a b where- MaxBound_0123456789876543210Sym0 = MaxBound_0123456789876543210- instance PBounded (Foo4 a b) where- type MinBound = MinBound_0123456789876543210Sym0- type MaxBound = MaxBound_0123456789876543210Sym0- type MinBound_0123456789876543210 :: Pair- type family MinBound_0123456789876543210 :: Pair where- MinBound_0123456789876543210 = Apply (Apply PairSym0 MinBoundSym0) MinBoundSym0- type MinBound_0123456789876543210Sym0 :: Pair- type family MinBound_0123456789876543210Sym0 :: Pair where- MinBound_0123456789876543210Sym0 = MinBound_0123456789876543210- type MaxBound_0123456789876543210 :: Pair- type family MaxBound_0123456789876543210 :: Pair where- MaxBound_0123456789876543210 = Apply (Apply PairSym0 MaxBoundSym0) MaxBoundSym0- type MaxBound_0123456789876543210Sym0 :: Pair- type family MaxBound_0123456789876543210Sym0 :: Pair where- MaxBound_0123456789876543210Sym0 = MaxBound_0123456789876543210- instance PBounded Pair where- type MinBound = MinBound_0123456789876543210Sym0- type MaxBound = MaxBound_0123456789876543210Sym0- data SFoo1 :: Foo1 -> Type where SFoo1 :: SFoo1 (Foo1 :: Foo1)- type instance Sing @Foo1 = SFoo1- instance SingKind Foo1 where- type Demote Foo1 = Foo1- fromSing SFoo1 = Foo1- toSing Foo1 = SomeSing SFoo1- data SFoo2 :: Foo2 -> Type- where- SA :: SFoo2 (A :: Foo2)- SB :: SFoo2 (B :: Foo2)- SC :: SFoo2 (C :: Foo2)- SD :: SFoo2 (D :: Foo2)- SE :: SFoo2 (E :: Foo2)- type instance Sing @Foo2 = SFoo2- instance SingKind Foo2 where- type Demote Foo2 = Foo2- fromSing SA = A- fromSing SB = B- fromSing SC = C- fromSing SD = D- fromSing SE = E- toSing A = SomeSing SA- toSing B = SomeSing SB- toSing C = SomeSing SC- toSing D = SomeSing SD- toSing E = SomeSing SE- data SFoo3 :: forall a. Foo3 a -> Type- where- SFoo3 :: forall a (n :: a). (Sing n) -> SFoo3 (Foo3 n :: Foo3 a)- type instance Sing @(Foo3 a) = SFoo3- instance SingKind a => SingKind (Foo3 a) where- type Demote (Foo3 a) = Foo3 (Demote a)- fromSing (SFoo3 b) = Foo3 (fromSing b)- toSing (Foo3 (b :: Demote a))- = case toSing b :: SomeSing a of SomeSing c -> SomeSing (SFoo3 c)- data SFoo4 :: forall (a :: Type) (b :: Type). Foo4 a b -> Type- where- SFoo41 :: forall (a :: Type) (b :: Type).- SFoo4 (Foo41 :: Foo4 (a :: Type) (b :: Type))- SFoo42 :: forall (a :: Type) (b :: Type).- SFoo4 (Foo42 :: Foo4 (a :: Type) (b :: Type))- type instance Sing @(Foo4 a b) = SFoo4- instance (SingKind a, SingKind b) => SingKind (Foo4 a b) where- type Demote (Foo4 a b) = Foo4 (Demote a) (Demote b)- fromSing SFoo41 = Foo41- fromSing SFoo42 = Foo42- toSing Foo41 = SomeSing SFoo41- toSing Foo42 = SomeSing SFoo42- data SPair :: Pair -> Type- where- SPair :: forall (n :: Bool) (n :: Bool).- (Sing n) -> (Sing n) -> SPair (Pair n n :: Pair)- type instance Sing @Pair = SPair- instance SingKind Pair where- type Demote Pair = Pair- fromSing (SPair b b) = (Pair (fromSing b)) (fromSing b)- toSing (Pair (b :: Demote Bool) (b :: Demote Bool))- = case- ((,) (toSing b :: SomeSing Bool)) (toSing b :: SomeSing Bool)- of- (,) (SomeSing c) (SomeSing c) -> SomeSing ((SPair c) c)- instance SBounded Foo1 where- sMinBound :: Sing (MinBoundSym0 :: Foo1)- sMaxBound :: Sing (MaxBoundSym0 :: Foo1)- sMinBound = SFoo1- sMaxBound = SFoo1- instance SBounded Foo2 where- sMinBound :: Sing (MinBoundSym0 :: Foo2)- sMaxBound :: Sing (MaxBoundSym0 :: Foo2)- sMinBound = SA- sMaxBound = SE- instance SBounded a => SBounded (Foo3 a) where- sMinBound :: Sing (MinBoundSym0 :: Foo3 a)- sMaxBound :: Sing (MaxBoundSym0 :: Foo3 a)- sMinBound = (applySing ((singFun1 @Foo3Sym0) SFoo3)) sMinBound- sMaxBound = (applySing ((singFun1 @Foo3Sym0) SFoo3)) sMaxBound- instance SBounded (Foo4 a b) where- sMinBound :: Sing (MinBoundSym0 :: Foo4 a b)- sMaxBound :: Sing (MaxBoundSym0 :: Foo4 a b)- sMinBound = SFoo41- sMaxBound = SFoo42- instance SBounded Bool => SBounded Pair where- sMinBound :: Sing (MinBoundSym0 :: Pair)- sMaxBound :: Sing (MaxBoundSym0 :: Pair)- sMinBound- = (applySing ((applySing ((singFun2 @PairSym0) SPair)) sMinBound))- sMinBound- sMaxBound- = (applySing ((applySing ((singFun2 @PairSym0) SPair)) sMaxBound))- sMaxBound- instance SingI Foo1 where- sing = SFoo1- instance SingI A where- sing = SA- instance SingI B where- sing = SB- instance SingI C where- sing = SC- instance SingI D where- sing = SD- instance SingI E where- sing = SE- instance SingI n => SingI (Foo3 (n :: a)) where- sing = SFoo3 sing- instance SingI1 Foo3 where- liftSing = SFoo3- instance SingI (Foo3Sym0 :: (~>) a (Foo3 a)) where- sing = (singFun1 @Foo3Sym0) SFoo3- instance SingI Foo41 where- sing = SFoo41- instance SingI Foo42 where- sing = SFoo42- instance (SingI n, SingI n) =>- SingI (Pair (n :: Bool) (n :: Bool)) where- sing = (SPair sing) sing- instance SingI n => SingI1 (Pair (n :: Bool)) where- liftSing = SPair sing- instance SingI2 Pair where- liftSing2 = SPair- instance SingI (PairSym0 :: (~>) Bool ((~>) Bool Pair)) where- sing = (singFun2 @PairSym0) SPair- instance SingI d =>- SingI (PairSym1 (d :: Bool) :: (~>) Bool Pair) where- sing = (singFun1 @(PairSym1 (d :: Bool))) (SPair (sing @d))- instance SingI1 (PairSym1 :: Bool -> (~>) Bool Pair) where- liftSing (s :: Sing (d :: Bool))- = (singFun1 @(PairSym1 (d :: Bool))) (SPair s)+Singletons/BoundedDeriving.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| data Foo1 + = Foo1 + deriving (Bounded) + data Foo2 + = A | B | C | D | E + deriving (Bounded) + data Foo3 a + = Foo3 a + deriving (Bounded) + data Foo4 (a :: Type) (b :: Type) + = Foo41 | Foo42 + deriving Bounded + data Pair + = Pair Bool Bool + deriving Bounded |] + ======> + data Foo1 + = Foo1 + deriving Bounded + data Foo2 + = A | B | C | D | E + deriving Bounded + data Foo3 a + = Foo3 a + deriving Bounded + data Foo4 (a :: Type) (b :: Type) + = Foo41 | Foo42 + deriving Bounded + data Pair + = Pair Bool Bool + deriving Bounded + type Foo1Sym0 :: Foo1 + type family Foo1Sym0 :: Foo1 where + Foo1Sym0 = Foo1 + type ASym0 :: Foo2 + type family ASym0 :: Foo2 where + ASym0 = A + type BSym0 :: Foo2 + type family BSym0 :: Foo2 where + BSym0 = B + type CSym0 :: Foo2 + type family CSym0 :: Foo2 where + CSym0 = C + type DSym0 :: Foo2 + type family DSym0 :: Foo2 where + DSym0 = D + type ESym0 :: Foo2 + type family ESym0 :: Foo2 where + ESym0 = E + type Foo3Sym0 :: forall a. (~>) a (Foo3 a) + data Foo3Sym0 :: (~>) a (Foo3 a) + where + Foo3Sym0KindInference :: SameKind (Apply Foo3Sym0 arg) (Foo3Sym1 arg) => + Foo3Sym0 a0123456789876543210 + type instance Apply Foo3Sym0 a0123456789876543210 = Foo3 a0123456789876543210 + instance SuppressUnusedWarnings Foo3Sym0 where + suppressUnusedWarnings = snd ((,) Foo3Sym0KindInference ()) + type Foo3Sym1 :: forall a. a -> Foo3 a + type family Foo3Sym1 (a0123456789876543210 :: a) :: Foo3 a where + Foo3Sym1 a0123456789876543210 = Foo3 a0123456789876543210 + type Foo41Sym0 :: forall (a :: Type) + (b :: Type). Foo4 (a :: Type) (b :: Type) + type family Foo41Sym0 :: Foo4 (a :: Type) (b :: Type) where + Foo41Sym0 = Foo41 + type Foo42Sym0 :: forall (a :: Type) + (b :: Type). Foo4 (a :: Type) (b :: Type) + type family Foo42Sym0 :: Foo4 (a :: Type) (b :: Type) where + Foo42Sym0 = Foo42 + type PairSym0 :: (~>) Bool ((~>) Bool Pair) + data PairSym0 :: (~>) Bool ((~>) Bool Pair) + where + PairSym0KindInference :: SameKind (Apply PairSym0 arg) (PairSym1 arg) => + PairSym0 a0123456789876543210 + type instance Apply PairSym0 a0123456789876543210 = PairSym1 a0123456789876543210 + instance SuppressUnusedWarnings PairSym0 where + suppressUnusedWarnings = snd ((,) PairSym0KindInference ()) + type PairSym1 :: Bool -> (~>) Bool Pair + data PairSym1 (a0123456789876543210 :: Bool) :: (~>) Bool Pair + where + PairSym1KindInference :: SameKind (Apply (PairSym1 a0123456789876543210) arg) (PairSym2 a0123456789876543210 arg) => + PairSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (PairSym1 a0123456789876543210) a0123456789876543210 = Pair a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (PairSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) PairSym1KindInference ()) + type PairSym2 :: Bool -> Bool -> Pair + type family PairSym2 (a0123456789876543210 :: Bool) (a0123456789876543210 :: Bool) :: Pair where + PairSym2 a0123456789876543210 a0123456789876543210 = Pair a0123456789876543210 a0123456789876543210 + type MinBound_0123456789876543210 :: Foo1 + type family MinBound_0123456789876543210 :: Foo1 where + MinBound_0123456789876543210 = Foo1Sym0 + type MinBound_0123456789876543210Sym0 :: Foo1 + type family MinBound_0123456789876543210Sym0 :: Foo1 where + MinBound_0123456789876543210Sym0 = MinBound_0123456789876543210 + type MaxBound_0123456789876543210 :: Foo1 + type family MaxBound_0123456789876543210 :: Foo1 where + MaxBound_0123456789876543210 = Foo1Sym0 + type MaxBound_0123456789876543210Sym0 :: Foo1 + type family MaxBound_0123456789876543210Sym0 :: Foo1 where + MaxBound_0123456789876543210Sym0 = MaxBound_0123456789876543210 + instance PBounded Foo1 where + type MinBound = MinBound_0123456789876543210Sym0 + type MaxBound = MaxBound_0123456789876543210Sym0 + type MinBound_0123456789876543210 :: Foo2 + type family MinBound_0123456789876543210 :: Foo2 where + MinBound_0123456789876543210 = ASym0 + type MinBound_0123456789876543210Sym0 :: Foo2 + type family MinBound_0123456789876543210Sym0 :: Foo2 where + MinBound_0123456789876543210Sym0 = MinBound_0123456789876543210 + type MaxBound_0123456789876543210 :: Foo2 + type family MaxBound_0123456789876543210 :: Foo2 where + MaxBound_0123456789876543210 = ESym0 + type MaxBound_0123456789876543210Sym0 :: Foo2 + type family MaxBound_0123456789876543210Sym0 :: Foo2 where + MaxBound_0123456789876543210Sym0 = MaxBound_0123456789876543210 + instance PBounded Foo2 where + type MinBound = MinBound_0123456789876543210Sym0 + type MaxBound = MaxBound_0123456789876543210Sym0 + type MinBound_0123456789876543210 :: Foo3 a + type family MinBound_0123456789876543210 :: Foo3 a where + MinBound_0123456789876543210 = Apply Foo3Sym0 MinBoundSym0 + type MinBound_0123456789876543210Sym0 :: Foo3 a + type family MinBound_0123456789876543210Sym0 :: Foo3 a where + MinBound_0123456789876543210Sym0 = MinBound_0123456789876543210 + type MaxBound_0123456789876543210 :: Foo3 a + type family MaxBound_0123456789876543210 :: Foo3 a where + MaxBound_0123456789876543210 = Apply Foo3Sym0 MaxBoundSym0 + type MaxBound_0123456789876543210Sym0 :: Foo3 a + type family MaxBound_0123456789876543210Sym0 :: Foo3 a where + MaxBound_0123456789876543210Sym0 = MaxBound_0123456789876543210 + instance PBounded (Foo3 a) where + type MinBound = MinBound_0123456789876543210Sym0 + type MaxBound = MaxBound_0123456789876543210Sym0 + type MinBound_0123456789876543210 :: Foo4 a b + type family MinBound_0123456789876543210 :: Foo4 a b where + MinBound_0123456789876543210 = Foo41Sym0 + type MinBound_0123456789876543210Sym0 :: Foo4 a b + type family MinBound_0123456789876543210Sym0 :: Foo4 a b where + MinBound_0123456789876543210Sym0 = MinBound_0123456789876543210 + type MaxBound_0123456789876543210 :: Foo4 a b + type family MaxBound_0123456789876543210 :: Foo4 a b where + MaxBound_0123456789876543210 = Foo42Sym0 + type MaxBound_0123456789876543210Sym0 :: Foo4 a b + type family MaxBound_0123456789876543210Sym0 :: Foo4 a b where + MaxBound_0123456789876543210Sym0 = MaxBound_0123456789876543210 + instance PBounded (Foo4 a b) where + type MinBound = MinBound_0123456789876543210Sym0 + type MaxBound = MaxBound_0123456789876543210Sym0 + type MinBound_0123456789876543210 :: Pair + type family MinBound_0123456789876543210 :: Pair where + MinBound_0123456789876543210 = Apply (Apply PairSym0 MinBoundSym0) MinBoundSym0 + type MinBound_0123456789876543210Sym0 :: Pair + type family MinBound_0123456789876543210Sym0 :: Pair where + MinBound_0123456789876543210Sym0 = MinBound_0123456789876543210 + type MaxBound_0123456789876543210 :: Pair + type family MaxBound_0123456789876543210 :: Pair where + MaxBound_0123456789876543210 = Apply (Apply PairSym0 MaxBoundSym0) MaxBoundSym0 + type MaxBound_0123456789876543210Sym0 :: Pair + type family MaxBound_0123456789876543210Sym0 :: Pair where + MaxBound_0123456789876543210Sym0 = MaxBound_0123456789876543210 + instance PBounded Pair where + type MinBound = MinBound_0123456789876543210Sym0 + type MaxBound = MaxBound_0123456789876543210Sym0 + data SFoo1 :: Foo1 -> Type where SFoo1 :: SFoo1 (Foo1 :: Foo1) + type instance Sing @Foo1 = SFoo1 + instance SingKind Foo1 where + type Demote Foo1 = Foo1 + fromSing SFoo1 = Foo1 + toSing Foo1 = SomeSing SFoo1 + data SFoo2 :: Foo2 -> Type + where + SA :: SFoo2 (A :: Foo2) + SB :: SFoo2 (B :: Foo2) + SC :: SFoo2 (C :: Foo2) + SD :: SFoo2 (D :: Foo2) + SE :: SFoo2 (E :: Foo2) + type instance Sing @Foo2 = SFoo2 + instance SingKind Foo2 where + type Demote Foo2 = Foo2 + fromSing SA = A + fromSing SB = B + fromSing SC = C + fromSing SD = D + fromSing SE = E + toSing A = SomeSing SA + toSing B = SomeSing SB + toSing C = SomeSing SC + toSing D = SomeSing SD + toSing E = SomeSing SE + data SFoo3 :: forall a. Foo3 a -> Type + where + SFoo3 :: forall a (n :: a). (Sing n) -> SFoo3 (Foo3 n :: Foo3 a) + type instance Sing @(Foo3 a) = SFoo3 + instance SingKind a => SingKind (Foo3 a) where + type Demote (Foo3 a) = Foo3 (Demote a) + fromSing (SFoo3 b) = Foo3 (fromSing b) + toSing (Foo3 (b :: Demote a)) + = case toSing b :: SomeSing a of SomeSing c -> SomeSing (SFoo3 c) + data SFoo4 :: forall (a :: Type) (b :: Type). Foo4 a b -> Type + where + SFoo41 :: forall (a :: Type) (b :: Type). + SFoo4 (Foo41 :: Foo4 (a :: Type) (b :: Type)) + SFoo42 :: forall (a :: Type) (b :: Type). + SFoo4 (Foo42 :: Foo4 (a :: Type) (b :: Type)) + type instance Sing @(Foo4 a b) = SFoo4 + instance (SingKind a, SingKind b) => SingKind (Foo4 a b) where + type Demote (Foo4 a b) = Foo4 (Demote a) (Demote b) + fromSing SFoo41 = Foo41 + fromSing SFoo42 = Foo42 + toSing Foo41 = SomeSing SFoo41 + toSing Foo42 = SomeSing SFoo42 + data SPair :: Pair -> Type + where + SPair :: forall (n :: Bool) (n :: Bool). + (Sing n) -> (Sing n) -> SPair (Pair n n :: Pair) + type instance Sing @Pair = SPair + instance SingKind Pair where + type Demote Pair = Pair + fromSing (SPair b b) = Pair (fromSing b) (fromSing b) + toSing (Pair (b :: Demote Bool) (b :: Demote Bool)) + = case + (,) (toSing b :: SomeSing Bool) (toSing b :: SomeSing Bool) + of + (,) (SomeSing c) (SomeSing c) -> SomeSing (SPair c c) + instance SBounded Foo1 where + sMinBound :: Sing (MinBoundSym0 :: Foo1) + sMaxBound :: Sing (MaxBoundSym0 :: Foo1) + sMinBound = SFoo1 + sMaxBound = SFoo1 + instance SBounded Foo2 where + sMinBound :: Sing (MinBoundSym0 :: Foo2) + sMaxBound :: Sing (MaxBoundSym0 :: Foo2) + sMinBound = SA + sMaxBound = SE + instance SBounded a => SBounded (Foo3 a) where + sMinBound :: Sing (MinBoundSym0 :: Foo3 a) + sMaxBound :: Sing (MaxBoundSym0 :: Foo3 a) + sMinBound = applySing (singFun1 @Foo3Sym0 SFoo3) sMinBound + sMaxBound = applySing (singFun1 @Foo3Sym0 SFoo3) sMaxBound + instance SBounded (Foo4 a b) where + sMinBound :: Sing (MinBoundSym0 :: Foo4 a b) + sMaxBound :: Sing (MaxBoundSym0 :: Foo4 a b) + sMinBound = SFoo41 + sMaxBound = SFoo42 + instance SBounded Bool => SBounded Pair where + sMinBound :: Sing (MinBoundSym0 :: Pair) + sMaxBound :: Sing (MaxBoundSym0 :: Pair) + sMinBound + = applySing + (applySing (singFun2 @PairSym0 SPair) sMinBound) sMinBound + sMaxBound + = applySing + (applySing (singFun2 @PairSym0 SPair) sMaxBound) sMaxBound + instance SingI Foo1 where + sing = SFoo1 + instance SingI A where + sing = SA + instance SingI B where + sing = SB + instance SingI C where + sing = SC + instance SingI D where + sing = SD + instance SingI E where + sing = SE + instance SingI n => SingI (Foo3 (n :: a)) where + sing = SFoo3 sing + instance SingI1 Foo3 where + liftSing = SFoo3 + instance SingI (Foo3Sym0 :: (~>) a (Foo3 a)) where + sing = singFun1 @Foo3Sym0 SFoo3 + instance SingI Foo41 where + sing = SFoo41 + instance SingI Foo42 where + sing = SFoo42 + instance (SingI n, SingI n) => + SingI (Pair (n :: Bool) (n :: Bool)) where + sing = SPair sing sing + instance SingI n => SingI1 (Pair (n :: Bool)) where + liftSing = SPair sing + instance SingI2 Pair where + liftSing2 = SPair + instance SingI (PairSym0 :: (~>) Bool ((~>) Bool Pair)) where + sing = singFun2 @PairSym0 SPair + instance SingI d => + SingI (PairSym1 (d :: Bool) :: (~>) Bool Pair) where + sing = singFun1 @(PairSym1 (d :: Bool)) (SPair (sing @d)) + instance SingI1 (PairSym1 :: Bool -> (~>) Bool Pair) where + liftSing (s :: Sing (d :: Bool)) + = singFun1 @(PairSym1 (d :: Bool)) (SPair s)
tests/compile-and-dump/Singletons/BoundedDeriving.hs view
@@ -1,52 +1,52 @@-module Singletons.BoundedDeriving where--import Data.Singletons.TH-import Data.Kind (Type)-import Prelude.Singletons--$(singletons [d|- data Foo1 = Foo1 deriving (Bounded)- data Foo2 = A | B | C | D | E deriving (Bounded)- data Foo3 a = Foo3 a deriving (Bounded)- data Foo4 (a :: Type) (b :: Type) = Foo41 | Foo42 deriving Bounded-- data Pair = Pair Bool Bool- deriving Bounded-- |])--foo1a :: Proxy (MinBound :: Foo1)-foo1a = Proxy--foo1b :: Proxy 'Foo1-foo1b = foo1a--foo1c :: Proxy (MaxBound :: Foo1)-foo1c = Proxy--foo1d :: Proxy 'Foo1-foo1d = foo1c--foo2a :: Proxy (MinBound :: Foo2)-foo2a = Proxy--foo2b :: Proxy 'A-foo2b = foo2a--foo2c :: Proxy (MaxBound :: Foo2)-foo2c = Proxy--foo2d :: Proxy 'E-foo2d = foo2c--foo3a :: Proxy (MinBound :: Foo3 Bool)-foo3a = Proxy--foo3b :: Proxy ('Foo3 False)-foo3b = foo3a--foo3c :: Proxy (MaxBound :: Foo3 Bool)-foo3c = Proxy--foo3d :: Proxy ('Foo3 True)-foo3d = foo3c+module Singletons.BoundedDeriving where + +import Data.Singletons.TH +import Data.Kind (Type) +import Prelude.Singletons + +$(singletons [d| + data Foo1 = Foo1 deriving (Bounded) + data Foo2 = A | B | C | D | E deriving (Bounded) + data Foo3 a = Foo3 a deriving (Bounded) + data Foo4 (a :: Type) (b :: Type) = Foo41 | Foo42 deriving Bounded + + data Pair = Pair Bool Bool + deriving Bounded + + |]) + +foo1a :: Proxy (MinBound :: Foo1) +foo1a = Proxy + +foo1b :: Proxy 'Foo1 +foo1b = foo1a + +foo1c :: Proxy (MaxBound :: Foo1) +foo1c = Proxy + +foo1d :: Proxy 'Foo1 +foo1d = foo1c + +foo2a :: Proxy (MinBound :: Foo2) +foo2a = Proxy + +foo2b :: Proxy 'A +foo2b = foo2a + +foo2c :: Proxy (MaxBound :: Foo2) +foo2c = Proxy + +foo2d :: Proxy 'E +foo2d = foo2c + +foo3a :: Proxy (MinBound :: Foo3 Bool) +foo3a = Proxy + +foo3b :: Proxy ('Foo3 False) +foo3b = foo3a + +foo3c :: Proxy (MaxBound :: Foo3 Bool) +foo3c = Proxy + +foo3d :: Proxy ('Foo3 True) +foo3d = foo3c
tests/compile-and-dump/Singletons/BoxUnBox.golden view
@@ -1,55 +1,56 @@-Singletons/BoxUnBox.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| unBox :: Box a -> a- unBox (FBox a) = a- - data Box a = FBox a |]- ======>- data Box a = FBox a- unBox :: Box a -> a- unBox (FBox a) = a- type FBoxSym0 :: forall a. (~>) a (Box a)- data FBoxSym0 :: (~>) a (Box a)- where- FBoxSym0KindInference :: SameKind (Apply FBoxSym0 arg) (FBoxSym1 arg) =>- FBoxSym0 a0123456789876543210- type instance Apply FBoxSym0 a0123456789876543210 = FBox a0123456789876543210- instance SuppressUnusedWarnings FBoxSym0 where- suppressUnusedWarnings = snd (((,) FBoxSym0KindInference) ())- type FBoxSym1 :: forall a. a -> Box a- type family FBoxSym1 (a0123456789876543210 :: a) :: Box a where- FBoxSym1 a0123456789876543210 = FBox a0123456789876543210- type UnBoxSym0 :: (~>) (Box a) a- data UnBoxSym0 :: (~>) (Box a) a- where- UnBoxSym0KindInference :: SameKind (Apply UnBoxSym0 arg) (UnBoxSym1 arg) =>- UnBoxSym0 a0123456789876543210- type instance Apply UnBoxSym0 a0123456789876543210 = UnBox a0123456789876543210- instance SuppressUnusedWarnings UnBoxSym0 where- suppressUnusedWarnings = snd (((,) UnBoxSym0KindInference) ())- type UnBoxSym1 :: Box a -> a- type family UnBoxSym1 (a0123456789876543210 :: Box a) :: a where- UnBoxSym1 a0123456789876543210 = UnBox a0123456789876543210- type UnBox :: Box a -> a- type family UnBox (a :: Box a) :: a where- UnBox (FBox a) = a- sUnBox ::- forall a (t :: Box a). Sing t -> Sing (Apply UnBoxSym0 t :: a)- sUnBox (SFBox (sA :: Sing a)) = sA- instance SingI (UnBoxSym0 :: (~>) (Box a) a) where- sing = (singFun1 @UnBoxSym0) sUnBox- data SBox :: forall a. Box a -> Type- where- SFBox :: forall a (n :: a). (Sing n) -> SBox (FBox n :: Box a)- type instance Sing @(Box a) = SBox- instance SingKind a => SingKind (Box a) where- type Demote (Box a) = Box (Demote a)- fromSing (SFBox b) = FBox (fromSing b)- toSing (FBox (b :: Demote a))- = case toSing b :: SomeSing a of SomeSing c -> SomeSing (SFBox c)- instance SingI n => SingI (FBox (n :: a)) where- sing = SFBox sing- instance SingI1 FBox where- liftSing = SFBox- instance SingI (FBoxSym0 :: (~>) a (Box a)) where- sing = (singFun1 @FBoxSym0) SFBox+Singletons/BoxUnBox.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| unBox :: Box a -> a + unBox (FBox a) = a + + data Box a = FBox a |] + ======> + data Box a = FBox a + unBox :: Box a -> a + unBox (FBox a) = a + type FBoxSym0 :: forall a. (~>) a (Box a) + data FBoxSym0 :: (~>) a (Box a) + where + FBoxSym0KindInference :: SameKind (Apply FBoxSym0 arg) (FBoxSym1 arg) => + FBoxSym0 a0123456789876543210 + type instance Apply FBoxSym0 a0123456789876543210 = FBox a0123456789876543210 + instance SuppressUnusedWarnings FBoxSym0 where + suppressUnusedWarnings = snd ((,) FBoxSym0KindInference ()) + type FBoxSym1 :: forall a. a -> Box a + type family FBoxSym1 (a0123456789876543210 :: a) :: Box a where + FBoxSym1 a0123456789876543210 = FBox a0123456789876543210 + type UnBoxSym0 :: (~>) (Box a) a + data UnBoxSym0 :: (~>) (Box a) a + where + UnBoxSym0KindInference :: SameKind (Apply UnBoxSym0 arg) (UnBoxSym1 arg) => + UnBoxSym0 a0123456789876543210 + type instance Apply UnBoxSym0 a0123456789876543210 = UnBox a0123456789876543210 + instance SuppressUnusedWarnings UnBoxSym0 where + suppressUnusedWarnings = snd ((,) UnBoxSym0KindInference ()) + type UnBoxSym1 :: Box a -> a + type family UnBoxSym1 (a0123456789876543210 :: Box a) :: a where + UnBoxSym1 a0123456789876543210 = UnBox a0123456789876543210 + type UnBox :: Box a -> a + type family UnBox (a :: Box a) :: a where + UnBox (FBox a) = a + sUnBox :: + (forall (t :: Box a). + Sing t -> Sing (Apply UnBoxSym0 t :: a) :: Type) + sUnBox (SFBox (sA :: Sing a)) = sA + instance SingI (UnBoxSym0 :: (~>) (Box a) a) where + sing = singFun1 @UnBoxSym0 sUnBox + data SBox :: forall a. Box a -> Type + where + SFBox :: forall a (n :: a). (Sing n) -> SBox (FBox n :: Box a) + type instance Sing @(Box a) = SBox + instance SingKind a => SingKind (Box a) where + type Demote (Box a) = Box (Demote a) + fromSing (SFBox b) = FBox (fromSing b) + toSing (FBox (b :: Demote a)) + = case toSing b :: SomeSing a of SomeSing c -> SomeSing (SFBox c) + instance SingI n => SingI (FBox (n :: a)) where + sing = SFBox sing + instance SingI1 FBox where + liftSing = SFBox + instance SingI (FBoxSym0 :: (~>) a (Box a)) where + sing = singFun1 @FBoxSym0 SFBox
tests/compile-and-dump/Singletons/BoxUnBox.hs view
@@ -1,9 +1,9 @@-module Singletons.BoxUnBox where--import Data.Singletons.TH--$(singletons [d|- data Box a = FBox a- unBox :: Box a -> a- unBox (FBox a) = a- |])+module Singletons.BoxUnBox where + +import Data.Singletons.TH + +$(singletons [d| + data Box a = FBox a + unBox :: Box a -> a + unBox (FBox a) = a + |])
tests/compile-and-dump/Singletons/CaseExpressions.golden view
@@ -1,320 +1,325 @@-Singletons/CaseExpressions.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| foo1 :: a -> Maybe a -> a- foo1 d x- = case x of- Just y -> y- Nothing -> d- foo2 :: a -> Maybe a -> a- foo2 d _ = case (Just d) of Just y -> y- foo3 :: a -> b -> a- foo3 a b = case (a, b) of (p, _) -> p- foo4 :: forall a. a -> a- foo4 x- = case x of- y -> let- z :: a- z = y- in z- foo5 :: a -> a- foo5 x = case x of y -> (\ _ -> x) y |]- ======>- foo1 :: a -> Maybe a -> a- foo1 d x- = case x of- Just y -> y- Nothing -> d- foo2 :: a -> Maybe a -> a- foo2 d _ = case Just d of Just y -> y- foo3 :: a -> b -> a- foo3 a b = case (a, b) of (p, _) -> p- foo4 :: forall a. a -> a- foo4 x- = case x of- y -> let- z :: a- z = y- in z- foo5 :: a -> a- foo5 x = case x of y -> (\ _ -> x) y- type family Case_0123456789876543210 arg_0123456789876543210 y x t where- Case_0123456789876543210 arg_0123456789876543210 y x _ = x- type family Lambda_0123456789876543210 y x arg_0123456789876543210 where- Lambda_0123456789876543210 y x arg_0123456789876543210 = Case_0123456789876543210 arg_0123456789876543210 y x arg_0123456789876543210- data Lambda_0123456789876543210Sym0 y0123456789876543210- where- Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) =>- Lambda_0123456789876543210Sym0 y0123456789876543210- type instance Apply Lambda_0123456789876543210Sym0 y0123456789876543210 = Lambda_0123456789876543210Sym1 y0123456789876543210- instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym0KindInference) ())- data Lambda_0123456789876543210Sym1 y0123456789876543210 x0123456789876543210- where- Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 y0123456789876543210) arg) (Lambda_0123456789876543210Sym2 y0123456789876543210 arg) =>- Lambda_0123456789876543210Sym1 y0123456789876543210 x0123456789876543210- type instance Apply (Lambda_0123456789876543210Sym1 y0123456789876543210) x0123456789876543210 = Lambda_0123456789876543210Sym2 y0123456789876543210 x0123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 y0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym1KindInference) ())- data Lambda_0123456789876543210Sym2 y0123456789876543210 x0123456789876543210 arg_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 y0123456789876543210 x0123456789876543210) arg) (Lambda_0123456789876543210Sym3 y0123456789876543210 x0123456789876543210 arg) =>- Lambda_0123456789876543210Sym2 y0123456789876543210 x0123456789876543210 arg_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym2 y0123456789876543210 x0123456789876543210) arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210 y0123456789876543210 x0123456789876543210 arg_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 y0123456789876543210 x0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym2KindInference) ())- type family Lambda_0123456789876543210Sym3 y0123456789876543210 x0123456789876543210 arg_01234567898765432100123456789876543210 where- Lambda_0123456789876543210Sym3 y0123456789876543210 x0123456789876543210 arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210 y0123456789876543210 x0123456789876543210 arg_01234567898765432100123456789876543210- type family Case_0123456789876543210 x t where- Case_0123456789876543210 x y = Apply (Apply (Apply Lambda_0123456789876543210Sym0 y) x) y- data Let0123456789876543210ZSym0 y0123456789876543210- where- Let0123456789876543210ZSym0KindInference :: SameKind (Apply Let0123456789876543210ZSym0 arg) (Let0123456789876543210ZSym1 arg) =>- Let0123456789876543210ZSym0 y0123456789876543210- type instance Apply Let0123456789876543210ZSym0 y0123456789876543210 = Let0123456789876543210ZSym1 y0123456789876543210- instance SuppressUnusedWarnings Let0123456789876543210ZSym0 where- suppressUnusedWarnings- = snd (((,) Let0123456789876543210ZSym0KindInference) ())- data Let0123456789876543210ZSym1 y0123456789876543210 x0123456789876543210- where- Let0123456789876543210ZSym1KindInference :: SameKind (Apply (Let0123456789876543210ZSym1 y0123456789876543210) arg) (Let0123456789876543210ZSym2 y0123456789876543210 arg) =>- Let0123456789876543210ZSym1 y0123456789876543210 x0123456789876543210- type instance Apply (Let0123456789876543210ZSym1 y0123456789876543210) x0123456789876543210 = Let0123456789876543210Z y0123456789876543210 x0123456789876543210- instance SuppressUnusedWarnings (Let0123456789876543210ZSym1 y0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Let0123456789876543210ZSym1KindInference) ())- type family Let0123456789876543210ZSym2 y0123456789876543210 x0123456789876543210 :: a0123456789876543210 where- Let0123456789876543210ZSym2 y0123456789876543210 x0123456789876543210 = Let0123456789876543210Z y0123456789876543210 x0123456789876543210- type family Let0123456789876543210Z y x :: a where- Let0123456789876543210Z y x = y- type family Case_0123456789876543210 x t where- Case_0123456789876543210 x y = Let0123456789876543210ZSym2 y x- data Let0123456789876543210Scrutinee_0123456789876543210Sym0 a0123456789876543210- where- Let0123456789876543210Scrutinee_0123456789876543210Sym0KindInference :: SameKind (Apply Let0123456789876543210Scrutinee_0123456789876543210Sym0 arg) (Let0123456789876543210Scrutinee_0123456789876543210Sym1 arg) =>- Let0123456789876543210Scrutinee_0123456789876543210Sym0 a0123456789876543210- type instance Apply Let0123456789876543210Scrutinee_0123456789876543210Sym0 a0123456789876543210 = Let0123456789876543210Scrutinee_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings Let0123456789876543210Scrutinee_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd- (((,)- Let0123456789876543210Scrutinee_0123456789876543210Sym0KindInference)- ())- data Let0123456789876543210Scrutinee_0123456789876543210Sym1 a0123456789876543210 b0123456789876543210- where- Let0123456789876543210Scrutinee_0123456789876543210Sym1KindInference :: SameKind (Apply (Let0123456789876543210Scrutinee_0123456789876543210Sym1 a0123456789876543210) arg) (Let0123456789876543210Scrutinee_0123456789876543210Sym2 a0123456789876543210 arg) =>- Let0123456789876543210Scrutinee_0123456789876543210Sym1 a0123456789876543210 b0123456789876543210- type instance Apply (Let0123456789876543210Scrutinee_0123456789876543210Sym1 a0123456789876543210) b0123456789876543210 = Let0123456789876543210Scrutinee_0123456789876543210 a0123456789876543210 b0123456789876543210- instance SuppressUnusedWarnings (Let0123456789876543210Scrutinee_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd- (((,)- Let0123456789876543210Scrutinee_0123456789876543210Sym1KindInference)- ())- type family Let0123456789876543210Scrutinee_0123456789876543210Sym2 a0123456789876543210 b0123456789876543210 where- Let0123456789876543210Scrutinee_0123456789876543210Sym2 a0123456789876543210 b0123456789876543210 = Let0123456789876543210Scrutinee_0123456789876543210 a0123456789876543210 b0123456789876543210- type family Let0123456789876543210Scrutinee_0123456789876543210 a b where- Let0123456789876543210Scrutinee_0123456789876543210 a b = Apply (Apply Tuple2Sym0 a) b- type family Case_0123456789876543210 a b t where- Case_0123456789876543210 a b '(p, _) = p- data Let0123456789876543210Scrutinee_0123456789876543210Sym0 d0123456789876543210- where- Let0123456789876543210Scrutinee_0123456789876543210Sym0KindInference :: SameKind (Apply Let0123456789876543210Scrutinee_0123456789876543210Sym0 arg) (Let0123456789876543210Scrutinee_0123456789876543210Sym1 arg) =>- Let0123456789876543210Scrutinee_0123456789876543210Sym0 d0123456789876543210- type instance Apply Let0123456789876543210Scrutinee_0123456789876543210Sym0 d0123456789876543210 = Let0123456789876543210Scrutinee_0123456789876543210 d0123456789876543210- instance SuppressUnusedWarnings Let0123456789876543210Scrutinee_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd- (((,)- Let0123456789876543210Scrutinee_0123456789876543210Sym0KindInference)- ())- type family Let0123456789876543210Scrutinee_0123456789876543210Sym1 d0123456789876543210 where- Let0123456789876543210Scrutinee_0123456789876543210Sym1 d0123456789876543210 = Let0123456789876543210Scrutinee_0123456789876543210 d0123456789876543210- type family Let0123456789876543210Scrutinee_0123456789876543210 d where- Let0123456789876543210Scrutinee_0123456789876543210 d = Apply JustSym0 d- type family Case_0123456789876543210 d t where- Case_0123456789876543210 d ('Just y) = y- type family Case_0123456789876543210 d x t where- Case_0123456789876543210 d x ('Just y) = y- Case_0123456789876543210 d x 'Nothing = d- type Foo5Sym0 :: (~>) a a- data Foo5Sym0 :: (~>) a a- where- Foo5Sym0KindInference :: SameKind (Apply Foo5Sym0 arg) (Foo5Sym1 arg) =>- Foo5Sym0 a0123456789876543210- type instance Apply Foo5Sym0 a0123456789876543210 = Foo5 a0123456789876543210- instance SuppressUnusedWarnings Foo5Sym0 where- suppressUnusedWarnings = snd (((,) Foo5Sym0KindInference) ())- type Foo5Sym1 :: a -> a- type family Foo5Sym1 (a0123456789876543210 :: a) :: a where- Foo5Sym1 a0123456789876543210 = Foo5 a0123456789876543210- type Foo4Sym0 :: forall a. (~>) a a- data Foo4Sym0 :: (~>) a a- where- Foo4Sym0KindInference :: SameKind (Apply Foo4Sym0 arg) (Foo4Sym1 arg) =>- Foo4Sym0 a0123456789876543210- type instance Apply Foo4Sym0 a0123456789876543210 = Foo4 a0123456789876543210- instance SuppressUnusedWarnings Foo4Sym0 where- suppressUnusedWarnings = snd (((,) Foo4Sym0KindInference) ())- type Foo4Sym1 :: forall a. a -> a- type family Foo4Sym1 (a0123456789876543210 :: a) :: a where- Foo4Sym1 a0123456789876543210 = Foo4 a0123456789876543210- type Foo3Sym0 :: (~>) a ((~>) b a)- data Foo3Sym0 :: (~>) a ((~>) b a)- where- Foo3Sym0KindInference :: SameKind (Apply Foo3Sym0 arg) (Foo3Sym1 arg) =>- Foo3Sym0 a0123456789876543210- type instance Apply Foo3Sym0 a0123456789876543210 = Foo3Sym1 a0123456789876543210- instance SuppressUnusedWarnings Foo3Sym0 where- suppressUnusedWarnings = snd (((,) Foo3Sym0KindInference) ())- type Foo3Sym1 :: a -> (~>) b a- data Foo3Sym1 (a0123456789876543210 :: a) :: (~>) b a- where- Foo3Sym1KindInference :: SameKind (Apply (Foo3Sym1 a0123456789876543210) arg) (Foo3Sym2 a0123456789876543210 arg) =>- Foo3Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (Foo3Sym1 a0123456789876543210) a0123456789876543210 = Foo3 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Foo3Sym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) Foo3Sym1KindInference) ())- type Foo3Sym2 :: a -> b -> a- type family Foo3Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: a where- Foo3Sym2 a0123456789876543210 a0123456789876543210 = Foo3 a0123456789876543210 a0123456789876543210- type Foo2Sym0 :: (~>) a ((~>) (Maybe a) a)- data Foo2Sym0 :: (~>) a ((~>) (Maybe a) a)- where- Foo2Sym0KindInference :: SameKind (Apply Foo2Sym0 arg) (Foo2Sym1 arg) =>- Foo2Sym0 a0123456789876543210- type instance Apply Foo2Sym0 a0123456789876543210 = Foo2Sym1 a0123456789876543210- instance SuppressUnusedWarnings Foo2Sym0 where- suppressUnusedWarnings = snd (((,) Foo2Sym0KindInference) ())- type Foo2Sym1 :: a -> (~>) (Maybe a) a- data Foo2Sym1 (a0123456789876543210 :: a) :: (~>) (Maybe a) a- where- Foo2Sym1KindInference :: SameKind (Apply (Foo2Sym1 a0123456789876543210) arg) (Foo2Sym2 a0123456789876543210 arg) =>- Foo2Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (Foo2Sym1 a0123456789876543210) a0123456789876543210 = Foo2 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Foo2Sym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) Foo2Sym1KindInference) ())- type Foo2Sym2 :: a -> Maybe a -> a- type family Foo2Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: Maybe a) :: a where- Foo2Sym2 a0123456789876543210 a0123456789876543210 = Foo2 a0123456789876543210 a0123456789876543210- type Foo1Sym0 :: (~>) a ((~>) (Maybe a) a)- data Foo1Sym0 :: (~>) a ((~>) (Maybe a) a)- where- Foo1Sym0KindInference :: SameKind (Apply Foo1Sym0 arg) (Foo1Sym1 arg) =>- Foo1Sym0 a0123456789876543210- type instance Apply Foo1Sym0 a0123456789876543210 = Foo1Sym1 a0123456789876543210- instance SuppressUnusedWarnings Foo1Sym0 where- suppressUnusedWarnings = snd (((,) Foo1Sym0KindInference) ())- type Foo1Sym1 :: a -> (~>) (Maybe a) a- data Foo1Sym1 (a0123456789876543210 :: a) :: (~>) (Maybe a) a- where- Foo1Sym1KindInference :: SameKind (Apply (Foo1Sym1 a0123456789876543210) arg) (Foo1Sym2 a0123456789876543210 arg) =>- Foo1Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (Foo1Sym1 a0123456789876543210) a0123456789876543210 = Foo1 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Foo1Sym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) Foo1Sym1KindInference) ())- type Foo1Sym2 :: a -> Maybe a -> a- type family Foo1Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: Maybe a) :: a where- Foo1Sym2 a0123456789876543210 a0123456789876543210 = Foo1 a0123456789876543210 a0123456789876543210- type Foo5 :: a -> a- type family Foo5 (a :: a) :: a where- Foo5 x = Case_0123456789876543210 x x- type Foo4 :: forall a. a -> a- type family Foo4 (a :: a) :: a where- Foo4 x = Case_0123456789876543210 x x- type Foo3 :: a -> b -> a- type family Foo3 (a :: a) (a :: b) :: a where- Foo3 a b = Case_0123456789876543210 a b (Let0123456789876543210Scrutinee_0123456789876543210Sym2 a b)- type Foo2 :: a -> Maybe a -> a- type family Foo2 (a :: a) (a :: Maybe a) :: a where- Foo2 d _ = Case_0123456789876543210 d (Let0123456789876543210Scrutinee_0123456789876543210Sym1 d)- type Foo1 :: a -> Maybe a -> a- type family Foo1 (a :: a) (a :: Maybe a) :: a where- Foo1 d x = Case_0123456789876543210 d x x- sFoo5 :: forall a (t :: a). Sing t -> Sing (Apply Foo5Sym0 t :: a)- sFoo4 :: forall a (t :: a). Sing t -> Sing (Apply Foo4Sym0 t :: a)- sFoo3 ::- forall a b (t :: a) (t :: b). Sing t- -> Sing t -> Sing (Apply (Apply Foo3Sym0 t) t :: a)- sFoo2 ::- forall a (t :: a) (t :: Maybe a). Sing t- -> Sing t -> Sing (Apply (Apply Foo2Sym0 t) t :: a)- sFoo1 ::- forall a (t :: a) (t :: Maybe a). Sing t- -> Sing t -> Sing (Apply (Apply Foo1Sym0 t) t :: a)- sFoo5 (sX :: Sing x)- = (id @(Sing (Case_0123456789876543210 x x :: a)))- (case sX of- (sY :: Sing y)- -> (applySing- ((singFun1 @(Apply (Apply Lambda_0123456789876543210Sym0 y) x))- (\ sArg_0123456789876543210- -> case sArg_0123456789876543210 of- (_ :: Sing arg_0123456789876543210)- -> (id- @(Sing (Case_0123456789876543210 arg_0123456789876543210 y x arg_0123456789876543210)))- (case sArg_0123456789876543210 of _ -> sX))))- sY)- sFoo4 (sX :: Sing x)- = (id @(Sing (Case_0123456789876543210 x x :: a)))- (case sX of- (sY :: Sing y)- -> let- sZ :: Sing (Let0123456789876543210ZSym2 y x :: a)- sZ = sY- in sZ)- sFoo3 (sA :: Sing a) (sB :: Sing b)- = let- sScrutinee_0123456789876543210 ::- Sing @_ (Let0123456789876543210Scrutinee_0123456789876543210Sym2 a b)- sScrutinee_0123456789876543210- = (applySing ((applySing ((singFun2 @Tuple2Sym0) STuple2)) sA)) sB- in- (id- @(Sing (Case_0123456789876543210 a b (Let0123456789876543210Scrutinee_0123456789876543210Sym2 a b) :: a)))- (case sScrutinee_0123456789876543210 of- STuple2 (sP :: Sing p) _ -> sP)- sFoo2 (sD :: Sing d) _- = let- sScrutinee_0123456789876543210 ::- Sing @_ (Let0123456789876543210Scrutinee_0123456789876543210Sym1 d)- sScrutinee_0123456789876543210- = (applySing ((singFun1 @JustSym0) SJust)) sD- in- (id- @(Sing (Case_0123456789876543210 d (Let0123456789876543210Scrutinee_0123456789876543210Sym1 d) :: a)))- (case sScrutinee_0123456789876543210 of SJust (sY :: Sing y) -> sY)- sFoo1 (sD :: Sing d) (sX :: Sing x)- = (id @(Sing (Case_0123456789876543210 d x x :: a)))- (case sX of- SJust (sY :: Sing y) -> sY- SNothing -> sD)- instance SingI (Foo5Sym0 :: (~>) a a) where- sing = (singFun1 @Foo5Sym0) sFoo5- instance SingI (Foo4Sym0 :: (~>) a a) where- sing = (singFun1 @Foo4Sym0) sFoo4- instance SingI (Foo3Sym0 :: (~>) a ((~>) b a)) where- sing = (singFun2 @Foo3Sym0) sFoo3- instance SingI d => SingI (Foo3Sym1 (d :: a) :: (~>) b a) where- sing = (singFun1 @(Foo3Sym1 (d :: a))) (sFoo3 (sing @d))- instance SingI1 (Foo3Sym1 :: a -> (~>) b a) where- liftSing (s :: Sing (d :: a))- = (singFun1 @(Foo3Sym1 (d :: a))) (sFoo3 s)- instance SingI (Foo2Sym0 :: (~>) a ((~>) (Maybe a) a)) where- sing = (singFun2 @Foo2Sym0) sFoo2- instance SingI d =>- SingI (Foo2Sym1 (d :: a) :: (~>) (Maybe a) a) where- sing = (singFun1 @(Foo2Sym1 (d :: a))) (sFoo2 (sing @d))- instance SingI1 (Foo2Sym1 :: a -> (~>) (Maybe a) a) where- liftSing (s :: Sing (d :: a))- = (singFun1 @(Foo2Sym1 (d :: a))) (sFoo2 s)- instance SingI (Foo1Sym0 :: (~>) a ((~>) (Maybe a) a)) where- sing = (singFun2 @Foo1Sym0) sFoo1- instance SingI d =>- SingI (Foo1Sym1 (d :: a) :: (~>) (Maybe a) a) where- sing = (singFun1 @(Foo1Sym1 (d :: a))) (sFoo1 (sing @d))- instance SingI1 (Foo1Sym1 :: a -> (~>) (Maybe a) a) where- liftSing (s :: Sing (d :: a))- = (singFun1 @(Foo1Sym1 (d :: a))) (sFoo1 s)+Singletons/CaseExpressions.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| foo1 :: a -> Maybe a -> a + foo1 d x + = case x of + Just y -> y + Nothing -> d + foo2 :: a -> Maybe a -> a + foo2 d _ = case (Just d) of Just y -> y + foo3 :: a -> b -> a + foo3 a b = case (a, b) of (p, _) -> p + foo4 :: forall a. a -> a + foo4 x + = case x of + y -> let + z :: a + z = y + in z + foo5 :: a -> a + foo5 x = case x of y -> (\ _ -> x) y |] + ======> + foo1 :: a -> Maybe a -> a + foo1 d x + = case x of + Just y -> y + Nothing -> d + foo2 :: a -> Maybe a -> a + foo2 d _ = case Just d of Just y -> y + foo3 :: a -> b -> a + foo3 a b = case (a, b) of (p, _) -> p + foo4 :: forall a. a -> a + foo4 x + = case x of + y -> let + z :: a + z = y + in z + foo5 :: a -> a + foo5 x = case x of y -> (\ _ -> x) y + type family Case_0123456789876543210 arg_0123456789876543210 y x t where + Case_0123456789876543210 arg_0123456789876543210 y x _ = x + type family Lambda_0123456789876543210 y x arg_0123456789876543210 where + Lambda_0123456789876543210 y x arg_0123456789876543210 = Case_0123456789876543210 arg_0123456789876543210 y x arg_0123456789876543210 + data Lambda_0123456789876543210Sym0 y0123456789876543210 + where + Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) => + Lambda_0123456789876543210Sym0 y0123456789876543210 + type instance Apply Lambda_0123456789876543210Sym0 y0123456789876543210 = Lambda_0123456789876543210Sym1 y0123456789876543210 + instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym0KindInference ()) + data Lambda_0123456789876543210Sym1 y0123456789876543210 x0123456789876543210 + where + Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 y0123456789876543210) arg) (Lambda_0123456789876543210Sym2 y0123456789876543210 arg) => + Lambda_0123456789876543210Sym1 y0123456789876543210 x0123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym1 y0123456789876543210) x0123456789876543210 = Lambda_0123456789876543210Sym2 y0123456789876543210 x0123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 y0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym1KindInference ()) + data Lambda_0123456789876543210Sym2 y0123456789876543210 x0123456789876543210 arg_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 y0123456789876543210 x0123456789876543210) arg) (Lambda_0123456789876543210Sym3 y0123456789876543210 x0123456789876543210 arg) => + Lambda_0123456789876543210Sym2 y0123456789876543210 x0123456789876543210 arg_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym2 y0123456789876543210 x0123456789876543210) arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210 y0123456789876543210 x0123456789876543210 arg_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 y0123456789876543210 x0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym2KindInference ()) + type family Lambda_0123456789876543210Sym3 y0123456789876543210 x0123456789876543210 arg_01234567898765432100123456789876543210 where + Lambda_0123456789876543210Sym3 y0123456789876543210 x0123456789876543210 arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210 y0123456789876543210 x0123456789876543210 arg_01234567898765432100123456789876543210 + type family Case_0123456789876543210 x t where + Case_0123456789876543210 x y = Apply (Apply (Apply Lambda_0123456789876543210Sym0 y) x) y + data Let0123456789876543210ZSym0 y0123456789876543210 + where + Let0123456789876543210ZSym0KindInference :: SameKind (Apply Let0123456789876543210ZSym0 arg) (Let0123456789876543210ZSym1 arg) => + Let0123456789876543210ZSym0 y0123456789876543210 + type instance Apply Let0123456789876543210ZSym0 y0123456789876543210 = Let0123456789876543210ZSym1 y0123456789876543210 + instance SuppressUnusedWarnings Let0123456789876543210ZSym0 where + suppressUnusedWarnings + = snd ((,) Let0123456789876543210ZSym0KindInference ()) + data Let0123456789876543210ZSym1 y0123456789876543210 x0123456789876543210 + where + Let0123456789876543210ZSym1KindInference :: SameKind (Apply (Let0123456789876543210ZSym1 y0123456789876543210) arg) (Let0123456789876543210ZSym2 y0123456789876543210 arg) => + Let0123456789876543210ZSym1 y0123456789876543210 x0123456789876543210 + type instance Apply (Let0123456789876543210ZSym1 y0123456789876543210) x0123456789876543210 = Let0123456789876543210Z y0123456789876543210 x0123456789876543210 + instance SuppressUnusedWarnings (Let0123456789876543210ZSym1 y0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Let0123456789876543210ZSym1KindInference ()) + type family Let0123456789876543210ZSym2 y0123456789876543210 x0123456789876543210 :: a0123456789876543210 where + Let0123456789876543210ZSym2 y0123456789876543210 x0123456789876543210 = Let0123456789876543210Z y0123456789876543210 x0123456789876543210 + type family Let0123456789876543210Z y x :: a where + Let0123456789876543210Z y x = y + type family Case_0123456789876543210 x t where + Case_0123456789876543210 x y = Let0123456789876543210ZSym2 y x + data Let0123456789876543210Scrutinee_0123456789876543210Sym0 a0123456789876543210 + where + Let0123456789876543210Scrutinee_0123456789876543210Sym0KindInference :: SameKind (Apply Let0123456789876543210Scrutinee_0123456789876543210Sym0 arg) (Let0123456789876543210Scrutinee_0123456789876543210Sym1 arg) => + Let0123456789876543210Scrutinee_0123456789876543210Sym0 a0123456789876543210 + type instance Apply Let0123456789876543210Scrutinee_0123456789876543210Sym0 a0123456789876543210 = Let0123456789876543210Scrutinee_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Let0123456789876543210Scrutinee_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd + ((,) + Let0123456789876543210Scrutinee_0123456789876543210Sym0KindInference + ()) + data Let0123456789876543210Scrutinee_0123456789876543210Sym1 a0123456789876543210 b0123456789876543210 + where + Let0123456789876543210Scrutinee_0123456789876543210Sym1KindInference :: SameKind (Apply (Let0123456789876543210Scrutinee_0123456789876543210Sym1 a0123456789876543210) arg) (Let0123456789876543210Scrutinee_0123456789876543210Sym2 a0123456789876543210 arg) => + Let0123456789876543210Scrutinee_0123456789876543210Sym1 a0123456789876543210 b0123456789876543210 + type instance Apply (Let0123456789876543210Scrutinee_0123456789876543210Sym1 a0123456789876543210) b0123456789876543210 = Let0123456789876543210Scrutinee_0123456789876543210 a0123456789876543210 b0123456789876543210 + instance SuppressUnusedWarnings (Let0123456789876543210Scrutinee_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd + ((,) + Let0123456789876543210Scrutinee_0123456789876543210Sym1KindInference + ()) + type family Let0123456789876543210Scrutinee_0123456789876543210Sym2 a0123456789876543210 b0123456789876543210 where + Let0123456789876543210Scrutinee_0123456789876543210Sym2 a0123456789876543210 b0123456789876543210 = Let0123456789876543210Scrutinee_0123456789876543210 a0123456789876543210 b0123456789876543210 + type family Let0123456789876543210Scrutinee_0123456789876543210 a b where + Let0123456789876543210Scrutinee_0123456789876543210 a b = Apply (Apply Tuple2Sym0 a) b + type family Case_0123456789876543210 a b t where + Case_0123456789876543210 a b '(p, _) = p + data Let0123456789876543210Scrutinee_0123456789876543210Sym0 d0123456789876543210 + where + Let0123456789876543210Scrutinee_0123456789876543210Sym0KindInference :: SameKind (Apply Let0123456789876543210Scrutinee_0123456789876543210Sym0 arg) (Let0123456789876543210Scrutinee_0123456789876543210Sym1 arg) => + Let0123456789876543210Scrutinee_0123456789876543210Sym0 d0123456789876543210 + type instance Apply Let0123456789876543210Scrutinee_0123456789876543210Sym0 d0123456789876543210 = Let0123456789876543210Scrutinee_0123456789876543210 d0123456789876543210 + instance SuppressUnusedWarnings Let0123456789876543210Scrutinee_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd + ((,) + Let0123456789876543210Scrutinee_0123456789876543210Sym0KindInference + ()) + type family Let0123456789876543210Scrutinee_0123456789876543210Sym1 d0123456789876543210 where + Let0123456789876543210Scrutinee_0123456789876543210Sym1 d0123456789876543210 = Let0123456789876543210Scrutinee_0123456789876543210 d0123456789876543210 + type family Let0123456789876543210Scrutinee_0123456789876543210 d where + Let0123456789876543210Scrutinee_0123456789876543210 d = Apply JustSym0 d + type family Case_0123456789876543210 d t where + Case_0123456789876543210 d ('Just y) = y + type family Case_0123456789876543210 d x t where + Case_0123456789876543210 d x ('Just y) = y + Case_0123456789876543210 d x 'Nothing = d + type Foo5Sym0 :: (~>) a a + data Foo5Sym0 :: (~>) a a + where + Foo5Sym0KindInference :: SameKind (Apply Foo5Sym0 arg) (Foo5Sym1 arg) => + Foo5Sym0 a0123456789876543210 + type instance Apply Foo5Sym0 a0123456789876543210 = Foo5 a0123456789876543210 + instance SuppressUnusedWarnings Foo5Sym0 where + suppressUnusedWarnings = snd ((,) Foo5Sym0KindInference ()) + type Foo5Sym1 :: a -> a + type family Foo5Sym1 (a0123456789876543210 :: a) :: a where + Foo5Sym1 a0123456789876543210 = Foo5 a0123456789876543210 + type Foo4Sym0 :: forall a. (~>) a a + data Foo4Sym0 :: (~>) a a + where + Foo4Sym0KindInference :: SameKind (Apply Foo4Sym0 arg) (Foo4Sym1 arg) => + Foo4Sym0 a0123456789876543210 + type instance Apply Foo4Sym0 a0123456789876543210 = Foo4 a0123456789876543210 + instance SuppressUnusedWarnings Foo4Sym0 where + suppressUnusedWarnings = snd ((,) Foo4Sym0KindInference ()) + type Foo4Sym1 :: forall a. a -> a + type family Foo4Sym1 (a0123456789876543210 :: a) :: a where + Foo4Sym1 a0123456789876543210 = Foo4 a0123456789876543210 + type Foo3Sym0 :: (~>) a ((~>) b a) + data Foo3Sym0 :: (~>) a ((~>) b a) + where + Foo3Sym0KindInference :: SameKind (Apply Foo3Sym0 arg) (Foo3Sym1 arg) => + Foo3Sym0 a0123456789876543210 + type instance Apply Foo3Sym0 a0123456789876543210 = Foo3Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Foo3Sym0 where + suppressUnusedWarnings = snd ((,) Foo3Sym0KindInference ()) + type Foo3Sym1 :: a -> (~>) b a + data Foo3Sym1 (a0123456789876543210 :: a) :: (~>) b a + where + Foo3Sym1KindInference :: SameKind (Apply (Foo3Sym1 a0123456789876543210) arg) (Foo3Sym2 a0123456789876543210 arg) => + Foo3Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (Foo3Sym1 a0123456789876543210) a0123456789876543210 = Foo3 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Foo3Sym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) Foo3Sym1KindInference ()) + type Foo3Sym2 :: a -> b -> a + type family Foo3Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: a where + Foo3Sym2 a0123456789876543210 a0123456789876543210 = Foo3 a0123456789876543210 a0123456789876543210 + type Foo2Sym0 :: (~>) a ((~>) (Maybe a) a) + data Foo2Sym0 :: (~>) a ((~>) (Maybe a) a) + where + Foo2Sym0KindInference :: SameKind (Apply Foo2Sym0 arg) (Foo2Sym1 arg) => + Foo2Sym0 a0123456789876543210 + type instance Apply Foo2Sym0 a0123456789876543210 = Foo2Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Foo2Sym0 where + suppressUnusedWarnings = snd ((,) Foo2Sym0KindInference ()) + type Foo2Sym1 :: a -> (~>) (Maybe a) a + data Foo2Sym1 (a0123456789876543210 :: a) :: (~>) (Maybe a) a + where + Foo2Sym1KindInference :: SameKind (Apply (Foo2Sym1 a0123456789876543210) arg) (Foo2Sym2 a0123456789876543210 arg) => + Foo2Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (Foo2Sym1 a0123456789876543210) a0123456789876543210 = Foo2 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Foo2Sym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) Foo2Sym1KindInference ()) + type Foo2Sym2 :: a -> Maybe a -> a + type family Foo2Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: Maybe a) :: a where + Foo2Sym2 a0123456789876543210 a0123456789876543210 = Foo2 a0123456789876543210 a0123456789876543210 + type Foo1Sym0 :: (~>) a ((~>) (Maybe a) a) + data Foo1Sym0 :: (~>) a ((~>) (Maybe a) a) + where + Foo1Sym0KindInference :: SameKind (Apply Foo1Sym0 arg) (Foo1Sym1 arg) => + Foo1Sym0 a0123456789876543210 + type instance Apply Foo1Sym0 a0123456789876543210 = Foo1Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Foo1Sym0 where + suppressUnusedWarnings = snd ((,) Foo1Sym0KindInference ()) + type Foo1Sym1 :: a -> (~>) (Maybe a) a + data Foo1Sym1 (a0123456789876543210 :: a) :: (~>) (Maybe a) a + where + Foo1Sym1KindInference :: SameKind (Apply (Foo1Sym1 a0123456789876543210) arg) (Foo1Sym2 a0123456789876543210 arg) => + Foo1Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (Foo1Sym1 a0123456789876543210) a0123456789876543210 = Foo1 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Foo1Sym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) Foo1Sym1KindInference ()) + type Foo1Sym2 :: a -> Maybe a -> a + type family Foo1Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: Maybe a) :: a where + Foo1Sym2 a0123456789876543210 a0123456789876543210 = Foo1 a0123456789876543210 a0123456789876543210 + type Foo5 :: a -> a + type family Foo5 (a :: a) :: a where + Foo5 x = Case_0123456789876543210 x x + type Foo4 :: forall a. a -> a + type family Foo4 (a :: a) :: a where + Foo4 x = Case_0123456789876543210 x x + type Foo3 :: a -> b -> a + type family Foo3 (a :: a) (a :: b) :: a where + Foo3 a b = Case_0123456789876543210 a b (Let0123456789876543210Scrutinee_0123456789876543210Sym2 a b) + type Foo2 :: a -> Maybe a -> a + type family Foo2 (a :: a) (a :: Maybe a) :: a where + Foo2 d _ = Case_0123456789876543210 d (Let0123456789876543210Scrutinee_0123456789876543210Sym1 d) + type Foo1 :: a -> Maybe a -> a + type family Foo1 (a :: a) (a :: Maybe a) :: a where + Foo1 d x = Case_0123456789876543210 d x x + sFoo5 :: + (forall (t :: a). Sing t -> Sing (Apply Foo5Sym0 t :: a) :: Type) + sFoo4 :: forall a (t :: a). Sing t -> Sing (Apply Foo4Sym0 t :: a) + sFoo3 :: + (forall (t :: a) (t :: b). + Sing t -> Sing t -> Sing (Apply (Apply Foo3Sym0 t) t :: a) :: Type) + sFoo2 :: + (forall (t :: a) (t :: Maybe a). + Sing t -> Sing t -> Sing (Apply (Apply Foo2Sym0 t) t :: a) :: Type) + sFoo1 :: + (forall (t :: a) (t :: Maybe a). + Sing t -> Sing t -> Sing (Apply (Apply Foo1Sym0 t) t :: a) :: Type) + sFoo5 (sX :: Sing x) + = id + @(Sing (Case_0123456789876543210 x x)) + (case sX of + (sY :: Sing y) + -> applySing + (singFun1 + @(Apply (Apply Lambda_0123456789876543210Sym0 y) x) + (\ sArg_0123456789876543210 + -> case sArg_0123456789876543210 of + (_ :: Sing arg_0123456789876543210) + -> id + @(Sing (Case_0123456789876543210 arg_0123456789876543210 y x arg_0123456789876543210)) + (case sArg_0123456789876543210 of _ -> sX))) + sY) + sFoo4 (sX :: Sing x) + = id + @(Sing (Case_0123456789876543210 x x)) + (case sX of + (sY :: Sing y) + -> let + sZ :: (Sing (Let0123456789876543210ZSym2 y x :: a) :: Type) + sZ = sY + in sZ) + sFoo3 (sA :: Sing a) (sB :: Sing b) + = let + sScrutinee_0123456789876543210 :: + Sing @_ (Let0123456789876543210Scrutinee_0123456789876543210Sym2 a b) + sScrutinee_0123456789876543210 + = applySing (applySing (singFun2 @Tuple2Sym0 STuple2) sA) sB + in + id + @(Sing (Case_0123456789876543210 a b (Let0123456789876543210Scrutinee_0123456789876543210Sym2 a b))) + (case sScrutinee_0123456789876543210 of + STuple2 (sP :: Sing p) _ -> sP) + sFoo2 (sD :: Sing d) _ + = let + sScrutinee_0123456789876543210 :: + Sing @_ (Let0123456789876543210Scrutinee_0123456789876543210Sym1 d) + sScrutinee_0123456789876543210 + = applySing (singFun1 @JustSym0 SJust) sD + in + id + @(Sing (Case_0123456789876543210 d (Let0123456789876543210Scrutinee_0123456789876543210Sym1 d))) + (case sScrutinee_0123456789876543210 of SJust (sY :: Sing y) -> sY) + sFoo1 (sD :: Sing d) (sX :: Sing x) + = id + @(Sing (Case_0123456789876543210 d x x)) + (case sX of + SJust (sY :: Sing y) -> sY + SNothing -> sD) + instance SingI (Foo5Sym0 :: (~>) a a) where + sing = singFun1 @Foo5Sym0 sFoo5 + instance SingI (Foo4Sym0 :: (~>) a a) where + sing = singFun1 @Foo4Sym0 sFoo4 + instance SingI (Foo3Sym0 :: (~>) a ((~>) b a)) where + sing = singFun2 @Foo3Sym0 sFoo3 + instance SingI d => SingI (Foo3Sym1 (d :: a) :: (~>) b a) where + sing = singFun1 @(Foo3Sym1 (d :: a)) (sFoo3 (sing @d)) + instance SingI1 (Foo3Sym1 :: a -> (~>) b a) where + liftSing (s :: Sing (d :: a)) + = singFun1 @(Foo3Sym1 (d :: a)) (sFoo3 s) + instance SingI (Foo2Sym0 :: (~>) a ((~>) (Maybe a) a)) where + sing = singFun2 @Foo2Sym0 sFoo2 + instance SingI d => + SingI (Foo2Sym1 (d :: a) :: (~>) (Maybe a) a) where + sing = singFun1 @(Foo2Sym1 (d :: a)) (sFoo2 (sing @d)) + instance SingI1 (Foo2Sym1 :: a -> (~>) (Maybe a) a) where + liftSing (s :: Sing (d :: a)) + = singFun1 @(Foo2Sym1 (d :: a)) (sFoo2 s) + instance SingI (Foo1Sym0 :: (~>) a ((~>) (Maybe a) a)) where + sing = singFun2 @Foo1Sym0 sFoo1 + instance SingI d => + SingI (Foo1Sym1 (d :: a) :: (~>) (Maybe a) a) where + sing = singFun1 @(Foo1Sym1 (d :: a)) (sFoo1 (sing @d)) + instance SingI1 (Foo1Sym1 :: a -> (~>) (Maybe a) a) where + liftSing (s :: Sing (d :: a)) + = singFun1 @(Foo1Sym1 (d :: a)) (sFoo1 s)
tests/compile-and-dump/Singletons/CaseExpressions.hs view
@@ -1,64 +1,64 @@-{-# OPTIONS_GHC -Wno-incomplete-patterns #-}--module Singletons.CaseExpressions where--import Data.Maybe.Singletons-import Data.Singletons.Base.TH--$(singletons [d|- foo1 :: a -> Maybe a -> a- foo1 d x = case x of- Just y -> y- Nothing -> d-- foo2 :: a -> Maybe a -> a- foo2 d _ = case (Just d) of- Just y -> y--- Nothing -> d--- the above line causes an "inaccessible code" error. w00t.-- foo3 :: a -> b -> a- foo3 a b = case (a, b) of- (p, _) -> p--- foo4 :: forall a. a -> a- foo4 x = case x of- y -> let z :: a- z = y- in z-- foo5 :: a -> a- foo5 x = case x of- y -> (\_ -> x) y- |])--foo1a :: Proxy (Foo1 Int (Just Char))-foo1a = Proxy--foo1b :: Proxy Char-foo1b = foo1a--foo2a :: Proxy (Foo2 Char Nothing)-foo2a = Proxy--foo2b :: Proxy Char-foo2b = foo2a--foo3a :: Proxy (Foo3 Int Char)-foo3a = Proxy--foo3b :: Proxy Int-foo3b = foo3a--foo4a :: Proxy (Foo4 Int)-foo4a = Proxy--foo4b :: Proxy Int-foo4b = foo4a--foo5a :: Proxy (Foo5 Int)-foo5a = Proxy--foo5b :: Proxy Int-foo5b = foo5a+{-# OPTIONS_GHC -Wno-incomplete-patterns #-} + +module Singletons.CaseExpressions where + +import Data.Maybe.Singletons +import Data.Singletons.Base.TH + +$(singletons [d| + foo1 :: a -> Maybe a -> a + foo1 d x = case x of + Just y -> y + Nothing -> d + + foo2 :: a -> Maybe a -> a + foo2 d _ = case (Just d) of + Just y -> y +-- Nothing -> d +-- the above line causes an "inaccessible code" error. w00t. + + foo3 :: a -> b -> a + foo3 a b = case (a, b) of + (p, _) -> p + + + foo4 :: forall a. a -> a + foo4 x = case x of + y -> let z :: a + z = y + in z + + foo5 :: a -> a + foo5 x = case x of + y -> (\_ -> x) y + |]) + +foo1a :: Proxy (Foo1 Int (Just Char)) +foo1a = Proxy + +foo1b :: Proxy Char +foo1b = foo1a + +foo2a :: Proxy (Foo2 Char Nothing) +foo2a = Proxy + +foo2b :: Proxy Char +foo2b = foo2a + +foo3a :: Proxy (Foo3 Int Char) +foo3a = Proxy + +foo3b :: Proxy Int +foo3b = foo3a + +foo4a :: Proxy (Foo4 Int) +foo4a = Proxy + +foo4b :: Proxy Int +foo4b = foo4a + +foo5a :: Proxy (Foo5 Int) +foo5a = Proxy + +foo5b :: Proxy Int +foo5b = foo5a
tests/compile-and-dump/Singletons/Classes.golden view
@@ -1,607 +1,616 @@-Singletons/Classes.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| const :: a -> b -> a- const x _ = x- fooCompare :: Foo -> Foo -> Ordering- fooCompare A A = EQ- fooCompare A B = LT- fooCompare B B = GT- fooCompare B A = EQ- - class MyOrd a where- mycompare :: a -> a -> Ordering- (<=>) :: a -> a -> Ordering- (<=>) = mycompare- infix 4 <=>- data Foo = A | B- data Foo2 = F | G- - instance MyOrd () where- mycompare _ = const EQ- instance MyOrd Nat where- Zero `mycompare` Zero = EQ- Zero `mycompare` (Succ _) = LT- (Succ _) `mycompare` Zero = GT- (Succ n) `mycompare` (Succ m) = m `mycompare` n- instance MyOrd Foo where- mycompare = fooCompare- instance Eq Foo2 where- F == F = True- G == G = True- F == G = False- G == F = False |]- ======>- const :: a -> b -> a- const x _ = x- class MyOrd a where- mycompare :: a -> a -> Ordering- (<=>) :: a -> a -> Ordering- infix 4 <=>- (<=>) = mycompare- instance MyOrd Nat where- mycompare Zero Zero = EQ- mycompare Zero (Succ _) = LT- mycompare (Succ _) Zero = GT- mycompare (Succ n) (Succ m) = (m `mycompare` n)- instance MyOrd () where- mycompare _ = const EQ- data Foo = A | B- fooCompare :: Foo -> Foo -> Ordering- fooCompare A A = EQ- fooCompare A B = LT- fooCompare B B = GT- fooCompare B A = EQ- instance MyOrd Foo where- mycompare = fooCompare- data Foo2 = F | G- instance Eq Foo2 where- (==) F F = True- (==) G G = True- (==) F G = False- (==) G F = False- type ASym0 :: Foo- type family ASym0 :: Foo where- ASym0 = A- type BSym0 :: Foo- type family BSym0 :: Foo where- BSym0 = B- type FSym0 :: Foo2- type family FSym0 :: Foo2 where- FSym0 = F- type GSym0 :: Foo2- type family GSym0 :: Foo2 where- GSym0 = G- type FooCompareSym0 :: (~>) Foo ((~>) Foo Ordering)- data FooCompareSym0 :: (~>) Foo ((~>) Foo Ordering)- where- FooCompareSym0KindInference :: SameKind (Apply FooCompareSym0 arg) (FooCompareSym1 arg) =>- FooCompareSym0 a0123456789876543210- type instance Apply FooCompareSym0 a0123456789876543210 = FooCompareSym1 a0123456789876543210- instance SuppressUnusedWarnings FooCompareSym0 where- suppressUnusedWarnings = snd (((,) FooCompareSym0KindInference) ())- type FooCompareSym1 :: Foo -> (~>) Foo Ordering- data FooCompareSym1 (a0123456789876543210 :: Foo) :: (~>) Foo Ordering- where- FooCompareSym1KindInference :: SameKind (Apply (FooCompareSym1 a0123456789876543210) arg) (FooCompareSym2 a0123456789876543210 arg) =>- FooCompareSym1 a0123456789876543210 a0123456789876543210- type instance Apply (FooCompareSym1 a0123456789876543210) a0123456789876543210 = FooCompare a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (FooCompareSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) FooCompareSym1KindInference) ())- type FooCompareSym2 :: Foo -> Foo -> Ordering- type family FooCompareSym2 (a0123456789876543210 :: Foo) (a0123456789876543210 :: Foo) :: Ordering where- FooCompareSym2 a0123456789876543210 a0123456789876543210 = FooCompare a0123456789876543210 a0123456789876543210- type ConstSym0 :: (~>) a ((~>) b a)- data ConstSym0 :: (~>) a ((~>) b a)- where- ConstSym0KindInference :: SameKind (Apply ConstSym0 arg) (ConstSym1 arg) =>- ConstSym0 a0123456789876543210- type instance Apply ConstSym0 a0123456789876543210 = ConstSym1 a0123456789876543210- instance SuppressUnusedWarnings ConstSym0 where- suppressUnusedWarnings = snd (((,) ConstSym0KindInference) ())- type ConstSym1 :: a -> (~>) b a- data ConstSym1 (a0123456789876543210 :: a) :: (~>) b a- where- ConstSym1KindInference :: SameKind (Apply (ConstSym1 a0123456789876543210) arg) (ConstSym2 a0123456789876543210 arg) =>- ConstSym1 a0123456789876543210 a0123456789876543210- type instance Apply (ConstSym1 a0123456789876543210) a0123456789876543210 = Const a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ConstSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) ConstSym1KindInference) ())- type ConstSym2 :: a -> b -> a- type family ConstSym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: a where- ConstSym2 a0123456789876543210 a0123456789876543210 = Const a0123456789876543210 a0123456789876543210- type FooCompare :: Foo -> Foo -> Ordering- type family FooCompare (a :: Foo) (a :: Foo) :: Ordering where- FooCompare A A = EQSym0- FooCompare A B = LTSym0- FooCompare B B = GTSym0- FooCompare B A = EQSym0- type Const :: a -> b -> a- type family Const (a :: a) (a :: b) :: a where- Const x _ = x- type MycompareSym0 :: forall a. (~>) a ((~>) a Ordering)- data MycompareSym0 :: (~>) a ((~>) a Ordering)- where- MycompareSym0KindInference :: SameKind (Apply MycompareSym0 arg) (MycompareSym1 arg) =>- MycompareSym0 a0123456789876543210- type instance Apply MycompareSym0 a0123456789876543210 = MycompareSym1 a0123456789876543210- instance SuppressUnusedWarnings MycompareSym0 where- suppressUnusedWarnings = snd (((,) MycompareSym0KindInference) ())- type MycompareSym1 :: forall a. a -> (~>) a Ordering- data MycompareSym1 (a0123456789876543210 :: a) :: (~>) a Ordering- where- MycompareSym1KindInference :: SameKind (Apply (MycompareSym1 a0123456789876543210) arg) (MycompareSym2 a0123456789876543210 arg) =>- MycompareSym1 a0123456789876543210 a0123456789876543210- type instance Apply (MycompareSym1 a0123456789876543210) a0123456789876543210 = Mycompare a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (MycompareSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) MycompareSym1KindInference) ())- type MycompareSym2 :: forall a. a -> a -> Ordering- type family MycompareSym2 (a0123456789876543210 :: a) (a0123456789876543210 :: a) :: Ordering where- MycompareSym2 a0123456789876543210 a0123456789876543210 = Mycompare a0123456789876543210 a0123456789876543210- type (<=>@#@$) :: forall a. (~>) a ((~>) a Ordering)- data (<=>@#@$) :: (~>) a ((~>) a Ordering)- where- (:<=>@#@$###) :: SameKind (Apply (<=>@#@$) arg) ((<=>@#@$$) arg) =>- (<=>@#@$) a0123456789876543210- type instance Apply (<=>@#@$) a0123456789876543210 = (<=>@#@$$) a0123456789876543210- instance SuppressUnusedWarnings (<=>@#@$) where- suppressUnusedWarnings = snd (((,) (:<=>@#@$###)) ())- infix 4 <=>@#@$- type (<=>@#@$$) :: forall a. a -> (~>) a Ordering- data (<=>@#@$$) (a0123456789876543210 :: a) :: (~>) a Ordering- where- (:<=>@#@$$###) :: SameKind (Apply ((<=>@#@$$) a0123456789876543210) arg) ((<=>@#@$$$) a0123456789876543210 arg) =>- (<=>@#@$$) a0123456789876543210 a0123456789876543210- type instance Apply ((<=>@#@$$) a0123456789876543210) a0123456789876543210 = (<=>) a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings ((<=>@#@$$) a0123456789876543210) where- suppressUnusedWarnings = snd (((,) (:<=>@#@$$###)) ())- infix 4 <=>@#@$$- type (<=>@#@$$$) :: forall a. a -> a -> Ordering- type family (<=>@#@$$$) (a0123456789876543210 :: a) (a0123456789876543210 :: a) :: Ordering where- (<=>@#@$$$) a0123456789876543210 a0123456789876543210 = (<=>) a0123456789876543210 a0123456789876543210- infix 4 <=>@#@$$$- type TFHelper_0123456789876543210 :: a -> a -> Ordering- type family TFHelper_0123456789876543210 (a :: a) (a :: a) :: Ordering where- TFHelper_0123456789876543210 a_0123456789876543210 a_0123456789876543210 = Apply (Apply MycompareSym0 a_0123456789876543210) a_0123456789876543210- type TFHelper_0123456789876543210Sym0 :: (~>) a ((~>) a Ordering)- data TFHelper_0123456789876543210Sym0 :: (~>) a ((~>) a Ordering)- where- TFHelper_0123456789876543210Sym0KindInference :: SameKind (Apply TFHelper_0123456789876543210Sym0 arg) (TFHelper_0123456789876543210Sym1 arg) =>- TFHelper_0123456789876543210Sym0 a0123456789876543210- type instance Apply TFHelper_0123456789876543210Sym0 a0123456789876543210 = TFHelper_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings TFHelper_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) TFHelper_0123456789876543210Sym0KindInference) ())- type TFHelper_0123456789876543210Sym1 :: a -> (~>) a Ordering- data TFHelper_0123456789876543210Sym1 (a0123456789876543210 :: a) :: (~>) a Ordering- where- TFHelper_0123456789876543210Sym1KindInference :: SameKind (Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) arg) (TFHelper_0123456789876543210Sym2 a0123456789876543210 arg) =>- TFHelper_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (TFHelper_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) TFHelper_0123456789876543210Sym1KindInference) ())- type TFHelper_0123456789876543210Sym2 :: a -> a -> Ordering- type family TFHelper_0123456789876543210Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: a) :: Ordering where- TFHelper_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210- class PMyOrd a where- type family Mycompare (arg :: a) (arg :: a) :: Ordering- type family (<=>) (arg :: a) (arg :: a) :: Ordering- type (<=>) a a = Apply (Apply TFHelper_0123456789876543210Sym0 a) a- type Mycompare_0123456789876543210 :: Nat -> Nat -> Ordering- type family Mycompare_0123456789876543210 (a :: Nat) (a :: Nat) :: Ordering where- Mycompare_0123456789876543210 'Zero 'Zero = EQSym0- Mycompare_0123456789876543210 'Zero ('Succ _) = LTSym0- Mycompare_0123456789876543210 ('Succ _) 'Zero = GTSym0- Mycompare_0123456789876543210 ('Succ n) ('Succ m) = Apply (Apply MycompareSym0 m) n- type Mycompare_0123456789876543210Sym0 :: (~>) Nat ((~>) Nat Ordering)- data Mycompare_0123456789876543210Sym0 :: (~>) Nat ((~>) Nat Ordering)- where- Mycompare_0123456789876543210Sym0KindInference :: SameKind (Apply Mycompare_0123456789876543210Sym0 arg) (Mycompare_0123456789876543210Sym1 arg) =>- Mycompare_0123456789876543210Sym0 a0123456789876543210- type instance Apply Mycompare_0123456789876543210Sym0 a0123456789876543210 = Mycompare_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings Mycompare_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Mycompare_0123456789876543210Sym0KindInference) ())- type Mycompare_0123456789876543210Sym1 :: Nat -> (~>) Nat Ordering- data Mycompare_0123456789876543210Sym1 (a0123456789876543210 :: Nat) :: (~>) Nat Ordering- where- Mycompare_0123456789876543210Sym1KindInference :: SameKind (Apply (Mycompare_0123456789876543210Sym1 a0123456789876543210) arg) (Mycompare_0123456789876543210Sym2 a0123456789876543210 arg) =>- Mycompare_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (Mycompare_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Mycompare_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Mycompare_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Mycompare_0123456789876543210Sym1KindInference) ())- type Mycompare_0123456789876543210Sym2 :: Nat -> Nat -> Ordering- type family Mycompare_0123456789876543210Sym2 (a0123456789876543210 :: Nat) (a0123456789876543210 :: Nat) :: Ordering where- Mycompare_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Mycompare_0123456789876543210 a0123456789876543210 a0123456789876543210- instance PMyOrd Nat where- type Mycompare a a = Apply (Apply Mycompare_0123456789876543210Sym0 a) a- type Mycompare_0123456789876543210 :: () -> () -> Ordering- type family Mycompare_0123456789876543210 (a :: ()) (a :: ()) :: Ordering where- Mycompare_0123456789876543210 _ a_0123456789876543210 = Apply (Apply ConstSym0 EQSym0) a_0123456789876543210- type Mycompare_0123456789876543210Sym0 :: (~>) () ((~>) () Ordering)- data Mycompare_0123456789876543210Sym0 :: (~>) () ((~>) () Ordering)- where- Mycompare_0123456789876543210Sym0KindInference :: SameKind (Apply Mycompare_0123456789876543210Sym0 arg) (Mycompare_0123456789876543210Sym1 arg) =>- Mycompare_0123456789876543210Sym0 a0123456789876543210- type instance Apply Mycompare_0123456789876543210Sym0 a0123456789876543210 = Mycompare_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings Mycompare_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Mycompare_0123456789876543210Sym0KindInference) ())- type Mycompare_0123456789876543210Sym1 :: () -> (~>) () Ordering- data Mycompare_0123456789876543210Sym1 (a0123456789876543210 :: ()) :: (~>) () Ordering- where- Mycompare_0123456789876543210Sym1KindInference :: SameKind (Apply (Mycompare_0123456789876543210Sym1 a0123456789876543210) arg) (Mycompare_0123456789876543210Sym2 a0123456789876543210 arg) =>- Mycompare_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (Mycompare_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Mycompare_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Mycompare_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Mycompare_0123456789876543210Sym1KindInference) ())- type Mycompare_0123456789876543210Sym2 :: () -> () -> Ordering- type family Mycompare_0123456789876543210Sym2 (a0123456789876543210 :: ()) (a0123456789876543210 :: ()) :: Ordering where- Mycompare_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Mycompare_0123456789876543210 a0123456789876543210 a0123456789876543210- instance PMyOrd () where- type Mycompare a a = Apply (Apply Mycompare_0123456789876543210Sym0 a) a- type Mycompare_0123456789876543210 :: Foo -> Foo -> Ordering- type family Mycompare_0123456789876543210 (a :: Foo) (a :: Foo) :: Ordering where- Mycompare_0123456789876543210 a_0123456789876543210 a_0123456789876543210 = Apply (Apply FooCompareSym0 a_0123456789876543210) a_0123456789876543210- type Mycompare_0123456789876543210Sym0 :: (~>) Foo ((~>) Foo Ordering)- data Mycompare_0123456789876543210Sym0 :: (~>) Foo ((~>) Foo Ordering)- where- Mycompare_0123456789876543210Sym0KindInference :: SameKind (Apply Mycompare_0123456789876543210Sym0 arg) (Mycompare_0123456789876543210Sym1 arg) =>- Mycompare_0123456789876543210Sym0 a0123456789876543210- type instance Apply Mycompare_0123456789876543210Sym0 a0123456789876543210 = Mycompare_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings Mycompare_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Mycompare_0123456789876543210Sym0KindInference) ())- type Mycompare_0123456789876543210Sym1 :: Foo -> (~>) Foo Ordering- data Mycompare_0123456789876543210Sym1 (a0123456789876543210 :: Foo) :: (~>) Foo Ordering- where- Mycompare_0123456789876543210Sym1KindInference :: SameKind (Apply (Mycompare_0123456789876543210Sym1 a0123456789876543210) arg) (Mycompare_0123456789876543210Sym2 a0123456789876543210 arg) =>- Mycompare_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (Mycompare_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Mycompare_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Mycompare_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Mycompare_0123456789876543210Sym1KindInference) ())- type Mycompare_0123456789876543210Sym2 :: Foo -> Foo -> Ordering- type family Mycompare_0123456789876543210Sym2 (a0123456789876543210 :: Foo) (a0123456789876543210 :: Foo) :: Ordering where- Mycompare_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Mycompare_0123456789876543210 a0123456789876543210 a0123456789876543210- instance PMyOrd Foo where- type Mycompare a a = Apply (Apply Mycompare_0123456789876543210Sym0 a) a- type TFHelper_0123456789876543210 :: Foo2 -> Foo2 -> Bool- type family TFHelper_0123456789876543210 (a :: Foo2) (a :: Foo2) :: Bool where- TFHelper_0123456789876543210 F F = TrueSym0- TFHelper_0123456789876543210 G G = TrueSym0- TFHelper_0123456789876543210 F G = FalseSym0- TFHelper_0123456789876543210 G F = FalseSym0- type TFHelper_0123456789876543210Sym0 :: (~>) Foo2 ((~>) Foo2 Bool)- data TFHelper_0123456789876543210Sym0 :: (~>) Foo2 ((~>) Foo2 Bool)- where- TFHelper_0123456789876543210Sym0KindInference :: SameKind (Apply TFHelper_0123456789876543210Sym0 arg) (TFHelper_0123456789876543210Sym1 arg) =>- TFHelper_0123456789876543210Sym0 a0123456789876543210- type instance Apply TFHelper_0123456789876543210Sym0 a0123456789876543210 = TFHelper_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings TFHelper_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) TFHelper_0123456789876543210Sym0KindInference) ())- type TFHelper_0123456789876543210Sym1 :: Foo2 -> (~>) Foo2 Bool- data TFHelper_0123456789876543210Sym1 (a0123456789876543210 :: Foo2) :: (~>) Foo2 Bool- where- TFHelper_0123456789876543210Sym1KindInference :: SameKind (Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) arg) (TFHelper_0123456789876543210Sym2 a0123456789876543210 arg) =>- TFHelper_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (TFHelper_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) TFHelper_0123456789876543210Sym1KindInference) ())- type TFHelper_0123456789876543210Sym2 :: Foo2 -> Foo2 -> Bool- type family TFHelper_0123456789876543210Sym2 (a0123456789876543210 :: Foo2) (a0123456789876543210 :: Foo2) :: Bool where- TFHelper_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210- instance PEq Foo2 where- type (==) a a = Apply (Apply TFHelper_0123456789876543210Sym0 a) a- sFooCompare ::- forall (t :: Foo) (t :: Foo). Sing t- -> Sing t -> Sing (Apply (Apply FooCompareSym0 t) t :: Ordering)- sConst ::- forall a b (t :: a) (t :: b). Sing t- -> Sing t -> Sing (Apply (Apply ConstSym0 t) t :: a)- sFooCompare SA SA = SEQ- sFooCompare SA SB = SLT- sFooCompare SB SB = SGT- sFooCompare SB SA = SEQ- sConst (sX :: Sing x) _ = sX- instance SingI (FooCompareSym0 :: (~>) Foo ((~>) Foo Ordering)) where- sing = (singFun2 @FooCompareSym0) sFooCompare- instance SingI d =>- SingI (FooCompareSym1 (d :: Foo) :: (~>) Foo Ordering) where- sing- = (singFun1 @(FooCompareSym1 (d :: Foo))) (sFooCompare (sing @d))- instance SingI1 (FooCompareSym1 :: Foo -> (~>) Foo Ordering) where- liftSing (s :: Sing (d :: Foo))- = (singFun1 @(FooCompareSym1 (d :: Foo))) (sFooCompare s)- instance SingI (ConstSym0 :: (~>) a ((~>) b a)) where- sing = (singFun2 @ConstSym0) sConst- instance SingI d => SingI (ConstSym1 (d :: a) :: (~>) b a) where- sing = (singFun1 @(ConstSym1 (d :: a))) (sConst (sing @d))- instance SingI1 (ConstSym1 :: a -> (~>) b a) where- liftSing (s :: Sing (d :: a))- = (singFun1 @(ConstSym1 (d :: a))) (sConst s)- data SFoo :: Foo -> Type- where- SA :: SFoo (A :: Foo)- SB :: SFoo (B :: Foo)- type instance Sing @Foo = SFoo- instance SingKind Foo where- type Demote Foo = Foo- fromSing SA = A- fromSing SB = B- toSing A = SomeSing SA- toSing B = SomeSing SB- data SFoo2 :: Foo2 -> Type- where- SF :: SFoo2 (F :: Foo2)- SG :: SFoo2 (G :: Foo2)- type instance Sing @Foo2 = SFoo2- instance SingKind Foo2 where- type Demote Foo2 = Foo2- fromSing SF = F- fromSing SG = G- toSing F = SomeSing SF- toSing G = SomeSing SG- class SMyOrd a where- sMycompare ::- forall (t :: a) (t :: a). Sing t- -> Sing t -> Sing (Apply (Apply MycompareSym0 t) t :: Ordering)- (%<=>) ::- forall (t :: a) (t :: a). Sing t- -> Sing t -> Sing (Apply (Apply (<=>@#@$) t) t :: Ordering)- infix 4 %<=>- default (%<=>) ::- forall (t :: a)- (t :: a). ((Apply (Apply (<=>@#@$) t) t :: Ordering)- ~ Apply (Apply TFHelper_0123456789876543210Sym0 t) t) =>- Sing t -> Sing t -> Sing (Apply (Apply (<=>@#@$) t) t :: Ordering)- (%<=>)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing ((singFun2 @MycompareSym0) sMycompare))- sA_0123456789876543210))- sA_0123456789876543210- instance SMyOrd Nat where- sMycompare ::- forall (t :: Nat) (t :: Nat). Sing t- -> Sing t- -> Sing (Apply (Apply MycompareSym0 t) t :: Ordering)- sMycompare SZero SZero = SEQ- sMycompare SZero (SSucc _) = SLT- sMycompare (SSucc _) SZero = SGT- sMycompare (SSucc (sN :: Sing n)) (SSucc (sM :: Sing m))- = (applySing- ((applySing ((singFun2 @MycompareSym0) sMycompare)) sM))- sN- instance SMyOrd () where- sMycompare ::- forall (t :: ()) (t :: ()). Sing t- -> Sing t -> Sing (Apply (Apply MycompareSym0 t) t :: Ordering)- sMycompare _ (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing ((applySing ((singFun2 @ConstSym0) sConst)) SEQ))- sA_0123456789876543210- instance SMyOrd Foo where- sMycompare ::- forall (t :: Foo) (t :: Foo). Sing t- -> Sing t- -> Sing (Apply (Apply MycompareSym0 t) t :: Ordering)- sMycompare- (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing ((singFun2 @FooCompareSym0) sFooCompare))- sA_0123456789876543210))- sA_0123456789876543210- instance SEq Foo2 where- (%==) ::- forall (t1 :: Foo2) (t2 :: Foo2). Sing t1- -> Sing t2- -> Sing (Apply (Apply ((==@#@$) :: TyFun Foo2 ((~>) Foo2 Bool)- -> Type) t1) t2)- (%==) SF SF = STrue- (%==) SG SG = STrue- (%==) SF SG = SFalse- (%==) SG SF = SFalse- instance SingI A where- sing = SA- instance SingI B where- sing = SB- instance SingI F where- sing = SF- instance SingI G where- sing = SG- instance SMyOrd a =>- SingI (MycompareSym0 :: (~>) a ((~>) a Ordering)) where- sing = (singFun2 @MycompareSym0) sMycompare- instance (SMyOrd a, SingI d) =>- SingI (MycompareSym1 (d :: a) :: (~>) a Ordering) where- sing = (singFun1 @(MycompareSym1 (d :: a))) (sMycompare (sing @d))- instance SMyOrd a =>- SingI1 (MycompareSym1 :: a -> (~>) a Ordering) where- liftSing (s :: Sing (d :: a))- = (singFun1 @(MycompareSym1 (d :: a))) (sMycompare s)- instance SMyOrd a =>- SingI ((<=>@#@$) :: (~>) a ((~>) a Ordering)) where- sing = (singFun2 @(<=>@#@$)) (%<=>)- instance (SMyOrd a, SingI d) =>- SingI ((<=>@#@$$) (d :: a) :: (~>) a Ordering) where- sing = (singFun1 @((<=>@#@$$) (d :: a))) ((%<=>) (sing @d))- instance SMyOrd a =>- SingI1 ((<=>@#@$$) :: a -> (~>) a Ordering) where- liftSing (s :: Sing (d :: a))- = (singFun1 @((<=>@#@$$) (d :: a))) ((%<=>) s)-Singletons/Classes.hs:(0,0)-(0,0): Splicing declarations- promote- [d| instance Ord Foo2 where- F `compare` F = EQ- F `compare` _ = LT- _ `compare` _ = GT- instance MyOrd Foo2 where- F `mycompare` F = EQ- F `mycompare` _ = LT- _ `mycompare` _ = GT |]- ======>- instance MyOrd Foo2 where- mycompare F F = EQ- mycompare F _ = LT- mycompare _ _ = GT- instance Ord Foo2 where- compare F F = EQ- compare F _ = LT- compare _ _ = GT- type Mycompare_0123456789876543210 :: Foo2 -> Foo2 -> Ordering- type family Mycompare_0123456789876543210 (a :: Foo2) (a :: Foo2) :: Ordering where- Mycompare_0123456789876543210 'F 'F = EQSym0- Mycompare_0123456789876543210 'F _ = LTSym0- Mycompare_0123456789876543210 _ _ = GTSym0- type Mycompare_0123456789876543210Sym0 :: (~>) Foo2 ((~>) Foo2 Ordering)- data Mycompare_0123456789876543210Sym0 :: (~>) Foo2 ((~>) Foo2 Ordering)- where- Mycompare_0123456789876543210Sym0KindInference :: SameKind (Apply Mycompare_0123456789876543210Sym0 arg) (Mycompare_0123456789876543210Sym1 arg) =>- Mycompare_0123456789876543210Sym0 a0123456789876543210- type instance Apply Mycompare_0123456789876543210Sym0 a0123456789876543210 = Mycompare_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings Mycompare_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Mycompare_0123456789876543210Sym0KindInference) ())- type Mycompare_0123456789876543210Sym1 :: Foo2- -> (~>) Foo2 Ordering- data Mycompare_0123456789876543210Sym1 (a0123456789876543210 :: Foo2) :: (~>) Foo2 Ordering- where- Mycompare_0123456789876543210Sym1KindInference :: SameKind (Apply (Mycompare_0123456789876543210Sym1 a0123456789876543210) arg) (Mycompare_0123456789876543210Sym2 a0123456789876543210 arg) =>- Mycompare_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (Mycompare_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Mycompare_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Mycompare_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Mycompare_0123456789876543210Sym1KindInference) ())- type Mycompare_0123456789876543210Sym2 :: Foo2 -> Foo2 -> Ordering- type family Mycompare_0123456789876543210Sym2 (a0123456789876543210 :: Foo2) (a0123456789876543210 :: Foo2) :: Ordering where- Mycompare_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Mycompare_0123456789876543210 a0123456789876543210 a0123456789876543210- instance PMyOrd Foo2 where- type Mycompare a a = Apply (Apply Mycompare_0123456789876543210Sym0 a) a- type Compare_0123456789876543210 :: Foo2 -> Foo2 -> Ordering- type family Compare_0123456789876543210 (a :: Foo2) (a :: Foo2) :: Ordering where- Compare_0123456789876543210 'F 'F = EQSym0- Compare_0123456789876543210 'F _ = LTSym0- Compare_0123456789876543210 _ _ = GTSym0- type Compare_0123456789876543210Sym0 :: (~>) Foo2 ((~>) Foo2 Ordering)- data Compare_0123456789876543210Sym0 :: (~>) Foo2 ((~>) Foo2 Ordering)- where- Compare_0123456789876543210Sym0KindInference :: SameKind (Apply Compare_0123456789876543210Sym0 arg) (Compare_0123456789876543210Sym1 arg) =>- Compare_0123456789876543210Sym0 a0123456789876543210- type instance Apply Compare_0123456789876543210Sym0 a0123456789876543210 = Compare_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings Compare_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Compare_0123456789876543210Sym0KindInference) ())- type Compare_0123456789876543210Sym1 :: Foo2 -> (~>) Foo2 Ordering- data Compare_0123456789876543210Sym1 (a0123456789876543210 :: Foo2) :: (~>) Foo2 Ordering- where- Compare_0123456789876543210Sym1KindInference :: SameKind (Apply (Compare_0123456789876543210Sym1 a0123456789876543210) arg) (Compare_0123456789876543210Sym2 a0123456789876543210 arg) =>- Compare_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (Compare_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Compare_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Compare_0123456789876543210Sym1KindInference) ())- type Compare_0123456789876543210Sym2 :: Foo2 -> Foo2 -> Ordering- type family Compare_0123456789876543210Sym2 (a0123456789876543210 :: Foo2) (a0123456789876543210 :: Foo2) :: Ordering where- Compare_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210- instance POrd Foo2 where- type Compare a a = Apply (Apply Compare_0123456789876543210Sym0 a) a-Singletons/Classes.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| data Nat' = Zero' | Succ' Nat'- - instance MyOrd Nat' where- Zero' `mycompare` Zero' = EQ- Zero' `mycompare` (Succ' _) = LT- (Succ' _) `mycompare` Zero' = GT- (Succ' n) `mycompare` (Succ' m) = m `mycompare` n |]- ======>- data Nat' = Zero' | Succ' Nat'- instance MyOrd Nat' where- mycompare Zero' Zero' = EQ- mycompare Zero' (Succ' _) = LT- mycompare (Succ' _) Zero' = GT- mycompare (Succ' n) (Succ' m) = (m `mycompare` n)- type Zero'Sym0 :: Nat'- type family Zero'Sym0 :: Nat' where- Zero'Sym0 = Zero'- type Succ'Sym0 :: (~>) Nat' Nat'- data Succ'Sym0 :: (~>) Nat' Nat'- where- Succ'Sym0KindInference :: SameKind (Apply Succ'Sym0 arg) (Succ'Sym1 arg) =>- Succ'Sym0 a0123456789876543210- type instance Apply Succ'Sym0 a0123456789876543210 = Succ' a0123456789876543210- instance SuppressUnusedWarnings Succ'Sym0 where- suppressUnusedWarnings = snd (((,) Succ'Sym0KindInference) ())- type Succ'Sym1 :: Nat' -> Nat'- type family Succ'Sym1 (a0123456789876543210 :: Nat') :: Nat' where- Succ'Sym1 a0123456789876543210 = Succ' a0123456789876543210- type Mycompare_0123456789876543210 :: Nat' -> Nat' -> Ordering- type family Mycompare_0123456789876543210 (a :: Nat') (a :: Nat') :: Ordering where- Mycompare_0123456789876543210 Zero' Zero' = EQSym0- Mycompare_0123456789876543210 Zero' (Succ' _) = LTSym0- Mycompare_0123456789876543210 (Succ' _) Zero' = GTSym0- Mycompare_0123456789876543210 (Succ' n) (Succ' m) = Apply (Apply MycompareSym0 m) n- type Mycompare_0123456789876543210Sym0 :: (~>) Nat' ((~>) Nat' Ordering)- data Mycompare_0123456789876543210Sym0 :: (~>) Nat' ((~>) Nat' Ordering)- where- Mycompare_0123456789876543210Sym0KindInference :: SameKind (Apply Mycompare_0123456789876543210Sym0 arg) (Mycompare_0123456789876543210Sym1 arg) =>- Mycompare_0123456789876543210Sym0 a0123456789876543210- type instance Apply Mycompare_0123456789876543210Sym0 a0123456789876543210 = Mycompare_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings Mycompare_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Mycompare_0123456789876543210Sym0KindInference) ())- type Mycompare_0123456789876543210Sym1 :: Nat'- -> (~>) Nat' Ordering- data Mycompare_0123456789876543210Sym1 (a0123456789876543210 :: Nat') :: (~>) Nat' Ordering- where- Mycompare_0123456789876543210Sym1KindInference :: SameKind (Apply (Mycompare_0123456789876543210Sym1 a0123456789876543210) arg) (Mycompare_0123456789876543210Sym2 a0123456789876543210 arg) =>- Mycompare_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (Mycompare_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Mycompare_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Mycompare_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Mycompare_0123456789876543210Sym1KindInference) ())- type Mycompare_0123456789876543210Sym2 :: Nat' -> Nat' -> Ordering- type family Mycompare_0123456789876543210Sym2 (a0123456789876543210 :: Nat') (a0123456789876543210 :: Nat') :: Ordering where- Mycompare_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Mycompare_0123456789876543210 a0123456789876543210 a0123456789876543210- instance PMyOrd Nat' where- type Mycompare a a = Apply (Apply Mycompare_0123456789876543210Sym0 a) a- data SNat' :: Nat' -> Type- where- SZero' :: SNat' (Zero' :: Nat')- SSucc' :: forall (n :: Nat'). (Sing n) -> SNat' (Succ' n :: Nat')- type instance Sing @Nat' = SNat'- instance SingKind Nat' where- type Demote Nat' = Nat'- fromSing SZero' = Zero'- fromSing (SSucc' b) = Succ' (fromSing b)- toSing Zero' = SomeSing SZero'- toSing (Succ' (b :: Demote Nat'))- = case toSing b :: SomeSing Nat' of- SomeSing c -> SomeSing (SSucc' c)- instance SMyOrd Nat' where- sMycompare ::- forall (t :: Nat') (t :: Nat'). Sing t- -> Sing t- -> Sing (Apply (Apply (MycompareSym0 :: TyFun Nat' ((~>) Nat' Ordering)- -> Type) t) t)- sMycompare SZero' SZero' = SEQ- sMycompare SZero' (SSucc' _) = SLT- sMycompare (SSucc' _) SZero' = SGT- sMycompare (SSucc' (sN :: Sing n)) (SSucc' (sM :: Sing m))- = (applySing- ((applySing ((singFun2 @MycompareSym0) sMycompare)) sM))- sN- instance SingI Zero' where- sing = SZero'- instance SingI n => SingI (Succ' (n :: Nat')) where- sing = SSucc' sing- instance SingI1 Succ' where- liftSing = SSucc'- instance SingI (Succ'Sym0 :: (~>) Nat' Nat') where- sing = (singFun1 @Succ'Sym0) SSucc'+Singletons/Classes.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| const :: a -> b -> a + const x _ = x + fooCompare :: Foo -> Foo -> Ordering + fooCompare A A = EQ + fooCompare A B = LT + fooCompare B B = GT + fooCompare B A = EQ + + class MyOrd a where + mycompare :: a -> a -> Ordering + (<=>) :: a -> a -> Ordering + (<=>) = mycompare + infix 4 <=> + data Foo = A | B + data Foo2 = F | G + + instance MyOrd () where + mycompare _ = const EQ + instance MyOrd Nat where + Zero `mycompare` Zero = EQ + Zero `mycompare` (Succ _) = LT + (Succ _) `mycompare` Zero = GT + (Succ n) `mycompare` (Succ m) = m `mycompare` n + instance MyOrd Foo where + mycompare = fooCompare + instance Eq Foo2 where + F == F = True + G == G = True + F == G = False + G == F = False |] + ======> + const :: a -> b -> a + const x _ = x + class MyOrd a where + mycompare :: a -> a -> Ordering + (<=>) :: a -> a -> Ordering + infix 4 <=> + (<=>) = mycompare + instance MyOrd Nat where + mycompare Zero Zero = EQ + mycompare Zero (Succ _) = LT + mycompare (Succ _) Zero = GT + mycompare (Succ n) (Succ m) = (m `mycompare` n) + instance MyOrd () where + mycompare _ = const EQ + data Foo = A | B + fooCompare :: Foo -> Foo -> Ordering + fooCompare A A = EQ + fooCompare A B = LT + fooCompare B B = GT + fooCompare B A = EQ + instance MyOrd Foo where + mycompare = fooCompare + data Foo2 = F | G + instance Eq Foo2 where + (==) F F = True + (==) G G = True + (==) F G = False + (==) G F = False + type ASym0 :: Foo + type family ASym0 :: Foo where + ASym0 = A + type BSym0 :: Foo + type family BSym0 :: Foo where + BSym0 = B + type FSym0 :: Foo2 + type family FSym0 :: Foo2 where + FSym0 = F + type GSym0 :: Foo2 + type family GSym0 :: Foo2 where + GSym0 = G + type FooCompareSym0 :: (~>) Foo ((~>) Foo Ordering) + data FooCompareSym0 :: (~>) Foo ((~>) Foo Ordering) + where + FooCompareSym0KindInference :: SameKind (Apply FooCompareSym0 arg) (FooCompareSym1 arg) => + FooCompareSym0 a0123456789876543210 + type instance Apply FooCompareSym0 a0123456789876543210 = FooCompareSym1 a0123456789876543210 + instance SuppressUnusedWarnings FooCompareSym0 where + suppressUnusedWarnings = snd ((,) FooCompareSym0KindInference ()) + type FooCompareSym1 :: Foo -> (~>) Foo Ordering + data FooCompareSym1 (a0123456789876543210 :: Foo) :: (~>) Foo Ordering + where + FooCompareSym1KindInference :: SameKind (Apply (FooCompareSym1 a0123456789876543210) arg) (FooCompareSym2 a0123456789876543210 arg) => + FooCompareSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (FooCompareSym1 a0123456789876543210) a0123456789876543210 = FooCompare a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (FooCompareSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) FooCompareSym1KindInference ()) + type FooCompareSym2 :: Foo -> Foo -> Ordering + type family FooCompareSym2 (a0123456789876543210 :: Foo) (a0123456789876543210 :: Foo) :: Ordering where + FooCompareSym2 a0123456789876543210 a0123456789876543210 = FooCompare a0123456789876543210 a0123456789876543210 + type ConstSym0 :: (~>) a ((~>) b a) + data ConstSym0 :: (~>) a ((~>) b a) + where + ConstSym0KindInference :: SameKind (Apply ConstSym0 arg) (ConstSym1 arg) => + ConstSym0 a0123456789876543210 + type instance Apply ConstSym0 a0123456789876543210 = ConstSym1 a0123456789876543210 + instance SuppressUnusedWarnings ConstSym0 where + suppressUnusedWarnings = snd ((,) ConstSym0KindInference ()) + type ConstSym1 :: a -> (~>) b a + data ConstSym1 (a0123456789876543210 :: a) :: (~>) b a + where + ConstSym1KindInference :: SameKind (Apply (ConstSym1 a0123456789876543210) arg) (ConstSym2 a0123456789876543210 arg) => + ConstSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (ConstSym1 a0123456789876543210) a0123456789876543210 = Const a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ConstSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) ConstSym1KindInference ()) + type ConstSym2 :: a -> b -> a + type family ConstSym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: a where + ConstSym2 a0123456789876543210 a0123456789876543210 = Const a0123456789876543210 a0123456789876543210 + type FooCompare :: Foo -> Foo -> Ordering + type family FooCompare (a :: Foo) (a :: Foo) :: Ordering where + FooCompare A A = EQSym0 + FooCompare A B = LTSym0 + FooCompare B B = GTSym0 + FooCompare B A = EQSym0 + type Const :: a -> b -> a + type family Const (a :: a) (a :: b) :: a where + Const x _ = x + type MycompareSym0 :: forall a. (~>) a ((~>) a Ordering) + data MycompareSym0 :: (~>) a ((~>) a Ordering) + where + MycompareSym0KindInference :: SameKind (Apply MycompareSym0 arg) (MycompareSym1 arg) => + MycompareSym0 a0123456789876543210 + type instance Apply MycompareSym0 a0123456789876543210 = MycompareSym1 a0123456789876543210 + instance SuppressUnusedWarnings MycompareSym0 where + suppressUnusedWarnings = snd ((,) MycompareSym0KindInference ()) + type MycompareSym1 :: forall a. a -> (~>) a Ordering + data MycompareSym1 (a0123456789876543210 :: a) :: (~>) a Ordering + where + MycompareSym1KindInference :: SameKind (Apply (MycompareSym1 a0123456789876543210) arg) (MycompareSym2 a0123456789876543210 arg) => + MycompareSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (MycompareSym1 a0123456789876543210) a0123456789876543210 = Mycompare a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (MycompareSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) MycompareSym1KindInference ()) + type MycompareSym2 :: forall a. a -> a -> Ordering + type family MycompareSym2 (a0123456789876543210 :: a) (a0123456789876543210 :: a) :: Ordering where + MycompareSym2 a0123456789876543210 a0123456789876543210 = Mycompare a0123456789876543210 a0123456789876543210 + type (<=>@#@$) :: forall a. (~>) a ((~>) a Ordering) + data (<=>@#@$) :: (~>) a ((~>) a Ordering) + where + (:<=>@#@$###) :: SameKind (Apply (<=>@#@$) arg) ((<=>@#@$$) arg) => + (<=>@#@$) a0123456789876543210 + type instance Apply (<=>@#@$) a0123456789876543210 = (<=>@#@$$) a0123456789876543210 + instance SuppressUnusedWarnings (<=>@#@$) where + suppressUnusedWarnings = snd ((,) (:<=>@#@$###) ()) + infix 4 <=>@#@$ + type (<=>@#@$$) :: forall a. a -> (~>) a Ordering + data (<=>@#@$$) (a0123456789876543210 :: a) :: (~>) a Ordering + where + (:<=>@#@$$###) :: SameKind (Apply ((<=>@#@$$) a0123456789876543210) arg) ((<=>@#@$$$) a0123456789876543210 arg) => + (<=>@#@$$) a0123456789876543210 a0123456789876543210 + type instance Apply ((<=>@#@$$) a0123456789876543210) a0123456789876543210 = (<=>) a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings ((<=>@#@$$) a0123456789876543210) where + suppressUnusedWarnings = snd ((,) (:<=>@#@$$###) ()) + infix 4 <=>@#@$$ + type (<=>@#@$$$) :: forall a. a -> a -> Ordering + type family (<=>@#@$$$) (a0123456789876543210 :: a) (a0123456789876543210 :: a) :: Ordering where + (<=>@#@$$$) a0123456789876543210 a0123456789876543210 = (<=>) a0123456789876543210 a0123456789876543210 + infix 4 <=>@#@$$$ + type TFHelper_0123456789876543210 :: a -> a -> Ordering + type family TFHelper_0123456789876543210 (a :: a) (a :: a) :: Ordering where + TFHelper_0123456789876543210 a_0123456789876543210 a_0123456789876543210 = Apply (Apply MycompareSym0 a_0123456789876543210) a_0123456789876543210 + type TFHelper_0123456789876543210Sym0 :: (~>) a ((~>) a Ordering) + data TFHelper_0123456789876543210Sym0 :: (~>) a ((~>) a Ordering) + where + TFHelper_0123456789876543210Sym0KindInference :: SameKind (Apply TFHelper_0123456789876543210Sym0 arg) (TFHelper_0123456789876543210Sym1 arg) => + TFHelper_0123456789876543210Sym0 a0123456789876543210 + type instance Apply TFHelper_0123456789876543210Sym0 a0123456789876543210 = TFHelper_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings TFHelper_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) TFHelper_0123456789876543210Sym0KindInference ()) + type TFHelper_0123456789876543210Sym1 :: a -> (~>) a Ordering + data TFHelper_0123456789876543210Sym1 (a0123456789876543210 :: a) :: (~>) a Ordering + where + TFHelper_0123456789876543210Sym1KindInference :: SameKind (Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) arg) (TFHelper_0123456789876543210Sym2 a0123456789876543210 arg) => + TFHelper_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (TFHelper_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) TFHelper_0123456789876543210Sym1KindInference ()) + type TFHelper_0123456789876543210Sym2 :: a -> a -> Ordering + type family TFHelper_0123456789876543210Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: a) :: Ordering where + TFHelper_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210 + class PMyOrd a where + type family Mycompare (arg :: a) (arg :: a) :: Ordering + type family (<=>) (arg :: a) (arg :: a) :: Ordering + type (<=>) a a = Apply (Apply TFHelper_0123456789876543210Sym0 a) a + type Mycompare_0123456789876543210 :: Nat -> Nat -> Ordering + type family Mycompare_0123456789876543210 (a :: Nat) (a :: Nat) :: Ordering where + Mycompare_0123456789876543210 'Zero 'Zero = EQSym0 + Mycompare_0123456789876543210 'Zero ('Succ _) = LTSym0 + Mycompare_0123456789876543210 ('Succ _) 'Zero = GTSym0 + Mycompare_0123456789876543210 ('Succ n) ('Succ m) = Apply (Apply MycompareSym0 m) n + type Mycompare_0123456789876543210Sym0 :: (~>) Nat ((~>) Nat Ordering) + data Mycompare_0123456789876543210Sym0 :: (~>) Nat ((~>) Nat Ordering) + where + Mycompare_0123456789876543210Sym0KindInference :: SameKind (Apply Mycompare_0123456789876543210Sym0 arg) (Mycompare_0123456789876543210Sym1 arg) => + Mycompare_0123456789876543210Sym0 a0123456789876543210 + type instance Apply Mycompare_0123456789876543210Sym0 a0123456789876543210 = Mycompare_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Mycompare_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Mycompare_0123456789876543210Sym0KindInference ()) + type Mycompare_0123456789876543210Sym1 :: Nat -> (~>) Nat Ordering + data Mycompare_0123456789876543210Sym1 (a0123456789876543210 :: Nat) :: (~>) Nat Ordering + where + Mycompare_0123456789876543210Sym1KindInference :: SameKind (Apply (Mycompare_0123456789876543210Sym1 a0123456789876543210) arg) (Mycompare_0123456789876543210Sym2 a0123456789876543210 arg) => + Mycompare_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (Mycompare_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Mycompare_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Mycompare_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Mycompare_0123456789876543210Sym1KindInference ()) + type Mycompare_0123456789876543210Sym2 :: Nat -> Nat -> Ordering + type family Mycompare_0123456789876543210Sym2 (a0123456789876543210 :: Nat) (a0123456789876543210 :: Nat) :: Ordering where + Mycompare_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Mycompare_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PMyOrd Nat where + type Mycompare a a = Apply (Apply Mycompare_0123456789876543210Sym0 a) a + type Mycompare_0123456789876543210 :: () -> () -> Ordering + type family Mycompare_0123456789876543210 (a :: ()) (a :: ()) :: Ordering where + Mycompare_0123456789876543210 _ a_0123456789876543210 = Apply (Apply ConstSym0 EQSym0) a_0123456789876543210 + type Mycompare_0123456789876543210Sym0 :: (~>) () ((~>) () Ordering) + data Mycompare_0123456789876543210Sym0 :: (~>) () ((~>) () Ordering) + where + Mycompare_0123456789876543210Sym0KindInference :: SameKind (Apply Mycompare_0123456789876543210Sym0 arg) (Mycompare_0123456789876543210Sym1 arg) => + Mycompare_0123456789876543210Sym0 a0123456789876543210 + type instance Apply Mycompare_0123456789876543210Sym0 a0123456789876543210 = Mycompare_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Mycompare_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Mycompare_0123456789876543210Sym0KindInference ()) + type Mycompare_0123456789876543210Sym1 :: () -> (~>) () Ordering + data Mycompare_0123456789876543210Sym1 (a0123456789876543210 :: ()) :: (~>) () Ordering + where + Mycompare_0123456789876543210Sym1KindInference :: SameKind (Apply (Mycompare_0123456789876543210Sym1 a0123456789876543210) arg) (Mycompare_0123456789876543210Sym2 a0123456789876543210 arg) => + Mycompare_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (Mycompare_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Mycompare_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Mycompare_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Mycompare_0123456789876543210Sym1KindInference ()) + type Mycompare_0123456789876543210Sym2 :: () -> () -> Ordering + type family Mycompare_0123456789876543210Sym2 (a0123456789876543210 :: ()) (a0123456789876543210 :: ()) :: Ordering where + Mycompare_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Mycompare_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PMyOrd () where + type Mycompare a a = Apply (Apply Mycompare_0123456789876543210Sym0 a) a + type Mycompare_0123456789876543210 :: Foo -> Foo -> Ordering + type family Mycompare_0123456789876543210 (a :: Foo) (a :: Foo) :: Ordering where + Mycompare_0123456789876543210 a_0123456789876543210 a_0123456789876543210 = Apply (Apply FooCompareSym0 a_0123456789876543210) a_0123456789876543210 + type Mycompare_0123456789876543210Sym0 :: (~>) Foo ((~>) Foo Ordering) + data Mycompare_0123456789876543210Sym0 :: (~>) Foo ((~>) Foo Ordering) + where + Mycompare_0123456789876543210Sym0KindInference :: SameKind (Apply Mycompare_0123456789876543210Sym0 arg) (Mycompare_0123456789876543210Sym1 arg) => + Mycompare_0123456789876543210Sym0 a0123456789876543210 + type instance Apply Mycompare_0123456789876543210Sym0 a0123456789876543210 = Mycompare_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Mycompare_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Mycompare_0123456789876543210Sym0KindInference ()) + type Mycompare_0123456789876543210Sym1 :: Foo -> (~>) Foo Ordering + data Mycompare_0123456789876543210Sym1 (a0123456789876543210 :: Foo) :: (~>) Foo Ordering + where + Mycompare_0123456789876543210Sym1KindInference :: SameKind (Apply (Mycompare_0123456789876543210Sym1 a0123456789876543210) arg) (Mycompare_0123456789876543210Sym2 a0123456789876543210 arg) => + Mycompare_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (Mycompare_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Mycompare_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Mycompare_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Mycompare_0123456789876543210Sym1KindInference ()) + type Mycompare_0123456789876543210Sym2 :: Foo -> Foo -> Ordering + type family Mycompare_0123456789876543210Sym2 (a0123456789876543210 :: Foo) (a0123456789876543210 :: Foo) :: Ordering where + Mycompare_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Mycompare_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PMyOrd Foo where + type Mycompare a a = Apply (Apply Mycompare_0123456789876543210Sym0 a) a + type TFHelper_0123456789876543210 :: Foo2 -> Foo2 -> Bool + type family TFHelper_0123456789876543210 (a :: Foo2) (a :: Foo2) :: Bool where + TFHelper_0123456789876543210 F F = TrueSym0 + TFHelper_0123456789876543210 G G = TrueSym0 + TFHelper_0123456789876543210 F G = FalseSym0 + TFHelper_0123456789876543210 G F = FalseSym0 + type TFHelper_0123456789876543210Sym0 :: (~>) Foo2 ((~>) Foo2 Bool) + data TFHelper_0123456789876543210Sym0 :: (~>) Foo2 ((~>) Foo2 Bool) + where + TFHelper_0123456789876543210Sym0KindInference :: SameKind (Apply TFHelper_0123456789876543210Sym0 arg) (TFHelper_0123456789876543210Sym1 arg) => + TFHelper_0123456789876543210Sym0 a0123456789876543210 + type instance Apply TFHelper_0123456789876543210Sym0 a0123456789876543210 = TFHelper_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings TFHelper_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) TFHelper_0123456789876543210Sym0KindInference ()) + type TFHelper_0123456789876543210Sym1 :: Foo2 -> (~>) Foo2 Bool + data TFHelper_0123456789876543210Sym1 (a0123456789876543210 :: Foo2) :: (~>) Foo2 Bool + where + TFHelper_0123456789876543210Sym1KindInference :: SameKind (Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) arg) (TFHelper_0123456789876543210Sym2 a0123456789876543210 arg) => + TFHelper_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (TFHelper_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) TFHelper_0123456789876543210Sym1KindInference ()) + type TFHelper_0123456789876543210Sym2 :: Foo2 -> Foo2 -> Bool + type family TFHelper_0123456789876543210Sym2 (a0123456789876543210 :: Foo2) (a0123456789876543210 :: Foo2) :: Bool where + TFHelper_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PEq Foo2 where + type (==) a a = Apply (Apply TFHelper_0123456789876543210Sym0 a) a + sFooCompare :: + (forall (t :: Foo) (t :: Foo). + Sing t + -> Sing t + -> Sing (Apply (Apply FooCompareSym0 t) t :: Ordering) :: Type) + sConst :: + (forall (t :: a) (t :: b). + Sing t + -> Sing t -> Sing (Apply (Apply ConstSym0 t) t :: a) :: Type) + sFooCompare SA SA = SEQ + sFooCompare SA SB = SLT + sFooCompare SB SB = SGT + sFooCompare SB SA = SEQ + sConst (sX :: Sing x) _ = sX + instance SingI (FooCompareSym0 :: (~>) Foo ((~>) Foo Ordering)) where + sing = singFun2 @FooCompareSym0 sFooCompare + instance SingI d => + SingI (FooCompareSym1 (d :: Foo) :: (~>) Foo Ordering) where + sing + = singFun1 @(FooCompareSym1 (d :: Foo)) (sFooCompare (sing @d)) + instance SingI1 (FooCompareSym1 :: Foo -> (~>) Foo Ordering) where + liftSing (s :: Sing (d :: Foo)) + = singFun1 @(FooCompareSym1 (d :: Foo)) (sFooCompare s) + instance SingI (ConstSym0 :: (~>) a ((~>) b a)) where + sing = singFun2 @ConstSym0 sConst + instance SingI d => SingI (ConstSym1 (d :: a) :: (~>) b a) where + sing = singFun1 @(ConstSym1 (d :: a)) (sConst (sing @d)) + instance SingI1 (ConstSym1 :: a -> (~>) b a) where + liftSing (s :: Sing (d :: a)) + = singFun1 @(ConstSym1 (d :: a)) (sConst s) + data SFoo :: Foo -> Type + where + SA :: SFoo (A :: Foo) + SB :: SFoo (B :: Foo) + type instance Sing @Foo = SFoo + instance SingKind Foo where + type Demote Foo = Foo + fromSing SA = A + fromSing SB = B + toSing A = SomeSing SA + toSing B = SomeSing SB + data SFoo2 :: Foo2 -> Type + where + SF :: SFoo2 (F :: Foo2) + SG :: SFoo2 (G :: Foo2) + type instance Sing @Foo2 = SFoo2 + instance SingKind Foo2 where + type Demote Foo2 = Foo2 + fromSing SF = F + fromSing SG = G + toSing F = SomeSing SF + toSing G = SomeSing SG + class SMyOrd a where + sMycompare :: + (forall (t :: a) (t :: a). + Sing t + -> Sing t + -> Sing (Apply (Apply MycompareSym0 t) t :: Ordering) :: Type) + (%<=>) :: + (forall (t :: a) (t :: a). + Sing t + -> Sing t + -> Sing (Apply (Apply (<=>@#@$) t) t :: Ordering) :: Type) + infix 4 %<=> + default (%<=>) :: + (forall (t :: a) (t :: a). + ((Apply (Apply (<=>@#@$) t) t :: Ordering) + ~ Apply (Apply TFHelper_0123456789876543210Sym0 t) t) => + Sing t + -> Sing t + -> Sing (Apply (Apply (<=>@#@$) t) t :: Ordering) :: Type) + (%<=>) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (singFun2 @MycompareSym0 sMycompare) sA_0123456789876543210) + sA_0123456789876543210 + instance SMyOrd Nat where + sMycompare :: + (forall (t :: Nat) (t :: Nat). + Sing t + -> Sing t + -> Sing (Apply (Apply MycompareSym0 t) t :: Ordering) :: Type) + sMycompare SZero SZero = SEQ + sMycompare SZero (SSucc _) = SLT + sMycompare (SSucc _) SZero = SGT + sMycompare (SSucc (sN :: Sing n)) (SSucc (sM :: Sing m)) + = applySing (applySing (singFun2 @MycompareSym0 sMycompare) sM) sN + instance SMyOrd () where + sMycompare :: + (forall (t :: ()) (t :: ()). + Sing t + -> Sing t + -> Sing (Apply (Apply MycompareSym0 t) t :: Ordering) :: Type) + sMycompare _ (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing (singFun2 @ConstSym0 sConst) SEQ) sA_0123456789876543210 + instance SMyOrd Foo where + sMycompare :: + (forall (t :: Foo) (t :: Foo). + Sing t + -> Sing t + -> Sing (Apply (Apply MycompareSym0 t) t :: Ordering) :: Type) + sMycompare + (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (singFun2 @FooCompareSym0 sFooCompare) sA_0123456789876543210) + sA_0123456789876543210 + instance SEq Foo2 where + (%==) :: + forall (t1 :: Foo2) (t2 :: Foo2). Sing t1 + -> Sing t2 + -> Sing (Apply (Apply ((==@#@$) :: TyFun Foo2 ((~>) Foo2 Bool) + -> Type) t1) t2) + (%==) SF SF = STrue + (%==) SG SG = STrue + (%==) SF SG = SFalse + (%==) SG SF = SFalse + instance SingI A where + sing = SA + instance SingI B where + sing = SB + instance SingI F where + sing = SF + instance SingI G where + sing = SG + instance SMyOrd a => + SingI (MycompareSym0 :: (~>) a ((~>) a Ordering)) where + sing = singFun2 @MycompareSym0 sMycompare + instance (SMyOrd a, SingI d) => + SingI (MycompareSym1 (d :: a) :: (~>) a Ordering) where + sing = singFun1 @(MycompareSym1 (d :: a)) (sMycompare (sing @d)) + instance SMyOrd a => + SingI1 (MycompareSym1 :: a -> (~>) a Ordering) where + liftSing (s :: Sing (d :: a)) + = singFun1 @(MycompareSym1 (d :: a)) (sMycompare s) + instance SMyOrd a => + SingI ((<=>@#@$) :: (~>) a ((~>) a Ordering)) where + sing = singFun2 @(<=>@#@$) (%<=>) + instance (SMyOrd a, SingI d) => + SingI ((<=>@#@$$) (d :: a) :: (~>) a Ordering) where + sing = singFun1 @((<=>@#@$$) (d :: a)) ((%<=>) (sing @d)) + instance SMyOrd a => + SingI1 ((<=>@#@$$) :: a -> (~>) a Ordering) where + liftSing (s :: Sing (d :: a)) + = singFun1 @((<=>@#@$$) (d :: a)) ((%<=>) s) +Singletons/Classes.hs:(0,0)-(0,0): Splicing declarations + promote + [d| instance Ord Foo2 where + F `compare` F = EQ + F `compare` _ = LT + _ `compare` _ = GT + instance MyOrd Foo2 where + F `mycompare` F = EQ + F `mycompare` _ = LT + _ `mycompare` _ = GT |] + ======> + instance MyOrd Foo2 where + mycompare F F = EQ + mycompare F _ = LT + mycompare _ _ = GT + instance Ord Foo2 where + compare F F = EQ + compare F _ = LT + compare _ _ = GT + type Mycompare_0123456789876543210 :: Foo2 -> Foo2 -> Ordering + type family Mycompare_0123456789876543210 (a :: Foo2) (a :: Foo2) :: Ordering where + Mycompare_0123456789876543210 'F 'F = EQSym0 + Mycompare_0123456789876543210 'F _ = LTSym0 + Mycompare_0123456789876543210 _ _ = GTSym0 + type Mycompare_0123456789876543210Sym0 :: (~>) Foo2 ((~>) Foo2 Ordering) + data Mycompare_0123456789876543210Sym0 :: (~>) Foo2 ((~>) Foo2 Ordering) + where + Mycompare_0123456789876543210Sym0KindInference :: SameKind (Apply Mycompare_0123456789876543210Sym0 arg) (Mycompare_0123456789876543210Sym1 arg) => + Mycompare_0123456789876543210Sym0 a0123456789876543210 + type instance Apply Mycompare_0123456789876543210Sym0 a0123456789876543210 = Mycompare_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Mycompare_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Mycompare_0123456789876543210Sym0KindInference ()) + type Mycompare_0123456789876543210Sym1 :: Foo2 + -> (~>) Foo2 Ordering + data Mycompare_0123456789876543210Sym1 (a0123456789876543210 :: Foo2) :: (~>) Foo2 Ordering + where + Mycompare_0123456789876543210Sym1KindInference :: SameKind (Apply (Mycompare_0123456789876543210Sym1 a0123456789876543210) arg) (Mycompare_0123456789876543210Sym2 a0123456789876543210 arg) => + Mycompare_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (Mycompare_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Mycompare_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Mycompare_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Mycompare_0123456789876543210Sym1KindInference ()) + type Mycompare_0123456789876543210Sym2 :: Foo2 -> Foo2 -> Ordering + type family Mycompare_0123456789876543210Sym2 (a0123456789876543210 :: Foo2) (a0123456789876543210 :: Foo2) :: Ordering where + Mycompare_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Mycompare_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PMyOrd Foo2 where + type Mycompare a a = Apply (Apply Mycompare_0123456789876543210Sym0 a) a + type Compare_0123456789876543210 :: Foo2 -> Foo2 -> Ordering + type family Compare_0123456789876543210 (a :: Foo2) (a :: Foo2) :: Ordering where + Compare_0123456789876543210 'F 'F = EQSym0 + Compare_0123456789876543210 'F _ = LTSym0 + Compare_0123456789876543210 _ _ = GTSym0 + type Compare_0123456789876543210Sym0 :: (~>) Foo2 ((~>) Foo2 Ordering) + data Compare_0123456789876543210Sym0 :: (~>) Foo2 ((~>) Foo2 Ordering) + where + Compare_0123456789876543210Sym0KindInference :: SameKind (Apply Compare_0123456789876543210Sym0 arg) (Compare_0123456789876543210Sym1 arg) => + Compare_0123456789876543210Sym0 a0123456789876543210 + type instance Apply Compare_0123456789876543210Sym0 a0123456789876543210 = Compare_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Compare_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Compare_0123456789876543210Sym0KindInference ()) + type Compare_0123456789876543210Sym1 :: Foo2 -> (~>) Foo2 Ordering + data Compare_0123456789876543210Sym1 (a0123456789876543210 :: Foo2) :: (~>) Foo2 Ordering + where + Compare_0123456789876543210Sym1KindInference :: SameKind (Apply (Compare_0123456789876543210Sym1 a0123456789876543210) arg) (Compare_0123456789876543210Sym2 a0123456789876543210 arg) => + Compare_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (Compare_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Compare_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Compare_0123456789876543210Sym1KindInference ()) + type Compare_0123456789876543210Sym2 :: Foo2 -> Foo2 -> Ordering + type family Compare_0123456789876543210Sym2 (a0123456789876543210 :: Foo2) (a0123456789876543210 :: Foo2) :: Ordering where + Compare_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance POrd Foo2 where + type Compare a a = Apply (Apply Compare_0123456789876543210Sym0 a) a +Singletons/Classes.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| data Nat' = Zero' | Succ' Nat' + + instance MyOrd Nat' where + Zero' `mycompare` Zero' = EQ + Zero' `mycompare` (Succ' _) = LT + (Succ' _) `mycompare` Zero' = GT + (Succ' n) `mycompare` (Succ' m) = m `mycompare` n |] + ======> + data Nat' = Zero' | Succ' Nat' + instance MyOrd Nat' where + mycompare Zero' Zero' = EQ + mycompare Zero' (Succ' _) = LT + mycompare (Succ' _) Zero' = GT + mycompare (Succ' n) (Succ' m) = (m `mycompare` n) + type Zero'Sym0 :: Nat' + type family Zero'Sym0 :: Nat' where + Zero'Sym0 = Zero' + type Succ'Sym0 :: (~>) Nat' Nat' + data Succ'Sym0 :: (~>) Nat' Nat' + where + Succ'Sym0KindInference :: SameKind (Apply Succ'Sym0 arg) (Succ'Sym1 arg) => + Succ'Sym0 a0123456789876543210 + type instance Apply Succ'Sym0 a0123456789876543210 = Succ' a0123456789876543210 + instance SuppressUnusedWarnings Succ'Sym0 where + suppressUnusedWarnings = snd ((,) Succ'Sym0KindInference ()) + type Succ'Sym1 :: Nat' -> Nat' + type family Succ'Sym1 (a0123456789876543210 :: Nat') :: Nat' where + Succ'Sym1 a0123456789876543210 = Succ' a0123456789876543210 + type Mycompare_0123456789876543210 :: Nat' -> Nat' -> Ordering + type family Mycompare_0123456789876543210 (a :: Nat') (a :: Nat') :: Ordering where + Mycompare_0123456789876543210 Zero' Zero' = EQSym0 + Mycompare_0123456789876543210 Zero' (Succ' _) = LTSym0 + Mycompare_0123456789876543210 (Succ' _) Zero' = GTSym0 + Mycompare_0123456789876543210 (Succ' n) (Succ' m) = Apply (Apply MycompareSym0 m) n + type Mycompare_0123456789876543210Sym0 :: (~>) Nat' ((~>) Nat' Ordering) + data Mycompare_0123456789876543210Sym0 :: (~>) Nat' ((~>) Nat' Ordering) + where + Mycompare_0123456789876543210Sym0KindInference :: SameKind (Apply Mycompare_0123456789876543210Sym0 arg) (Mycompare_0123456789876543210Sym1 arg) => + Mycompare_0123456789876543210Sym0 a0123456789876543210 + type instance Apply Mycompare_0123456789876543210Sym0 a0123456789876543210 = Mycompare_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Mycompare_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Mycompare_0123456789876543210Sym0KindInference ()) + type Mycompare_0123456789876543210Sym1 :: Nat' + -> (~>) Nat' Ordering + data Mycompare_0123456789876543210Sym1 (a0123456789876543210 :: Nat') :: (~>) Nat' Ordering + where + Mycompare_0123456789876543210Sym1KindInference :: SameKind (Apply (Mycompare_0123456789876543210Sym1 a0123456789876543210) arg) (Mycompare_0123456789876543210Sym2 a0123456789876543210 arg) => + Mycompare_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (Mycompare_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Mycompare_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Mycompare_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Mycompare_0123456789876543210Sym1KindInference ()) + type Mycompare_0123456789876543210Sym2 :: Nat' -> Nat' -> Ordering + type family Mycompare_0123456789876543210Sym2 (a0123456789876543210 :: Nat') (a0123456789876543210 :: Nat') :: Ordering where + Mycompare_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Mycompare_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PMyOrd Nat' where + type Mycompare a a = Apply (Apply Mycompare_0123456789876543210Sym0 a) a + data SNat' :: Nat' -> Type + where + SZero' :: SNat' (Zero' :: Nat') + SSucc' :: forall (n :: Nat'). (Sing n) -> SNat' (Succ' n :: Nat') + type instance Sing @Nat' = SNat' + instance SingKind Nat' where + type Demote Nat' = Nat' + fromSing SZero' = Zero' + fromSing (SSucc' b) = Succ' (fromSing b) + toSing Zero' = SomeSing SZero' + toSing (Succ' (b :: Demote Nat')) + = case toSing b :: SomeSing Nat' of + SomeSing c -> SomeSing (SSucc' c) + instance SMyOrd Nat' where + sMycompare :: + forall (t :: Nat') (t :: Nat'). Sing t + -> Sing t + -> Sing (Apply (Apply (MycompareSym0 :: TyFun Nat' ((~>) Nat' Ordering) + -> Type) t) t) + sMycompare SZero' SZero' = SEQ + sMycompare SZero' (SSucc' _) = SLT + sMycompare (SSucc' _) SZero' = SGT + sMycompare (SSucc' (sN :: Sing n)) (SSucc' (sM :: Sing m)) + = applySing (applySing (singFun2 @MycompareSym0 sMycompare) sM) sN + instance SingI Zero' where + sing = SZero' + instance SingI n => SingI (Succ' (n :: Nat')) where + sing = SSucc' sing + instance SingI1 Succ' where + liftSing = SSucc' + instance SingI (Succ'Sym0 :: (~>) Nat' Nat') where + sing = singFun1 @Succ'Sym0 SSucc'
tests/compile-and-dump/Singletons/Classes.hs view
@@ -1,97 +1,97 @@-module Singletons.Classes where--import Data.Eq.Singletons-import Data.Ord.Singletons-import Data.Singletons.Base.TH-import Language.Haskell.TH.Desugar-import Prelude hiding (const)-import Singletons.Nat--$(singletons [d|- const :: a -> b -> a- const x _ = x-- class MyOrd a where- mycompare :: a -> a -> Ordering- (<=>) :: a -> a -> Ordering- (<=>) = mycompare- infix 4 <=>-- instance MyOrd Nat where- Zero `mycompare` Zero = EQ- Zero `mycompare` (Succ _) = LT- (Succ _) `mycompare` Zero = GT- (Succ n) `mycompare` (Succ m) = m `mycompare` n-- -- test eta-expansion- instance MyOrd () where- mycompare _ = const EQ-- data Foo = A | B-- fooCompare :: Foo -> Foo -> Ordering- fooCompare A A = EQ- fooCompare A B = LT- fooCompare B B = GT- fooCompare B A = EQ-- instance MyOrd Foo where- -- test that values in instance definitions are eta-expanded- mycompare = fooCompare-- data Foo2 = F | G-- instance Eq Foo2 where- F == F = True- G == G = True- F == G = False- G == F = False- |])--$(promote [d|- -- instance with overlaping equations. Tests #56- instance MyOrd Foo2 where- F `mycompare` F = EQ- F `mycompare` _ = LT- _ `mycompare` _ = GT-- instance Ord Foo2 where- F `compare` F = EQ- F `compare` _ = LT- _ `compare` _ = GT-- |])---- check promotion across different splices (#55)-$(singletons [d|- data Nat' = Zero' | Succ' Nat'- instance MyOrd Nat' where- Zero' `mycompare` Zero' = EQ- Zero' `mycompare` (Succ' _) = LT- (Succ' _) `mycompare` Zero' = GT- (Succ' n) `mycompare` (Succ' m) = m `mycompare` n- |])--foo1a :: Proxy (Zero `Mycompare` (Succ Zero))-foo1a = Proxy--foo1b :: Proxy LT-foo1b = foo1a--foo2a :: Proxy (A `Mycompare` A)-foo2a = Proxy--foo2b :: Proxy EQ-foo2b = foo2a--foo3a :: Proxy ('() `Mycompare` '())-foo3a = Proxy--foo3b :: Proxy EQ-foo3b = foo3a--foo4a :: Proxy (Succ' Zero' <=> Zero')-foo4a = Proxy--foo4b :: Proxy GT-foo4b = foo4a+module Singletons.Classes where + +import Data.Eq.Singletons +import Data.Ord.Singletons +import Data.Singletons.Base.TH +import Language.Haskell.TH.Desugar +import Prelude hiding (const) +import Singletons.Nat + +$(singletons [d| + const :: a -> b -> a + const x _ = x + + class MyOrd a where + mycompare :: a -> a -> Ordering + (<=>) :: a -> a -> Ordering + (<=>) = mycompare + infix 4 <=> + + instance MyOrd Nat where + Zero `mycompare` Zero = EQ + Zero `mycompare` (Succ _) = LT + (Succ _) `mycompare` Zero = GT + (Succ n) `mycompare` (Succ m) = m `mycompare` n + + -- test eta-expansion + instance MyOrd () where + mycompare _ = const EQ + + data Foo = A | B + + fooCompare :: Foo -> Foo -> Ordering + fooCompare A A = EQ + fooCompare A B = LT + fooCompare B B = GT + fooCompare B A = EQ + + instance MyOrd Foo where + -- test that values in instance definitions are eta-expanded + mycompare = fooCompare + + data Foo2 = F | G + + instance Eq Foo2 where + F == F = True + G == G = True + F == G = False + G == F = False + |]) + +$(promote [d| + -- instance with overlaping equations. Tests #56 + instance MyOrd Foo2 where + F `mycompare` F = EQ + F `mycompare` _ = LT + _ `mycompare` _ = GT + + instance Ord Foo2 where + F `compare` F = EQ + F `compare` _ = LT + _ `compare` _ = GT + + |]) + +-- check promotion across different splices (#55) +$(singletons [d| + data Nat' = Zero' | Succ' Nat' + instance MyOrd Nat' where + Zero' `mycompare` Zero' = EQ + Zero' `mycompare` (Succ' _) = LT + (Succ' _) `mycompare` Zero' = GT + (Succ' n) `mycompare` (Succ' m) = m `mycompare` n + |]) + +foo1a :: Proxy (Zero `Mycompare` (Succ Zero)) +foo1a = Proxy + +foo1b :: Proxy LT +foo1b = foo1a + +foo2a :: Proxy (A `Mycompare` A) +foo2a = Proxy + +foo2b :: Proxy EQ +foo2b = foo2a + +foo3a :: Proxy ('() `Mycompare` '()) +foo3a = Proxy + +foo3b :: Proxy EQ +foo3b = foo3a + +foo4a :: Proxy (Succ' Zero' <=> Zero') +foo4a = Proxy + +foo4b :: Proxy GT +foo4b = foo4a
tests/compile-and-dump/Singletons/Classes2.golden view
@@ -1,96 +1,94 @@-Singletons/Classes2.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| data NatFoo = ZeroFoo | SuccFoo NatFoo- - instance MyOrd NatFoo where- ZeroFoo `mycompare` ZeroFoo = EQ- ZeroFoo `mycompare` (SuccFoo _) = LT- (SuccFoo _) `mycompare` ZeroFoo = GT- (SuccFoo n) `mycompare` (SuccFoo m) = m `mycompare` n |]- ======>- data NatFoo = ZeroFoo | SuccFoo NatFoo- instance MyOrd NatFoo where- mycompare ZeroFoo ZeroFoo = EQ- mycompare ZeroFoo (SuccFoo _) = LT- mycompare (SuccFoo _) ZeroFoo = GT- mycompare (SuccFoo n) (SuccFoo m) = (m `mycompare` n)- type ZeroFooSym0 :: NatFoo- type family ZeroFooSym0 :: NatFoo where- ZeroFooSym0 = ZeroFoo- type SuccFooSym0 :: (~>) NatFoo NatFoo- data SuccFooSym0 :: (~>) NatFoo NatFoo- where- SuccFooSym0KindInference :: SameKind (Apply SuccFooSym0 arg) (SuccFooSym1 arg) =>- SuccFooSym0 a0123456789876543210- type instance Apply SuccFooSym0 a0123456789876543210 = SuccFoo a0123456789876543210- instance SuppressUnusedWarnings SuccFooSym0 where- suppressUnusedWarnings = snd (((,) SuccFooSym0KindInference) ())- type SuccFooSym1 :: NatFoo -> NatFoo- type family SuccFooSym1 (a0123456789876543210 :: NatFoo) :: NatFoo where- SuccFooSym1 a0123456789876543210 = SuccFoo a0123456789876543210- type Mycompare_0123456789876543210 :: NatFoo -> NatFoo -> Ordering- type family Mycompare_0123456789876543210 (a :: NatFoo) (a :: NatFoo) :: Ordering where- Mycompare_0123456789876543210 ZeroFoo ZeroFoo = EQSym0- Mycompare_0123456789876543210 ZeroFoo (SuccFoo _) = LTSym0- Mycompare_0123456789876543210 (SuccFoo _) ZeroFoo = GTSym0- Mycompare_0123456789876543210 (SuccFoo n) (SuccFoo m) = Apply (Apply MycompareSym0 m) n- type Mycompare_0123456789876543210Sym0 :: (~>) NatFoo ((~>) NatFoo Ordering)- data Mycompare_0123456789876543210Sym0 :: (~>) NatFoo ((~>) NatFoo Ordering)- where- Mycompare_0123456789876543210Sym0KindInference :: SameKind (Apply Mycompare_0123456789876543210Sym0 arg) (Mycompare_0123456789876543210Sym1 arg) =>- Mycompare_0123456789876543210Sym0 a0123456789876543210- type instance Apply Mycompare_0123456789876543210Sym0 a0123456789876543210 = Mycompare_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings Mycompare_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Mycompare_0123456789876543210Sym0KindInference) ())- type Mycompare_0123456789876543210Sym1 :: NatFoo- -> (~>) NatFoo Ordering- data Mycompare_0123456789876543210Sym1 (a0123456789876543210 :: NatFoo) :: (~>) NatFoo Ordering- where- Mycompare_0123456789876543210Sym1KindInference :: SameKind (Apply (Mycompare_0123456789876543210Sym1 a0123456789876543210) arg) (Mycompare_0123456789876543210Sym2 a0123456789876543210 arg) =>- Mycompare_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (Mycompare_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Mycompare_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Mycompare_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Mycompare_0123456789876543210Sym1KindInference) ())- type Mycompare_0123456789876543210Sym2 :: NatFoo- -> NatFoo -> Ordering- type family Mycompare_0123456789876543210Sym2 (a0123456789876543210 :: NatFoo) (a0123456789876543210 :: NatFoo) :: Ordering where- Mycompare_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Mycompare_0123456789876543210 a0123456789876543210 a0123456789876543210- instance PMyOrd NatFoo where- type Mycompare a a = Apply (Apply Mycompare_0123456789876543210Sym0 a) a- data SNatFoo :: NatFoo -> Type- where- SZeroFoo :: SNatFoo (ZeroFoo :: NatFoo)- SSuccFoo :: forall (n :: NatFoo).- (Sing n) -> SNatFoo (SuccFoo n :: NatFoo)- type instance Sing @NatFoo = SNatFoo- instance SingKind NatFoo where- type Demote NatFoo = NatFoo- fromSing SZeroFoo = ZeroFoo- fromSing (SSuccFoo b) = SuccFoo (fromSing b)- toSing ZeroFoo = SomeSing SZeroFoo- toSing (SuccFoo (b :: Demote NatFoo))- = case toSing b :: SomeSing NatFoo of- SomeSing c -> SomeSing (SSuccFoo c)- instance SMyOrd NatFoo where- sMycompare ::- forall (t1 :: NatFoo) (t2 :: NatFoo). Sing t1- -> Sing t2- -> Sing (Apply (Apply (MycompareSym0 :: TyFun NatFoo ((~>) NatFoo Ordering)- -> Type) t1) t2)- sMycompare SZeroFoo SZeroFoo = SEQ- sMycompare SZeroFoo (SSuccFoo _) = SLT- sMycompare (SSuccFoo _) SZeroFoo = SGT- sMycompare (SSuccFoo (sN :: Sing n)) (SSuccFoo (sM :: Sing m))- = (applySing- ((applySing ((singFun2 @MycompareSym0) sMycompare)) sM))- sN- instance SingI ZeroFoo where- sing = SZeroFoo- instance SingI n => SingI (SuccFoo (n :: NatFoo)) where- sing = SSuccFoo sing- instance SingI1 SuccFoo where- liftSing = SSuccFoo- instance SingI (SuccFooSym0 :: (~>) NatFoo NatFoo) where- sing = (singFun1 @SuccFooSym0) SSuccFoo+Singletons/Classes2.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| data NatFoo = ZeroFoo | SuccFoo NatFoo + + instance MyOrd NatFoo where + ZeroFoo `mycompare` ZeroFoo = EQ + ZeroFoo `mycompare` (SuccFoo _) = LT + (SuccFoo _) `mycompare` ZeroFoo = GT + (SuccFoo n) `mycompare` (SuccFoo m) = m `mycompare` n |] + ======> + data NatFoo = ZeroFoo | SuccFoo NatFoo + instance MyOrd NatFoo where + mycompare ZeroFoo ZeroFoo = EQ + mycompare ZeroFoo (SuccFoo _) = LT + mycompare (SuccFoo _) ZeroFoo = GT + mycompare (SuccFoo n) (SuccFoo m) = (m `mycompare` n) + type ZeroFooSym0 :: NatFoo + type family ZeroFooSym0 :: NatFoo where + ZeroFooSym0 = ZeroFoo + type SuccFooSym0 :: (~>) NatFoo NatFoo + data SuccFooSym0 :: (~>) NatFoo NatFoo + where + SuccFooSym0KindInference :: SameKind (Apply SuccFooSym0 arg) (SuccFooSym1 arg) => + SuccFooSym0 a0123456789876543210 + type instance Apply SuccFooSym0 a0123456789876543210 = SuccFoo a0123456789876543210 + instance SuppressUnusedWarnings SuccFooSym0 where + suppressUnusedWarnings = snd ((,) SuccFooSym0KindInference ()) + type SuccFooSym1 :: NatFoo -> NatFoo + type family SuccFooSym1 (a0123456789876543210 :: NatFoo) :: NatFoo where + SuccFooSym1 a0123456789876543210 = SuccFoo a0123456789876543210 + type Mycompare_0123456789876543210 :: NatFoo -> NatFoo -> Ordering + type family Mycompare_0123456789876543210 (a :: NatFoo) (a :: NatFoo) :: Ordering where + Mycompare_0123456789876543210 ZeroFoo ZeroFoo = EQSym0 + Mycompare_0123456789876543210 ZeroFoo (SuccFoo _) = LTSym0 + Mycompare_0123456789876543210 (SuccFoo _) ZeroFoo = GTSym0 + Mycompare_0123456789876543210 (SuccFoo n) (SuccFoo m) = Apply (Apply MycompareSym0 m) n + type Mycompare_0123456789876543210Sym0 :: (~>) NatFoo ((~>) NatFoo Ordering) + data Mycompare_0123456789876543210Sym0 :: (~>) NatFoo ((~>) NatFoo Ordering) + where + Mycompare_0123456789876543210Sym0KindInference :: SameKind (Apply Mycompare_0123456789876543210Sym0 arg) (Mycompare_0123456789876543210Sym1 arg) => + Mycompare_0123456789876543210Sym0 a0123456789876543210 + type instance Apply Mycompare_0123456789876543210Sym0 a0123456789876543210 = Mycompare_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Mycompare_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Mycompare_0123456789876543210Sym0KindInference ()) + type Mycompare_0123456789876543210Sym1 :: NatFoo + -> (~>) NatFoo Ordering + data Mycompare_0123456789876543210Sym1 (a0123456789876543210 :: NatFoo) :: (~>) NatFoo Ordering + where + Mycompare_0123456789876543210Sym1KindInference :: SameKind (Apply (Mycompare_0123456789876543210Sym1 a0123456789876543210) arg) (Mycompare_0123456789876543210Sym2 a0123456789876543210 arg) => + Mycompare_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (Mycompare_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Mycompare_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Mycompare_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Mycompare_0123456789876543210Sym1KindInference ()) + type Mycompare_0123456789876543210Sym2 :: NatFoo + -> NatFoo -> Ordering + type family Mycompare_0123456789876543210Sym2 (a0123456789876543210 :: NatFoo) (a0123456789876543210 :: NatFoo) :: Ordering where + Mycompare_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Mycompare_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PMyOrd NatFoo where + type Mycompare a a = Apply (Apply Mycompare_0123456789876543210Sym0 a) a + data SNatFoo :: NatFoo -> Type + where + SZeroFoo :: SNatFoo (ZeroFoo :: NatFoo) + SSuccFoo :: forall (n :: NatFoo). + (Sing n) -> SNatFoo (SuccFoo n :: NatFoo) + type instance Sing @NatFoo = SNatFoo + instance SingKind NatFoo where + type Demote NatFoo = NatFoo + fromSing SZeroFoo = ZeroFoo + fromSing (SSuccFoo b) = SuccFoo (fromSing b) + toSing ZeroFoo = SomeSing SZeroFoo + toSing (SuccFoo (b :: Demote NatFoo)) + = case toSing b :: SomeSing NatFoo of + SomeSing c -> SomeSing (SSuccFoo c) + instance SMyOrd NatFoo where + sMycompare :: + forall (t1 :: NatFoo) (t2 :: NatFoo). Sing t1 + -> Sing t2 + -> Sing (Apply (Apply (MycompareSym0 :: TyFun NatFoo ((~>) NatFoo Ordering) + -> Type) t1) t2) + sMycompare SZeroFoo SZeroFoo = SEQ + sMycompare SZeroFoo (SSuccFoo _) = SLT + sMycompare (SSuccFoo _) SZeroFoo = SGT + sMycompare (SSuccFoo (sN :: Sing n)) (SSuccFoo (sM :: Sing m)) + = applySing (applySing (singFun2 @MycompareSym0 sMycompare) sM) sN + instance SingI ZeroFoo where + sing = SZeroFoo + instance SingI n => SingI (SuccFoo (n :: NatFoo)) where + sing = SSuccFoo sing + instance SingI1 SuccFoo where + liftSing = SSuccFoo + instance SingI (SuccFooSym0 :: (~>) NatFoo NatFoo) where + sing = singFun1 @SuccFooSym0 SSuccFoo
tests/compile-and-dump/Singletons/Classes2.hs view
@@ -1,21 +1,21 @@-module Singletons.Classes2 where--import Data.Ord.Singletons (EQSym0, LTSym0, GTSym0, Sing(..))-import Data.Singletons.Base.TH-import Language.Haskell.TH.Desugar-import Prelude hiding (const)-import Singletons.Classes-import Singletons.Nat---$(singletons [d|- -- tests promotion of class instances when the class was declared- -- in a different source file than the instance.- data NatFoo = ZeroFoo | SuccFoo NatFoo-- instance MyOrd NatFoo where- ZeroFoo `mycompare` ZeroFoo = EQ- ZeroFoo `mycompare` (SuccFoo _) = LT- (SuccFoo _) `mycompare` ZeroFoo = GT- (SuccFoo n) `mycompare` (SuccFoo m) = m `mycompare` n- |])+module Singletons.Classes2 where + +import Data.Ord.Singletons (EQSym0, LTSym0, GTSym0, Sing(..)) +import Data.Singletons.Base.TH +import Language.Haskell.TH.Desugar +import Prelude hiding (const) +import Singletons.Classes +import Singletons.Nat + + +$(singletons [d| + -- tests promotion of class instances when the class was declared + -- in a different source file than the instance. + data NatFoo = ZeroFoo | SuccFoo NatFoo + + instance MyOrd NatFoo where + ZeroFoo `mycompare` ZeroFoo = EQ + ZeroFoo `mycompare` (SuccFoo _) = LT + (SuccFoo _) `mycompare` ZeroFoo = GT + (SuccFoo n) `mycompare` (SuccFoo m) = m `mycompare` n + |])
tests/compile-and-dump/Singletons/Contains.golden view
@@ -1,53 +1,53 @@-Singletons/Contains.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| contains :: Eq a => a -> [a] -> Bool- contains _ [] = False- contains elt (h : t) = (elt == h) || (contains elt t) |]- ======>- contains :: Eq a => a -> [a] -> Bool- contains _ [] = False- contains elt (h : t) = ((elt == h) || (contains elt) t)- type ContainsSym0 :: (~>) a ((~>) [a] Bool)- data ContainsSym0 :: (~>) a ((~>) [a] Bool)- where- ContainsSym0KindInference :: SameKind (Apply ContainsSym0 arg) (ContainsSym1 arg) =>- ContainsSym0 a0123456789876543210- type instance Apply ContainsSym0 a0123456789876543210 = ContainsSym1 a0123456789876543210- instance SuppressUnusedWarnings ContainsSym0 where- suppressUnusedWarnings = snd (((,) ContainsSym0KindInference) ())- type ContainsSym1 :: a -> (~>) [a] Bool- data ContainsSym1 (a0123456789876543210 :: a) :: (~>) [a] Bool- where- ContainsSym1KindInference :: SameKind (Apply (ContainsSym1 a0123456789876543210) arg) (ContainsSym2 a0123456789876543210 arg) =>- ContainsSym1 a0123456789876543210 a0123456789876543210- type instance Apply (ContainsSym1 a0123456789876543210) a0123456789876543210 = Contains a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ContainsSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) ContainsSym1KindInference) ())- type ContainsSym2 :: a -> [a] -> Bool- type family ContainsSym2 (a0123456789876543210 :: a) (a0123456789876543210 :: [a]) :: Bool where- ContainsSym2 a0123456789876543210 a0123456789876543210 = Contains a0123456789876543210 a0123456789876543210- type Contains :: a -> [a] -> Bool- type family Contains (a :: a) (a :: [a]) :: Bool where- Contains _ '[] = FalseSym0- Contains elt ('(:) h t) = Apply (Apply (||@#@$) (Apply (Apply (==@#@$) elt) h)) (Apply (Apply ContainsSym0 elt) t)- sContains ::- forall a (t :: a) (t :: [a]). SEq a =>- Sing t- -> Sing t -> Sing (Apply (Apply ContainsSym0 t) t :: Bool)- sContains _ SNil = SFalse- sContains (sElt :: Sing elt) (SCons (sH :: Sing h) (sT :: Sing t))- = (applySing- ((applySing ((singFun2 @(||@#@$)) (%||)))- ((applySing ((applySing ((singFun2 @(==@#@$)) (%==))) sElt)) sH)))- ((applySing- ((applySing ((singFun2 @ContainsSym0) sContains)) sElt))- sT)- instance SEq a =>- SingI (ContainsSym0 :: (~>) a ((~>) [a] Bool)) where- sing = (singFun2 @ContainsSym0) sContains- instance (SEq a, SingI d) =>- SingI (ContainsSym1 (d :: a) :: (~>) [a] Bool) where- sing = (singFun1 @(ContainsSym1 (d :: a))) (sContains (sing @d))- instance SEq a => SingI1 (ContainsSym1 :: a -> (~>) [a] Bool) where- liftSing (s :: Sing (d :: a))- = (singFun1 @(ContainsSym1 (d :: a))) (sContains s)+Singletons/Contains.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| contains :: Eq a => a -> [a] -> Bool + contains _ [] = False + contains elt (h : t) = (elt == h) || (contains elt t) |] + ======> + contains :: Eq a => a -> [a] -> Bool + contains _ [] = False + contains elt (h : t) = ((elt == h) || contains elt t) + type ContainsSym0 :: (~>) a ((~>) [a] Bool) + data ContainsSym0 :: (~>) a ((~>) [a] Bool) + where + ContainsSym0KindInference :: SameKind (Apply ContainsSym0 arg) (ContainsSym1 arg) => + ContainsSym0 a0123456789876543210 + type instance Apply ContainsSym0 a0123456789876543210 = ContainsSym1 a0123456789876543210 + instance SuppressUnusedWarnings ContainsSym0 where + suppressUnusedWarnings = snd ((,) ContainsSym0KindInference ()) + type ContainsSym1 :: a -> (~>) [a] Bool + data ContainsSym1 (a0123456789876543210 :: a) :: (~>) [a] Bool + where + ContainsSym1KindInference :: SameKind (Apply (ContainsSym1 a0123456789876543210) arg) (ContainsSym2 a0123456789876543210 arg) => + ContainsSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (ContainsSym1 a0123456789876543210) a0123456789876543210 = Contains a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ContainsSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) ContainsSym1KindInference ()) + type ContainsSym2 :: a -> [a] -> Bool + type family ContainsSym2 (a0123456789876543210 :: a) (a0123456789876543210 :: [a]) :: Bool where + ContainsSym2 a0123456789876543210 a0123456789876543210 = Contains a0123456789876543210 a0123456789876543210 + type Contains :: a -> [a] -> Bool + type family Contains (a :: a) (a :: [a]) :: Bool where + Contains _ '[] = FalseSym0 + Contains elt ('(:) h t) = Apply (Apply (||@#@$) (Apply (Apply (==@#@$) elt) h)) (Apply (Apply ContainsSym0 elt) t) + sContains :: + (forall (t :: a) (t :: [a]). + SEq a => + Sing t + -> Sing t -> Sing (Apply (Apply ContainsSym0 t) t :: Bool) :: Type) + sContains _ SNil = SFalse + sContains (sElt :: Sing elt) (SCons (sH :: Sing h) (sT :: Sing t)) + = applySing + (applySing + (singFun2 @(||@#@$) (%||)) + (applySing (applySing (singFun2 @(==@#@$) (%==)) sElt) sH)) + (applySing (applySing (singFun2 @ContainsSym0 sContains) sElt) sT) + instance SEq a => + SingI (ContainsSym0 :: (~>) a ((~>) [a] Bool)) where + sing = singFun2 @ContainsSym0 sContains + instance (SEq a, SingI d) => + SingI (ContainsSym1 (d :: a) :: (~>) [a] Bool) where + sing = singFun1 @(ContainsSym1 (d :: a)) (sContains (sing @d)) + instance SEq a => SingI1 (ContainsSym1 :: a -> (~>) [a] Bool) where + liftSing (s :: Sing (d :: a)) + = singFun1 @(ContainsSym1 (d :: a)) (sContains s)
tests/compile-and-dump/Singletons/Contains.hs view
@@ -1,12 +1,12 @@-module Singletons.Contains where--import Data.Singletons.TH-import Prelude.Singletons---- polymorphic function with context--$(singletons [d|- contains :: Eq a => a -> [a] -> Bool- contains _ [] = False- contains elt (h:t) = (elt == h) || (contains elt t)- |])+module Singletons.Contains where + +import Data.Singletons.TH +import Prelude.Singletons + +-- polymorphic function with context + +$(singletons [d| + contains :: Eq a => a -> [a] -> Bool + contains _ [] = False + contains elt (h:t) = (elt == h) || (contains elt t) + |])
tests/compile-and-dump/Singletons/DataValues.golden view
@@ -1,190 +1,203 @@-Singletons/DataValues.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| pr = Pair (Succ Zero) ([Zero])- complex = Pair (Pair (Just Zero) Zero) False- tuple = (False, Just Zero, True)- aList = [Zero, Succ Zero, Succ (Succ Zero)]- - data Pair a b- = Pair a b- deriving Show |]- ======>- data Pair a b- = Pair a b- deriving Show- pr = (Pair (Succ Zero)) [Zero]- complex = (Pair ((Pair (Just Zero)) Zero)) False- tuple = (False, Just Zero, True)- aList = [Zero, Succ Zero, Succ (Succ Zero)]- type PairSym0 :: forall a b. (~>) a ((~>) b (Pair a b))- data PairSym0 :: (~>) a ((~>) b (Pair a b))- where- PairSym0KindInference :: SameKind (Apply PairSym0 arg) (PairSym1 arg) =>- PairSym0 a0123456789876543210- type instance Apply PairSym0 a0123456789876543210 = PairSym1 a0123456789876543210- instance SuppressUnusedWarnings PairSym0 where- suppressUnusedWarnings = snd (((,) PairSym0KindInference) ())- type PairSym1 :: forall a b. a -> (~>) b (Pair a b)- data PairSym1 (a0123456789876543210 :: a) :: (~>) b (Pair a b)- where- PairSym1KindInference :: SameKind (Apply (PairSym1 a0123456789876543210) arg) (PairSym2 a0123456789876543210 arg) =>- PairSym1 a0123456789876543210 a0123456789876543210- type instance Apply (PairSym1 a0123456789876543210) a0123456789876543210 = Pair a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (PairSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) PairSym1KindInference) ())- type PairSym2 :: forall a b. a -> b -> Pair a b- type family PairSym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: Pair a b where- PairSym2 a0123456789876543210 a0123456789876543210 = Pair a0123456789876543210 a0123456789876543210- type family AListSym0 where- AListSym0 = AList- type family TupleSym0 where- TupleSym0 = Tuple- type family ComplexSym0 where- ComplexSym0 = Complex- type family PrSym0 where- PrSym0 = Pr- type family AList where- AList = Apply (Apply (:@#@$) ZeroSym0) (Apply (Apply (:@#@$) (Apply SuccSym0 ZeroSym0)) (Apply (Apply (:@#@$) (Apply SuccSym0 (Apply SuccSym0 ZeroSym0))) NilSym0))- type family Tuple where- Tuple = Apply (Apply (Apply Tuple3Sym0 FalseSym0) (Apply JustSym0 ZeroSym0)) TrueSym0- type family Complex where- Complex = Apply (Apply PairSym0 (Apply (Apply PairSym0 (Apply JustSym0 ZeroSym0)) ZeroSym0)) FalseSym0- type family Pr where- Pr = Apply (Apply PairSym0 (Apply SuccSym0 ZeroSym0)) (Apply (Apply (:@#@$) ZeroSym0) NilSym0)- type ShowsPrec_0123456789876543210 :: GHC.Num.Natural.Natural- -> Pair a b -> Symbol -> Symbol- type family ShowsPrec_0123456789876543210 (a :: GHC.Num.Natural.Natural) (a :: Pair a b) (a :: Symbol) :: Symbol where- ShowsPrec_0123456789876543210 p_0123456789876543210 (Pair arg_0123456789876543210 arg_0123456789876543210) a_0123456789876543210 = Apply (Apply (Apply ShowParenSym0 (Apply (Apply (>@#@$) p_0123456789876543210) (FromInteger 10))) (Apply (Apply (.@#@$) (Apply ShowStringSym0 "Pair ")) (Apply (Apply (.@#@$) (Apply (Apply ShowsPrecSym0 (FromInteger 11)) arg_0123456789876543210)) (Apply (Apply (.@#@$) ShowSpaceSym0) (Apply (Apply ShowsPrecSym0 (FromInteger 11)) arg_0123456789876543210))))) a_0123456789876543210- type ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) (Pair a b) ((~>) Symbol Symbol))- data ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) (Pair a b) ((~>) Symbol Symbol))- where- ShowsPrec_0123456789876543210Sym0KindInference :: SameKind (Apply ShowsPrec_0123456789876543210Sym0 arg) (ShowsPrec_0123456789876543210Sym1 arg) =>- ShowsPrec_0123456789876543210Sym0 a0123456789876543210- type instance Apply ShowsPrec_0123456789876543210Sym0 a0123456789876543210 = ShowsPrec_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings ShowsPrec_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym0KindInference) ())- type ShowsPrec_0123456789876543210Sym1 :: GHC.Num.Natural.Natural- -> (~>) (Pair a b) ((~>) Symbol Symbol)- data ShowsPrec_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Num.Natural.Natural) :: (~>) (Pair a b) ((~>) Symbol Symbol)- where- ShowsPrec_0123456789876543210Sym1KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 arg) =>- ShowsPrec_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym1KindInference) ())- type ShowsPrec_0123456789876543210Sym2 :: GHC.Num.Natural.Natural- -> Pair a b -> (~>) Symbol Symbol- data ShowsPrec_0123456789876543210Sym2 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: Pair a b) :: (~>) Symbol Symbol- where- ShowsPrec_0123456789876543210Sym2KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 arg) =>- ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym2KindInference) ())- type ShowsPrec_0123456789876543210Sym3 :: GHC.Num.Natural.Natural- -> Pair a b -> Symbol -> Symbol- type family ShowsPrec_0123456789876543210Sym3 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: Pair a b) (a0123456789876543210 :: Symbol) :: Symbol where- ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance PShow (Pair a b) where- type ShowsPrec a a a = Apply (Apply (Apply ShowsPrec_0123456789876543210Sym0 a) a) a- sAList :: Sing @_ AListSym0- sTuple :: Sing @_ TupleSym0- sComplex :: Sing @_ ComplexSym0- sPr :: Sing @_ PrSym0- sAList- = (applySing ((applySing ((singFun2 @(:@#@$)) SCons)) SZero))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing ((singFun1 @SuccSym0) SSucc)) SZero)))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing ((singFun1 @SuccSym0) SSucc))- ((applySing ((singFun1 @SuccSym0) SSucc)) SZero))))- SNil))- sTuple- = (applySing- ((applySing ((applySing ((singFun3 @Tuple3Sym0) STuple3)) SFalse))- ((applySing ((singFun1 @JustSym0) SJust)) SZero)))- STrue- sComplex- = (applySing- ((applySing ((singFun2 @PairSym0) SPair))- ((applySing- ((applySing ((singFun2 @PairSym0) SPair))- ((applySing ((singFun1 @JustSym0) SJust)) SZero)))- SZero)))- SFalse- sPr- = (applySing- ((applySing ((singFun2 @PairSym0) SPair))- ((applySing ((singFun1 @SuccSym0) SSucc)) SZero)))- ((applySing ((applySing ((singFun2 @(:@#@$)) SCons)) SZero)) SNil)- data SPair :: forall a b. Pair a b -> Type- where- SPair :: forall a b (n :: a) (n :: b).- (Sing n) -> (Sing n) -> SPair (Pair n n :: Pair a b)- type instance Sing @(Pair a b) = SPair- instance (SingKind a, SingKind b) => SingKind (Pair a b) where- type Demote (Pair a b) = Pair (Demote a) (Demote b)- fromSing (SPair b b) = (Pair (fromSing b)) (fromSing b)- toSing (Pair (b :: Demote a) (b :: Demote b))- = case ((,) (toSing b :: SomeSing a)) (toSing b :: SomeSing b) of- (,) (SomeSing c) (SomeSing c) -> SomeSing ((SPair c) c)- instance (SShow a, SShow b) => SShow (Pair a b) where- sShowsPrec ::- forall (t1 :: GHC.Num.Natural.Natural)- (t2 :: Pair a b)- (t3 :: Symbol). Sing t1- -> Sing t2- -> Sing t3- -> Sing (Apply (Apply (Apply (ShowsPrecSym0 :: TyFun GHC.Num.Natural.Natural ((~>) (Pair a b) ((~>) Symbol Symbol))- -> Type) t1) t2) t3)- sShowsPrec- (sP_0123456789876543210 :: Sing p_0123456789876543210)- (SPair (sArg_0123456789876543210 :: Sing arg_0123456789876543210)- (sArg_0123456789876543210 :: Sing arg_0123456789876543210))- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing- ((applySing ((singFun3 @ShowParenSym0) sShowParen))- ((applySing- ((applySing ((singFun2 @(>@#@$)) (%>))) sP_0123456789876543210))- (sFromInteger (sing :: Sing 10)))))- ((applySing- ((applySing ((singFun3 @(.@#@$)) (%.)))- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "Pair "))))- ((applySing- ((applySing ((singFun3 @(.@#@$)) (%.)))- ((applySing- ((applySing ((singFun3 @ShowsPrecSym0) sShowsPrec))- (sFromInteger (sing :: Sing 11))))- sArg_0123456789876543210)))- ((applySing- ((applySing ((singFun3 @(.@#@$)) (%.)))- ((singFun1 @ShowSpaceSym0) sShowSpace)))- ((applySing- ((applySing ((singFun3 @ShowsPrecSym0) sShowsPrec))- (sFromInteger (sing :: Sing 11))))- sArg_0123456789876543210))))))- sA_0123456789876543210- deriving instance (Data.Singletons.ShowSing.ShowSing a,- Data.Singletons.ShowSing.ShowSing b) =>- Show (SPair (z :: Pair a b))- instance (SingI n, SingI n) => SingI (Pair (n :: a) (n :: b)) where- sing = (SPair sing) sing- instance SingI n => SingI1 (Pair (n :: a)) where- liftSing = SPair sing- instance SingI2 Pair where- liftSing2 = SPair- instance SingI (PairSym0 :: (~>) a ((~>) b (Pair a b))) where- sing = (singFun2 @PairSym0) SPair- instance SingI d =>- SingI (PairSym1 (d :: a) :: (~>) b (Pair a b)) where- sing = (singFun1 @(PairSym1 (d :: a))) (SPair (sing @d))- instance SingI1 (PairSym1 :: a -> (~>) b (Pair a b)) where- liftSing (s :: Sing (d :: a))- = (singFun1 @(PairSym1 (d :: a))) (SPair s)+Singletons/DataValues.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| pr = Pair (Succ Zero) ([Zero]) + complex = Pair (Pair (Just Zero) Zero) False + tuple = (False, Just Zero, True) + aList = [Zero, Succ Zero, Succ (Succ Zero)] + + data Pair a b + = Pair a b + deriving Show |] + ======> + data Pair a b + = Pair a b + deriving Show + pr = Pair (Succ Zero) [Zero] + complex = Pair (Pair (Just Zero) Zero) False + tuple = (False, Just Zero, True) + aList = [Zero, Succ Zero, Succ (Succ Zero)] + type PairSym0 :: forall a b. (~>) a ((~>) b (Pair a b)) + data PairSym0 :: (~>) a ((~>) b (Pair a b)) + where + PairSym0KindInference :: SameKind (Apply PairSym0 arg) (PairSym1 arg) => + PairSym0 a0123456789876543210 + type instance Apply PairSym0 a0123456789876543210 = PairSym1 a0123456789876543210 + instance SuppressUnusedWarnings PairSym0 where + suppressUnusedWarnings = snd ((,) PairSym0KindInference ()) + type PairSym1 :: forall a b. a -> (~>) b (Pair a b) + data PairSym1 (a0123456789876543210 :: a) :: (~>) b (Pair a b) + where + PairSym1KindInference :: SameKind (Apply (PairSym1 a0123456789876543210) arg) (PairSym2 a0123456789876543210 arg) => + PairSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (PairSym1 a0123456789876543210) a0123456789876543210 = Pair a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (PairSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) PairSym1KindInference ()) + type PairSym2 :: forall a b. a -> b -> Pair a b + type family PairSym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: Pair a b where + PairSym2 a0123456789876543210 a0123456789876543210 = Pair a0123456789876543210 a0123456789876543210 + type family AListSym0 where + AListSym0 = AList + type family TupleSym0 where + TupleSym0 = Tuple + type family ComplexSym0 where + ComplexSym0 = Complex + type family PrSym0 where + PrSym0 = Pr + type family AList where + AList = Apply (Apply (:@#@$) ZeroSym0) (Apply (Apply (:@#@$) (Apply SuccSym0 ZeroSym0)) (Apply (Apply (:@#@$) (Apply SuccSym0 (Apply SuccSym0 ZeroSym0))) NilSym0)) + type family Tuple where + Tuple = Apply (Apply (Apply Tuple3Sym0 FalseSym0) (Apply JustSym0 ZeroSym0)) TrueSym0 + type family Complex where + Complex = Apply (Apply PairSym0 (Apply (Apply PairSym0 (Apply JustSym0 ZeroSym0)) ZeroSym0)) FalseSym0 + type family Pr where + Pr = Apply (Apply PairSym0 (Apply SuccSym0 ZeroSym0)) (Apply (Apply (:@#@$) ZeroSym0) NilSym0) + type ShowsPrec_0123456789876543210 :: GHC.Num.Natural.Natural + -> Pair a b -> Symbol -> Symbol + type family ShowsPrec_0123456789876543210 (a :: GHC.Num.Natural.Natural) (a :: Pair a b) (a :: Symbol) :: Symbol where + ShowsPrec_0123456789876543210 p_0123456789876543210 (Pair arg_0123456789876543210 arg_0123456789876543210) a_0123456789876543210 = Apply (Apply (Apply ShowParenSym0 (Apply (Apply (>@#@$) p_0123456789876543210) (FromInteger 10))) (Apply (Apply (.@#@$) (Apply ShowStringSym0 "Pair ")) (Apply (Apply (.@#@$) (Apply (Apply ShowsPrecSym0 (FromInteger 11)) arg_0123456789876543210)) (Apply (Apply (.@#@$) ShowSpaceSym0) (Apply (Apply ShowsPrecSym0 (FromInteger 11)) arg_0123456789876543210))))) a_0123456789876543210 + type ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) (Pair a b) ((~>) Symbol Symbol)) + data ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) (Pair a b) ((~>) Symbol Symbol)) + where + ShowsPrec_0123456789876543210Sym0KindInference :: SameKind (Apply ShowsPrec_0123456789876543210Sym0 arg) (ShowsPrec_0123456789876543210Sym1 arg) => + ShowsPrec_0123456789876543210Sym0 a0123456789876543210 + type instance Apply ShowsPrec_0123456789876543210Sym0 a0123456789876543210 = ShowsPrec_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings ShowsPrec_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym0KindInference ()) + type ShowsPrec_0123456789876543210Sym1 :: GHC.Num.Natural.Natural + -> (~>) (Pair a b) ((~>) Symbol Symbol) + data ShowsPrec_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Num.Natural.Natural) :: (~>) (Pair a b) ((~>) Symbol Symbol) + where + ShowsPrec_0123456789876543210Sym1KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 arg) => + ShowsPrec_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym1KindInference ()) + type ShowsPrec_0123456789876543210Sym2 :: GHC.Num.Natural.Natural + -> Pair a b -> (~>) Symbol Symbol + data ShowsPrec_0123456789876543210Sym2 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: Pair a b) :: (~>) Symbol Symbol + where + ShowsPrec_0123456789876543210Sym2KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 arg) => + ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym2KindInference ()) + type ShowsPrec_0123456789876543210Sym3 :: GHC.Num.Natural.Natural + -> Pair a b -> Symbol -> Symbol + type family ShowsPrec_0123456789876543210Sym3 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: Pair a b) (a0123456789876543210 :: Symbol) :: Symbol where + ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PShow (Pair a b) where + type ShowsPrec a a a = Apply (Apply (Apply ShowsPrec_0123456789876543210Sym0 a) a) a + sAList :: Sing @_ AListSym0 + sTuple :: Sing @_ TupleSym0 + sComplex :: Sing @_ ComplexSym0 + sPr :: Sing @_ PrSym0 + sAList + = applySing + (applySing (singFun2 @(:@#@$) SCons) SZero) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing (singFun1 @SuccSym0 SSucc) SZero)) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing + (singFun1 @SuccSym0 SSucc) + (applySing (singFun1 @SuccSym0 SSucc) SZero))) + SNil)) + sTuple + = applySing + (applySing + (applySing (singFun3 @Tuple3Sym0 STuple3) SFalse) + (applySing (singFun1 @JustSym0 SJust) SZero)) + STrue + sComplex + = applySing + (applySing + (singFun2 @PairSym0 SPair) + (applySing + (applySing + (singFun2 @PairSym0 SPair) + (applySing (singFun1 @JustSym0 SJust) SZero)) + SZero)) + SFalse + sPr + = applySing + (applySing + (singFun2 @PairSym0 SPair) + (applySing (singFun1 @SuccSym0 SSucc) SZero)) + (applySing (applySing (singFun2 @(:@#@$) SCons) SZero) SNil) + data SPair :: forall a b. Pair a b -> Type + where + SPair :: forall a b (n :: a) (n :: b). + (Sing n) -> (Sing n) -> SPair (Pair n n :: Pair a b) + type instance Sing @(Pair a b) = SPair + instance (SingKind a, SingKind b) => SingKind (Pair a b) where + type Demote (Pair a b) = Pair (Demote a) (Demote b) + fromSing (SPair b b) = Pair (fromSing b) (fromSing b) + toSing (Pair (b :: Demote a) (b :: Demote b)) + = case (,) (toSing b :: SomeSing a) (toSing b :: SomeSing b) of + (,) (SomeSing c) (SomeSing c) -> SomeSing (SPair c c) + instance (SShow a, SShow b) => SShow (Pair a b) where + sShowsPrec :: + forall (t1 :: GHC.Num.Natural.Natural) + (t2 :: Pair a b) + (t3 :: Symbol). Sing t1 + -> Sing t2 + -> Sing t3 + -> Sing (Apply (Apply (Apply (ShowsPrecSym0 :: TyFun GHC.Num.Natural.Natural ((~>) (Pair a b) ((~>) Symbol Symbol)) + -> Type) t1) t2) t3) + sShowsPrec + (sP_0123456789876543210 :: Sing p_0123456789876543210) + (SPair (sArg_0123456789876543210 :: Sing arg_0123456789876543210) + (sArg_0123456789876543210 :: Sing arg_0123456789876543210)) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (applySing + (singFun3 @ShowParenSym0 sShowParen) + (applySing + (applySing (singFun2 @(>@#@$) (%>)) sP_0123456789876543210) + (sFromInteger (sing :: Sing 10)))) + (applySing + (applySing + (singFun3 @(.@#@$) (%.)) + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "Pair "))) + (applySing + (applySing + (singFun3 @(.@#@$) (%.)) + (applySing + (applySing + (singFun3 @ShowsPrecSym0 sShowsPrec) + (sFromInteger (sing :: Sing 11))) + sArg_0123456789876543210)) + (applySing + (applySing + (singFun3 @(.@#@$) (%.)) (singFun1 @ShowSpaceSym0 sShowSpace)) + (applySing + (applySing + (singFun3 @ShowsPrecSym0 sShowsPrec) + (sFromInteger (sing :: Sing 11))) + sArg_0123456789876543210))))) + sA_0123456789876543210 + deriving instance (Data.Singletons.ShowSing.ShowSing a, + Data.Singletons.ShowSing.ShowSing b) => + Show (SPair (z :: Pair a b)) + instance (SingI n, SingI n) => SingI (Pair (n :: a) (n :: b)) where + sing = SPair sing sing + instance SingI n => SingI1 (Pair (n :: a)) where + liftSing = SPair sing + instance SingI2 Pair where + liftSing2 = SPair + instance SingI (PairSym0 :: (~>) a ((~>) b (Pair a b))) where + sing = singFun2 @PairSym0 SPair + instance SingI d => + SingI (PairSym1 (d :: a) :: (~>) b (Pair a b)) where + sing = singFun1 @(PairSym1 (d :: a)) (SPair (sing @d)) + instance SingI1 (PairSym1 :: a -> (~>) b (Pair a b)) where + liftSing (s :: Sing (d :: a)) + = singFun1 @(PairSym1 (d :: a)) (SPair s)
tests/compile-and-dump/Singletons/DataValues.hs view
@@ -1,19 +1,19 @@-module Singletons.DataValues where--import Data.Singletons.TH-import Prelude.Singletons-import Singletons.Nat-import Text.Show.Singletons--$(singletons [d|- data Pair a b = Pair a b deriving Show-- pr = Pair (Succ Zero) ([Zero])-- complex = Pair (Pair (Just Zero) Zero) False-- tuple = (False, Just Zero, True)-- aList = [Zero, Succ Zero, Succ (Succ Zero)]-- |])+module Singletons.DataValues where + +import Data.Singletons.TH +import Prelude.Singletons +import Singletons.Nat +import Text.Show.Singletons + +$(singletons [d| + data Pair a b = Pair a b deriving Show + + pr = Pair (Succ Zero) ([Zero]) + + complex = Pair (Pair (Just Zero) Zero) False + + tuple = (False, Just Zero, True) + + aList = [Zero, Succ Zero, Succ (Succ Zero)] + + |])
tests/compile-and-dump/Singletons/Empty.golden view
@@ -1,10 +1,10 @@-Singletons/Empty.hs:(0,0)-(0,0): Splicing declarations- singletons [d| data Empty |]- ======>- data Empty- data SEmpty :: Empty -> Type- type instance Sing @Empty = SEmpty- instance SingKind Empty where- type Demote Empty = Empty- fromSing x = case x of {}- toSing x = SomeSing (case x of {})+Singletons/Empty.hs:(0,0)-(0,0): Splicing declarations + singletons [d| data Empty |] + ======> + data Empty + data SEmpty :: Empty -> Type + type instance Sing @Empty = SEmpty + instance SingKind Empty where + type Demote Empty = Empty + fromSing x = case x of {} + toSing x = SomeSing (case x of {})
tests/compile-and-dump/Singletons/Empty.hs view
@@ -1,7 +1,7 @@-module Singletons.Empty where--import Data.Singletons.TH--$(singletons [d|- data Empty- |])+module Singletons.Empty where + +import Data.Singletons.TH + +$(singletons [d| + data Empty + |])
tests/compile-and-dump/Singletons/EmptyShowDeriving.golden view
@@ -1,73 +1,73 @@-Singletons/EmptyShowDeriving.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| data Foo- - deriving instance Show Foo |]- ======>- data Foo- deriving instance Show Foo- type family Case_0123456789876543210 v_0123456789876543210 a_0123456789876543210 t where- type ShowsPrec_0123456789876543210 :: GHC.Num.Natural.Natural- -> Foo -> GHC.Types.Symbol -> GHC.Types.Symbol- type family ShowsPrec_0123456789876543210 (a :: GHC.Num.Natural.Natural) (a :: Foo) (a :: GHC.Types.Symbol) :: GHC.Types.Symbol where- ShowsPrec_0123456789876543210 _ v_0123456789876543210 a_0123456789876543210 = Apply (Case_0123456789876543210 v_0123456789876543210 a_0123456789876543210 v_0123456789876543210) a_0123456789876543210- type ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) Foo ((~>) GHC.Types.Symbol GHC.Types.Symbol))- data ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) Foo ((~>) GHC.Types.Symbol GHC.Types.Symbol))- where- ShowsPrec_0123456789876543210Sym0KindInference :: SameKind (Apply ShowsPrec_0123456789876543210Sym0 arg) (ShowsPrec_0123456789876543210Sym1 arg) =>- ShowsPrec_0123456789876543210Sym0 a0123456789876543210- type instance Apply ShowsPrec_0123456789876543210Sym0 a0123456789876543210 = ShowsPrec_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings ShowsPrec_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym0KindInference) ())- type ShowsPrec_0123456789876543210Sym1 :: GHC.Num.Natural.Natural- -> (~>) Foo ((~>) GHC.Types.Symbol GHC.Types.Symbol)- data ShowsPrec_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Num.Natural.Natural) :: (~>) Foo ((~>) GHC.Types.Symbol GHC.Types.Symbol)- where- ShowsPrec_0123456789876543210Sym1KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 arg) =>- ShowsPrec_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym1KindInference) ())- type ShowsPrec_0123456789876543210Sym2 :: GHC.Num.Natural.Natural- -> Foo -> (~>) GHC.Types.Symbol GHC.Types.Symbol- data ShowsPrec_0123456789876543210Sym2 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: Foo) :: (~>) GHC.Types.Symbol GHC.Types.Symbol- where- ShowsPrec_0123456789876543210Sym2KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 arg) =>- ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym2KindInference) ())- type ShowsPrec_0123456789876543210Sym3 :: GHC.Num.Natural.Natural- -> Foo -> GHC.Types.Symbol -> GHC.Types.Symbol- type family ShowsPrec_0123456789876543210Sym3 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: Foo) (a0123456789876543210 :: GHC.Types.Symbol) :: GHC.Types.Symbol where- ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance PShow Foo where- type ShowsPrec a a a = Apply (Apply (Apply ShowsPrec_0123456789876543210Sym0 a) a) a- data SFoo :: Foo -> Type- type instance Sing @Foo = SFoo- instance SingKind Foo where- type Demote Foo = Foo- fromSing x = case x of {}- toSing x = SomeSing (case x of {})- instance SShow Foo where- sShowsPrec ::- forall (t1 :: GHC.Num.Natural.Natural)- (t2 :: Foo)- (t3 :: GHC.Types.Symbol). Sing t1- -> Sing t2- -> Sing t3- -> Sing (Apply (Apply (Apply (ShowsPrecSym0 :: TyFun GHC.Num.Natural.Natural ((~>) Foo ((~>) GHC.Types.Symbol GHC.Types.Symbol))- -> Type) t1) t2) t3)- sShowsPrec- _- (sV_0123456789876543210 :: Sing v_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((id- @(Sing (Case_0123456789876543210 v_0123456789876543210 a_0123456789876543210 v_0123456789876543210)))- (case sV_0123456789876543210 of {})))- sA_0123456789876543210- deriving instance Show (SFoo (z :: Foo))+Singletons/EmptyShowDeriving.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| data Foo + + deriving instance Show Foo |] + ======> + data Foo + deriving instance Show Foo + type family Case_0123456789876543210 v_0123456789876543210 a_0123456789876543210 t where + type ShowsPrec_0123456789876543210 :: GHC.Num.Natural.Natural + -> Foo -> GHC.Types.Symbol -> GHC.Types.Symbol + type family ShowsPrec_0123456789876543210 (a :: GHC.Num.Natural.Natural) (a :: Foo) (a :: GHC.Types.Symbol) :: GHC.Types.Symbol where + ShowsPrec_0123456789876543210 _ v_0123456789876543210 a_0123456789876543210 = Apply (Case_0123456789876543210 v_0123456789876543210 a_0123456789876543210 v_0123456789876543210) a_0123456789876543210 + type ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) Foo ((~>) GHC.Types.Symbol GHC.Types.Symbol)) + data ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) Foo ((~>) GHC.Types.Symbol GHC.Types.Symbol)) + where + ShowsPrec_0123456789876543210Sym0KindInference :: SameKind (Apply ShowsPrec_0123456789876543210Sym0 arg) (ShowsPrec_0123456789876543210Sym1 arg) => + ShowsPrec_0123456789876543210Sym0 a0123456789876543210 + type instance Apply ShowsPrec_0123456789876543210Sym0 a0123456789876543210 = ShowsPrec_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings ShowsPrec_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym0KindInference ()) + type ShowsPrec_0123456789876543210Sym1 :: GHC.Num.Natural.Natural + -> (~>) Foo ((~>) GHC.Types.Symbol GHC.Types.Symbol) + data ShowsPrec_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Num.Natural.Natural) :: (~>) Foo ((~>) GHC.Types.Symbol GHC.Types.Symbol) + where + ShowsPrec_0123456789876543210Sym1KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 arg) => + ShowsPrec_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym1KindInference ()) + type ShowsPrec_0123456789876543210Sym2 :: GHC.Num.Natural.Natural + -> Foo -> (~>) GHC.Types.Symbol GHC.Types.Symbol + data ShowsPrec_0123456789876543210Sym2 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: Foo) :: (~>) GHC.Types.Symbol GHC.Types.Symbol + where + ShowsPrec_0123456789876543210Sym2KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 arg) => + ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym2KindInference ()) + type ShowsPrec_0123456789876543210Sym3 :: GHC.Num.Natural.Natural + -> Foo -> GHC.Types.Symbol -> GHC.Types.Symbol + type family ShowsPrec_0123456789876543210Sym3 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: Foo) (a0123456789876543210 :: GHC.Types.Symbol) :: GHC.Types.Symbol where + ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PShow Foo where + type ShowsPrec a a a = Apply (Apply (Apply ShowsPrec_0123456789876543210Sym0 a) a) a + data SFoo :: Foo -> Type + type instance Sing @Foo = SFoo + instance SingKind Foo where + type Demote Foo = Foo + fromSing x = case x of {} + toSing x = SomeSing (case x of {}) + instance SShow Foo where + sShowsPrec :: + forall (t1 :: GHC.Num.Natural.Natural) + (t2 :: Foo) + (t3 :: GHC.Types.Symbol). Sing t1 + -> Sing t2 + -> Sing t3 + -> Sing (Apply (Apply (Apply (ShowsPrecSym0 :: TyFun GHC.Num.Natural.Natural ((~>) Foo ((~>) GHC.Types.Symbol GHC.Types.Symbol)) + -> Type) t1) t2) t3) + sShowsPrec + _ + (sV_0123456789876543210 :: Sing v_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (id + @(Sing (Case_0123456789876543210 v_0123456789876543210 a_0123456789876543210 v_0123456789876543210)) + (case sV_0123456789876543210 of {})) + sA_0123456789876543210 + deriving instance Show (SFoo (z :: Foo))
tests/compile-and-dump/Singletons/EmptyShowDeriving.hs view
@@ -1,7 +1,7 @@-module Singletons.EmptyShowDeriving where--import Data.Singletons.Base.TH--$(singletons [d| data Foo- deriving instance Show Foo- |])+module Singletons.EmptyShowDeriving where + +import Data.Singletons.Base.TH + +$(singletons [d| data Foo + deriving instance Show Foo + |])
tests/compile-and-dump/Singletons/EnumDeriving.golden view
@@ -1,218 +1,223 @@-Singletons/EnumDeriving.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| data Foo- = Bar | Baz | Bum- deriving Enum- data Quux = Q1 | Q2 |]- ======>- data Foo- = Bar | Baz | Bum- deriving Enum- data Quux = Q1 | Q2- type BarSym0 :: Foo- type family BarSym0 :: Foo where- BarSym0 = Bar- type BazSym0 :: Foo- type family BazSym0 :: Foo where- BazSym0 = Baz- type BumSym0 :: Foo- type family BumSym0 :: Foo where- BumSym0 = Bum- type Q1Sym0 :: Quux- type family Q1Sym0 :: Quux where- Q1Sym0 = Q1- type Q2Sym0 :: Quux- type family Q2Sym0 :: Quux where- Q2Sym0 = Q2- type family Case_0123456789876543210 n t where- Case_0123456789876543210 n 'True = BumSym0- Case_0123456789876543210 n 'False = Apply ErrorSym0 "toEnum: bad argument"- type family Case_0123456789876543210 n t where- Case_0123456789876543210 n 'True = BazSym0- Case_0123456789876543210 n 'False = Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (FromInteger 2))- type family Case_0123456789876543210 n t where- Case_0123456789876543210 n 'True = BarSym0- Case_0123456789876543210 n 'False = Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (FromInteger 1))- type ToEnum_0123456789876543210 :: GHC.Num.Natural.Natural -> Foo- type family ToEnum_0123456789876543210 (a :: GHC.Num.Natural.Natural) :: Foo where- ToEnum_0123456789876543210 n = Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (FromInteger 0))- type ToEnum_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural Foo- data ToEnum_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural Foo- where- ToEnum_0123456789876543210Sym0KindInference :: SameKind (Apply ToEnum_0123456789876543210Sym0 arg) (ToEnum_0123456789876543210Sym1 arg) =>- ToEnum_0123456789876543210Sym0 a0123456789876543210- type instance Apply ToEnum_0123456789876543210Sym0 a0123456789876543210 = ToEnum_0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings ToEnum_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) ToEnum_0123456789876543210Sym0KindInference) ())- type ToEnum_0123456789876543210Sym1 :: GHC.Num.Natural.Natural- -> Foo- type family ToEnum_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Num.Natural.Natural) :: Foo where- ToEnum_0123456789876543210Sym1 a0123456789876543210 = ToEnum_0123456789876543210 a0123456789876543210- type FromEnum_0123456789876543210 :: Foo -> GHC.Num.Natural.Natural- type family FromEnum_0123456789876543210 (a :: Foo) :: GHC.Num.Natural.Natural where- FromEnum_0123456789876543210 Bar = FromInteger 0- FromEnum_0123456789876543210 Baz = FromInteger 1- FromEnum_0123456789876543210 Bum = FromInteger 2- type FromEnum_0123456789876543210Sym0 :: (~>) Foo GHC.Num.Natural.Natural- data FromEnum_0123456789876543210Sym0 :: (~>) Foo GHC.Num.Natural.Natural- where- FromEnum_0123456789876543210Sym0KindInference :: SameKind (Apply FromEnum_0123456789876543210Sym0 arg) (FromEnum_0123456789876543210Sym1 arg) =>- FromEnum_0123456789876543210Sym0 a0123456789876543210- type instance Apply FromEnum_0123456789876543210Sym0 a0123456789876543210 = FromEnum_0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings FromEnum_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) FromEnum_0123456789876543210Sym0KindInference) ())- type FromEnum_0123456789876543210Sym1 :: Foo- -> GHC.Num.Natural.Natural- type family FromEnum_0123456789876543210Sym1 (a0123456789876543210 :: Foo) :: GHC.Num.Natural.Natural where- FromEnum_0123456789876543210Sym1 a0123456789876543210 = FromEnum_0123456789876543210 a0123456789876543210- instance PEnum Foo where- type ToEnum a = Apply ToEnum_0123456789876543210Sym0 a- type FromEnum a = Apply FromEnum_0123456789876543210Sym0 a- data SFoo :: Foo -> Type- where- SBar :: SFoo (Bar :: Foo)- SBaz :: SFoo (Baz :: Foo)- SBum :: SFoo (Bum :: Foo)- type instance Sing @Foo = SFoo- instance SingKind Foo where- type Demote Foo = Foo- fromSing SBar = Bar- fromSing SBaz = Baz- fromSing SBum = Bum- toSing Bar = SomeSing SBar- toSing Baz = SomeSing SBaz- toSing Bum = SomeSing SBum- data SQuux :: Quux -> Type- where- SQ1 :: SQuux (Q1 :: Quux)- SQ2 :: SQuux (Q2 :: Quux)- type instance Sing @Quux = SQuux- instance SingKind Quux where- type Demote Quux = Quux- fromSing SQ1 = Q1- fromSing SQ2 = Q2- toSing Q1 = SomeSing SQ1- toSing Q2 = SomeSing SQ2- instance SEnum Foo where- sToEnum ::- forall (t :: GHC.Num.Natural.Natural). Sing t- -> Sing (Apply (Data.Singletons.Base.Enum.ToEnumSym0 :: TyFun GHC.Num.Natural.Natural Foo- -> Type) t)- sFromEnum ::- forall (t :: Foo). Sing t- -> Sing (Apply (Data.Singletons.Base.Enum.FromEnumSym0 :: TyFun Foo GHC.Num.Natural.Natural- -> Type) t)- sToEnum (sN :: Sing n)- = (id- @(Sing (Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (FromInteger 0)))))- (case- (applySing ((applySing ((singFun2 @(==@#@$)) (%==))) sN))- (sFromInteger (sing :: Sing 0))- of- STrue -> SBar- SFalse- -> (id- @(Sing (Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (FromInteger 1)))))- (case- (applySing ((applySing ((singFun2 @(==@#@$)) (%==))) sN))- (sFromInteger (sing :: Sing 1))- of- STrue -> SBaz- SFalse- -> (id- @(Sing (Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (FromInteger 2)))))- (case- (applySing ((applySing ((singFun2 @(==@#@$)) (%==))) sN))- (sFromInteger (sing :: Sing 2))- of- STrue -> SBum- SFalse -> sError (sing :: Sing "toEnum: bad argument"))))- sFromEnum SBar = sFromInteger (sing :: Sing 0)- sFromEnum SBaz = sFromInteger (sing :: Sing 1)- sFromEnum SBum = sFromInteger (sing :: Sing 2)- instance SingI Bar where- sing = SBar- instance SingI Baz where- sing = SBaz- instance SingI Bum where- sing = SBum- instance SingI Q1 where- sing = SQ1- instance SingI Q2 where- sing = SQ2-Singletons/EnumDeriving.hs:0:0:: Splicing declarations- singEnumInstance ''Quux- ======>- type family Case_0123456789876543210 n t where- Case_0123456789876543210 n 'True = Q2Sym0- Case_0123456789876543210 n 'False = Apply ErrorSym0 "toEnum: bad argument"- type family Case_0123456789876543210 n t where- Case_0123456789876543210 n 'True = Q1Sym0- Case_0123456789876543210 n 'False = Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (FromInteger 1))- type ToEnum_0123456789876543210 :: GHC.Num.Natural.Natural -> Quux- type family ToEnum_0123456789876543210 (a :: GHC.Num.Natural.Natural) :: Quux where- ToEnum_0123456789876543210 n = Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (FromInteger 0))- type ToEnum_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural Quux- data ToEnum_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural Quux- where- ToEnum_0123456789876543210Sym0KindInference :: SameKind (Apply ToEnum_0123456789876543210Sym0 arg) (ToEnum_0123456789876543210Sym1 arg) =>- ToEnum_0123456789876543210Sym0 a0123456789876543210- type instance Apply ToEnum_0123456789876543210Sym0 a0123456789876543210 = ToEnum_0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings ToEnum_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) ToEnum_0123456789876543210Sym0KindInference) ())- type ToEnum_0123456789876543210Sym1 :: GHC.Num.Natural.Natural- -> Quux- type family ToEnum_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Num.Natural.Natural) :: Quux where- ToEnum_0123456789876543210Sym1 a0123456789876543210 = ToEnum_0123456789876543210 a0123456789876543210- type FromEnum_0123456789876543210 :: Quux- -> GHC.Num.Natural.Natural- type family FromEnum_0123456789876543210 (a :: Quux) :: GHC.Num.Natural.Natural where- FromEnum_0123456789876543210 'Q1 = FromInteger 0- FromEnum_0123456789876543210 'Q2 = FromInteger 1- type FromEnum_0123456789876543210Sym0 :: (~>) Quux GHC.Num.Natural.Natural- data FromEnum_0123456789876543210Sym0 :: (~>) Quux GHC.Num.Natural.Natural- where- FromEnum_0123456789876543210Sym0KindInference :: SameKind (Apply FromEnum_0123456789876543210Sym0 arg) (FromEnum_0123456789876543210Sym1 arg) =>- FromEnum_0123456789876543210Sym0 a0123456789876543210- type instance Apply FromEnum_0123456789876543210Sym0 a0123456789876543210 = FromEnum_0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings FromEnum_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) FromEnum_0123456789876543210Sym0KindInference) ())- type FromEnum_0123456789876543210Sym1 :: Quux- -> GHC.Num.Natural.Natural- type family FromEnum_0123456789876543210Sym1 (a0123456789876543210 :: Quux) :: GHC.Num.Natural.Natural where- FromEnum_0123456789876543210Sym1 a0123456789876543210 = FromEnum_0123456789876543210 a0123456789876543210- instance PEnum Quux where- type ToEnum a = Apply ToEnum_0123456789876543210Sym0 a- type FromEnum a = Apply FromEnum_0123456789876543210Sym0 a- instance SEnum Quux where- sToEnum ::- forall (t :: GHC.Num.Natural.Natural). Sing t- -> Sing (Apply (Data.Singletons.Base.Enum.ToEnumSym0 :: TyFun GHC.Num.Natural.Natural Quux- -> Type) t)- sFromEnum ::- forall (t :: Quux). Sing t- -> Sing (Apply (Data.Singletons.Base.Enum.FromEnumSym0 :: TyFun Quux GHC.Num.Natural.Natural- -> Type) t)- sToEnum (sN :: Sing n)- = (id- @(Sing (Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (FromInteger 0)))))- (case- (applySing ((applySing ((singFun2 @(==@#@$)) (%==))) sN))- (sFromInteger (sing :: Sing 0))- of- STrue -> SQ1- SFalse- -> (id- @(Sing (Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (FromInteger 1)))))- (case- (applySing ((applySing ((singFun2 @(==@#@$)) (%==))) sN))- (sFromInteger (sing :: Sing 1))- of- STrue -> SQ2- SFalse -> sError (sing :: Sing "toEnum: bad argument")))- sFromEnum SQ1 = sFromInteger (sing :: Sing 0)- sFromEnum SQ2 = sFromInteger (sing :: Sing 1)+Singletons/EnumDeriving.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| data Foo + = Bar | Baz | Bum + deriving Enum + data Quux = Q1 | Q2 |] + ======> + data Foo + = Bar | Baz | Bum + deriving Enum + data Quux = Q1 | Q2 + type BarSym0 :: Foo + type family BarSym0 :: Foo where + BarSym0 = Bar + type BazSym0 :: Foo + type family BazSym0 :: Foo where + BazSym0 = Baz + type BumSym0 :: Foo + type family BumSym0 :: Foo where + BumSym0 = Bum + type Q1Sym0 :: Quux + type family Q1Sym0 :: Quux where + Q1Sym0 = Q1 + type Q2Sym0 :: Quux + type family Q2Sym0 :: Quux where + Q2Sym0 = Q2 + type family Case_0123456789876543210 n t where + Case_0123456789876543210 n 'True = BumSym0 + Case_0123456789876543210 n 'False = Apply ErrorSym0 "toEnum: bad argument" + type family Case_0123456789876543210 n t where + Case_0123456789876543210 n 'True = BazSym0 + Case_0123456789876543210 n 'False = Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (FromInteger 2)) + type family Case_0123456789876543210 n t where + Case_0123456789876543210 n 'True = BarSym0 + Case_0123456789876543210 n 'False = Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (FromInteger 1)) + type ToEnum_0123456789876543210 :: GHC.Num.Natural.Natural -> Foo + type family ToEnum_0123456789876543210 (a :: GHC.Num.Natural.Natural) :: Foo where + ToEnum_0123456789876543210 n = Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (FromInteger 0)) + type ToEnum_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural Foo + data ToEnum_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural Foo + where + ToEnum_0123456789876543210Sym0KindInference :: SameKind (Apply ToEnum_0123456789876543210Sym0 arg) (ToEnum_0123456789876543210Sym1 arg) => + ToEnum_0123456789876543210Sym0 a0123456789876543210 + type instance Apply ToEnum_0123456789876543210Sym0 a0123456789876543210 = ToEnum_0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings ToEnum_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) ToEnum_0123456789876543210Sym0KindInference ()) + type ToEnum_0123456789876543210Sym1 :: GHC.Num.Natural.Natural + -> Foo + type family ToEnum_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Num.Natural.Natural) :: Foo where + ToEnum_0123456789876543210Sym1 a0123456789876543210 = ToEnum_0123456789876543210 a0123456789876543210 + type FromEnum_0123456789876543210 :: Foo -> GHC.Num.Natural.Natural + type family FromEnum_0123456789876543210 (a :: Foo) :: GHC.Num.Natural.Natural where + FromEnum_0123456789876543210 Bar = FromInteger 0 + FromEnum_0123456789876543210 Baz = FromInteger 1 + FromEnum_0123456789876543210 Bum = FromInteger 2 + type FromEnum_0123456789876543210Sym0 :: (~>) Foo GHC.Num.Natural.Natural + data FromEnum_0123456789876543210Sym0 :: (~>) Foo GHC.Num.Natural.Natural + where + FromEnum_0123456789876543210Sym0KindInference :: SameKind (Apply FromEnum_0123456789876543210Sym0 arg) (FromEnum_0123456789876543210Sym1 arg) => + FromEnum_0123456789876543210Sym0 a0123456789876543210 + type instance Apply FromEnum_0123456789876543210Sym0 a0123456789876543210 = FromEnum_0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings FromEnum_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) FromEnum_0123456789876543210Sym0KindInference ()) + type FromEnum_0123456789876543210Sym1 :: Foo + -> GHC.Num.Natural.Natural + type family FromEnum_0123456789876543210Sym1 (a0123456789876543210 :: Foo) :: GHC.Num.Natural.Natural where + FromEnum_0123456789876543210Sym1 a0123456789876543210 = FromEnum_0123456789876543210 a0123456789876543210 + instance PEnum Foo where + type ToEnum a = Apply ToEnum_0123456789876543210Sym0 a + type FromEnum a = Apply FromEnum_0123456789876543210Sym0 a + data SFoo :: Foo -> Type + where + SBar :: SFoo (Bar :: Foo) + SBaz :: SFoo (Baz :: Foo) + SBum :: SFoo (Bum :: Foo) + type instance Sing @Foo = SFoo + instance SingKind Foo where + type Demote Foo = Foo + fromSing SBar = Bar + fromSing SBaz = Baz + fromSing SBum = Bum + toSing Bar = SomeSing SBar + toSing Baz = SomeSing SBaz + toSing Bum = SomeSing SBum + data SQuux :: Quux -> Type + where + SQ1 :: SQuux (Q1 :: Quux) + SQ2 :: SQuux (Q2 :: Quux) + type instance Sing @Quux = SQuux + instance SingKind Quux where + type Demote Quux = Quux + fromSing SQ1 = Q1 + fromSing SQ2 = Q2 + toSing Q1 = SomeSing SQ1 + toSing Q2 = SomeSing SQ2 + instance SEnum Foo where + sToEnum :: + forall (t :: GHC.Num.Natural.Natural). Sing t + -> Sing (Apply (Data.Singletons.Base.Enum.ToEnumSym0 :: TyFun GHC.Num.Natural.Natural Foo + -> Type) t) + sFromEnum :: + forall (t :: Foo). Sing t + -> Sing (Apply (Data.Singletons.Base.Enum.FromEnumSym0 :: TyFun Foo GHC.Num.Natural.Natural + -> Type) t) + sToEnum (sN :: Sing n) + = id + @(Sing (Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (FromInteger 0)))) + (case + applySing + (applySing (singFun2 @(==@#@$) (%==)) sN) + (sFromInteger (sing :: Sing 0)) + of + STrue -> SBar + SFalse + -> id + @(Sing (Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (FromInteger 1)))) + (case + applySing + (applySing (singFun2 @(==@#@$) (%==)) sN) + (sFromInteger (sing :: Sing 1)) + of + STrue -> SBaz + SFalse + -> id + @(Sing (Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (FromInteger 2)))) + (case + applySing + (applySing (singFun2 @(==@#@$) (%==)) sN) + (sFromInteger (sing :: Sing 2)) + of + STrue -> SBum + SFalse -> sError (sing :: Sing "toEnum: bad argument")))) + sFromEnum SBar = sFromInteger (sing :: Sing 0) + sFromEnum SBaz = sFromInteger (sing :: Sing 1) + sFromEnum SBum = sFromInteger (sing :: Sing 2) + instance SingI Bar where + sing = SBar + instance SingI Baz where + sing = SBaz + instance SingI Bum where + sing = SBum + instance SingI Q1 where + sing = SQ1 + instance SingI Q2 where + sing = SQ2 +Singletons/EnumDeriving.hs:0:0:: Splicing declarations + singEnumInstance ''Quux + ======> + type family Case_0123456789876543210 n t where + Case_0123456789876543210 n 'True = Q2Sym0 + Case_0123456789876543210 n 'False = Apply ErrorSym0 "toEnum: bad argument" + type family Case_0123456789876543210 n t where + Case_0123456789876543210 n 'True = Q1Sym0 + Case_0123456789876543210 n 'False = Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (FromInteger 1)) + type ToEnum_0123456789876543210 :: GHC.Num.Natural.Natural -> Quux + type family ToEnum_0123456789876543210 (a :: GHC.Num.Natural.Natural) :: Quux where + ToEnum_0123456789876543210 n = Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (FromInteger 0)) + type ToEnum_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural Quux + data ToEnum_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural Quux + where + ToEnum_0123456789876543210Sym0KindInference :: SameKind (Apply ToEnum_0123456789876543210Sym0 arg) (ToEnum_0123456789876543210Sym1 arg) => + ToEnum_0123456789876543210Sym0 a0123456789876543210 + type instance Apply ToEnum_0123456789876543210Sym0 a0123456789876543210 = ToEnum_0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings ToEnum_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) ToEnum_0123456789876543210Sym0KindInference ()) + type ToEnum_0123456789876543210Sym1 :: GHC.Num.Natural.Natural + -> Quux + type family ToEnum_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Num.Natural.Natural) :: Quux where + ToEnum_0123456789876543210Sym1 a0123456789876543210 = ToEnum_0123456789876543210 a0123456789876543210 + type FromEnum_0123456789876543210 :: Quux + -> GHC.Num.Natural.Natural + type family FromEnum_0123456789876543210 (a :: Quux) :: GHC.Num.Natural.Natural where + FromEnum_0123456789876543210 'Q1 = FromInteger 0 + FromEnum_0123456789876543210 'Q2 = FromInteger 1 + type FromEnum_0123456789876543210Sym0 :: (~>) Quux GHC.Num.Natural.Natural + data FromEnum_0123456789876543210Sym0 :: (~>) Quux GHC.Num.Natural.Natural + where + FromEnum_0123456789876543210Sym0KindInference :: SameKind (Apply FromEnum_0123456789876543210Sym0 arg) (FromEnum_0123456789876543210Sym1 arg) => + FromEnum_0123456789876543210Sym0 a0123456789876543210 + type instance Apply FromEnum_0123456789876543210Sym0 a0123456789876543210 = FromEnum_0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings FromEnum_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) FromEnum_0123456789876543210Sym0KindInference ()) + type FromEnum_0123456789876543210Sym1 :: Quux + -> GHC.Num.Natural.Natural + type family FromEnum_0123456789876543210Sym1 (a0123456789876543210 :: Quux) :: GHC.Num.Natural.Natural where + FromEnum_0123456789876543210Sym1 a0123456789876543210 = FromEnum_0123456789876543210 a0123456789876543210 + instance PEnum Quux where + type ToEnum a = Apply ToEnum_0123456789876543210Sym0 a + type FromEnum a = Apply FromEnum_0123456789876543210Sym0 a + instance SEnum Quux where + sToEnum :: + forall (t :: GHC.Num.Natural.Natural). Sing t + -> Sing (Apply (Data.Singletons.Base.Enum.ToEnumSym0 :: TyFun GHC.Num.Natural.Natural Quux + -> Type) t) + sFromEnum :: + forall (t :: Quux). Sing t + -> Sing (Apply (Data.Singletons.Base.Enum.FromEnumSym0 :: TyFun Quux GHC.Num.Natural.Natural + -> Type) t) + sToEnum (sN :: Sing n) + = id + @(Sing (Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (FromInteger 0)))) + (case + applySing + (applySing (singFun2 @(==@#@$) (%==)) sN) + (sFromInteger (sing :: Sing 0)) + of + STrue -> SQ1 + SFalse + -> id + @(Sing (Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (FromInteger 1)))) + (case + applySing + (applySing (singFun2 @(==@#@$) (%==)) sN) + (sFromInteger (sing :: Sing 1)) + of + STrue -> SQ2 + SFalse -> sError (sing :: Sing "toEnum: bad argument"))) + sFromEnum SQ1 = sFromInteger (sing :: Sing 0) + sFromEnum SQ2 = sFromInteger (sing :: Sing 1)
tests/compile-and-dump/Singletons/EnumDeriving.hs view
@@ -1,11 +1,11 @@-module Singletons.EnumDeriving where--import Data.Singletons.Base.TH--$(singletons [d|- data Foo = Bar | Baz | Bum- deriving Enum- data Quux = Q1 | Q2- |])--$(singEnumInstance ''Quux)+module Singletons.EnumDeriving where + +import Data.Singletons.Base.TH + +$(singletons [d| + data Foo = Bar | Baz | Bum + deriving Enum + data Quux = Q1 | Q2 + |]) + +$(singEnumInstance ''Quux)
tests/compile-and-dump/Singletons/EqInstances.golden view
@@ -1,87 +1,88 @@-Singletons/EqInstances.hs:0:0:: Splicing declarations- singEqInstances [''Foo, ''Empty]- ======>- type TFHelper_0123456789876543210 :: Foo -> Foo -> Bool- type family TFHelper_0123456789876543210 (a :: Foo) (a :: Foo) :: Bool where- TFHelper_0123456789876543210 'FLeaf 'FLeaf = TrueSym0- TFHelper_0123456789876543210 'FLeaf ('(:+:) _ _) = FalseSym0- TFHelper_0123456789876543210 ('(:+:) _ _) 'FLeaf = FalseSym0- TFHelper_0123456789876543210 ('(:+:) a_0123456789876543210 a_0123456789876543210) ('(:+:) b_0123456789876543210 b_0123456789876543210) = Apply (Apply (&&@#@$) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)- type TFHelper_0123456789876543210Sym0 :: (~>) Foo ((~>) Foo Bool)- data TFHelper_0123456789876543210Sym0 :: (~>) Foo ((~>) Foo Bool)- where- TFHelper_0123456789876543210Sym0KindInference :: SameKind (Apply TFHelper_0123456789876543210Sym0 arg) (TFHelper_0123456789876543210Sym1 arg) =>- TFHelper_0123456789876543210Sym0 a0123456789876543210- type instance Apply TFHelper_0123456789876543210Sym0 a0123456789876543210 = TFHelper_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings TFHelper_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) TFHelper_0123456789876543210Sym0KindInference) ())- type TFHelper_0123456789876543210Sym1 :: Foo -> (~>) Foo Bool- data TFHelper_0123456789876543210Sym1 (a0123456789876543210 :: Foo) :: (~>) Foo Bool- where- TFHelper_0123456789876543210Sym1KindInference :: SameKind (Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) arg) (TFHelper_0123456789876543210Sym2 a0123456789876543210 arg) =>- TFHelper_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (TFHelper_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) TFHelper_0123456789876543210Sym1KindInference) ())- type TFHelper_0123456789876543210Sym2 :: Foo -> Foo -> Bool- type family TFHelper_0123456789876543210Sym2 (a0123456789876543210 :: Foo) (a0123456789876543210 :: Foo) :: Bool where- TFHelper_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210- instance PEq Foo where- type (==) a a = Apply (Apply TFHelper_0123456789876543210Sym0 a) a- instance SEq Foo => SEq Foo where- (%==) ::- forall (t1 :: Foo) (t2 :: Foo). Sing t1- -> Sing t2- -> Sing (Apply (Apply ((==@#@$) :: TyFun Foo ((~>) Foo Bool)- -> Type) t1) t2)- (%==) SFLeaf SFLeaf = STrue- (%==) SFLeaf ((:%+:) _ _) = SFalse- (%==) ((:%+:) _ _) SFLeaf = SFalse- (%==)- ((:%+:) (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210))- ((:%+:) (sB_0123456789876543210 :: Sing b_0123456789876543210)- (sB_0123456789876543210 :: Sing b_0123456789876543210))- = (applySing- ((applySing ((singFun2 @(&&@#@$)) (%&&)))- ((applySing- ((applySing ((singFun2 @(==@#@$)) (%==))) sA_0123456789876543210))- sB_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @(==@#@$)) (%==))) sA_0123456789876543210))- sB_0123456789876543210)- type TFHelper_0123456789876543210 :: Empty -> Empty -> Bool- type family TFHelper_0123456789876543210 (a :: Empty) (a :: Empty) :: Bool where- TFHelper_0123456789876543210 _ _ = TrueSym0- type TFHelper_0123456789876543210Sym0 :: (~>) Empty ((~>) Empty Bool)- data TFHelper_0123456789876543210Sym0 :: (~>) Empty ((~>) Empty Bool)- where- TFHelper_0123456789876543210Sym0KindInference :: SameKind (Apply TFHelper_0123456789876543210Sym0 arg) (TFHelper_0123456789876543210Sym1 arg) =>- TFHelper_0123456789876543210Sym0 a0123456789876543210- type instance Apply TFHelper_0123456789876543210Sym0 a0123456789876543210 = TFHelper_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings TFHelper_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) TFHelper_0123456789876543210Sym0KindInference) ())- type TFHelper_0123456789876543210Sym1 :: Empty -> (~>) Empty Bool- data TFHelper_0123456789876543210Sym1 (a0123456789876543210 :: Empty) :: (~>) Empty Bool- where- TFHelper_0123456789876543210Sym1KindInference :: SameKind (Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) arg) (TFHelper_0123456789876543210Sym2 a0123456789876543210 arg) =>- TFHelper_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (TFHelper_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) TFHelper_0123456789876543210Sym1KindInference) ())- type TFHelper_0123456789876543210Sym2 :: Empty -> Empty -> Bool- type family TFHelper_0123456789876543210Sym2 (a0123456789876543210 :: Empty) (a0123456789876543210 :: Empty) :: Bool where- TFHelper_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210- instance PEq Empty where- type (==) a a = Apply (Apply TFHelper_0123456789876543210Sym0 a) a- instance SEq Empty where- (%==) ::- forall (t1 :: Empty) (t2 :: Empty). Sing t1- -> Sing t2- -> Sing (Apply (Apply ((==@#@$) :: TyFun Empty ((~>) Empty Bool)- -> Type) t1) t2)- (%==) _ _ = STrue+Singletons/EqInstances.hs:0:0:: Splicing declarations + singEqInstances [''Foo, ''Empty] + ======> + type TFHelper_0123456789876543210 :: Foo -> Foo -> Bool + type family TFHelper_0123456789876543210 (a :: Foo) (a :: Foo) :: Bool where + TFHelper_0123456789876543210 'FLeaf 'FLeaf = TrueSym0 + TFHelper_0123456789876543210 'FLeaf ('(:+:) _ _) = FalseSym0 + TFHelper_0123456789876543210 ('(:+:) _ _) 'FLeaf = FalseSym0 + TFHelper_0123456789876543210 ('(:+:) a_0123456789876543210 a_0123456789876543210) ('(:+:) b_0123456789876543210 b_0123456789876543210) = Apply (Apply (&&@#@$) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210) + type TFHelper_0123456789876543210Sym0 :: (~>) Foo ((~>) Foo Bool) + data TFHelper_0123456789876543210Sym0 :: (~>) Foo ((~>) Foo Bool) + where + TFHelper_0123456789876543210Sym0KindInference :: SameKind (Apply TFHelper_0123456789876543210Sym0 arg) (TFHelper_0123456789876543210Sym1 arg) => + TFHelper_0123456789876543210Sym0 a0123456789876543210 + type instance Apply TFHelper_0123456789876543210Sym0 a0123456789876543210 = TFHelper_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings TFHelper_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) TFHelper_0123456789876543210Sym0KindInference ()) + type TFHelper_0123456789876543210Sym1 :: Foo -> (~>) Foo Bool + data TFHelper_0123456789876543210Sym1 (a0123456789876543210 :: Foo) :: (~>) Foo Bool + where + TFHelper_0123456789876543210Sym1KindInference :: SameKind (Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) arg) (TFHelper_0123456789876543210Sym2 a0123456789876543210 arg) => + TFHelper_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (TFHelper_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) TFHelper_0123456789876543210Sym1KindInference ()) + type TFHelper_0123456789876543210Sym2 :: Foo -> Foo -> Bool + type family TFHelper_0123456789876543210Sym2 (a0123456789876543210 :: Foo) (a0123456789876543210 :: Foo) :: Bool where + TFHelper_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PEq Foo where + type (==) a a = Apply (Apply TFHelper_0123456789876543210Sym0 a) a + instance SEq Foo => SEq Foo where + (%==) :: + forall (t1 :: Foo) (t2 :: Foo). Sing t1 + -> Sing t2 + -> Sing (Apply (Apply ((==@#@$) :: TyFun Foo ((~>) Foo Bool) + -> Type) t1) t2) + (%==) SFLeaf SFLeaf = STrue + (%==) SFLeaf ((:%+:) _ _) = SFalse + (%==) ((:%+:) _ _) SFLeaf = SFalse + (%==) + ((:%+:) (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210)) + ((:%+:) (sB_0123456789876543210 :: Sing b_0123456789876543210) + (sB_0123456789876543210 :: Sing b_0123456789876543210)) + = applySing + (applySing + (singFun2 @(&&@#@$) (%&&)) + (applySing + (applySing (singFun2 @(==@#@$) (%==)) sA_0123456789876543210) + sB_0123456789876543210)) + (applySing + (applySing (singFun2 @(==@#@$) (%==)) sA_0123456789876543210) + sB_0123456789876543210) + type TFHelper_0123456789876543210 :: Empty -> Empty -> Bool + type family TFHelper_0123456789876543210 (a :: Empty) (a :: Empty) :: Bool where + TFHelper_0123456789876543210 _ _ = TrueSym0 + type TFHelper_0123456789876543210Sym0 :: (~>) Empty ((~>) Empty Bool) + data TFHelper_0123456789876543210Sym0 :: (~>) Empty ((~>) Empty Bool) + where + TFHelper_0123456789876543210Sym0KindInference :: SameKind (Apply TFHelper_0123456789876543210Sym0 arg) (TFHelper_0123456789876543210Sym1 arg) => + TFHelper_0123456789876543210Sym0 a0123456789876543210 + type instance Apply TFHelper_0123456789876543210Sym0 a0123456789876543210 = TFHelper_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings TFHelper_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) TFHelper_0123456789876543210Sym0KindInference ()) + type TFHelper_0123456789876543210Sym1 :: Empty -> (~>) Empty Bool + data TFHelper_0123456789876543210Sym1 (a0123456789876543210 :: Empty) :: (~>) Empty Bool + where + TFHelper_0123456789876543210Sym1KindInference :: SameKind (Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) arg) (TFHelper_0123456789876543210Sym2 a0123456789876543210 arg) => + TFHelper_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (TFHelper_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) TFHelper_0123456789876543210Sym1KindInference ()) + type TFHelper_0123456789876543210Sym2 :: Empty -> Empty -> Bool + type family TFHelper_0123456789876543210Sym2 (a0123456789876543210 :: Empty) (a0123456789876543210 :: Empty) :: Bool where + TFHelper_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PEq Empty where + type (==) a a = Apply (Apply TFHelper_0123456789876543210Sym0 a) a + instance SEq Empty where + (%==) :: + forall (t1 :: Empty) (t2 :: Empty). Sing t1 + -> Sing t2 + -> Sing (Apply (Apply ((==@#@$) :: TyFun Empty ((~>) Empty Bool) + -> Type) t1) t2) + (%==) _ _ = STrue
tests/compile-and-dump/Singletons/EqInstances.hs view
@@ -1,8 +1,8 @@-module Singletons.EqInstances where--import Data.Bool.Singletons-import Data.Singletons.Base.TH-import Singletons.Empty-import Singletons.Operators--$(singEqInstances [''Foo, ''Empty])+module Singletons.EqInstances where + +import Data.Bool.Singletons +import Data.Singletons.Base.TH +import Singletons.Empty +import Singletons.Operators + +$(singEqInstances [''Foo, ''Empty])
tests/compile-and-dump/Singletons/Error.golden view
@@ -1,30 +1,30 @@-Singletons/Error.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| head :: [a] -> a- head (a : _) = a- head [] = error "head: empty list" |]- ======>- head :: [a] -> a- head (a : _) = a- head [] = error "head: empty list"- type HeadSym0 :: (~>) [a] a- data HeadSym0 :: (~>) [a] a- where- HeadSym0KindInference :: SameKind (Apply HeadSym0 arg) (HeadSym1 arg) =>- HeadSym0 a0123456789876543210- type instance Apply HeadSym0 a0123456789876543210 = Head a0123456789876543210- instance SuppressUnusedWarnings HeadSym0 where- suppressUnusedWarnings = snd (((,) HeadSym0KindInference) ())- type HeadSym1 :: [a] -> a- type family HeadSym1 (a0123456789876543210 :: [a]) :: a where- HeadSym1 a0123456789876543210 = Head a0123456789876543210- type Head :: [a] -> a- type family Head (a :: [a]) :: a where- Head ('(:) a _) = a- Head '[] = Apply ErrorSym0 "head: empty list"- sHead ::- forall a (t :: [a]). Sing t -> Sing (Apply HeadSym0 t :: a)- sHead (SCons (sA :: Sing a) _) = sA- sHead SNil = sError (sing :: Sing "head: empty list")- instance SingI (HeadSym0 :: (~>) [a] a) where- sing = (singFun1 @HeadSym0) sHead+Singletons/Error.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| head :: [a] -> a + head (a : _) = a + head [] = error "head: empty list" |] + ======> + head :: [a] -> a + head (a : _) = a + head [] = error "head: empty list" + type HeadSym0 :: (~>) [a] a + data HeadSym0 :: (~>) [a] a + where + HeadSym0KindInference :: SameKind (Apply HeadSym0 arg) (HeadSym1 arg) => + HeadSym0 a0123456789876543210 + type instance Apply HeadSym0 a0123456789876543210 = Head a0123456789876543210 + instance SuppressUnusedWarnings HeadSym0 where + suppressUnusedWarnings = snd ((,) HeadSym0KindInference ()) + type HeadSym1 :: [a] -> a + type family HeadSym1 (a0123456789876543210 :: [a]) :: a where + HeadSym1 a0123456789876543210 = Head a0123456789876543210 + type Head :: [a] -> a + type family Head (a :: [a]) :: a where + Head ('(:) a _) = a + Head '[] = Apply ErrorSym0 "head: empty list" + sHead :: + (forall (t :: [a]). Sing t -> Sing (Apply HeadSym0 t :: a) :: Type) + sHead (SCons (sA :: Sing a) _) = sA + sHead SNil = sError (sing :: Sing "head: empty list") + instance SingI (HeadSym0 :: (~>) [a] a) where + sing = singFun1 @HeadSym0 sHead
tests/compile-and-dump/Singletons/Error.hs view
@@ -1,11 +1,11 @@-module Singletons.Error where--import Data.Singletons-import Data.Singletons.TH-import Prelude.Singletons hiding (Head, HeadSym0, HeadSym1, sHead)--$(singletons [d|- head :: [a] -> a- head (a : _) = a- head [] = error "head: empty list"- |])+module Singletons.Error where + +import Data.Singletons +import Data.Singletons.TH +import Prelude.Singletons hiding (Head, HeadSym0, HeadSym1, sHead) + +$(singletons [d| + head :: [a] -> a + head (a : _) = a + head [] = error "head: empty list" + |])
tests/compile-and-dump/Singletons/Fixity.golden view
@@ -1,93 +1,96 @@-Singletons/Fixity.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| infix 4 ====- - (====) :: a -> a -> a- a ==== _ = a- - class MyOrd a where- (<=>) :: a -> a -> Ordering- infix 4 <=> |]- ======>- class MyOrd a where- (<=>) :: a -> a -> Ordering- infix 4 <=>- (====) :: a -> a -> a- (====) a _ = a- infix 4 ====- type (====@#@$) :: (~>) a ((~>) a a)- data (====@#@$) :: (~>) a ((~>) a a)- where- (:====@#@$###) :: SameKind (Apply (====@#@$) arg) ((====@#@$$) arg) =>- (====@#@$) a0123456789876543210- type instance Apply (====@#@$) a0123456789876543210 = (====@#@$$) a0123456789876543210- instance SuppressUnusedWarnings (====@#@$) where- suppressUnusedWarnings = snd (((,) (:====@#@$###)) ())- infix 4 ====@#@$- type (====@#@$$) :: a -> (~>) a a- data (====@#@$$) (a0123456789876543210 :: a) :: (~>) a a- where- (:====@#@$$###) :: SameKind (Apply ((====@#@$$) a0123456789876543210) arg) ((====@#@$$$) a0123456789876543210 arg) =>- (====@#@$$) a0123456789876543210 a0123456789876543210- type instance Apply ((====@#@$$) a0123456789876543210) a0123456789876543210 = (====) a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings ((====@#@$$) a0123456789876543210) where- suppressUnusedWarnings = snd (((,) (:====@#@$$###)) ())- infix 4 ====@#@$$- type (====@#@$$$) :: a -> a -> a- type family (====@#@$$$) (a0123456789876543210 :: a) (a0123456789876543210 :: a) :: a where- (====@#@$$$) a0123456789876543210 a0123456789876543210 = (====) a0123456789876543210 a0123456789876543210- infix 4 ====@#@$$$- type (====) :: a -> a -> a- type family (====) (a :: a) (a :: a) :: a where- (====) a _ = a- type (<=>@#@$) :: forall a. (~>) a ((~>) a Ordering)- data (<=>@#@$) :: (~>) a ((~>) a Ordering)- where- (:<=>@#@$###) :: SameKind (Apply (<=>@#@$) arg) ((<=>@#@$$) arg) =>- (<=>@#@$) a0123456789876543210- type instance Apply (<=>@#@$) a0123456789876543210 = (<=>@#@$$) a0123456789876543210- instance SuppressUnusedWarnings (<=>@#@$) where- suppressUnusedWarnings = snd (((,) (:<=>@#@$###)) ())- infix 4 <=>@#@$- type (<=>@#@$$) :: forall a. a -> (~>) a Ordering- data (<=>@#@$$) (a0123456789876543210 :: a) :: (~>) a Ordering- where- (:<=>@#@$$###) :: SameKind (Apply ((<=>@#@$$) a0123456789876543210) arg) ((<=>@#@$$$) a0123456789876543210 arg) =>- (<=>@#@$$) a0123456789876543210 a0123456789876543210- type instance Apply ((<=>@#@$$) a0123456789876543210) a0123456789876543210 = (<=>) a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings ((<=>@#@$$) a0123456789876543210) where- suppressUnusedWarnings = snd (((,) (:<=>@#@$$###)) ())- infix 4 <=>@#@$$- type (<=>@#@$$$) :: forall a. a -> a -> Ordering- type family (<=>@#@$$$) (a0123456789876543210 :: a) (a0123456789876543210 :: a) :: Ordering where- (<=>@#@$$$) a0123456789876543210 a0123456789876543210 = (<=>) a0123456789876543210 a0123456789876543210- infix 4 <=>@#@$$$- class PMyOrd a where- type family (<=>) (arg :: a) (arg :: a) :: Ordering- infix 4 %====- (%====) ::- forall a (t :: a) (t :: a). Sing t- -> Sing t -> Sing (Apply (Apply (====@#@$) t) t :: a)- (%====) (sA :: Sing a) _ = sA- instance SingI ((====@#@$) :: (~>) a ((~>) a a)) where- sing = (singFun2 @(====@#@$)) (%====)- instance SingI d => SingI ((====@#@$$) (d :: a) :: (~>) a a) where- sing = (singFun1 @((====@#@$$) (d :: a))) ((%====) (sing @d))- instance SingI1 ((====@#@$$) :: a -> (~>) a a) where- liftSing (s :: Sing (d :: a))- = (singFun1 @((====@#@$$) (d :: a))) ((%====) s)- class SMyOrd a where- (%<=>) ::- forall (t :: a) (t :: a). Sing t- -> Sing t -> Sing (Apply (Apply (<=>@#@$) t) t :: Ordering)- infix 4 %<=>- instance SMyOrd a =>- SingI ((<=>@#@$) :: (~>) a ((~>) a Ordering)) where- sing = (singFun2 @(<=>@#@$)) (%<=>)- instance (SMyOrd a, SingI d) =>- SingI ((<=>@#@$$) (d :: a) :: (~>) a Ordering) where- sing = (singFun1 @((<=>@#@$$) (d :: a))) ((%<=>) (sing @d))- instance SMyOrd a =>- SingI1 ((<=>@#@$$) :: a -> (~>) a Ordering) where- liftSing (s :: Sing (d :: a))- = (singFun1 @((<=>@#@$$) (d :: a))) ((%<=>) s)+Singletons/Fixity.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| infix 4 ==== + + (====) :: a -> a -> a + a ==== _ = a + + class MyOrd a where + (<=>) :: a -> a -> Ordering + infix 4 <=> |] + ======> + class MyOrd a where + (<=>) :: a -> a -> Ordering + infix 4 <=> + (====) :: a -> a -> a + (====) a _ = a + infix 4 ==== + type (====@#@$) :: (~>) a ((~>) a a) + data (====@#@$) :: (~>) a ((~>) a a) + where + (:====@#@$###) :: SameKind (Apply (====@#@$) arg) ((====@#@$$) arg) => + (====@#@$) a0123456789876543210 + type instance Apply (====@#@$) a0123456789876543210 = (====@#@$$) a0123456789876543210 + instance SuppressUnusedWarnings (====@#@$) where + suppressUnusedWarnings = snd ((,) (:====@#@$###) ()) + infix 4 ====@#@$ + type (====@#@$$) :: a -> (~>) a a + data (====@#@$$) (a0123456789876543210 :: a) :: (~>) a a + where + (:====@#@$$###) :: SameKind (Apply ((====@#@$$) a0123456789876543210) arg) ((====@#@$$$) a0123456789876543210 arg) => + (====@#@$$) a0123456789876543210 a0123456789876543210 + type instance Apply ((====@#@$$) a0123456789876543210) a0123456789876543210 = (====) a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings ((====@#@$$) a0123456789876543210) where + suppressUnusedWarnings = snd ((,) (:====@#@$$###) ()) + infix 4 ====@#@$$ + type (====@#@$$$) :: a -> a -> a + type family (====@#@$$$) (a0123456789876543210 :: a) (a0123456789876543210 :: a) :: a where + (====@#@$$$) a0123456789876543210 a0123456789876543210 = (====) a0123456789876543210 a0123456789876543210 + infix 4 ====@#@$$$ + type (====) :: a -> a -> a + type family (====) (a :: a) (a :: a) :: a where + (====) a _ = a + type (<=>@#@$) :: forall a. (~>) a ((~>) a Ordering) + data (<=>@#@$) :: (~>) a ((~>) a Ordering) + where + (:<=>@#@$###) :: SameKind (Apply (<=>@#@$) arg) ((<=>@#@$$) arg) => + (<=>@#@$) a0123456789876543210 + type instance Apply (<=>@#@$) a0123456789876543210 = (<=>@#@$$) a0123456789876543210 + instance SuppressUnusedWarnings (<=>@#@$) where + suppressUnusedWarnings = snd ((,) (:<=>@#@$###) ()) + infix 4 <=>@#@$ + type (<=>@#@$$) :: forall a. a -> (~>) a Ordering + data (<=>@#@$$) (a0123456789876543210 :: a) :: (~>) a Ordering + where + (:<=>@#@$$###) :: SameKind (Apply ((<=>@#@$$) a0123456789876543210) arg) ((<=>@#@$$$) a0123456789876543210 arg) => + (<=>@#@$$) a0123456789876543210 a0123456789876543210 + type instance Apply ((<=>@#@$$) a0123456789876543210) a0123456789876543210 = (<=>) a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings ((<=>@#@$$) a0123456789876543210) where + suppressUnusedWarnings = snd ((,) (:<=>@#@$$###) ()) + infix 4 <=>@#@$$ + type (<=>@#@$$$) :: forall a. a -> a -> Ordering + type family (<=>@#@$$$) (a0123456789876543210 :: a) (a0123456789876543210 :: a) :: Ordering where + (<=>@#@$$$) a0123456789876543210 a0123456789876543210 = (<=>) a0123456789876543210 a0123456789876543210 + infix 4 <=>@#@$$$ + class PMyOrd a where + type family (<=>) (arg :: a) (arg :: a) :: Ordering + infix 4 %==== + (%====) :: + (forall (t :: a) (t :: a). + Sing t + -> Sing t -> Sing (Apply (Apply (====@#@$) t) t :: a) :: Type) + (%====) (sA :: Sing a) _ = sA + instance SingI ((====@#@$) :: (~>) a ((~>) a a)) where + sing = singFun2 @(====@#@$) (%====) + instance SingI d => SingI ((====@#@$$) (d :: a) :: (~>) a a) where + sing = singFun1 @((====@#@$$) (d :: a)) ((%====) (sing @d)) + instance SingI1 ((====@#@$$) :: a -> (~>) a a) where + liftSing (s :: Sing (d :: a)) + = singFun1 @((====@#@$$) (d :: a)) ((%====) s) + class SMyOrd a where + (%<=>) :: + (forall (t :: a) (t :: a). + Sing t + -> Sing t + -> Sing (Apply (Apply (<=>@#@$) t) t :: Ordering) :: Type) + infix 4 %<=> + instance SMyOrd a => + SingI ((<=>@#@$) :: (~>) a ((~>) a Ordering)) where + sing = singFun2 @(<=>@#@$) (%<=>) + instance (SMyOrd a, SingI d) => + SingI ((<=>@#@$$) (d :: a) :: (~>) a Ordering) where + sing = singFun1 @((<=>@#@$$) (d :: a)) ((%<=>) (sing @d)) + instance SMyOrd a => + SingI1 ((<=>@#@$$) :: a -> (~>) a Ordering) where + liftSing (s :: Sing (d :: a)) + = singFun1 @((<=>@#@$$) (d :: a)) ((%<=>) s)
tests/compile-and-dump/Singletons/Fixity.hs view
@@ -1,16 +1,16 @@-module Singletons.Fixity where--import Data.Singletons-import Data.Singletons.TH-import Language.Haskell.TH.Desugar-import Prelude.Singletons--$(singletons [d|- class MyOrd a where- (<=>) :: a -> a -> Ordering- infix 4 <=>-- (====) :: a -> a -> a- a ==== _ = a- infix 4 ====- |])+module Singletons.Fixity where + +import Data.Singletons +import Data.Singletons.TH +import Language.Haskell.TH.Desugar +import Prelude.Singletons + +$(singletons [d| + class MyOrd a where + (<=>) :: a -> a -> Ordering + infix 4 <=> + + (====) :: a -> a -> a + a ==== _ = a + infix 4 ==== + |])
tests/compile-and-dump/Singletons/FunDeps.golden view
@@ -1,102 +1,106 @@-Singletons/FunDeps.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| t1 = meth True- - class FD a b | a -> b where- meth :: a -> a- l2r :: a -> b- - instance FD Bool Natural where- meth = not- l2r False = 0- l2r True = 1 |]- ======>- class FD a b | a -> b where- meth :: a -> a- l2r :: a -> b- instance FD Bool Natural where- meth = not- l2r False = 0- l2r True = 1- t1 = meth True- type family T1Sym0 where- T1Sym0 = T1- type family T1 where- T1 = Apply MethSym0 TrueSym0- type MethSym0 :: forall a. (~>) a a- data MethSym0 :: (~>) a a- where- MethSym0KindInference :: SameKind (Apply MethSym0 arg) (MethSym1 arg) =>- MethSym0 a0123456789876543210- type instance Apply MethSym0 a0123456789876543210 = Meth a0123456789876543210- instance SuppressUnusedWarnings MethSym0 where- suppressUnusedWarnings = snd (((,) MethSym0KindInference) ())- type MethSym1 :: forall a. a -> a- type family MethSym1 (a0123456789876543210 :: a) :: a where- MethSym1 a0123456789876543210 = Meth a0123456789876543210- type L2rSym0 :: forall a b. (~>) a b- data L2rSym0 :: (~>) a b- where- L2rSym0KindInference :: SameKind (Apply L2rSym0 arg) (L2rSym1 arg) =>- L2rSym0 a0123456789876543210- type instance Apply L2rSym0 a0123456789876543210 = L2r a0123456789876543210- instance SuppressUnusedWarnings L2rSym0 where- suppressUnusedWarnings = snd (((,) L2rSym0KindInference) ())- type L2rSym1 :: forall a b. a -> b- type family L2rSym1 (a0123456789876543210 :: a) :: b where- L2rSym1 a0123456789876543210 = L2r a0123456789876543210- class PFD a b | a -> b where- type family Meth (arg :: a) :: a- type family L2r (arg :: a) :: b- type Meth_0123456789876543210 :: Bool -> Bool- type family Meth_0123456789876543210 (a :: Bool) :: Bool where- Meth_0123456789876543210 a_0123456789876543210 = Apply NotSym0 a_0123456789876543210- type Meth_0123456789876543210Sym0 :: (~>) Bool Bool- data Meth_0123456789876543210Sym0 :: (~>) Bool Bool- where- Meth_0123456789876543210Sym0KindInference :: SameKind (Apply Meth_0123456789876543210Sym0 arg) (Meth_0123456789876543210Sym1 arg) =>- Meth_0123456789876543210Sym0 a0123456789876543210- type instance Apply Meth_0123456789876543210Sym0 a0123456789876543210 = Meth_0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings Meth_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Meth_0123456789876543210Sym0KindInference) ())- type Meth_0123456789876543210Sym1 :: Bool -> Bool- type family Meth_0123456789876543210Sym1 (a0123456789876543210 :: Bool) :: Bool where- Meth_0123456789876543210Sym1 a0123456789876543210 = Meth_0123456789876543210 a0123456789876543210- type L2r_0123456789876543210 :: Bool -> Natural- type family L2r_0123456789876543210 (a :: Bool) :: Natural where- L2r_0123456789876543210 'False = FromInteger 0- L2r_0123456789876543210 'True = FromInteger 1- type L2r_0123456789876543210Sym0 :: (~>) Bool Natural- data L2r_0123456789876543210Sym0 :: (~>) Bool Natural- where- L2r_0123456789876543210Sym0KindInference :: SameKind (Apply L2r_0123456789876543210Sym0 arg) (L2r_0123456789876543210Sym1 arg) =>- L2r_0123456789876543210Sym0 a0123456789876543210- type instance Apply L2r_0123456789876543210Sym0 a0123456789876543210 = L2r_0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings L2r_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) L2r_0123456789876543210Sym0KindInference) ())- type L2r_0123456789876543210Sym1 :: Bool -> Natural- type family L2r_0123456789876543210Sym1 (a0123456789876543210 :: Bool) :: Natural where- L2r_0123456789876543210Sym1 a0123456789876543210 = L2r_0123456789876543210 a0123456789876543210- instance PFD Bool Natural where- type Meth a = Apply Meth_0123456789876543210Sym0 a- type L2r a = Apply L2r_0123456789876543210Sym0 a- sT1 :: Sing @_ T1Sym0- sT1 = (applySing ((singFun1 @MethSym0) sMeth)) STrue- class SFD a b | a -> b where- sMeth :: forall (t :: a). Sing t -> Sing (Apply MethSym0 t :: a)- sL2r :: forall (t :: a). Sing t -> Sing (Apply L2rSym0 t :: b)- instance SFD Bool Natural where- sMeth ::- forall (t :: Bool). Sing t -> Sing (Apply MethSym0 t :: Bool)- sL2r ::- forall (t :: Bool). Sing t -> Sing (Apply L2rSym0 t :: Natural)- sMeth (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing ((singFun1 @NotSym0) sNot)) sA_0123456789876543210- sL2r SFalse = sFromInteger (sing :: Sing 0)- sL2r STrue = sFromInteger (sing :: Sing 1)- instance SFD a b => SingI (MethSym0 :: (~>) a a) where- sing = (singFun1 @MethSym0) sMeth- instance SFD a b => SingI (L2rSym0 :: (~>) a b) where- sing = (singFun1 @L2rSym0) sL2r+Singletons/FunDeps.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| t1 = meth True + + class FD a b | a -> b where + meth :: a -> a + l2r :: a -> b + + instance FD Bool Natural where + meth = not + l2r False = 0 + l2r True = 1 |] + ======> + class FD a b | a -> b where + meth :: a -> a + l2r :: a -> b + instance FD Bool Natural where + meth = not + l2r False = 0 + l2r True = 1 + t1 = meth True + type family T1Sym0 where + T1Sym0 = T1 + type family T1 where + T1 = Apply MethSym0 TrueSym0 + type MethSym0 :: forall a. (~>) a a + data MethSym0 :: (~>) a a + where + MethSym0KindInference :: SameKind (Apply MethSym0 arg) (MethSym1 arg) => + MethSym0 a0123456789876543210 + type instance Apply MethSym0 a0123456789876543210 = Meth a0123456789876543210 + instance SuppressUnusedWarnings MethSym0 where + suppressUnusedWarnings = snd ((,) MethSym0KindInference ()) + type MethSym1 :: forall a. a -> a + type family MethSym1 (a0123456789876543210 :: a) :: a where + MethSym1 a0123456789876543210 = Meth a0123456789876543210 + type L2rSym0 :: forall a b. (~>) a b + data L2rSym0 :: (~>) a b + where + L2rSym0KindInference :: SameKind (Apply L2rSym0 arg) (L2rSym1 arg) => + L2rSym0 a0123456789876543210 + type instance Apply L2rSym0 a0123456789876543210 = L2r a0123456789876543210 + instance SuppressUnusedWarnings L2rSym0 where + suppressUnusedWarnings = snd ((,) L2rSym0KindInference ()) + type L2rSym1 :: forall a b. a -> b + type family L2rSym1 (a0123456789876543210 :: a) :: b where + L2rSym1 a0123456789876543210 = L2r a0123456789876543210 + class PFD a b | a -> b where + type family Meth (arg :: a) :: a + type family L2r (arg :: a) :: b + type Meth_0123456789876543210 :: Bool -> Bool + type family Meth_0123456789876543210 (a :: Bool) :: Bool where + Meth_0123456789876543210 a_0123456789876543210 = Apply NotSym0 a_0123456789876543210 + type Meth_0123456789876543210Sym0 :: (~>) Bool Bool + data Meth_0123456789876543210Sym0 :: (~>) Bool Bool + where + Meth_0123456789876543210Sym0KindInference :: SameKind (Apply Meth_0123456789876543210Sym0 arg) (Meth_0123456789876543210Sym1 arg) => + Meth_0123456789876543210Sym0 a0123456789876543210 + type instance Apply Meth_0123456789876543210Sym0 a0123456789876543210 = Meth_0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings Meth_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Meth_0123456789876543210Sym0KindInference ()) + type Meth_0123456789876543210Sym1 :: Bool -> Bool + type family Meth_0123456789876543210Sym1 (a0123456789876543210 :: Bool) :: Bool where + Meth_0123456789876543210Sym1 a0123456789876543210 = Meth_0123456789876543210 a0123456789876543210 + type L2r_0123456789876543210 :: Bool -> Natural + type family L2r_0123456789876543210 (a :: Bool) :: Natural where + L2r_0123456789876543210 'False = FromInteger 0 + L2r_0123456789876543210 'True = FromInteger 1 + type L2r_0123456789876543210Sym0 :: (~>) Bool Natural + data L2r_0123456789876543210Sym0 :: (~>) Bool Natural + where + L2r_0123456789876543210Sym0KindInference :: SameKind (Apply L2r_0123456789876543210Sym0 arg) (L2r_0123456789876543210Sym1 arg) => + L2r_0123456789876543210Sym0 a0123456789876543210 + type instance Apply L2r_0123456789876543210Sym0 a0123456789876543210 = L2r_0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings L2r_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) L2r_0123456789876543210Sym0KindInference ()) + type L2r_0123456789876543210Sym1 :: Bool -> Natural + type family L2r_0123456789876543210Sym1 (a0123456789876543210 :: Bool) :: Natural where + L2r_0123456789876543210Sym1 a0123456789876543210 = L2r_0123456789876543210 a0123456789876543210 + instance PFD Bool Natural where + type Meth a = Apply Meth_0123456789876543210Sym0 a + type L2r a = Apply L2r_0123456789876543210Sym0 a + sT1 :: Sing @_ T1Sym0 + sT1 = applySing (singFun1 @MethSym0 sMeth) STrue + class SFD a b | a -> b where + sMeth :: + (forall (t :: a). Sing t -> Sing (Apply MethSym0 t :: a) :: Type) + sL2r :: + (forall (t :: a). Sing t -> Sing (Apply L2rSym0 t :: b) :: Type) + instance SFD Bool Natural where + sMeth :: + (forall (t :: Bool). + Sing t -> Sing (Apply MethSym0 t :: Bool) :: Type) + sL2r :: + (forall (t :: Bool). + Sing t -> Sing (Apply L2rSym0 t :: Natural) :: Type) + sMeth (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing (singFun1 @NotSym0 sNot) sA_0123456789876543210 + sL2r SFalse = sFromInteger (sing :: Sing 0) + sL2r STrue = sFromInteger (sing :: Sing 1) + instance SFD a b => SingI (MethSym0 :: (~>) a a) where + sing = singFun1 @MethSym0 sMeth + instance SFD a b => SingI (L2rSym0 :: (~>) a b) where + sing = singFun1 @L2rSym0 sL2r
tests/compile-and-dump/Singletons/FunDeps.hs view
@@ -1,21 +1,21 @@-{-# LANGUAGE FunctionalDependencies #-}--module Singletons.FunDeps where--import Data.Singletons.TH-import GHC.TypeLits.Singletons-import Prelude.Singletons--$( singletons [d|- class FD a b | a -> b where- meth :: a -> a- l2r :: a -> b-- instance FD Bool Natural where- meth = not- l2r False = 0- l2r True = 1-- t1 = meth True--- t2 = l2r False -- This fails because no FDs in type families- |])+{-# LANGUAGE FunctionalDependencies #-} + +module Singletons.FunDeps where + +import Data.Singletons.TH +import GHC.TypeLits.Singletons +import Prelude.Singletons + +$( singletons [d| + class FD a b | a -> b where + meth :: a -> a + l2r :: a -> b + + instance FD Bool Natural where + meth = not + l2r False = 0 + l2r True = 1 + + t1 = meth True +-- t2 = l2r False -- This fails because no FDs in type families + |])
tests/compile-and-dump/Singletons/FunctorLikeDeriving.golden view
@@ -1,1373 +1,1385 @@-Singletons/FunctorLikeDeriving.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| data T x a- = MkT1 x a (Maybe a) (Maybe (Maybe a)) | MkT2 (Maybe x)- deriving (Functor, Foldable, Traversable)- data Empty (a :: Type) deriving (Functor, Foldable, Traversable) |]- ======>- data T x a- = MkT1 x a (Maybe a) (Maybe (Maybe a)) | MkT2 (Maybe x)- deriving (Functor, Foldable, Traversable)- data Empty (a :: Type) deriving (Functor, Foldable, Traversable)- type MkT1Sym0 :: forall x- a. (~>) x ((~>) a ((~>) (Maybe a) ((~>) (Maybe (Maybe a)) (T x a))))- data MkT1Sym0 :: (~>) x ((~>) a ((~>) (Maybe a) ((~>) (Maybe (Maybe a)) (T x a))))- where- MkT1Sym0KindInference :: SameKind (Apply MkT1Sym0 arg) (MkT1Sym1 arg) =>- MkT1Sym0 a0123456789876543210- type instance Apply MkT1Sym0 a0123456789876543210 = MkT1Sym1 a0123456789876543210- instance SuppressUnusedWarnings MkT1Sym0 where- suppressUnusedWarnings = snd (((,) MkT1Sym0KindInference) ())- type MkT1Sym1 :: forall x a. x- -> (~>) a ((~>) (Maybe a) ((~>) (Maybe (Maybe a)) (T x a)))- data MkT1Sym1 (a0123456789876543210 :: x) :: (~>) a ((~>) (Maybe a) ((~>) (Maybe (Maybe a)) (T x a)))- where- MkT1Sym1KindInference :: SameKind (Apply (MkT1Sym1 a0123456789876543210) arg) (MkT1Sym2 a0123456789876543210 arg) =>- MkT1Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (MkT1Sym1 a0123456789876543210) a0123456789876543210 = MkT1Sym2 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (MkT1Sym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) MkT1Sym1KindInference) ())- type MkT1Sym2 :: forall x a. x- -> a -> (~>) (Maybe a) ((~>) (Maybe (Maybe a)) (T x a))- data MkT1Sym2 (a0123456789876543210 :: x) (a0123456789876543210 :: a) :: (~>) (Maybe a) ((~>) (Maybe (Maybe a)) (T x a))- where- MkT1Sym2KindInference :: SameKind (Apply (MkT1Sym2 a0123456789876543210 a0123456789876543210) arg) (MkT1Sym3 a0123456789876543210 a0123456789876543210 arg) =>- MkT1Sym2 a0123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply (MkT1Sym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = MkT1Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (MkT1Sym2 a0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) MkT1Sym2KindInference) ())- type MkT1Sym3 :: forall x a. x- -> a -> Maybe a -> (~>) (Maybe (Maybe a)) (T x a)- data MkT1Sym3 (a0123456789876543210 :: x) (a0123456789876543210 :: a) (a0123456789876543210 :: Maybe a) :: (~>) (Maybe (Maybe a)) (T x a)- where- MkT1Sym3KindInference :: SameKind (Apply (MkT1Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210) arg) (MkT1Sym4 a0123456789876543210 a0123456789876543210 a0123456789876543210 arg) =>- MkT1Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply (MkT1Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210) a0123456789876543210 = MkT1 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (MkT1Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) MkT1Sym3KindInference) ())- type MkT1Sym4 :: forall x a. x- -> a -> Maybe a -> Maybe (Maybe a) -> T x a- type family MkT1Sym4 (a0123456789876543210 :: x) (a0123456789876543210 :: a) (a0123456789876543210 :: Maybe a) (a0123456789876543210 :: Maybe (Maybe a)) :: T x a where- MkT1Sym4 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 = MkT1 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- type MkT2Sym0 :: forall x a. (~>) (Maybe x) (T x a)- data MkT2Sym0 :: (~>) (Maybe x) (T x a)- where- MkT2Sym0KindInference :: SameKind (Apply MkT2Sym0 arg) (MkT2Sym1 arg) =>- MkT2Sym0 a0123456789876543210- type instance Apply MkT2Sym0 a0123456789876543210 = MkT2 a0123456789876543210- instance SuppressUnusedWarnings MkT2Sym0 where- suppressUnusedWarnings = snd (((,) MkT2Sym0KindInference) ())- type MkT2Sym1 :: forall x a. Maybe x -> T x a- type family MkT2Sym1 (a0123456789876543210 :: Maybe x) :: T x a where- MkT2Sym1 a0123456789876543210 = MkT2 a0123456789876543210- type family Lambda_0123456789876543210 _f_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 n_0123456789876543210 where- Lambda_0123456789876543210 _f_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 n_0123456789876543210 = n_0123456789876543210- data Lambda_0123456789876543210Sym0 _f_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) =>- Lambda_0123456789876543210Sym0 _f_01234567898765432100123456789876543210- type instance Apply Lambda_0123456789876543210Sym0 _f_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210- instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym0KindInference) ())- data Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym1KindInference) ())- data Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym2KindInference) ())- data Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym3KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym3KindInference) ())- data Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym4KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym4KindInference) ())- data Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym5KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) n_01234567898765432100123456789876543210 = Lambda_0123456789876543210 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym5KindInference) ())- type family Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 where- Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 = Lambda_0123456789876543210 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210- type family Lambda_0123456789876543210 _f_0123456789876543210 a_0123456789876543210 n_0123456789876543210 where- Lambda_0123456789876543210 _f_0123456789876543210 a_0123456789876543210 n_0123456789876543210 = n_0123456789876543210- data Lambda_0123456789876543210Sym0 _f_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) =>- Lambda_0123456789876543210Sym0 _f_01234567898765432100123456789876543210- type instance Apply Lambda_0123456789876543210Sym0 _f_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210- instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym0KindInference) ())- data Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym1KindInference) ())- data Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) n_01234567898765432100123456789876543210 = Lambda_0123456789876543210 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym2KindInference) ())- type family Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 where- Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 = Lambda_0123456789876543210 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210- type Fmap_0123456789876543210 :: (~>) a b -> T x a -> T x b- type family Fmap_0123456789876543210 (a :: (~>) a b) (a :: T x a) :: T x b where- Fmap_0123456789876543210 _f_0123456789876543210 (MkT1 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210) = Apply (Apply (Apply (Apply MkT1Sym0 (Apply (Apply (Apply (Apply (Apply (Apply Lambda_0123456789876543210Sym0 _f_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210)) (Apply _f_0123456789876543210 a_0123456789876543210)) (Apply (Apply FmapSym0 _f_0123456789876543210) a_0123456789876543210)) (Apply (Apply FmapSym0 (Apply FmapSym0 _f_0123456789876543210)) a_0123456789876543210)- Fmap_0123456789876543210 _f_0123456789876543210 (MkT2 a_0123456789876543210) = Apply MkT2Sym0 (Apply (Apply (Apply Lambda_0123456789876543210Sym0 _f_0123456789876543210) a_0123456789876543210) a_0123456789876543210)- type Fmap_0123456789876543210Sym0 :: (~>) ((~>) a b) ((~>) (T x a) (T x b))- data Fmap_0123456789876543210Sym0 :: (~>) ((~>) a b) ((~>) (T x a) (T x b))- where- Fmap_0123456789876543210Sym0KindInference :: SameKind (Apply Fmap_0123456789876543210Sym0 arg) (Fmap_0123456789876543210Sym1 arg) =>- Fmap_0123456789876543210Sym0 a0123456789876543210- type instance Apply Fmap_0123456789876543210Sym0 a0123456789876543210 = Fmap_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings Fmap_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Fmap_0123456789876543210Sym0KindInference) ())- type Fmap_0123456789876543210Sym1 :: (~>) a b- -> (~>) (T x a) (T x b)- data Fmap_0123456789876543210Sym1 (a0123456789876543210 :: (~>) a b) :: (~>) (T x a) (T x b)- where- Fmap_0123456789876543210Sym1KindInference :: SameKind (Apply (Fmap_0123456789876543210Sym1 a0123456789876543210) arg) (Fmap_0123456789876543210Sym2 a0123456789876543210 arg) =>- Fmap_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (Fmap_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Fmap_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Fmap_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Fmap_0123456789876543210Sym1KindInference) ())- type Fmap_0123456789876543210Sym2 :: (~>) a b -> T x a -> T x b- type family Fmap_0123456789876543210Sym2 (a0123456789876543210 :: (~>) a b) (a0123456789876543210 :: T x a) :: T x b where- Fmap_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Fmap_0123456789876543210 a0123456789876543210 a0123456789876543210- type family Lambda_0123456789876543210 _z_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 n_0123456789876543210 where- Lambda_0123456789876543210 _z_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 n_0123456789876543210 = n_0123456789876543210- data Lambda_0123456789876543210Sym0 _z_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) =>- Lambda_0123456789876543210Sym0 _z_01234567898765432100123456789876543210- type instance Apply Lambda_0123456789876543210Sym0 _z_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym1 _z_01234567898765432100123456789876543210- instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym0KindInference) ())- data Lambda_0123456789876543210Sym1 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 _z_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym2 _z_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym1 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym1 _z_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym2 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 _z_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym1KindInference) ())- data Lambda_0123456789876543210Sym2 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym3 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym2 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym2 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym3 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym2KindInference) ())- data Lambda_0123456789876543210Sym3 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym3KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym3 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym4 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym3 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym3 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym4 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym3 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym3KindInference) ())- data Lambda_0123456789876543210Sym4 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym4KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym4 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym5 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym4 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym4 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym5 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym4 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym4KindInference) ())- data Lambda_0123456789876543210Sym5 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym5KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym5 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym6 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym5 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym5 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) n_01234567898765432100123456789876543210 = Lambda_0123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym5 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym5KindInference) ())- type family Lambda_0123456789876543210Sym6 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 where- Lambda_0123456789876543210Sym6 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 = Lambda_0123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210- type family Lambda_0123456789876543210 _z_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 n_0123456789876543210 where- Lambda_0123456789876543210 _z_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 n_0123456789876543210 = _z_0123456789876543210- data Lambda_0123456789876543210Sym0 _z_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) =>- Lambda_0123456789876543210Sym0 _z_01234567898765432100123456789876543210- type instance Apply Lambda_0123456789876543210Sym0 _z_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym1 _z_01234567898765432100123456789876543210- instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym0KindInference) ())- data Lambda_0123456789876543210Sym1 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 _z_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym2 _z_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym1 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym1 _z_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym2 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 _z_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym1KindInference) ())- data Lambda_0123456789876543210Sym2 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym3 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym2 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym2 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym3 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym2KindInference) ())- data Lambda_0123456789876543210Sym3 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym3KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym3 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym4 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym3 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym3 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym4 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym3 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym3KindInference) ())- data Lambda_0123456789876543210Sym4 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym4KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym4 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym5 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym4 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym4 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym5 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym4 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym4KindInference) ())- data Lambda_0123456789876543210Sym5 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym5KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym5 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym6 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym5 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym5 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) n_01234567898765432100123456789876543210 = Lambda_0123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym5 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym5KindInference) ())- type family Lambda_0123456789876543210Sym6 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 where- Lambda_0123456789876543210Sym6 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 = Lambda_0123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210- type family Lambda_0123456789876543210 _z_0123456789876543210 a_0123456789876543210 n_0123456789876543210 where- Lambda_0123456789876543210 _z_0123456789876543210 a_0123456789876543210 n_0123456789876543210 = n_0123456789876543210- data Lambda_0123456789876543210Sym0 _z_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) =>- Lambda_0123456789876543210Sym0 _z_01234567898765432100123456789876543210- type instance Apply Lambda_0123456789876543210Sym0 _z_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym1 _z_01234567898765432100123456789876543210- instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym0KindInference) ())- data Lambda_0123456789876543210Sym1 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 _z_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym2 _z_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym1 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym1 _z_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym2 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 _z_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym1KindInference) ())- data Lambda_0123456789876543210Sym2 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym3 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym2 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym2 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) n_01234567898765432100123456789876543210 = Lambda_0123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym2KindInference) ())- type family Lambda_0123456789876543210Sym3 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 where- Lambda_0123456789876543210Sym3 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 = Lambda_0123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210- type TFHelper_0123456789876543210 :: a -> T x b -> T x a- type family TFHelper_0123456789876543210 (a :: a) (a :: T x b) :: T x a where- TFHelper_0123456789876543210 _z_0123456789876543210 (MkT1 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210) = Apply (Apply (Apply (Apply MkT1Sym0 (Apply (Apply (Apply (Apply (Apply (Apply Lambda_0123456789876543210Sym0 _z_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210)) (Apply (Apply (Apply (Apply (Apply (Apply Lambda_0123456789876543210Sym0 _z_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210)) (Apply (Apply (<$@#@$) _z_0123456789876543210) a_0123456789876543210)) (Apply (Apply FmapSym0 (Apply (<$@#@$) _z_0123456789876543210)) a_0123456789876543210)- TFHelper_0123456789876543210 _z_0123456789876543210 (MkT2 a_0123456789876543210) = Apply MkT2Sym0 (Apply (Apply (Apply Lambda_0123456789876543210Sym0 _z_0123456789876543210) a_0123456789876543210) a_0123456789876543210)- type TFHelper_0123456789876543210Sym0 :: (~>) a ((~>) (T x b) (T x a))- data TFHelper_0123456789876543210Sym0 :: (~>) a ((~>) (T x b) (T x a))- where- TFHelper_0123456789876543210Sym0KindInference :: SameKind (Apply TFHelper_0123456789876543210Sym0 arg) (TFHelper_0123456789876543210Sym1 arg) =>- TFHelper_0123456789876543210Sym0 a0123456789876543210- type instance Apply TFHelper_0123456789876543210Sym0 a0123456789876543210 = TFHelper_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings TFHelper_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) TFHelper_0123456789876543210Sym0KindInference) ())- type TFHelper_0123456789876543210Sym1 :: a -> (~>) (T x b) (T x a)- data TFHelper_0123456789876543210Sym1 (a0123456789876543210 :: a) :: (~>) (T x b) (T x a)- where- TFHelper_0123456789876543210Sym1KindInference :: SameKind (Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) arg) (TFHelper_0123456789876543210Sym2 a0123456789876543210 arg) =>- TFHelper_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (TFHelper_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) TFHelper_0123456789876543210Sym1KindInference) ())- type TFHelper_0123456789876543210Sym2 :: a -> T x b -> T x a- type family TFHelper_0123456789876543210Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: T x b) :: T x a where- TFHelper_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210- instance PFunctor (T x) where- type Fmap a a = Apply (Apply Fmap_0123456789876543210Sym0 a) a- type (<$) a a = Apply (Apply TFHelper_0123456789876543210Sym0 a) a- type family Lambda_0123456789876543210 _f_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 n_0123456789876543210 where- Lambda_0123456789876543210 _f_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 n_0123456789876543210 = MemptySym0- data Lambda_0123456789876543210Sym0 _f_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) =>- Lambda_0123456789876543210Sym0 _f_01234567898765432100123456789876543210- type instance Apply Lambda_0123456789876543210Sym0 _f_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210- instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym0KindInference) ())- data Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym1KindInference) ())- data Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym2KindInference) ())- data Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym3KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym3KindInference) ())- data Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym4KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym4KindInference) ())- data Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym5KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) n_01234567898765432100123456789876543210 = Lambda_0123456789876543210 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym5KindInference) ())- type family Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 where- Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 = Lambda_0123456789876543210 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210- type family Lambda_0123456789876543210 _f_0123456789876543210 a_0123456789876543210 n_0123456789876543210 where- Lambda_0123456789876543210 _f_0123456789876543210 a_0123456789876543210 n_0123456789876543210 = MemptySym0- data Lambda_0123456789876543210Sym0 _f_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) =>- Lambda_0123456789876543210Sym0 _f_01234567898765432100123456789876543210- type instance Apply Lambda_0123456789876543210Sym0 _f_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210- instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym0KindInference) ())- data Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym1KindInference) ())- data Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) n_01234567898765432100123456789876543210 = Lambda_0123456789876543210 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym2KindInference) ())- type family Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 where- Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 = Lambda_0123456789876543210 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210- type FoldMap_0123456789876543210 :: (~>) a m -> T x a -> m- type family FoldMap_0123456789876543210 (a :: (~>) a m) (a :: T x a) :: m where- FoldMap_0123456789876543210 _f_0123456789876543210 (MkT1 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210) = Apply (Apply MappendSym0 (Apply (Apply (Apply (Apply (Apply (Apply Lambda_0123456789876543210Sym0 _f_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210)) (Apply (Apply MappendSym0 (Apply _f_0123456789876543210 a_0123456789876543210)) (Apply (Apply MappendSym0 (Apply (Apply FoldMapSym0 _f_0123456789876543210) a_0123456789876543210)) (Apply (Apply FoldMapSym0 (Apply FoldMapSym0 _f_0123456789876543210)) a_0123456789876543210)))- FoldMap_0123456789876543210 _f_0123456789876543210 (MkT2 a_0123456789876543210) = Apply (Apply (Apply Lambda_0123456789876543210Sym0 _f_0123456789876543210) a_0123456789876543210) a_0123456789876543210- type FoldMap_0123456789876543210Sym0 :: (~>) ((~>) a m) ((~>) (T x a) m)- data FoldMap_0123456789876543210Sym0 :: (~>) ((~>) a m) ((~>) (T x a) m)- where- FoldMap_0123456789876543210Sym0KindInference :: SameKind (Apply FoldMap_0123456789876543210Sym0 arg) (FoldMap_0123456789876543210Sym1 arg) =>- FoldMap_0123456789876543210Sym0 a0123456789876543210- type instance Apply FoldMap_0123456789876543210Sym0 a0123456789876543210 = FoldMap_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings FoldMap_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) FoldMap_0123456789876543210Sym0KindInference) ())- type FoldMap_0123456789876543210Sym1 :: (~>) a m -> (~>) (T x a) m- data FoldMap_0123456789876543210Sym1 (a0123456789876543210 :: (~>) a m) :: (~>) (T x a) m- where- FoldMap_0123456789876543210Sym1KindInference :: SameKind (Apply (FoldMap_0123456789876543210Sym1 a0123456789876543210) arg) (FoldMap_0123456789876543210Sym2 a0123456789876543210 arg) =>- FoldMap_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (FoldMap_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = FoldMap_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (FoldMap_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) FoldMap_0123456789876543210Sym1KindInference) ())- type FoldMap_0123456789876543210Sym2 :: (~>) a m -> T x a -> m- type family FoldMap_0123456789876543210Sym2 (a0123456789876543210 :: (~>) a m) (a0123456789876543210 :: T x a) :: m where- FoldMap_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = FoldMap_0123456789876543210 a0123456789876543210 a0123456789876543210- type family Lambda_0123456789876543210 _f_0123456789876543210 _z_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 n1_0123456789876543210 n2_0123456789876543210 where- Lambda_0123456789876543210 _f_0123456789876543210 _z_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 n1_0123456789876543210 n2_0123456789876543210 = n2_0123456789876543210- data Lambda_0123456789876543210Sym0 _f_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) =>- Lambda_0123456789876543210Sym0 _f_01234567898765432100123456789876543210- type instance Apply Lambda_0123456789876543210Sym0 _f_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210- instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym0KindInference) ())- data Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210) _z_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym1KindInference) ())- data Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym2KindInference) ())- data Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym3KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym3KindInference) ())- data Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym4KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym4KindInference) ())- data Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym5KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym5KindInference) ())- data Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym6KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym7 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) n1_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym7 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym6KindInference) ())- data Lambda_0123456789876543210Sym7 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym7KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym7 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym8 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym7 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym7 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210) n2_01234567898765432100123456789876543210 = Lambda_0123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym7 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym7KindInference) ())- type family Lambda_0123456789876543210Sym8 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 where- Lambda_0123456789876543210Sym8 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 = Lambda_0123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210- type family Lambda_0123456789876543210 _f_0123456789876543210 _z_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 n1_0123456789876543210 n2_0123456789876543210 where- Lambda_0123456789876543210 _f_0123456789876543210 _z_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 n1_0123456789876543210 n2_0123456789876543210 = Apply (Apply (Apply FoldrSym0 _f_0123456789876543210) n2_0123456789876543210) n1_0123456789876543210- data Lambda_0123456789876543210Sym0 _f_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) =>- Lambda_0123456789876543210Sym0 _f_01234567898765432100123456789876543210- type instance Apply Lambda_0123456789876543210Sym0 _f_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210- instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym0KindInference) ())- data Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210) _z_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym1KindInference) ())- data Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym2KindInference) ())- data Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym3KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym3KindInference) ())- data Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym4KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym4KindInference) ())- data Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym5KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym5KindInference) ())- data Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym6KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym7 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) n1_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym7 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym6KindInference) ())- data Lambda_0123456789876543210Sym7 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym7KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym7 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym8 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym7 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym7 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210) n2_01234567898765432100123456789876543210 = Lambda_0123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym7 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym7KindInference) ())- type family Lambda_0123456789876543210Sym8 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 where- Lambda_0123456789876543210Sym8 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 = Lambda_0123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210- type family Lambda_0123456789876543210 n1_0123456789876543210 n2_0123456789876543210 _f_0123456789876543210 _z_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 n1_0123456789876543210 n2_0123456789876543210 where- Lambda_0123456789876543210 n1_0123456789876543210 n2_0123456789876543210 _f_0123456789876543210 _z_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 n1_0123456789876543210 n2_0123456789876543210 = Apply (Apply (Apply FoldrSym0 _f_0123456789876543210) n2_0123456789876543210) n1_0123456789876543210- data Lambda_0123456789876543210Sym0 n1_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) =>- Lambda_0123456789876543210Sym0 n1_01234567898765432100123456789876543210- type instance Apply Lambda_0123456789876543210Sym0 n1_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym1 n1_01234567898765432100123456789876543210- instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym0KindInference) ())- data Lambda_0123456789876543210Sym1 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 n1_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym2 n1_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym1 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym1 n1_01234567898765432100123456789876543210) n2_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym2 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 n1_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym1KindInference) ())- data Lambda_0123456789876543210Sym2 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym3 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym2 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym2 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210) _f_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym3 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym2KindInference) ())- data Lambda_0123456789876543210Sym3 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym3KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym3 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym4 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym3 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym3 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210) _z_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym4 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym3 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym3KindInference) ())- data Lambda_0123456789876543210Sym4 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym4KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym4 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym5 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym4 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym4 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym5 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym4 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym4KindInference) ())- data Lambda_0123456789876543210Sym5 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym5KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym5 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym6 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym5 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym5 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym6 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym5 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym5KindInference) ())- data Lambda_0123456789876543210Sym6 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym6KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym6 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym7 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym6 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym6 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym7 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym6 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym6KindInference) ())- data Lambda_0123456789876543210Sym7 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym7KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym7 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym8 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym7 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym7 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym8 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym7 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym7KindInference) ())- data Lambda_0123456789876543210Sym8 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym8KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym8 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym9 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym8 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym8 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) n1_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym9 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym8 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym8KindInference) ())- data Lambda_0123456789876543210Sym9 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym9KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym9 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym10 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym9 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym9 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210) n2_01234567898765432100123456789876543210 = Lambda_0123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym9 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym9KindInference) ())- type family Lambda_0123456789876543210Sym10 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 where- Lambda_0123456789876543210Sym10 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 = Lambda_0123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210- type family Lambda_0123456789876543210 _f_0123456789876543210 _z_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 n1_0123456789876543210 n2_0123456789876543210 where- Lambda_0123456789876543210 _f_0123456789876543210 _z_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 n1_0123456789876543210 n2_0123456789876543210 = Apply (Apply (Apply FoldrSym0 (Apply (Apply (Apply (Apply (Apply (Apply (Apply (Apply Lambda_0123456789876543210Sym0 n1_0123456789876543210) n2_0123456789876543210) _f_0123456789876543210) _z_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210)) n2_0123456789876543210) n1_0123456789876543210- data Lambda_0123456789876543210Sym0 _f_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) =>- Lambda_0123456789876543210Sym0 _f_01234567898765432100123456789876543210- type instance Apply Lambda_0123456789876543210Sym0 _f_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210- instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym0KindInference) ())- data Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210) _z_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym1KindInference) ())- data Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym2KindInference) ())- data Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym3KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym3KindInference) ())- data Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym4KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym4KindInference) ())- data Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym5KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym5KindInference) ())- data Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym6KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym7 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) n1_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym7 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym6KindInference) ())- data Lambda_0123456789876543210Sym7 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym7KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym7 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym8 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym7 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym7 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210) n2_01234567898765432100123456789876543210 = Lambda_0123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym7 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym7KindInference) ())- type family Lambda_0123456789876543210Sym8 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 where- Lambda_0123456789876543210Sym8 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 = Lambda_0123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210- type family Lambda_0123456789876543210 _f_0123456789876543210 _z_0123456789876543210 a_0123456789876543210 n1_0123456789876543210 n2_0123456789876543210 where- Lambda_0123456789876543210 _f_0123456789876543210 _z_0123456789876543210 a_0123456789876543210 n1_0123456789876543210 n2_0123456789876543210 = n2_0123456789876543210- data Lambda_0123456789876543210Sym0 _f_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) =>- Lambda_0123456789876543210Sym0 _f_01234567898765432100123456789876543210- type instance Apply Lambda_0123456789876543210Sym0 _f_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210- instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym0KindInference) ())- data Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210) _z_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym1KindInference) ())- data Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym2KindInference) ())- data Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym3KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) n1_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym3KindInference) ())- data Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym4KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210) n2_01234567898765432100123456789876543210 = Lambda_0123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym4KindInference) ())- type family Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 where- Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 = Lambda_0123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210- type Foldr_0123456789876543210 :: (~>) a ((~>) b b)- -> b -> T x a -> b- type family Foldr_0123456789876543210 (a :: (~>) a ((~>) b b)) (a :: b) (a :: T x a) :: b where- Foldr_0123456789876543210 _f_0123456789876543210 _z_0123456789876543210 (MkT1 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210) = Apply (Apply (Apply (Apply (Apply (Apply (Apply (Apply Lambda_0123456789876543210Sym0 _f_0123456789876543210) _z_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) (Apply (Apply _f_0123456789876543210 a_0123456789876543210) (Apply (Apply (Apply (Apply (Apply (Apply (Apply (Apply Lambda_0123456789876543210Sym0 _f_0123456789876543210) _z_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) (Apply (Apply (Apply (Apply (Apply (Apply (Apply (Apply Lambda_0123456789876543210Sym0 _f_0123456789876543210) _z_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) _z_0123456789876543210)))- Foldr_0123456789876543210 _f_0123456789876543210 _z_0123456789876543210 (MkT2 a_0123456789876543210) = Apply (Apply (Apply (Apply (Apply Lambda_0123456789876543210Sym0 _f_0123456789876543210) _z_0123456789876543210) a_0123456789876543210) a_0123456789876543210) _z_0123456789876543210- type Foldr_0123456789876543210Sym0 :: (~>) ((~>) a ((~>) b b)) ((~>) b ((~>) (T x a) b))- data Foldr_0123456789876543210Sym0 :: (~>) ((~>) a ((~>) b b)) ((~>) b ((~>) (T x a) b))- where- Foldr_0123456789876543210Sym0KindInference :: SameKind (Apply Foldr_0123456789876543210Sym0 arg) (Foldr_0123456789876543210Sym1 arg) =>- Foldr_0123456789876543210Sym0 a0123456789876543210- type instance Apply Foldr_0123456789876543210Sym0 a0123456789876543210 = Foldr_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings Foldr_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Foldr_0123456789876543210Sym0KindInference) ())- type Foldr_0123456789876543210Sym1 :: (~>) a ((~>) b b)- -> (~>) b ((~>) (T x a) b)- data Foldr_0123456789876543210Sym1 (a0123456789876543210 :: (~>) a ((~>) b b)) :: (~>) b ((~>) (T x a) b)- where- Foldr_0123456789876543210Sym1KindInference :: SameKind (Apply (Foldr_0123456789876543210Sym1 a0123456789876543210) arg) (Foldr_0123456789876543210Sym2 a0123456789876543210 arg) =>- Foldr_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (Foldr_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Foldr_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Foldr_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Foldr_0123456789876543210Sym1KindInference) ())- type Foldr_0123456789876543210Sym2 :: (~>) a ((~>) b b)- -> b -> (~>) (T x a) b- data Foldr_0123456789876543210Sym2 (a0123456789876543210 :: (~>) a ((~>) b b)) (a0123456789876543210 :: b) :: (~>) (T x a) b- where- Foldr_0123456789876543210Sym2KindInference :: SameKind (Apply (Foldr_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) arg) (Foldr_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 arg) =>- Foldr_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply (Foldr_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = Foldr_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Foldr_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Foldr_0123456789876543210Sym2KindInference) ())- type Foldr_0123456789876543210Sym3 :: (~>) a ((~>) b b)- -> b -> T x a -> b- type family Foldr_0123456789876543210Sym3 (a0123456789876543210 :: (~>) a ((~>) b b)) (a0123456789876543210 :: b) (a0123456789876543210 :: T x a) :: b where- Foldr_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = Foldr_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance PFoldable (T x) where- type FoldMap a a = Apply (Apply FoldMap_0123456789876543210Sym0 a) a- type Foldr a a a = Apply (Apply (Apply Foldr_0123456789876543210Sym0 a) a) a- type Traverse_0123456789876543210 :: (~>) a (f b)- -> T x a -> f (T x b)- type family Traverse_0123456789876543210 (a :: (~>) a (f b)) (a :: T x a) :: f (T x b) where- Traverse_0123456789876543210 _f_0123456789876543210 (MkT1 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210) = Apply (Apply (<*>@#@$) (Apply (Apply (<*>@#@$) (Apply (Apply (Apply LiftA2Sym0 MkT1Sym0) (Apply PureSym0 a_0123456789876543210)) (Apply _f_0123456789876543210 a_0123456789876543210))) (Apply (Apply TraverseSym0 _f_0123456789876543210) a_0123456789876543210))) (Apply (Apply TraverseSym0 (Apply TraverseSym0 _f_0123456789876543210)) a_0123456789876543210)- Traverse_0123456789876543210 _f_0123456789876543210 (MkT2 a_0123456789876543210) = Apply (Apply FmapSym0 MkT2Sym0) (Apply PureSym0 a_0123456789876543210)- type Traverse_0123456789876543210Sym0 :: (~>) ((~>) a (f b)) ((~>) (T x a) (f (T x b)))- data Traverse_0123456789876543210Sym0 :: (~>) ((~>) a (f b)) ((~>) (T x a) (f (T x b)))- where- Traverse_0123456789876543210Sym0KindInference :: SameKind (Apply Traverse_0123456789876543210Sym0 arg) (Traverse_0123456789876543210Sym1 arg) =>- Traverse_0123456789876543210Sym0 a0123456789876543210- type instance Apply Traverse_0123456789876543210Sym0 a0123456789876543210 = Traverse_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings Traverse_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Traverse_0123456789876543210Sym0KindInference) ())- type Traverse_0123456789876543210Sym1 :: (~>) a (f b)- -> (~>) (T x a) (f (T x b))- data Traverse_0123456789876543210Sym1 (a0123456789876543210 :: (~>) a (f b)) :: (~>) (T x a) (f (T x b))- where- Traverse_0123456789876543210Sym1KindInference :: SameKind (Apply (Traverse_0123456789876543210Sym1 a0123456789876543210) arg) (Traverse_0123456789876543210Sym2 a0123456789876543210 arg) =>- Traverse_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (Traverse_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Traverse_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Traverse_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Traverse_0123456789876543210Sym1KindInference) ())- type Traverse_0123456789876543210Sym2 :: (~>) a (f b)- -> T x a -> f (T x b)- type family Traverse_0123456789876543210Sym2 (a0123456789876543210 :: (~>) a (f b)) (a0123456789876543210 :: T x a) :: f (T x b) where- Traverse_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Traverse_0123456789876543210 a0123456789876543210 a0123456789876543210- instance PTraversable (T x) where- type Traverse a a = Apply (Apply Traverse_0123456789876543210Sym0 a) a- type family Case_0123456789876543210 v_0123456789876543210 t where- type Fmap_0123456789876543210 :: (~>) a b -> Empty a -> Empty b- type family Fmap_0123456789876543210 (a :: (~>) a b) (a :: Empty a) :: Empty b where- Fmap_0123456789876543210 _ v_0123456789876543210 = Case_0123456789876543210 v_0123456789876543210 v_0123456789876543210- type Fmap_0123456789876543210Sym0 :: (~>) ((~>) a b) ((~>) (Empty a) (Empty b))- data Fmap_0123456789876543210Sym0 :: (~>) ((~>) a b) ((~>) (Empty a) (Empty b))- where- Fmap_0123456789876543210Sym0KindInference :: SameKind (Apply Fmap_0123456789876543210Sym0 arg) (Fmap_0123456789876543210Sym1 arg) =>- Fmap_0123456789876543210Sym0 a0123456789876543210- type instance Apply Fmap_0123456789876543210Sym0 a0123456789876543210 = Fmap_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings Fmap_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Fmap_0123456789876543210Sym0KindInference) ())- type Fmap_0123456789876543210Sym1 :: (~>) a b- -> (~>) (Empty a) (Empty b)- data Fmap_0123456789876543210Sym1 (a0123456789876543210 :: (~>) a b) :: (~>) (Empty a) (Empty b)- where- Fmap_0123456789876543210Sym1KindInference :: SameKind (Apply (Fmap_0123456789876543210Sym1 a0123456789876543210) arg) (Fmap_0123456789876543210Sym2 a0123456789876543210 arg) =>- Fmap_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (Fmap_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Fmap_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Fmap_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Fmap_0123456789876543210Sym1KindInference) ())- type Fmap_0123456789876543210Sym2 :: (~>) a b -> Empty a -> Empty b- type family Fmap_0123456789876543210Sym2 (a0123456789876543210 :: (~>) a b) (a0123456789876543210 :: Empty a) :: Empty b where- Fmap_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Fmap_0123456789876543210 a0123456789876543210 a0123456789876543210- type family Case_0123456789876543210 v_0123456789876543210 t where- type TFHelper_0123456789876543210 :: a -> Empty b -> Empty a- type family TFHelper_0123456789876543210 (a :: a) (a :: Empty b) :: Empty a where- TFHelper_0123456789876543210 _ v_0123456789876543210 = Case_0123456789876543210 v_0123456789876543210 v_0123456789876543210- type TFHelper_0123456789876543210Sym0 :: (~>) a ((~>) (Empty b) (Empty a))- data TFHelper_0123456789876543210Sym0 :: (~>) a ((~>) (Empty b) (Empty a))- where- TFHelper_0123456789876543210Sym0KindInference :: SameKind (Apply TFHelper_0123456789876543210Sym0 arg) (TFHelper_0123456789876543210Sym1 arg) =>- TFHelper_0123456789876543210Sym0 a0123456789876543210- type instance Apply TFHelper_0123456789876543210Sym0 a0123456789876543210 = TFHelper_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings TFHelper_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) TFHelper_0123456789876543210Sym0KindInference) ())- type TFHelper_0123456789876543210Sym1 :: a- -> (~>) (Empty b) (Empty a)- data TFHelper_0123456789876543210Sym1 (a0123456789876543210 :: a) :: (~>) (Empty b) (Empty a)- where- TFHelper_0123456789876543210Sym1KindInference :: SameKind (Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) arg) (TFHelper_0123456789876543210Sym2 a0123456789876543210 arg) =>- TFHelper_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (TFHelper_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) TFHelper_0123456789876543210Sym1KindInference) ())- type TFHelper_0123456789876543210Sym2 :: a -> Empty b -> Empty a- type family TFHelper_0123456789876543210Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: Empty b) :: Empty a where- TFHelper_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210- instance PFunctor Empty where- type Fmap a a = Apply (Apply Fmap_0123456789876543210Sym0 a) a- type (<$) a a = Apply (Apply TFHelper_0123456789876543210Sym0 a) a- type FoldMap_0123456789876543210 :: (~>) a m -> Empty a -> m- type family FoldMap_0123456789876543210 (a :: (~>) a m) (a :: Empty a) :: m where- FoldMap_0123456789876543210 _ _ = MemptySym0- type FoldMap_0123456789876543210Sym0 :: (~>) ((~>) a m) ((~>) (Empty a) m)- data FoldMap_0123456789876543210Sym0 :: (~>) ((~>) a m) ((~>) (Empty a) m)- where- FoldMap_0123456789876543210Sym0KindInference :: SameKind (Apply FoldMap_0123456789876543210Sym0 arg) (FoldMap_0123456789876543210Sym1 arg) =>- FoldMap_0123456789876543210Sym0 a0123456789876543210- type instance Apply FoldMap_0123456789876543210Sym0 a0123456789876543210 = FoldMap_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings FoldMap_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) FoldMap_0123456789876543210Sym0KindInference) ())- type FoldMap_0123456789876543210Sym1 :: (~>) a m- -> (~>) (Empty a) m- data FoldMap_0123456789876543210Sym1 (a0123456789876543210 :: (~>) a m) :: (~>) (Empty a) m- where- FoldMap_0123456789876543210Sym1KindInference :: SameKind (Apply (FoldMap_0123456789876543210Sym1 a0123456789876543210) arg) (FoldMap_0123456789876543210Sym2 a0123456789876543210 arg) =>- FoldMap_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (FoldMap_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = FoldMap_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (FoldMap_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) FoldMap_0123456789876543210Sym1KindInference) ())- type FoldMap_0123456789876543210Sym2 :: (~>) a m -> Empty a -> m- type family FoldMap_0123456789876543210Sym2 (a0123456789876543210 :: (~>) a m) (a0123456789876543210 :: Empty a) :: m where- FoldMap_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = FoldMap_0123456789876543210 a0123456789876543210 a0123456789876543210- instance PFoldable Empty where- type FoldMap a a = Apply (Apply FoldMap_0123456789876543210Sym0 a) a- type family Case_0123456789876543210 v_0123456789876543210 t where- type Traverse_0123456789876543210 :: (~>) a (f b)- -> Empty a -> f (Empty b)- type family Traverse_0123456789876543210 (a :: (~>) a (f b)) (a :: Empty a) :: f (Empty b) where- Traverse_0123456789876543210 _ v_0123456789876543210 = Apply PureSym0 (Case_0123456789876543210 v_0123456789876543210 v_0123456789876543210)- type Traverse_0123456789876543210Sym0 :: (~>) ((~>) a (f b)) ((~>) (Empty a) (f (Empty b)))- data Traverse_0123456789876543210Sym0 :: (~>) ((~>) a (f b)) ((~>) (Empty a) (f (Empty b)))- where- Traverse_0123456789876543210Sym0KindInference :: SameKind (Apply Traverse_0123456789876543210Sym0 arg) (Traverse_0123456789876543210Sym1 arg) =>- Traverse_0123456789876543210Sym0 a0123456789876543210- type instance Apply Traverse_0123456789876543210Sym0 a0123456789876543210 = Traverse_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings Traverse_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Traverse_0123456789876543210Sym0KindInference) ())- type Traverse_0123456789876543210Sym1 :: (~>) a (f b)- -> (~>) (Empty a) (f (Empty b))- data Traverse_0123456789876543210Sym1 (a0123456789876543210 :: (~>) a (f b)) :: (~>) (Empty a) (f (Empty b))- where- Traverse_0123456789876543210Sym1KindInference :: SameKind (Apply (Traverse_0123456789876543210Sym1 a0123456789876543210) arg) (Traverse_0123456789876543210Sym2 a0123456789876543210 arg) =>- Traverse_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (Traverse_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Traverse_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Traverse_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Traverse_0123456789876543210Sym1KindInference) ())- type Traverse_0123456789876543210Sym2 :: (~>) a (f b)- -> Empty a -> f (Empty b)- type family Traverse_0123456789876543210Sym2 (a0123456789876543210 :: (~>) a (f b)) (a0123456789876543210 :: Empty a) :: f (Empty b) where- Traverse_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Traverse_0123456789876543210 a0123456789876543210 a0123456789876543210- instance PTraversable Empty where- type Traverse a a = Apply (Apply Traverse_0123456789876543210Sym0 a) a- data ST :: forall x a. T x a -> Type- where- SMkT1 :: forall x- a- (n :: x)- (n :: a)- (n :: Maybe a)- (n :: Maybe (Maybe a)).- (Sing n) ->- (Sing n) ->- (Sing n) ->- (Sing n) ->- ST (MkT1 n n n n :: T x a)- SMkT2 :: forall x a (n :: Maybe x).- (Sing n) -> ST (MkT2 n :: T x a)- type instance Sing @(T x a) = ST- instance (SingKind x, SingKind a) => SingKind (T x a) where- type Demote (T x a) = T (Demote x) (Demote a)- fromSing (SMkT1 b b b b)- = (((MkT1 (fromSing b)) (fromSing b)) (fromSing b)) (fromSing b)- fromSing (SMkT2 b) = MkT2 (fromSing b)- toSing- (MkT1 (b :: Demote x) (b :: Demote a) (b :: Demote (Maybe a))- (b :: Demote (Maybe (Maybe a))))- = case- ((((,,,) (toSing b :: SomeSing x)) (toSing b :: SomeSing a))- (toSing b :: SomeSing (Maybe a)))- (toSing b :: SomeSing (Maybe (Maybe a)))- of- (,,,) (SomeSing c) (SomeSing c) (SomeSing c) (SomeSing c)- -> SomeSing ((((SMkT1 c) c) c) c)- toSing (MkT2 (b :: Demote (Maybe x)))- = case toSing b :: SomeSing (Maybe x) of- SomeSing c -> SomeSing (SMkT2 c)- data SEmpty :: forall (a :: Type). Empty a -> Type- type instance Sing @(Empty a) = SEmpty- instance SingKind a => SingKind (Empty a) where- type Demote (Empty a) = Empty (Demote a)- fromSing x = case x of {}- toSing x = SomeSing (case x of {})- instance SFunctor (T x) where- sFmap ::- forall (a :: Type)- (b :: Type)- (t1 :: (~>) a b)- (t2 :: T x a). Sing t1- -> Sing t2- -> Sing (Apply (Apply (FmapSym0 :: TyFun ((~>) a b) ((~>) (T x a) (T x b))- -> Type) t1) t2)- (%<$) ::- forall (a :: Type) (b :: Type) (t1 :: a) (t2 :: T x b). Sing t1- -> Sing t2- -> Sing (Apply (Apply ((<$@#@$) :: TyFun a ((~>) (T x b) (T x a))- -> Type) t1) t2)- sFmap- (_sf_0123456789876543210 :: Sing _f_0123456789876543210)- (SMkT1 (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210))- = (applySing- ((applySing- ((applySing- ((applySing ((singFun4 @MkT1Sym0) SMkT1))- ((applySing- ((singFun1- @(Apply (Apply (Apply (Apply (Apply Lambda_0123456789876543210Sym0 _f_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210))- (\ sN_0123456789876543210- -> case sN_0123456789876543210 of- (_ :: Sing n_0123456789876543210)- -> sN_0123456789876543210)))- sA_0123456789876543210)))- ((applySing _sf_0123456789876543210) sA_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @FmapSym0) sFmap)) _sf_0123456789876543210))- sA_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @FmapSym0) sFmap))- ((applySing ((singFun2 @FmapSym0) sFmap))- _sf_0123456789876543210)))- sA_0123456789876543210)- sFmap- (_sf_0123456789876543210 :: Sing _f_0123456789876543210)- (SMkT2 (sA_0123456789876543210 :: Sing a_0123456789876543210))- = (applySing ((singFun1 @MkT2Sym0) SMkT2))- ((applySing- ((singFun1- @(Apply (Apply Lambda_0123456789876543210Sym0 _f_0123456789876543210) a_0123456789876543210))- (\ sN_0123456789876543210- -> case sN_0123456789876543210 of- (_ :: Sing n_0123456789876543210) -> sN_0123456789876543210)))- sA_0123456789876543210)- (%<$)- (_sz_0123456789876543210 :: Sing _z_0123456789876543210)- (SMkT1 (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210))- = (applySing- ((applySing- ((applySing- ((applySing ((singFun4 @MkT1Sym0) SMkT1))- ((applySing- ((singFun1- @(Apply (Apply (Apply (Apply (Apply Lambda_0123456789876543210Sym0 _z_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210))- (\ sN_0123456789876543210- -> case sN_0123456789876543210 of- (_ :: Sing n_0123456789876543210)- -> sN_0123456789876543210)))- sA_0123456789876543210)))- ((applySing- ((singFun1- @(Apply (Apply (Apply (Apply (Apply Lambda_0123456789876543210Sym0 _z_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210))- (\ sN_0123456789876543210- -> case sN_0123456789876543210 of- (_ :: Sing n_0123456789876543210) -> _sz_0123456789876543210)))- sA_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @(<$@#@$)) (%<$))) _sz_0123456789876543210))- sA_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @FmapSym0) sFmap))- ((applySing ((singFun2 @(<$@#@$)) (%<$)))- _sz_0123456789876543210)))- sA_0123456789876543210)- (%<$)- (_sz_0123456789876543210 :: Sing _z_0123456789876543210)- (SMkT2 (sA_0123456789876543210 :: Sing a_0123456789876543210))- = (applySing ((singFun1 @MkT2Sym0) SMkT2))- ((applySing- ((singFun1- @(Apply (Apply Lambda_0123456789876543210Sym0 _z_0123456789876543210) a_0123456789876543210))- (\ sN_0123456789876543210- -> case sN_0123456789876543210 of- (_ :: Sing n_0123456789876543210) -> sN_0123456789876543210)))- sA_0123456789876543210)- instance SFoldable (T x) where- sFoldMap ::- forall (a :: Type)- (m :: Type)- (t1 :: (~>) a m)- (t2 :: T x a). SMonoid m =>- Sing t1- -> Sing t2- -> Sing (Apply (Apply (FoldMapSym0 :: TyFun ((~>) a m) ((~>) (T x a) m)- -> Type) t1) t2)- sFoldr ::- forall (a :: Type)- (b :: Type)- (t1 :: (~>) a ((~>) b b))- (t2 :: b)- (t3 :: T x a). Sing t1- -> Sing t2- -> Sing t3- -> Sing (Apply (Apply (Apply (FoldrSym0 :: TyFun ((~>) a ((~>) b b)) ((~>) b ((~>) (T x a) b))- -> Type) t1) t2) t3)- sFoldMap- (_sf_0123456789876543210 :: Sing _f_0123456789876543210)- (SMkT1 (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210))- = (applySing- ((applySing ((singFun2 @MappendSym0) sMappend))- ((applySing- ((singFun1- @(Apply (Apply (Apply (Apply (Apply Lambda_0123456789876543210Sym0 _f_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210))- (\ sN_0123456789876543210- -> case sN_0123456789876543210 of- (_ :: Sing n_0123456789876543210) -> sMempty)))- sA_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @MappendSym0) sMappend))- ((applySing _sf_0123456789876543210) sA_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @MappendSym0) sMappend))- ((applySing- ((applySing ((singFun2 @FoldMapSym0) sFoldMap))- _sf_0123456789876543210))- sA_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @FoldMapSym0) sFoldMap))- ((applySing ((singFun2 @FoldMapSym0) sFoldMap))- _sf_0123456789876543210)))- sA_0123456789876543210)))- sFoldMap- (_sf_0123456789876543210 :: Sing _f_0123456789876543210)- (SMkT2 (sA_0123456789876543210 :: Sing a_0123456789876543210))- = (applySing- ((singFun1- @(Apply (Apply Lambda_0123456789876543210Sym0 _f_0123456789876543210) a_0123456789876543210))- (\ sN_0123456789876543210- -> case sN_0123456789876543210 of- (_ :: Sing n_0123456789876543210) -> sMempty)))- sA_0123456789876543210- sFoldr- (_sf_0123456789876543210 :: Sing _f_0123456789876543210)- (_sz_0123456789876543210 :: Sing _z_0123456789876543210)- (SMkT1 (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210))- = (applySing- ((applySing- ((singFun2- @(Apply (Apply (Apply (Apply (Apply (Apply Lambda_0123456789876543210Sym0 _f_0123456789876543210) _z_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210))- (\ sN1_0123456789876543210 sN2_0123456789876543210- -> case ((,) sN1_0123456789876543210) sN2_0123456789876543210 of- (,) (_ :: Sing n1_0123456789876543210)- (_ :: Sing n2_0123456789876543210)- -> sN2_0123456789876543210)))- sA_0123456789876543210))- ((applySing- ((applySing _sf_0123456789876543210) sA_0123456789876543210))- ((applySing- ((applySing- ((singFun2- @(Apply (Apply (Apply (Apply (Apply (Apply Lambda_0123456789876543210Sym0 _f_0123456789876543210) _z_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210))- (\ sN1_0123456789876543210 sN2_0123456789876543210- -> case ((,) sN1_0123456789876543210) sN2_0123456789876543210 of- (,) (_ :: Sing n1_0123456789876543210)- (_ :: Sing n2_0123456789876543210)- -> (applySing- ((applySing- ((applySing ((singFun3 @FoldrSym0) sFoldr))- _sf_0123456789876543210))- sN2_0123456789876543210))- sN1_0123456789876543210)))- sA_0123456789876543210))- ((applySing- ((applySing- ((singFun2- @(Apply (Apply (Apply (Apply (Apply (Apply Lambda_0123456789876543210Sym0 _f_0123456789876543210) _z_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210))- (\ sN1_0123456789876543210 sN2_0123456789876543210- -> case ((,) sN1_0123456789876543210) sN2_0123456789876543210 of- (,) (_ :: Sing n1_0123456789876543210)- (_ :: Sing n2_0123456789876543210)- -> (applySing- ((applySing- ((applySing ((singFun3 @FoldrSym0) sFoldr))- ((singFun2- @(Apply (Apply (Apply (Apply (Apply (Apply (Apply (Apply Lambda_0123456789876543210Sym0 n1_0123456789876543210) n2_0123456789876543210) _f_0123456789876543210) _z_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210))- (\ sN1_0123456789876543210- sN2_0123456789876543210- -> case- ((,) sN1_0123456789876543210)- sN2_0123456789876543210- of- (,) (_ :: Sing n1_0123456789876543210)- (_ :: Sing n2_0123456789876543210)- -> (applySing- ((applySing- ((applySing- ((singFun3- @FoldrSym0)- sFoldr))- _sf_0123456789876543210))- sN2_0123456789876543210))- sN1_0123456789876543210))))- sN2_0123456789876543210))- sN1_0123456789876543210)))- sA_0123456789876543210))- _sz_0123456789876543210)))- sFoldr- (_sf_0123456789876543210 :: Sing _f_0123456789876543210)- (_sz_0123456789876543210 :: Sing _z_0123456789876543210)- (SMkT2 (sA_0123456789876543210 :: Sing a_0123456789876543210))- = (applySing- ((applySing- ((singFun2- @(Apply (Apply (Apply Lambda_0123456789876543210Sym0 _f_0123456789876543210) _z_0123456789876543210) a_0123456789876543210))- (\ sN1_0123456789876543210 sN2_0123456789876543210- -> case ((,) sN1_0123456789876543210) sN2_0123456789876543210 of- (,) (_ :: Sing n1_0123456789876543210)- (_ :: Sing n2_0123456789876543210)- -> sN2_0123456789876543210)))- sA_0123456789876543210))- _sz_0123456789876543210- instance STraversable (T x) where- sTraverse ::- forall (a :: Type)- (f :: Type -> Type)- (b :: Type)- (t1 :: (~>) a (f b))- (t2 :: T x a). SApplicative f =>- Sing t1- -> Sing t2- -> Sing (Apply (Apply (TraverseSym0 :: TyFun ((~>) a (f b)) ((~>) (T x a) (f (T x b)))- -> Type) t1) t2)- sTraverse- (_sf_0123456789876543210 :: Sing _f_0123456789876543210)- (SMkT1 (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210))- = (applySing- ((applySing ((singFun2 @(<*>@#@$)) (%<*>)))- ((applySing- ((applySing ((singFun2 @(<*>@#@$)) (%<*>)))- ((applySing- ((applySing- ((applySing ((singFun3 @LiftA2Sym0) sLiftA2))- ((singFun4 @MkT1Sym0) SMkT1)))- ((applySing ((singFun1 @PureSym0) sPure)) sA_0123456789876543210)))- ((applySing _sf_0123456789876543210) sA_0123456789876543210))))- ((applySing- ((applySing ((singFun2 @TraverseSym0) sTraverse))- _sf_0123456789876543210))- sA_0123456789876543210))))- ((applySing- ((applySing ((singFun2 @TraverseSym0) sTraverse))- ((applySing ((singFun2 @TraverseSym0) sTraverse))- _sf_0123456789876543210)))- sA_0123456789876543210)- sTraverse- (_sf_0123456789876543210 :: Sing _f_0123456789876543210)- (SMkT2 (sA_0123456789876543210 :: Sing a_0123456789876543210))- = (applySing- ((applySing ((singFun2 @FmapSym0) sFmap))- ((singFun1 @MkT2Sym0) SMkT2)))- ((applySing ((singFun1 @PureSym0) sPure)) sA_0123456789876543210)- instance SFunctor Empty where- sFmap ::- forall (a :: Type)- (b :: Type)- (t1 :: (~>) a b)- (t2 :: Empty a). Sing t1- -> Sing t2- -> Sing (Apply (Apply (FmapSym0 :: TyFun ((~>) a b) ((~>) (Empty a) (Empty b))- -> Type) t1) t2)- (%<$) ::- forall (a :: Type) (b :: Type) (t1 :: a) (t2 :: Empty b). Sing t1- -> Sing t2- -> Sing (Apply (Apply ((<$@#@$) :: TyFun a ((~>) (Empty b) (Empty a))- -> Type) t1) t2)- sFmap _ (sV_0123456789876543210 :: Sing v_0123456789876543210)- = (id- @(Sing (Case_0123456789876543210 v_0123456789876543210 v_0123456789876543210)))- (case sV_0123456789876543210 of {})- (%<$) _ (sV_0123456789876543210 :: Sing v_0123456789876543210)- = (id- @(Sing (Case_0123456789876543210 v_0123456789876543210 v_0123456789876543210)))- (case sV_0123456789876543210 of {})- instance SFoldable Empty where- sFoldMap ::- forall (a :: Type)- (m :: Type)- (t1 :: (~>) a m)- (t2 :: Empty a). SMonoid m =>- Sing t1- -> Sing t2- -> Sing (Apply (Apply (FoldMapSym0 :: TyFun ((~>) a m) ((~>) (Empty a) m)- -> Type) t1) t2)- sFoldMap _ _ = sMempty- instance STraversable Empty where- sTraverse ::- forall (a :: Type)- (f :: Type -> Type)- (b :: Type)- (t1 :: (~>) a (f b))- (t2 :: Empty a). SApplicative f =>- Sing t1- -> Sing t2- -> Sing (Apply (Apply (TraverseSym0 :: TyFun ((~>) a (f b)) ((~>) (Empty a) (f (Empty b)))- -> Type) t1) t2)- sTraverse _ (sV_0123456789876543210 :: Sing v_0123456789876543210)- = (applySing ((singFun1 @PureSym0) sPure))- ((id- @(Sing (Case_0123456789876543210 v_0123456789876543210 v_0123456789876543210)))- (case sV_0123456789876543210 of {}))- instance (SingI n, SingI n, SingI n, SingI n) =>- SingI (MkT1 (n :: x) (n :: a) (n :: Maybe a) (n :: Maybe (Maybe a))) where- sing = (((SMkT1 sing) sing) sing) sing- instance (SingI n, SingI n, SingI n) =>- SingI1 (MkT1 (n :: x) (n :: a) (n :: Maybe a)) where- liftSing = ((SMkT1 sing) sing) sing- instance (SingI n, SingI n) =>- SingI2 (MkT1 (n :: x) (n :: a)) where- liftSing2 = (SMkT1 sing) sing- instance SingI (MkT1Sym0 :: (~>) x ((~>) a ((~>) (Maybe a) ((~>) (Maybe (Maybe a)) (T x a))))) where- sing = (singFun4 @MkT1Sym0) SMkT1- instance SingI d =>- SingI (MkT1Sym1 (d :: x) :: (~>) a ((~>) (Maybe a) ((~>) (Maybe (Maybe a)) (T x a)))) where- sing = (singFun3 @(MkT1Sym1 (d :: x))) (SMkT1 (sing @d))- instance SingI1 (MkT1Sym1 :: x- -> (~>) a ((~>) (Maybe a) ((~>) (Maybe (Maybe a)) (T x a)))) where- liftSing (s :: Sing (d :: x))- = (singFun3 @(MkT1Sym1 (d :: x))) (SMkT1 s)- instance (SingI d, SingI d) =>- SingI (MkT1Sym2 (d :: x) (d :: a) :: (~>) (Maybe a) ((~>) (Maybe (Maybe a)) (T x a))) where- sing- = (singFun2 @(MkT1Sym2 (d :: x) (d :: a)))- ((SMkT1 (sing @d)) (sing @d))- instance SingI d =>- SingI1 (MkT1Sym2 (d :: x) :: a- -> (~>) (Maybe a) ((~>) (Maybe (Maybe a)) (T x a))) where- liftSing (s :: Sing (d :: a))- = (singFun2 @(MkT1Sym2 (d :: x) (d :: a))) ((SMkT1 (sing @d)) s)- instance SingI2 (MkT1Sym2 :: x- -> a -> (~>) (Maybe a) ((~>) (Maybe (Maybe a)) (T x a))) where- liftSing2 (s :: Sing (d :: x)) (s :: Sing (d :: a))- = (singFun2 @(MkT1Sym2 (d :: x) (d :: a))) ((SMkT1 s) s)- instance (SingI d, SingI d, SingI d) =>- SingI (MkT1Sym3 (d :: x) (d :: a) (d :: Maybe a) :: (~>) (Maybe (Maybe a)) (T x a)) where- sing- = (singFun1 @(MkT1Sym3 (d :: x) (d :: a) (d :: Maybe a)))- (((SMkT1 (sing @d)) (sing @d)) (sing @d))- instance (SingI d, SingI d) =>- SingI1 (MkT1Sym3 (d :: x) (d :: a) :: Maybe a- -> (~>) (Maybe (Maybe a)) (T x a)) where- liftSing (s :: Sing (d :: Maybe a))- = (singFun1 @(MkT1Sym3 (d :: x) (d :: a) (d :: Maybe a)))- (((SMkT1 (sing @d)) (sing @d)) s)- instance SingI d =>- SingI2 (MkT1Sym3 (d :: x) :: a- -> Maybe a -> (~>) (Maybe (Maybe a)) (T x a)) where- liftSing2 (s :: Sing (d :: a)) (s :: Sing (d :: Maybe a))- = (singFun1 @(MkT1Sym3 (d :: x) (d :: a) (d :: Maybe a)))- (((SMkT1 (sing @d)) s) s)- instance SingI n => SingI (MkT2 (n :: Maybe x)) where- sing = SMkT2 sing- instance SingI1 MkT2 where- liftSing = SMkT2- instance SingI (MkT2Sym0 :: (~>) (Maybe x) (T x a)) where- sing = (singFun1 @MkT2Sym0) SMkT2+Singletons/FunctorLikeDeriving.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| data T x a + = MkT1 x a (Maybe a) (Maybe (Maybe a)) | MkT2 (Maybe x) + deriving (Functor, Foldable, Traversable) + data Empty (a :: Type) deriving (Functor, Foldable, Traversable) |] + ======> + data T x a + = MkT1 x a (Maybe a) (Maybe (Maybe a)) | MkT2 (Maybe x) + deriving (Functor, Foldable, Traversable) + data Empty (a :: Type) deriving (Functor, Foldable, Traversable) + type MkT1Sym0 :: forall x + a. (~>) x ((~>) a ((~>) (Maybe a) ((~>) (Maybe (Maybe a)) (T x a)))) + data MkT1Sym0 :: (~>) x ((~>) a ((~>) (Maybe a) ((~>) (Maybe (Maybe a)) (T x a)))) + where + MkT1Sym0KindInference :: SameKind (Apply MkT1Sym0 arg) (MkT1Sym1 arg) => + MkT1Sym0 a0123456789876543210 + type instance Apply MkT1Sym0 a0123456789876543210 = MkT1Sym1 a0123456789876543210 + instance SuppressUnusedWarnings MkT1Sym0 where + suppressUnusedWarnings = snd ((,) MkT1Sym0KindInference ()) + type MkT1Sym1 :: forall x a. x + -> (~>) a ((~>) (Maybe a) ((~>) (Maybe (Maybe a)) (T x a))) + data MkT1Sym1 (a0123456789876543210 :: x) :: (~>) a ((~>) (Maybe a) ((~>) (Maybe (Maybe a)) (T x a))) + where + MkT1Sym1KindInference :: SameKind (Apply (MkT1Sym1 a0123456789876543210) arg) (MkT1Sym2 a0123456789876543210 arg) => + MkT1Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (MkT1Sym1 a0123456789876543210) a0123456789876543210 = MkT1Sym2 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (MkT1Sym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) MkT1Sym1KindInference ()) + type MkT1Sym2 :: forall x a. x + -> a -> (~>) (Maybe a) ((~>) (Maybe (Maybe a)) (T x a)) + data MkT1Sym2 (a0123456789876543210 :: x) (a0123456789876543210 :: a) :: (~>) (Maybe a) ((~>) (Maybe (Maybe a)) (T x a)) + where + MkT1Sym2KindInference :: SameKind (Apply (MkT1Sym2 a0123456789876543210 a0123456789876543210) arg) (MkT1Sym3 a0123456789876543210 a0123456789876543210 arg) => + MkT1Sym2 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply (MkT1Sym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = MkT1Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (MkT1Sym2 a0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) MkT1Sym2KindInference ()) + type MkT1Sym3 :: forall x a. x + -> a -> Maybe a -> (~>) (Maybe (Maybe a)) (T x a) + data MkT1Sym3 (a0123456789876543210 :: x) (a0123456789876543210 :: a) (a0123456789876543210 :: Maybe a) :: (~>) (Maybe (Maybe a)) (T x a) + where + MkT1Sym3KindInference :: SameKind (Apply (MkT1Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210) arg) (MkT1Sym4 a0123456789876543210 a0123456789876543210 a0123456789876543210 arg) => + MkT1Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply (MkT1Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210) a0123456789876543210 = MkT1 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (MkT1Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) MkT1Sym3KindInference ()) + type MkT1Sym4 :: forall x a. x + -> a -> Maybe a -> Maybe (Maybe a) -> T x a + type family MkT1Sym4 (a0123456789876543210 :: x) (a0123456789876543210 :: a) (a0123456789876543210 :: Maybe a) (a0123456789876543210 :: Maybe (Maybe a)) :: T x a where + MkT1Sym4 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 = MkT1 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type MkT2Sym0 :: forall x a. (~>) (Maybe x) (T x a) + data MkT2Sym0 :: (~>) (Maybe x) (T x a) + where + MkT2Sym0KindInference :: SameKind (Apply MkT2Sym0 arg) (MkT2Sym1 arg) => + MkT2Sym0 a0123456789876543210 + type instance Apply MkT2Sym0 a0123456789876543210 = MkT2 a0123456789876543210 + instance SuppressUnusedWarnings MkT2Sym0 where + suppressUnusedWarnings = snd ((,) MkT2Sym0KindInference ()) + type MkT2Sym1 :: forall x a. Maybe x -> T x a + type family MkT2Sym1 (a0123456789876543210 :: Maybe x) :: T x a where + MkT2Sym1 a0123456789876543210 = MkT2 a0123456789876543210 + type family Lambda_0123456789876543210 _f_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 n_0123456789876543210 where + Lambda_0123456789876543210 _f_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 n_0123456789876543210 = n_0123456789876543210 + data Lambda_0123456789876543210Sym0 _f_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) => + Lambda_0123456789876543210Sym0 _f_01234567898765432100123456789876543210 + type instance Apply Lambda_0123456789876543210Sym0 _f_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym0KindInference ()) + data Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym1KindInference ()) + data Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym2KindInference ()) + data Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym3KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym3KindInference ()) + data Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym4KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym4KindInference ()) + data Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym5KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) n_01234567898765432100123456789876543210 = Lambda_0123456789876543210 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym5KindInference ()) + type family Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 where + Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 = Lambda_0123456789876543210 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 + type family Lambda_0123456789876543210 _f_0123456789876543210 a_0123456789876543210 n_0123456789876543210 where + Lambda_0123456789876543210 _f_0123456789876543210 a_0123456789876543210 n_0123456789876543210 = n_0123456789876543210 + data Lambda_0123456789876543210Sym0 _f_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) => + Lambda_0123456789876543210Sym0 _f_01234567898765432100123456789876543210 + type instance Apply Lambda_0123456789876543210Sym0 _f_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym0KindInference ()) + data Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym1KindInference ()) + data Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) n_01234567898765432100123456789876543210 = Lambda_0123456789876543210 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym2KindInference ()) + type family Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 where + Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 = Lambda_0123456789876543210 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 + type Fmap_0123456789876543210 :: (~>) a b -> T x a -> T x b + type family Fmap_0123456789876543210 (a :: (~>) a b) (a :: T x a) :: T x b where + Fmap_0123456789876543210 _f_0123456789876543210 (MkT1 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210) = Apply (Apply (Apply (Apply MkT1Sym0 (Apply (Apply (Apply (Apply (Apply (Apply Lambda_0123456789876543210Sym0 _f_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210)) (Apply _f_0123456789876543210 a_0123456789876543210)) (Apply (Apply FmapSym0 _f_0123456789876543210) a_0123456789876543210)) (Apply (Apply FmapSym0 (Apply FmapSym0 _f_0123456789876543210)) a_0123456789876543210) + Fmap_0123456789876543210 _f_0123456789876543210 (MkT2 a_0123456789876543210) = Apply MkT2Sym0 (Apply (Apply (Apply Lambda_0123456789876543210Sym0 _f_0123456789876543210) a_0123456789876543210) a_0123456789876543210) + type Fmap_0123456789876543210Sym0 :: (~>) ((~>) a b) ((~>) (T x a) (T x b)) + data Fmap_0123456789876543210Sym0 :: (~>) ((~>) a b) ((~>) (T x a) (T x b)) + where + Fmap_0123456789876543210Sym0KindInference :: SameKind (Apply Fmap_0123456789876543210Sym0 arg) (Fmap_0123456789876543210Sym1 arg) => + Fmap_0123456789876543210Sym0 a0123456789876543210 + type instance Apply Fmap_0123456789876543210Sym0 a0123456789876543210 = Fmap_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Fmap_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Fmap_0123456789876543210Sym0KindInference ()) + type Fmap_0123456789876543210Sym1 :: (~>) a b + -> (~>) (T x a) (T x b) + data Fmap_0123456789876543210Sym1 (a0123456789876543210 :: (~>) a b) :: (~>) (T x a) (T x b) + where + Fmap_0123456789876543210Sym1KindInference :: SameKind (Apply (Fmap_0123456789876543210Sym1 a0123456789876543210) arg) (Fmap_0123456789876543210Sym2 a0123456789876543210 arg) => + Fmap_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (Fmap_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Fmap_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Fmap_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Fmap_0123456789876543210Sym1KindInference ()) + type Fmap_0123456789876543210Sym2 :: (~>) a b -> T x a -> T x b + type family Fmap_0123456789876543210Sym2 (a0123456789876543210 :: (~>) a b) (a0123456789876543210 :: T x a) :: T x b where + Fmap_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Fmap_0123456789876543210 a0123456789876543210 a0123456789876543210 + type family Lambda_0123456789876543210 _z_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 n_0123456789876543210 where + Lambda_0123456789876543210 _z_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 n_0123456789876543210 = n_0123456789876543210 + data Lambda_0123456789876543210Sym0 _z_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) => + Lambda_0123456789876543210Sym0 _z_01234567898765432100123456789876543210 + type instance Apply Lambda_0123456789876543210Sym0 _z_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym1 _z_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym0KindInference ()) + data Lambda_0123456789876543210Sym1 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 _z_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym2 _z_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym1 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym1 _z_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym2 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 _z_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym1KindInference ()) + data Lambda_0123456789876543210Sym2 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym3 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym2 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym2 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym3 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym2KindInference ()) + data Lambda_0123456789876543210Sym3 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym3KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym3 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym4 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym3 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym3 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym4 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym3 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym3KindInference ()) + data Lambda_0123456789876543210Sym4 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym4KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym4 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym5 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym4 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym4 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym5 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym4 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym4KindInference ()) + data Lambda_0123456789876543210Sym5 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym5KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym5 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym6 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym5 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym5 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) n_01234567898765432100123456789876543210 = Lambda_0123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym5 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym5KindInference ()) + type family Lambda_0123456789876543210Sym6 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 where + Lambda_0123456789876543210Sym6 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 = Lambda_0123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 + type family Lambda_0123456789876543210 _z_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 n_0123456789876543210 where + Lambda_0123456789876543210 _z_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 n_0123456789876543210 = _z_0123456789876543210 + data Lambda_0123456789876543210Sym0 _z_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) => + Lambda_0123456789876543210Sym0 _z_01234567898765432100123456789876543210 + type instance Apply Lambda_0123456789876543210Sym0 _z_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym1 _z_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym0KindInference ()) + data Lambda_0123456789876543210Sym1 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 _z_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym2 _z_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym1 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym1 _z_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym2 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 _z_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym1KindInference ()) + data Lambda_0123456789876543210Sym2 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym3 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym2 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym2 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym3 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym2KindInference ()) + data Lambda_0123456789876543210Sym3 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym3KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym3 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym4 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym3 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym3 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym4 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym3 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym3KindInference ()) + data Lambda_0123456789876543210Sym4 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym4KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym4 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym5 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym4 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym4 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym5 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym4 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym4KindInference ()) + data Lambda_0123456789876543210Sym5 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym5KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym5 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym6 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym5 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym5 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) n_01234567898765432100123456789876543210 = Lambda_0123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym5 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym5KindInference ()) + type family Lambda_0123456789876543210Sym6 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 where + Lambda_0123456789876543210Sym6 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 = Lambda_0123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 + type family Lambda_0123456789876543210 _z_0123456789876543210 a_0123456789876543210 n_0123456789876543210 where + Lambda_0123456789876543210 _z_0123456789876543210 a_0123456789876543210 n_0123456789876543210 = n_0123456789876543210 + data Lambda_0123456789876543210Sym0 _z_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) => + Lambda_0123456789876543210Sym0 _z_01234567898765432100123456789876543210 + type instance Apply Lambda_0123456789876543210Sym0 _z_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym1 _z_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym0KindInference ()) + data Lambda_0123456789876543210Sym1 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 _z_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym2 _z_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym1 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym1 _z_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym2 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 _z_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym1KindInference ()) + data Lambda_0123456789876543210Sym2 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym3 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym2 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym2 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) n_01234567898765432100123456789876543210 = Lambda_0123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym2KindInference ()) + type family Lambda_0123456789876543210Sym3 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 where + Lambda_0123456789876543210Sym3 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 = Lambda_0123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 + type TFHelper_0123456789876543210 :: a -> T x b -> T x a + type family TFHelper_0123456789876543210 (a :: a) (a :: T x b) :: T x a where + TFHelper_0123456789876543210 _z_0123456789876543210 (MkT1 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210) = Apply (Apply (Apply (Apply MkT1Sym0 (Apply (Apply (Apply (Apply (Apply (Apply Lambda_0123456789876543210Sym0 _z_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210)) (Apply (Apply (Apply (Apply (Apply (Apply Lambda_0123456789876543210Sym0 _z_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210)) (Apply (Apply (<$@#@$) _z_0123456789876543210) a_0123456789876543210)) (Apply (Apply FmapSym0 (Apply (<$@#@$) _z_0123456789876543210)) a_0123456789876543210) + TFHelper_0123456789876543210 _z_0123456789876543210 (MkT2 a_0123456789876543210) = Apply MkT2Sym0 (Apply (Apply (Apply Lambda_0123456789876543210Sym0 _z_0123456789876543210) a_0123456789876543210) a_0123456789876543210) + type TFHelper_0123456789876543210Sym0 :: (~>) a ((~>) (T x b) (T x a)) + data TFHelper_0123456789876543210Sym0 :: (~>) a ((~>) (T x b) (T x a)) + where + TFHelper_0123456789876543210Sym0KindInference :: SameKind (Apply TFHelper_0123456789876543210Sym0 arg) (TFHelper_0123456789876543210Sym1 arg) => + TFHelper_0123456789876543210Sym0 a0123456789876543210 + type instance Apply TFHelper_0123456789876543210Sym0 a0123456789876543210 = TFHelper_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings TFHelper_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) TFHelper_0123456789876543210Sym0KindInference ()) + type TFHelper_0123456789876543210Sym1 :: a -> (~>) (T x b) (T x a) + data TFHelper_0123456789876543210Sym1 (a0123456789876543210 :: a) :: (~>) (T x b) (T x a) + where + TFHelper_0123456789876543210Sym1KindInference :: SameKind (Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) arg) (TFHelper_0123456789876543210Sym2 a0123456789876543210 arg) => + TFHelper_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (TFHelper_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) TFHelper_0123456789876543210Sym1KindInference ()) + type TFHelper_0123456789876543210Sym2 :: a -> T x b -> T x a + type family TFHelper_0123456789876543210Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: T x b) :: T x a where + TFHelper_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PFunctor (T x) where + type Fmap a a = Apply (Apply Fmap_0123456789876543210Sym0 a) a + type (<$) a a = Apply (Apply TFHelper_0123456789876543210Sym0 a) a + type family Lambda_0123456789876543210 _f_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 n_0123456789876543210 where + Lambda_0123456789876543210 _f_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 n_0123456789876543210 = MemptySym0 + data Lambda_0123456789876543210Sym0 _f_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) => + Lambda_0123456789876543210Sym0 _f_01234567898765432100123456789876543210 + type instance Apply Lambda_0123456789876543210Sym0 _f_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym0KindInference ()) + data Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym1KindInference ()) + data Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym2KindInference ()) + data Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym3KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym3KindInference ()) + data Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym4KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym4KindInference ()) + data Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym5KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) n_01234567898765432100123456789876543210 = Lambda_0123456789876543210 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym5KindInference ()) + type family Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 where + Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 = Lambda_0123456789876543210 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 + type family Lambda_0123456789876543210 _f_0123456789876543210 a_0123456789876543210 n_0123456789876543210 where + Lambda_0123456789876543210 _f_0123456789876543210 a_0123456789876543210 n_0123456789876543210 = MemptySym0 + data Lambda_0123456789876543210Sym0 _f_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) => + Lambda_0123456789876543210Sym0 _f_01234567898765432100123456789876543210 + type instance Apply Lambda_0123456789876543210Sym0 _f_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym0KindInference ()) + data Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym1KindInference ()) + data Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) n_01234567898765432100123456789876543210 = Lambda_0123456789876543210 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym2KindInference ()) + type family Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 where + Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 = Lambda_0123456789876543210 _f_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n_01234567898765432100123456789876543210 + type FoldMap_0123456789876543210 :: (~>) a m -> T x a -> m + type family FoldMap_0123456789876543210 (a :: (~>) a m) (a :: T x a) :: m where + FoldMap_0123456789876543210 _f_0123456789876543210 (MkT1 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210) = Apply (Apply MappendSym0 (Apply (Apply (Apply (Apply (Apply (Apply Lambda_0123456789876543210Sym0 _f_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210)) (Apply (Apply MappendSym0 (Apply _f_0123456789876543210 a_0123456789876543210)) (Apply (Apply MappendSym0 (Apply (Apply FoldMapSym0 _f_0123456789876543210) a_0123456789876543210)) (Apply (Apply FoldMapSym0 (Apply FoldMapSym0 _f_0123456789876543210)) a_0123456789876543210))) + FoldMap_0123456789876543210 _f_0123456789876543210 (MkT2 a_0123456789876543210) = Apply (Apply (Apply Lambda_0123456789876543210Sym0 _f_0123456789876543210) a_0123456789876543210) a_0123456789876543210 + type FoldMap_0123456789876543210Sym0 :: (~>) ((~>) a m) ((~>) (T x a) m) + data FoldMap_0123456789876543210Sym0 :: (~>) ((~>) a m) ((~>) (T x a) m) + where + FoldMap_0123456789876543210Sym0KindInference :: SameKind (Apply FoldMap_0123456789876543210Sym0 arg) (FoldMap_0123456789876543210Sym1 arg) => + FoldMap_0123456789876543210Sym0 a0123456789876543210 + type instance Apply FoldMap_0123456789876543210Sym0 a0123456789876543210 = FoldMap_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings FoldMap_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) FoldMap_0123456789876543210Sym0KindInference ()) + type FoldMap_0123456789876543210Sym1 :: (~>) a m -> (~>) (T x a) m + data FoldMap_0123456789876543210Sym1 (a0123456789876543210 :: (~>) a m) :: (~>) (T x a) m + where + FoldMap_0123456789876543210Sym1KindInference :: SameKind (Apply (FoldMap_0123456789876543210Sym1 a0123456789876543210) arg) (FoldMap_0123456789876543210Sym2 a0123456789876543210 arg) => + FoldMap_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (FoldMap_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = FoldMap_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (FoldMap_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) FoldMap_0123456789876543210Sym1KindInference ()) + type FoldMap_0123456789876543210Sym2 :: (~>) a m -> T x a -> m + type family FoldMap_0123456789876543210Sym2 (a0123456789876543210 :: (~>) a m) (a0123456789876543210 :: T x a) :: m where + FoldMap_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = FoldMap_0123456789876543210 a0123456789876543210 a0123456789876543210 + type family Lambda_0123456789876543210 _f_0123456789876543210 _z_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 n1_0123456789876543210 n2_0123456789876543210 where + Lambda_0123456789876543210 _f_0123456789876543210 _z_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 n1_0123456789876543210 n2_0123456789876543210 = n2_0123456789876543210 + data Lambda_0123456789876543210Sym0 _f_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) => + Lambda_0123456789876543210Sym0 _f_01234567898765432100123456789876543210 + type instance Apply Lambda_0123456789876543210Sym0 _f_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym0KindInference ()) + data Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210) _z_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym1KindInference ()) + data Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym2KindInference ()) + data Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym3KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym3KindInference ()) + data Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym4KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym4KindInference ()) + data Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym5KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym5KindInference ()) + data Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym6KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym7 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) n1_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym7 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym6KindInference ()) + data Lambda_0123456789876543210Sym7 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym7KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym7 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym8 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym7 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym7 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210) n2_01234567898765432100123456789876543210 = Lambda_0123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym7 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym7KindInference ()) + type family Lambda_0123456789876543210Sym8 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 where + Lambda_0123456789876543210Sym8 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 = Lambda_0123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 + type family Lambda_0123456789876543210 _f_0123456789876543210 _z_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 n1_0123456789876543210 n2_0123456789876543210 where + Lambda_0123456789876543210 _f_0123456789876543210 _z_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 n1_0123456789876543210 n2_0123456789876543210 = Apply (Apply (Apply FoldrSym0 _f_0123456789876543210) n2_0123456789876543210) n1_0123456789876543210 + data Lambda_0123456789876543210Sym0 _f_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) => + Lambda_0123456789876543210Sym0 _f_01234567898765432100123456789876543210 + type instance Apply Lambda_0123456789876543210Sym0 _f_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym0KindInference ()) + data Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210) _z_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym1KindInference ()) + data Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym2KindInference ()) + data Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym3KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym3KindInference ()) + data Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym4KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym4KindInference ()) + data Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym5KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym5KindInference ()) + data Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym6KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym7 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) n1_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym7 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym6KindInference ()) + data Lambda_0123456789876543210Sym7 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym7KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym7 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym8 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym7 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym7 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210) n2_01234567898765432100123456789876543210 = Lambda_0123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym7 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym7KindInference ()) + type family Lambda_0123456789876543210Sym8 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 where + Lambda_0123456789876543210Sym8 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 = Lambda_0123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 + type family Lambda_0123456789876543210 n1_0123456789876543210 n2_0123456789876543210 _f_0123456789876543210 _z_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 n1_0123456789876543210 n2_0123456789876543210 where + Lambda_0123456789876543210 n1_0123456789876543210 n2_0123456789876543210 _f_0123456789876543210 _z_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 n1_0123456789876543210 n2_0123456789876543210 = Apply (Apply (Apply FoldrSym0 _f_0123456789876543210) n2_0123456789876543210) n1_0123456789876543210 + data Lambda_0123456789876543210Sym0 n1_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) => + Lambda_0123456789876543210Sym0 n1_01234567898765432100123456789876543210 + type instance Apply Lambda_0123456789876543210Sym0 n1_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym1 n1_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym0KindInference ()) + data Lambda_0123456789876543210Sym1 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 n1_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym2 n1_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym1 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym1 n1_01234567898765432100123456789876543210) n2_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym2 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 n1_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym1KindInference ()) + data Lambda_0123456789876543210Sym2 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym3 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym2 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym2 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210) _f_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym3 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym2KindInference ()) + data Lambda_0123456789876543210Sym3 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym3KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym3 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym4 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym3 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym3 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210) _z_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym4 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym3 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym3KindInference ()) + data Lambda_0123456789876543210Sym4 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym4KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym4 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym5 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym4 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym4 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym5 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym4 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym4KindInference ()) + data Lambda_0123456789876543210Sym5 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym5KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym5 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym6 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym5 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym5 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym6 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym5 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym5KindInference ()) + data Lambda_0123456789876543210Sym6 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym6KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym6 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym7 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym6 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym6 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym7 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym6 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym6KindInference ()) + data Lambda_0123456789876543210Sym7 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym7KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym7 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym8 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym7 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym7 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym8 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym7 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym7KindInference ()) + data Lambda_0123456789876543210Sym8 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym8KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym8 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym9 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym8 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym8 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) n1_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym9 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym8 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym8KindInference ()) + data Lambda_0123456789876543210Sym9 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym9KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym9 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym10 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym9 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym9 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210) n2_01234567898765432100123456789876543210 = Lambda_0123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym9 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym9KindInference ()) + type family Lambda_0123456789876543210Sym10 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 where + Lambda_0123456789876543210Sym10 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 = Lambda_0123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 + type family Lambda_0123456789876543210 _f_0123456789876543210 _z_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 n1_0123456789876543210 n2_0123456789876543210 where + Lambda_0123456789876543210 _f_0123456789876543210 _z_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 n1_0123456789876543210 n2_0123456789876543210 = Apply (Apply (Apply FoldrSym0 (Apply (Apply (Apply (Apply (Apply (Apply (Apply (Apply Lambda_0123456789876543210Sym0 n1_0123456789876543210) n2_0123456789876543210) _f_0123456789876543210) _z_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210)) n2_0123456789876543210) n1_0123456789876543210 + data Lambda_0123456789876543210Sym0 _f_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) => + Lambda_0123456789876543210Sym0 _f_01234567898765432100123456789876543210 + type instance Apply Lambda_0123456789876543210Sym0 _f_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym0KindInference ()) + data Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210) _z_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym1KindInference ()) + data Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym2KindInference ()) + data Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym3KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym3KindInference ()) + data Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym4KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym4KindInference ()) + data Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym5KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym5KindInference ()) + data Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym6KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym7 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) n1_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym7 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym6 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym6KindInference ()) + data Lambda_0123456789876543210Sym7 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym7KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym7 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym8 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym7 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym7 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210) n2_01234567898765432100123456789876543210 = Lambda_0123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym7 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym7KindInference ()) + type family Lambda_0123456789876543210Sym8 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 where + Lambda_0123456789876543210Sym8 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 = Lambda_0123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 + type family Lambda_0123456789876543210 _f_0123456789876543210 _z_0123456789876543210 a_0123456789876543210 n1_0123456789876543210 n2_0123456789876543210 where + Lambda_0123456789876543210 _f_0123456789876543210 _z_0123456789876543210 a_0123456789876543210 n1_0123456789876543210 n2_0123456789876543210 = n2_0123456789876543210 + data Lambda_0123456789876543210Sym0 _f_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) => + Lambda_0123456789876543210Sym0 _f_01234567898765432100123456789876543210 + type instance Apply Lambda_0123456789876543210Sym0 _f_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym0KindInference ()) + data Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210) _z_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 _f_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym1KindInference ()) + data Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym2KindInference ()) + data Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym3KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) n1_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym3 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym3KindInference ()) + data Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym4KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210) n2_01234567898765432100123456789876543210 = Lambda_0123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym4 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym4KindInference ()) + type family Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 where + Lambda_0123456789876543210Sym5 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 = Lambda_0123456789876543210 _f_01234567898765432100123456789876543210 _z_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n1_01234567898765432100123456789876543210 n2_01234567898765432100123456789876543210 + type Foldr_0123456789876543210 :: (~>) a ((~>) b b) + -> b -> T x a -> b + type family Foldr_0123456789876543210 (a :: (~>) a ((~>) b b)) (a :: b) (a :: T x a) :: b where + Foldr_0123456789876543210 _f_0123456789876543210 _z_0123456789876543210 (MkT1 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210) = Apply (Apply (Apply (Apply (Apply (Apply (Apply (Apply Lambda_0123456789876543210Sym0 _f_0123456789876543210) _z_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) (Apply (Apply _f_0123456789876543210 a_0123456789876543210) (Apply (Apply (Apply (Apply (Apply (Apply (Apply (Apply Lambda_0123456789876543210Sym0 _f_0123456789876543210) _z_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) (Apply (Apply (Apply (Apply (Apply (Apply (Apply (Apply Lambda_0123456789876543210Sym0 _f_0123456789876543210) _z_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) _z_0123456789876543210))) + Foldr_0123456789876543210 _f_0123456789876543210 _z_0123456789876543210 (MkT2 a_0123456789876543210) = Apply (Apply (Apply (Apply (Apply Lambda_0123456789876543210Sym0 _f_0123456789876543210) _z_0123456789876543210) a_0123456789876543210) a_0123456789876543210) _z_0123456789876543210 + type Foldr_0123456789876543210Sym0 :: (~>) ((~>) a ((~>) b b)) ((~>) b ((~>) (T x a) b)) + data Foldr_0123456789876543210Sym0 :: (~>) ((~>) a ((~>) b b)) ((~>) b ((~>) (T x a) b)) + where + Foldr_0123456789876543210Sym0KindInference :: SameKind (Apply Foldr_0123456789876543210Sym0 arg) (Foldr_0123456789876543210Sym1 arg) => + Foldr_0123456789876543210Sym0 a0123456789876543210 + type instance Apply Foldr_0123456789876543210Sym0 a0123456789876543210 = Foldr_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Foldr_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Foldr_0123456789876543210Sym0KindInference ()) + type Foldr_0123456789876543210Sym1 :: (~>) a ((~>) b b) + -> (~>) b ((~>) (T x a) b) + data Foldr_0123456789876543210Sym1 (a0123456789876543210 :: (~>) a ((~>) b b)) :: (~>) b ((~>) (T x a) b) + where + Foldr_0123456789876543210Sym1KindInference :: SameKind (Apply (Foldr_0123456789876543210Sym1 a0123456789876543210) arg) (Foldr_0123456789876543210Sym2 a0123456789876543210 arg) => + Foldr_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (Foldr_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Foldr_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Foldr_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Foldr_0123456789876543210Sym1KindInference ()) + type Foldr_0123456789876543210Sym2 :: (~>) a ((~>) b b) + -> b -> (~>) (T x a) b + data Foldr_0123456789876543210Sym2 (a0123456789876543210 :: (~>) a ((~>) b b)) (a0123456789876543210 :: b) :: (~>) (T x a) b + where + Foldr_0123456789876543210Sym2KindInference :: SameKind (Apply (Foldr_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) arg) (Foldr_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 arg) => + Foldr_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply (Foldr_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = Foldr_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Foldr_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Foldr_0123456789876543210Sym2KindInference ()) + type Foldr_0123456789876543210Sym3 :: (~>) a ((~>) b b) + -> b -> T x a -> b + type family Foldr_0123456789876543210Sym3 (a0123456789876543210 :: (~>) a ((~>) b b)) (a0123456789876543210 :: b) (a0123456789876543210 :: T x a) :: b where + Foldr_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = Foldr_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PFoldable (T x) where + type FoldMap a a = Apply (Apply FoldMap_0123456789876543210Sym0 a) a + type Foldr a a a = Apply (Apply (Apply Foldr_0123456789876543210Sym0 a) a) a + type Traverse_0123456789876543210 :: (~>) a (f b) + -> T x a -> f (T x b) + type family Traverse_0123456789876543210 (a :: (~>) a (f b)) (a :: T x a) :: f (T x b) where + Traverse_0123456789876543210 _f_0123456789876543210 (MkT1 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210) = Apply (Apply (<*>@#@$) (Apply (Apply (<*>@#@$) (Apply (Apply (Apply LiftA2Sym0 MkT1Sym0) (Apply PureSym0 a_0123456789876543210)) (Apply _f_0123456789876543210 a_0123456789876543210))) (Apply (Apply TraverseSym0 _f_0123456789876543210) a_0123456789876543210))) (Apply (Apply TraverseSym0 (Apply TraverseSym0 _f_0123456789876543210)) a_0123456789876543210) + Traverse_0123456789876543210 _f_0123456789876543210 (MkT2 a_0123456789876543210) = Apply (Apply FmapSym0 MkT2Sym0) (Apply PureSym0 a_0123456789876543210) + type Traverse_0123456789876543210Sym0 :: (~>) ((~>) a (f b)) ((~>) (T x a) (f (T x b))) + data Traverse_0123456789876543210Sym0 :: (~>) ((~>) a (f b)) ((~>) (T x a) (f (T x b))) + where + Traverse_0123456789876543210Sym0KindInference :: SameKind (Apply Traverse_0123456789876543210Sym0 arg) (Traverse_0123456789876543210Sym1 arg) => + Traverse_0123456789876543210Sym0 a0123456789876543210 + type instance Apply Traverse_0123456789876543210Sym0 a0123456789876543210 = Traverse_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Traverse_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Traverse_0123456789876543210Sym0KindInference ()) + type Traverse_0123456789876543210Sym1 :: (~>) a (f b) + -> (~>) (T x a) (f (T x b)) + data Traverse_0123456789876543210Sym1 (a0123456789876543210 :: (~>) a (f b)) :: (~>) (T x a) (f (T x b)) + where + Traverse_0123456789876543210Sym1KindInference :: SameKind (Apply (Traverse_0123456789876543210Sym1 a0123456789876543210) arg) (Traverse_0123456789876543210Sym2 a0123456789876543210 arg) => + Traverse_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (Traverse_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Traverse_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Traverse_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Traverse_0123456789876543210Sym1KindInference ()) + type Traverse_0123456789876543210Sym2 :: (~>) a (f b) + -> T x a -> f (T x b) + type family Traverse_0123456789876543210Sym2 (a0123456789876543210 :: (~>) a (f b)) (a0123456789876543210 :: T x a) :: f (T x b) where + Traverse_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Traverse_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PTraversable (T x) where + type Traverse a a = Apply (Apply Traverse_0123456789876543210Sym0 a) a + type family Case_0123456789876543210 v_0123456789876543210 t where + type Fmap_0123456789876543210 :: (~>) a b -> Empty a -> Empty b + type family Fmap_0123456789876543210 (a :: (~>) a b) (a :: Empty a) :: Empty b where + Fmap_0123456789876543210 _ v_0123456789876543210 = Case_0123456789876543210 v_0123456789876543210 v_0123456789876543210 + type Fmap_0123456789876543210Sym0 :: (~>) ((~>) a b) ((~>) (Empty a) (Empty b)) + data Fmap_0123456789876543210Sym0 :: (~>) ((~>) a b) ((~>) (Empty a) (Empty b)) + where + Fmap_0123456789876543210Sym0KindInference :: SameKind (Apply Fmap_0123456789876543210Sym0 arg) (Fmap_0123456789876543210Sym1 arg) => + Fmap_0123456789876543210Sym0 a0123456789876543210 + type instance Apply Fmap_0123456789876543210Sym0 a0123456789876543210 = Fmap_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Fmap_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Fmap_0123456789876543210Sym0KindInference ()) + type Fmap_0123456789876543210Sym1 :: (~>) a b + -> (~>) (Empty a) (Empty b) + data Fmap_0123456789876543210Sym1 (a0123456789876543210 :: (~>) a b) :: (~>) (Empty a) (Empty b) + where + Fmap_0123456789876543210Sym1KindInference :: SameKind (Apply (Fmap_0123456789876543210Sym1 a0123456789876543210) arg) (Fmap_0123456789876543210Sym2 a0123456789876543210 arg) => + Fmap_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (Fmap_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Fmap_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Fmap_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Fmap_0123456789876543210Sym1KindInference ()) + type Fmap_0123456789876543210Sym2 :: (~>) a b -> Empty a -> Empty b + type family Fmap_0123456789876543210Sym2 (a0123456789876543210 :: (~>) a b) (a0123456789876543210 :: Empty a) :: Empty b where + Fmap_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Fmap_0123456789876543210 a0123456789876543210 a0123456789876543210 + type family Case_0123456789876543210 v_0123456789876543210 t where + type TFHelper_0123456789876543210 :: a -> Empty b -> Empty a + type family TFHelper_0123456789876543210 (a :: a) (a :: Empty b) :: Empty a where + TFHelper_0123456789876543210 _ v_0123456789876543210 = Case_0123456789876543210 v_0123456789876543210 v_0123456789876543210 + type TFHelper_0123456789876543210Sym0 :: (~>) a ((~>) (Empty b) (Empty a)) + data TFHelper_0123456789876543210Sym0 :: (~>) a ((~>) (Empty b) (Empty a)) + where + TFHelper_0123456789876543210Sym0KindInference :: SameKind (Apply TFHelper_0123456789876543210Sym0 arg) (TFHelper_0123456789876543210Sym1 arg) => + TFHelper_0123456789876543210Sym0 a0123456789876543210 + type instance Apply TFHelper_0123456789876543210Sym0 a0123456789876543210 = TFHelper_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings TFHelper_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) TFHelper_0123456789876543210Sym0KindInference ()) + type TFHelper_0123456789876543210Sym1 :: a + -> (~>) (Empty b) (Empty a) + data TFHelper_0123456789876543210Sym1 (a0123456789876543210 :: a) :: (~>) (Empty b) (Empty a) + where + TFHelper_0123456789876543210Sym1KindInference :: SameKind (Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) arg) (TFHelper_0123456789876543210Sym2 a0123456789876543210 arg) => + TFHelper_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (TFHelper_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) TFHelper_0123456789876543210Sym1KindInference ()) + type TFHelper_0123456789876543210Sym2 :: a -> Empty b -> Empty a + type family TFHelper_0123456789876543210Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: Empty b) :: Empty a where + TFHelper_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PFunctor Empty where + type Fmap a a = Apply (Apply Fmap_0123456789876543210Sym0 a) a + type (<$) a a = Apply (Apply TFHelper_0123456789876543210Sym0 a) a + type FoldMap_0123456789876543210 :: (~>) a m -> Empty a -> m + type family FoldMap_0123456789876543210 (a :: (~>) a m) (a :: Empty a) :: m where + FoldMap_0123456789876543210 _ _ = MemptySym0 + type FoldMap_0123456789876543210Sym0 :: (~>) ((~>) a m) ((~>) (Empty a) m) + data FoldMap_0123456789876543210Sym0 :: (~>) ((~>) a m) ((~>) (Empty a) m) + where + FoldMap_0123456789876543210Sym0KindInference :: SameKind (Apply FoldMap_0123456789876543210Sym0 arg) (FoldMap_0123456789876543210Sym1 arg) => + FoldMap_0123456789876543210Sym0 a0123456789876543210 + type instance Apply FoldMap_0123456789876543210Sym0 a0123456789876543210 = FoldMap_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings FoldMap_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) FoldMap_0123456789876543210Sym0KindInference ()) + type FoldMap_0123456789876543210Sym1 :: (~>) a m + -> (~>) (Empty a) m + data FoldMap_0123456789876543210Sym1 (a0123456789876543210 :: (~>) a m) :: (~>) (Empty a) m + where + FoldMap_0123456789876543210Sym1KindInference :: SameKind (Apply (FoldMap_0123456789876543210Sym1 a0123456789876543210) arg) (FoldMap_0123456789876543210Sym2 a0123456789876543210 arg) => + FoldMap_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (FoldMap_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = FoldMap_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (FoldMap_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) FoldMap_0123456789876543210Sym1KindInference ()) + type FoldMap_0123456789876543210Sym2 :: (~>) a m -> Empty a -> m + type family FoldMap_0123456789876543210Sym2 (a0123456789876543210 :: (~>) a m) (a0123456789876543210 :: Empty a) :: m where + FoldMap_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = FoldMap_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PFoldable Empty where + type FoldMap a a = Apply (Apply FoldMap_0123456789876543210Sym0 a) a + type family Case_0123456789876543210 v_0123456789876543210 t where + type Traverse_0123456789876543210 :: (~>) a (f b) + -> Empty a -> f (Empty b) + type family Traverse_0123456789876543210 (a :: (~>) a (f b)) (a :: Empty a) :: f (Empty b) where + Traverse_0123456789876543210 _ v_0123456789876543210 = Apply PureSym0 (Case_0123456789876543210 v_0123456789876543210 v_0123456789876543210) + type Traverse_0123456789876543210Sym0 :: (~>) ((~>) a (f b)) ((~>) (Empty a) (f (Empty b))) + data Traverse_0123456789876543210Sym0 :: (~>) ((~>) a (f b)) ((~>) (Empty a) (f (Empty b))) + where + Traverse_0123456789876543210Sym0KindInference :: SameKind (Apply Traverse_0123456789876543210Sym0 arg) (Traverse_0123456789876543210Sym1 arg) => + Traverse_0123456789876543210Sym0 a0123456789876543210 + type instance Apply Traverse_0123456789876543210Sym0 a0123456789876543210 = Traverse_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Traverse_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Traverse_0123456789876543210Sym0KindInference ()) + type Traverse_0123456789876543210Sym1 :: (~>) a (f b) + -> (~>) (Empty a) (f (Empty b)) + data Traverse_0123456789876543210Sym1 (a0123456789876543210 :: (~>) a (f b)) :: (~>) (Empty a) (f (Empty b)) + where + Traverse_0123456789876543210Sym1KindInference :: SameKind (Apply (Traverse_0123456789876543210Sym1 a0123456789876543210) arg) (Traverse_0123456789876543210Sym2 a0123456789876543210 arg) => + Traverse_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (Traverse_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Traverse_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Traverse_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Traverse_0123456789876543210Sym1KindInference ()) + type Traverse_0123456789876543210Sym2 :: (~>) a (f b) + -> Empty a -> f (Empty b) + type family Traverse_0123456789876543210Sym2 (a0123456789876543210 :: (~>) a (f b)) (a0123456789876543210 :: Empty a) :: f (Empty b) where + Traverse_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Traverse_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PTraversable Empty where + type Traverse a a = Apply (Apply Traverse_0123456789876543210Sym0 a) a + data ST :: forall x a. T x a -> Type + where + SMkT1 :: forall x + a + (n :: x) + (n :: a) + (n :: Maybe a) + (n :: Maybe (Maybe a)). + (Sing n) -> + (Sing n) -> + (Sing n) -> + (Sing n) -> + ST (MkT1 n n n n :: T x a) + SMkT2 :: forall x a (n :: Maybe x). + (Sing n) -> ST (MkT2 n :: T x a) + type instance Sing @(T x a) = ST + instance (SingKind x, SingKind a) => SingKind (T x a) where + type Demote (T x a) = T (Demote x) (Demote a) + fromSing (SMkT1 b b b b) + = MkT1 (fromSing b) (fromSing b) (fromSing b) (fromSing b) + fromSing (SMkT2 b) = MkT2 (fromSing b) + toSing + (MkT1 (b :: Demote x) (b :: Demote a) (b :: Demote (Maybe a)) + (b :: Demote (Maybe (Maybe a)))) + = case + (,,,) + (toSing b :: SomeSing x) (toSing b :: SomeSing a) + (toSing b :: SomeSing (Maybe a)) + (toSing b :: SomeSing (Maybe (Maybe a))) + of + (,,,) (SomeSing c) (SomeSing c) (SomeSing c) (SomeSing c) + -> SomeSing (SMkT1 c c c c) + toSing (MkT2 (b :: Demote (Maybe x))) + = case toSing b :: SomeSing (Maybe x) of + SomeSing c -> SomeSing (SMkT2 c) + data SEmpty :: forall (a :: Type). Empty a -> Type + type instance Sing @(Empty a) = SEmpty + instance SingKind a => SingKind (Empty a) where + type Demote (Empty a) = Empty (Demote a) + fromSing x = case x of {} + toSing x = SomeSing (case x of {}) + instance SFunctor (T x) where + sFmap :: + forall (a :: Type) + (b :: Type) + (t1 :: (~>) a b) + (t2 :: T x a). Sing t1 + -> Sing t2 + -> Sing (Apply (Apply (FmapSym0 :: TyFun ((~>) a b) ((~>) (T x a) (T x b)) + -> Type) t1) t2) + (%<$) :: + forall (a :: Type) (b :: Type) (t1 :: a) (t2 :: T x b). Sing t1 + -> Sing t2 + -> Sing (Apply (Apply ((<$@#@$) :: TyFun a ((~>) (T x b) (T x a)) + -> Type) t1) t2) + sFmap + (_sf_0123456789876543210 :: Sing _f_0123456789876543210) + (SMkT1 (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210)) + = applySing + (applySing + (applySing + (applySing + (singFun4 @MkT1Sym0 SMkT1) + (applySing + (singFun1 + @(Apply (Apply (Apply (Apply (Apply Lambda_0123456789876543210Sym0 _f_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) + (\ sN_0123456789876543210 + -> case sN_0123456789876543210 of + (_ :: Sing n_0123456789876543210) -> sN_0123456789876543210)) + sA_0123456789876543210)) + (applySing _sf_0123456789876543210 sA_0123456789876543210)) + (applySing + (applySing (singFun2 @FmapSym0 sFmap) _sf_0123456789876543210) + sA_0123456789876543210)) + (applySing + (applySing + (singFun2 @FmapSym0 sFmap) + (applySing (singFun2 @FmapSym0 sFmap) _sf_0123456789876543210)) + sA_0123456789876543210) + sFmap + (_sf_0123456789876543210 :: Sing _f_0123456789876543210) + (SMkT2 (sA_0123456789876543210 :: Sing a_0123456789876543210)) + = applySing + (singFun1 @MkT2Sym0 SMkT2) + (applySing + (singFun1 + @(Apply (Apply Lambda_0123456789876543210Sym0 _f_0123456789876543210) a_0123456789876543210) + (\ sN_0123456789876543210 + -> case sN_0123456789876543210 of + (_ :: Sing n_0123456789876543210) -> sN_0123456789876543210)) + sA_0123456789876543210) + (%<$) + (_sz_0123456789876543210 :: Sing _z_0123456789876543210) + (SMkT1 (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210)) + = applySing + (applySing + (applySing + (applySing + (singFun4 @MkT1Sym0 SMkT1) + (applySing + (singFun1 + @(Apply (Apply (Apply (Apply (Apply Lambda_0123456789876543210Sym0 _z_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) + (\ sN_0123456789876543210 + -> case sN_0123456789876543210 of + (_ :: Sing n_0123456789876543210) -> sN_0123456789876543210)) + sA_0123456789876543210)) + (applySing + (singFun1 + @(Apply (Apply (Apply (Apply (Apply Lambda_0123456789876543210Sym0 _z_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) + (\ sN_0123456789876543210 + -> case sN_0123456789876543210 of + (_ :: Sing n_0123456789876543210) -> _sz_0123456789876543210)) + sA_0123456789876543210)) + (applySing + (applySing (singFun2 @(<$@#@$) (%<$)) _sz_0123456789876543210) + sA_0123456789876543210)) + (applySing + (applySing + (singFun2 @FmapSym0 sFmap) + (applySing (singFun2 @(<$@#@$) (%<$)) _sz_0123456789876543210)) + sA_0123456789876543210) + (%<$) + (_sz_0123456789876543210 :: Sing _z_0123456789876543210) + (SMkT2 (sA_0123456789876543210 :: Sing a_0123456789876543210)) + = applySing + (singFun1 @MkT2Sym0 SMkT2) + (applySing + (singFun1 + @(Apply (Apply Lambda_0123456789876543210Sym0 _z_0123456789876543210) a_0123456789876543210) + (\ sN_0123456789876543210 + -> case sN_0123456789876543210 of + (_ :: Sing n_0123456789876543210) -> sN_0123456789876543210)) + sA_0123456789876543210) + instance SFoldable (T x) where + sFoldMap :: + forall (a :: Type) + (m :: Type) + (t1 :: (~>) a m) + (t2 :: T x a). SMonoid m => + Sing t1 + -> Sing t2 + -> Sing (Apply (Apply (FoldMapSym0 :: TyFun ((~>) a m) ((~>) (T x a) m) + -> Type) t1) t2) + sFoldr :: + forall (a :: Type) + (b :: Type) + (t1 :: (~>) a ((~>) b b)) + (t2 :: b) + (t3 :: T x a). Sing t1 + -> Sing t2 + -> Sing t3 + -> Sing (Apply (Apply (Apply (FoldrSym0 :: TyFun ((~>) a ((~>) b b)) ((~>) b ((~>) (T x a) b)) + -> Type) t1) t2) t3) + sFoldMap + (_sf_0123456789876543210 :: Sing _f_0123456789876543210) + (SMkT1 (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210)) + = applySing + (applySing + (singFun2 @MappendSym0 sMappend) + (applySing + (singFun1 + @(Apply (Apply (Apply (Apply (Apply Lambda_0123456789876543210Sym0 _f_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) + (\ sN_0123456789876543210 + -> case sN_0123456789876543210 of + (_ :: Sing n_0123456789876543210) -> sMempty)) + sA_0123456789876543210)) + (applySing + (applySing + (singFun2 @MappendSym0 sMappend) + (applySing _sf_0123456789876543210 sA_0123456789876543210)) + (applySing + (applySing + (singFun2 @MappendSym0 sMappend) + (applySing + (applySing + (singFun2 @FoldMapSym0 sFoldMap) _sf_0123456789876543210) + sA_0123456789876543210)) + (applySing + (applySing + (singFun2 @FoldMapSym0 sFoldMap) + (applySing + (singFun2 @FoldMapSym0 sFoldMap) _sf_0123456789876543210)) + sA_0123456789876543210))) + sFoldMap + (_sf_0123456789876543210 :: Sing _f_0123456789876543210) + (SMkT2 (sA_0123456789876543210 :: Sing a_0123456789876543210)) + = applySing + (singFun1 + @(Apply (Apply Lambda_0123456789876543210Sym0 _f_0123456789876543210) a_0123456789876543210) + (\ sN_0123456789876543210 + -> case sN_0123456789876543210 of + (_ :: Sing n_0123456789876543210) -> sMempty)) + sA_0123456789876543210 + sFoldr + (_sf_0123456789876543210 :: Sing _f_0123456789876543210) + (_sz_0123456789876543210 :: Sing _z_0123456789876543210) + (SMkT1 (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210)) + = applySing + (applySing + (singFun2 + @(Apply (Apply (Apply (Apply (Apply (Apply Lambda_0123456789876543210Sym0 _f_0123456789876543210) _z_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) + (\ sN1_0123456789876543210 sN2_0123456789876543210 + -> case (,) sN1_0123456789876543210 sN2_0123456789876543210 of + (,) (_ :: Sing n1_0123456789876543210) + (_ :: Sing n2_0123456789876543210) + -> sN2_0123456789876543210)) + sA_0123456789876543210) + (applySing + (applySing _sf_0123456789876543210 sA_0123456789876543210) + (applySing + (applySing + (singFun2 + @(Apply (Apply (Apply (Apply (Apply (Apply Lambda_0123456789876543210Sym0 _f_0123456789876543210) _z_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) + (\ sN1_0123456789876543210 sN2_0123456789876543210 + -> case (,) sN1_0123456789876543210 sN2_0123456789876543210 of + (,) (_ :: Sing n1_0123456789876543210) + (_ :: Sing n2_0123456789876543210) + -> applySing + (applySing + (applySing + (singFun3 @FoldrSym0 sFoldr) _sf_0123456789876543210) + sN2_0123456789876543210) + sN1_0123456789876543210)) + sA_0123456789876543210) + (applySing + (applySing + (singFun2 + @(Apply (Apply (Apply (Apply (Apply (Apply Lambda_0123456789876543210Sym0 _f_0123456789876543210) _z_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) + (\ sN1_0123456789876543210 sN2_0123456789876543210 + -> case (,) sN1_0123456789876543210 sN2_0123456789876543210 of + (,) (_ :: Sing n1_0123456789876543210) + (_ :: Sing n2_0123456789876543210) + -> applySing + (applySing + (applySing + (singFun3 @FoldrSym0 sFoldr) + (singFun2 + @(Apply (Apply (Apply (Apply (Apply (Apply (Apply (Apply Lambda_0123456789876543210Sym0 n1_0123456789876543210) n2_0123456789876543210) _f_0123456789876543210) _z_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) + (\ sN1_0123456789876543210 + sN2_0123456789876543210 + -> case + (,) + sN1_0123456789876543210 + sN2_0123456789876543210 + of + (,) (_ :: Sing n1_0123456789876543210) + (_ :: Sing n2_0123456789876543210) + -> applySing + (applySing + (applySing + (singFun3 @FoldrSym0 sFoldr) + _sf_0123456789876543210) + sN2_0123456789876543210) + sN1_0123456789876543210))) + sN2_0123456789876543210) + sN1_0123456789876543210)) + sA_0123456789876543210) + _sz_0123456789876543210))) + sFoldr + (_sf_0123456789876543210 :: Sing _f_0123456789876543210) + (_sz_0123456789876543210 :: Sing _z_0123456789876543210) + (SMkT2 (sA_0123456789876543210 :: Sing a_0123456789876543210)) + = applySing + (applySing + (singFun2 + @(Apply (Apply (Apply Lambda_0123456789876543210Sym0 _f_0123456789876543210) _z_0123456789876543210) a_0123456789876543210) + (\ sN1_0123456789876543210 sN2_0123456789876543210 + -> case (,) sN1_0123456789876543210 sN2_0123456789876543210 of + (,) (_ :: Sing n1_0123456789876543210) + (_ :: Sing n2_0123456789876543210) + -> sN2_0123456789876543210)) + sA_0123456789876543210) + _sz_0123456789876543210 + instance STraversable (T x) where + sTraverse :: + forall (a :: Type) + (f :: Type -> Type) + (b :: Type) + (t1 :: (~>) a (f b)) + (t2 :: T x a). SApplicative f => + Sing t1 + -> Sing t2 + -> Sing (Apply (Apply (TraverseSym0 :: TyFun ((~>) a (f b)) ((~>) (T x a) (f (T x b))) + -> Type) t1) t2) + sTraverse + (_sf_0123456789876543210 :: Sing _f_0123456789876543210) + (SMkT1 (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210)) + = applySing + (applySing + (singFun2 @(<*>@#@$) (%<*>)) + (applySing + (applySing + (singFun2 @(<*>@#@$) (%<*>)) + (applySing + (applySing + (applySing + (singFun3 @LiftA2Sym0 sLiftA2) (singFun4 @MkT1Sym0 SMkT1)) + (applySing (singFun1 @PureSym0 sPure) sA_0123456789876543210)) + (applySing _sf_0123456789876543210 sA_0123456789876543210))) + (applySing + (applySing + (singFun2 @TraverseSym0 sTraverse) _sf_0123456789876543210) + sA_0123456789876543210))) + (applySing + (applySing + (singFun2 @TraverseSym0 sTraverse) + (applySing + (singFun2 @TraverseSym0 sTraverse) _sf_0123456789876543210)) + sA_0123456789876543210) + sTraverse + (_sf_0123456789876543210 :: Sing _f_0123456789876543210) + (SMkT2 (sA_0123456789876543210 :: Sing a_0123456789876543210)) + = applySing + (applySing (singFun2 @FmapSym0 sFmap) (singFun1 @MkT2Sym0 SMkT2)) + (applySing (singFun1 @PureSym0 sPure) sA_0123456789876543210) + instance SFunctor Empty where + sFmap :: + forall (a :: Type) + (b :: Type) + (t1 :: (~>) a b) + (t2 :: Empty a). Sing t1 + -> Sing t2 + -> Sing (Apply (Apply (FmapSym0 :: TyFun ((~>) a b) ((~>) (Empty a) (Empty b)) + -> Type) t1) t2) + (%<$) :: + forall (a :: Type) (b :: Type) (t1 :: a) (t2 :: Empty b). Sing t1 + -> Sing t2 + -> Sing (Apply (Apply ((<$@#@$) :: TyFun a ((~>) (Empty b) (Empty a)) + -> Type) t1) t2) + sFmap _ (sV_0123456789876543210 :: Sing v_0123456789876543210) + = id + @(Sing (Case_0123456789876543210 v_0123456789876543210 v_0123456789876543210)) + (case sV_0123456789876543210 of {}) + (%<$) _ (sV_0123456789876543210 :: Sing v_0123456789876543210) + = id + @(Sing (Case_0123456789876543210 v_0123456789876543210 v_0123456789876543210)) + (case sV_0123456789876543210 of {}) + instance SFoldable Empty where + sFoldMap :: + forall (a :: Type) + (m :: Type) + (t1 :: (~>) a m) + (t2 :: Empty a). SMonoid m => + Sing t1 + -> Sing t2 + -> Sing (Apply (Apply (FoldMapSym0 :: TyFun ((~>) a m) ((~>) (Empty a) m) + -> Type) t1) t2) + sFoldMap _ _ = sMempty + instance STraversable Empty where + sTraverse :: + forall (a :: Type) + (f :: Type -> Type) + (b :: Type) + (t1 :: (~>) a (f b)) + (t2 :: Empty a). SApplicative f => + Sing t1 + -> Sing t2 + -> Sing (Apply (Apply (TraverseSym0 :: TyFun ((~>) a (f b)) ((~>) (Empty a) (f (Empty b))) + -> Type) t1) t2) + sTraverse _ (sV_0123456789876543210 :: Sing v_0123456789876543210) + = applySing + (singFun1 @PureSym0 sPure) + (id + @(Sing (Case_0123456789876543210 v_0123456789876543210 v_0123456789876543210)) + (case sV_0123456789876543210 of {})) + instance (SingI n, SingI n, SingI n, SingI n) => + SingI (MkT1 (n :: x) (n :: a) (n :: Maybe a) (n :: Maybe (Maybe a))) where + sing = SMkT1 sing sing sing sing + instance (SingI n, SingI n, SingI n) => + SingI1 (MkT1 (n :: x) (n :: a) (n :: Maybe a)) where + liftSing = SMkT1 sing sing sing + instance (SingI n, SingI n) => + SingI2 (MkT1 (n :: x) (n :: a)) where + liftSing2 = SMkT1 sing sing + instance SingI (MkT1Sym0 :: (~>) x ((~>) a ((~>) (Maybe a) ((~>) (Maybe (Maybe a)) (T x a))))) where + sing = singFun4 @MkT1Sym0 SMkT1 + instance SingI d => + SingI (MkT1Sym1 (d :: x) :: (~>) a ((~>) (Maybe a) ((~>) (Maybe (Maybe a)) (T x a)))) where + sing = singFun3 @(MkT1Sym1 (d :: x)) (SMkT1 (sing @d)) + instance SingI1 (MkT1Sym1 :: x + -> (~>) a ((~>) (Maybe a) ((~>) (Maybe (Maybe a)) (T x a)))) where + liftSing (s :: Sing (d :: x)) + = singFun3 @(MkT1Sym1 (d :: x)) (SMkT1 s) + instance (SingI d, SingI d) => + SingI (MkT1Sym2 (d :: x) (d :: a) :: (~>) (Maybe a) ((~>) (Maybe (Maybe a)) (T x a))) where + sing + = singFun2 + @(MkT1Sym2 (d :: x) (d :: a)) (SMkT1 (sing @d) (sing @d)) + instance SingI d => + SingI1 (MkT1Sym2 (d :: x) :: a + -> (~>) (Maybe a) ((~>) (Maybe (Maybe a)) (T x a))) where + liftSing (s :: Sing (d :: a)) + = singFun2 @(MkT1Sym2 (d :: x) (d :: a)) (SMkT1 (sing @d) s) + instance SingI2 (MkT1Sym2 :: x + -> a -> (~>) (Maybe a) ((~>) (Maybe (Maybe a)) (T x a))) where + liftSing2 (s :: Sing (d :: x)) (s :: Sing (d :: a)) + = singFun2 @(MkT1Sym2 (d :: x) (d :: a)) (SMkT1 s s) + instance (SingI d, SingI d, SingI d) => + SingI (MkT1Sym3 (d :: x) (d :: a) (d :: Maybe a) :: (~>) (Maybe (Maybe a)) (T x a)) where + sing + = singFun1 + @(MkT1Sym3 (d :: x) (d :: a) (d :: Maybe a)) + (SMkT1 (sing @d) (sing @d) (sing @d)) + instance (SingI d, SingI d) => + SingI1 (MkT1Sym3 (d :: x) (d :: a) :: Maybe a + -> (~>) (Maybe (Maybe a)) (T x a)) where + liftSing (s :: Sing (d :: Maybe a)) + = singFun1 + @(MkT1Sym3 (d :: x) (d :: a) (d :: Maybe a)) + (SMkT1 (sing @d) (sing @d) s) + instance SingI d => + SingI2 (MkT1Sym3 (d :: x) :: a + -> Maybe a -> (~>) (Maybe (Maybe a)) (T x a)) where + liftSing2 (s :: Sing (d :: a)) (s :: Sing (d :: Maybe a)) + = singFun1 + @(MkT1Sym3 (d :: x) (d :: a) (d :: Maybe a)) (SMkT1 (sing @d) s s) + instance SingI n => SingI (MkT2 (n :: Maybe x)) where + sing = SMkT2 sing + instance SingI1 MkT2 where + liftSing = SMkT2 + instance SingI (MkT2Sym0 :: (~>) (Maybe x) (T x a)) where + sing = singFun1 @MkT2Sym0 SMkT2
tests/compile-and-dump/Singletons/FunctorLikeDeriving.hs view
@@ -1,16 +1,16 @@--- Ensure that we can derive Functor, Foldable, and Traversable using only--- an import of Data.Singletons.TH-module FunctorLikeDeriving where--import Data.Kind-import Data.Singletons.Base.TH--$(singletons [d|- data T x a- = MkT1 x a (Maybe a) (Maybe (Maybe a))- | MkT2 (Maybe x)- deriving (Functor, Foldable, Traversable)-- data Empty (a :: Type)- deriving (Functor, Foldable, Traversable)- |])+-- Ensure that we can derive Functor, Foldable, and Traversable using only +-- an import of Data.Singletons.TH +module FunctorLikeDeriving where + +import Data.Kind +import Data.Singletons.Base.TH + +$(singletons [d| + data T x a + = MkT1 x a (Maybe a) (Maybe (Maybe a)) + | MkT2 (Maybe x) + deriving (Functor, Foldable, Traversable) + + data Empty (a :: Type) + deriving (Functor, Foldable, Traversable) + |])
tests/compile-and-dump/Singletons/HigherOrder.golden view
@@ -1,505 +1,514 @@-Singletons/HigherOrder.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| map :: (a -> b) -> [a] -> [b]- map _ [] = []- map f (h : t) = (f h) : (map f t)- liftMaybe :: (a -> b) -> Maybe a -> Maybe b- liftMaybe f (Just x) = Just (f x)- liftMaybe _ Nothing = Nothing- zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]- zipWith f (x : xs) (y : ys) = f x y : zipWith f xs ys- zipWith _ [] [] = []- zipWith _ (_ : _) [] = []- zipWith _ [] (_ : _) = []- foo :: ((a -> b) -> a -> b) -> (a -> b) -> a -> b- foo f g a = f g a- splunge :: [Nat] -> [Bool] -> [Nat]- splunge ns bs- = zipWith (\ n b -> if b then Succ (Succ n) else n) ns bs- etad :: [Nat] -> [Bool] -> [Nat]- etad = zipWith (\ n b -> if b then Succ (Succ n) else n)- - data Either a b = Left a | Right b |]- ======>- data Either a b = Left a | Right b- map :: (a -> b) -> [a] -> [b]- map _ [] = []- map f (h : t) = (f h : (map f) t)- liftMaybe :: (a -> b) -> Maybe a -> Maybe b- liftMaybe f (Just x) = Just (f x)- liftMaybe _ Nothing = Nothing- zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]- zipWith f (x : xs) (y : ys) = ((f x) y : ((zipWith f) xs) ys)- zipWith _ [] [] = []- zipWith _ (_ : _) [] = []- zipWith _ [] (_ : _) = []- foo :: ((a -> b) -> a -> b) -> (a -> b) -> a -> b- foo f g a = (f g) a- splunge :: [Nat] -> [Bool] -> [Nat]- splunge ns bs- = ((zipWith (\ n b -> if b then Succ (Succ n) else n)) ns) bs- etad :: [Nat] -> [Bool] -> [Nat]- etad = zipWith (\ n b -> if b then Succ (Succ n) else n)- type LeftSym0 :: forall a b. (~>) a (Either a b)- data LeftSym0 :: (~>) a (Either a b)- where- LeftSym0KindInference :: SameKind (Apply LeftSym0 arg) (LeftSym1 arg) =>- LeftSym0 a0123456789876543210- type instance Apply LeftSym0 a0123456789876543210 = Left a0123456789876543210- instance SuppressUnusedWarnings LeftSym0 where- suppressUnusedWarnings = snd (((,) LeftSym0KindInference) ())- type LeftSym1 :: forall a b. a -> Either a b- type family LeftSym1 (a0123456789876543210 :: a) :: Either a b where- LeftSym1 a0123456789876543210 = Left a0123456789876543210- type RightSym0 :: forall a b. (~>) b (Either a b)- data RightSym0 :: (~>) b (Either a b)- where- RightSym0KindInference :: SameKind (Apply RightSym0 arg) (RightSym1 arg) =>- RightSym0 a0123456789876543210- type instance Apply RightSym0 a0123456789876543210 = Right a0123456789876543210- instance SuppressUnusedWarnings RightSym0 where- suppressUnusedWarnings = snd (((,) RightSym0KindInference) ())- type RightSym1 :: forall a b. b -> Either a b- type family RightSym1 (a0123456789876543210 :: b) :: Either a b where- RightSym1 a0123456789876543210 = Right a0123456789876543210- type family Case_0123456789876543210 n b a_0123456789876543210 a_0123456789876543210 t where- Case_0123456789876543210 n b a_0123456789876543210 a_0123456789876543210 'True = Apply SuccSym0 (Apply SuccSym0 n)- Case_0123456789876543210 n b a_0123456789876543210 a_0123456789876543210 'False = n- type family Lambda_0123456789876543210 a_0123456789876543210 a_0123456789876543210 n b where- Lambda_0123456789876543210 a_0123456789876543210 a_0123456789876543210 n b = Case_0123456789876543210 n b a_0123456789876543210 a_0123456789876543210 b- data Lambda_0123456789876543210Sym0 a_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) =>- Lambda_0123456789876543210Sym0 a_01234567898765432100123456789876543210- type instance Apply Lambda_0123456789876543210Sym0 a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210- instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym0KindInference) ())- data Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym1KindInference) ())- data Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n0123456789876543210- where- Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym3 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n0123456789876543210- type instance Apply (Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) n0123456789876543210 = Lambda_0123456789876543210Sym3 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n0123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym2KindInference) ())- data Lambda_0123456789876543210Sym3 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n0123456789876543210 b0123456789876543210- where- Lambda_0123456789876543210Sym3KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym3 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n0123456789876543210) arg) (Lambda_0123456789876543210Sym4 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n0123456789876543210 arg) =>- Lambda_0123456789876543210Sym3 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n0123456789876543210 b0123456789876543210- type instance Apply (Lambda_0123456789876543210Sym3 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n0123456789876543210) b0123456789876543210 = Lambda_0123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n0123456789876543210 b0123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym3 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym3KindInference) ())- type family Lambda_0123456789876543210Sym4 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n0123456789876543210 b0123456789876543210 where- Lambda_0123456789876543210Sym4 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n0123456789876543210 b0123456789876543210 = Lambda_0123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n0123456789876543210 b0123456789876543210- type family Case_0123456789876543210 n b ns bs t where- Case_0123456789876543210 n b ns bs 'True = Apply SuccSym0 (Apply SuccSym0 n)- Case_0123456789876543210 n b ns bs 'False = n- type family Lambda_0123456789876543210 ns bs n b where- Lambda_0123456789876543210 ns bs n b = Case_0123456789876543210 n b ns bs b- data Lambda_0123456789876543210Sym0 ns0123456789876543210- where- Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) =>- Lambda_0123456789876543210Sym0 ns0123456789876543210- type instance Apply Lambda_0123456789876543210Sym0 ns0123456789876543210 = Lambda_0123456789876543210Sym1 ns0123456789876543210- instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym0KindInference) ())- data Lambda_0123456789876543210Sym1 ns0123456789876543210 bs0123456789876543210- where- Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 ns0123456789876543210) arg) (Lambda_0123456789876543210Sym2 ns0123456789876543210 arg) =>- Lambda_0123456789876543210Sym1 ns0123456789876543210 bs0123456789876543210- type instance Apply (Lambda_0123456789876543210Sym1 ns0123456789876543210) bs0123456789876543210 = Lambda_0123456789876543210Sym2 ns0123456789876543210 bs0123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 ns0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym1KindInference) ())- data Lambda_0123456789876543210Sym2 ns0123456789876543210 bs0123456789876543210 n0123456789876543210- where- Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 ns0123456789876543210 bs0123456789876543210) arg) (Lambda_0123456789876543210Sym3 ns0123456789876543210 bs0123456789876543210 arg) =>- Lambda_0123456789876543210Sym2 ns0123456789876543210 bs0123456789876543210 n0123456789876543210- type instance Apply (Lambda_0123456789876543210Sym2 ns0123456789876543210 bs0123456789876543210) n0123456789876543210 = Lambda_0123456789876543210Sym3 ns0123456789876543210 bs0123456789876543210 n0123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 ns0123456789876543210 bs0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym2KindInference) ())- data Lambda_0123456789876543210Sym3 ns0123456789876543210 bs0123456789876543210 n0123456789876543210 b0123456789876543210- where- Lambda_0123456789876543210Sym3KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym3 ns0123456789876543210 bs0123456789876543210 n0123456789876543210) arg) (Lambda_0123456789876543210Sym4 ns0123456789876543210 bs0123456789876543210 n0123456789876543210 arg) =>- Lambda_0123456789876543210Sym3 ns0123456789876543210 bs0123456789876543210 n0123456789876543210 b0123456789876543210- type instance Apply (Lambda_0123456789876543210Sym3 ns0123456789876543210 bs0123456789876543210 n0123456789876543210) b0123456789876543210 = Lambda_0123456789876543210 ns0123456789876543210 bs0123456789876543210 n0123456789876543210 b0123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym3 ns0123456789876543210 bs0123456789876543210 n0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym3KindInference) ())- type family Lambda_0123456789876543210Sym4 ns0123456789876543210 bs0123456789876543210 n0123456789876543210 b0123456789876543210 where- Lambda_0123456789876543210Sym4 ns0123456789876543210 bs0123456789876543210 n0123456789876543210 b0123456789876543210 = Lambda_0123456789876543210 ns0123456789876543210 bs0123456789876543210 n0123456789876543210 b0123456789876543210- type EtadSym0 :: (~>) [Nat] ((~>) [Bool] [Nat])- data EtadSym0 :: (~>) [Nat] ((~>) [Bool] [Nat])- where- EtadSym0KindInference :: SameKind (Apply EtadSym0 arg) (EtadSym1 arg) =>- EtadSym0 a0123456789876543210- type instance Apply EtadSym0 a0123456789876543210 = EtadSym1 a0123456789876543210- instance SuppressUnusedWarnings EtadSym0 where- suppressUnusedWarnings = snd (((,) EtadSym0KindInference) ())- type EtadSym1 :: [Nat] -> (~>) [Bool] [Nat]- data EtadSym1 (a0123456789876543210 :: [Nat]) :: (~>) [Bool] [Nat]- where- EtadSym1KindInference :: SameKind (Apply (EtadSym1 a0123456789876543210) arg) (EtadSym2 a0123456789876543210 arg) =>- EtadSym1 a0123456789876543210 a0123456789876543210- type instance Apply (EtadSym1 a0123456789876543210) a0123456789876543210 = Etad a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (EtadSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) EtadSym1KindInference) ())- type EtadSym2 :: [Nat] -> [Bool] -> [Nat]- type family EtadSym2 (a0123456789876543210 :: [Nat]) (a0123456789876543210 :: [Bool]) :: [Nat] where- EtadSym2 a0123456789876543210 a0123456789876543210 = Etad a0123456789876543210 a0123456789876543210- type SplungeSym0 :: (~>) [Nat] ((~>) [Bool] [Nat])- data SplungeSym0 :: (~>) [Nat] ((~>) [Bool] [Nat])- where- SplungeSym0KindInference :: SameKind (Apply SplungeSym0 arg) (SplungeSym1 arg) =>- SplungeSym0 a0123456789876543210- type instance Apply SplungeSym0 a0123456789876543210 = SplungeSym1 a0123456789876543210- instance SuppressUnusedWarnings SplungeSym0 where- suppressUnusedWarnings = snd (((,) SplungeSym0KindInference) ())- type SplungeSym1 :: [Nat] -> (~>) [Bool] [Nat]- data SplungeSym1 (a0123456789876543210 :: [Nat]) :: (~>) [Bool] [Nat]- where- SplungeSym1KindInference :: SameKind (Apply (SplungeSym1 a0123456789876543210) arg) (SplungeSym2 a0123456789876543210 arg) =>- SplungeSym1 a0123456789876543210 a0123456789876543210- type instance Apply (SplungeSym1 a0123456789876543210) a0123456789876543210 = Splunge a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (SplungeSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) SplungeSym1KindInference) ())- type SplungeSym2 :: [Nat] -> [Bool] -> [Nat]- type family SplungeSym2 (a0123456789876543210 :: [Nat]) (a0123456789876543210 :: [Bool]) :: [Nat] where- SplungeSym2 a0123456789876543210 a0123456789876543210 = Splunge a0123456789876543210 a0123456789876543210- type FooSym0 :: (~>) ((~>) ((~>) a b) ((~>) a b)) ((~>) ((~>) a b) ((~>) a b))- data FooSym0 :: (~>) ((~>) ((~>) a b) ((~>) a b)) ((~>) ((~>) a b) ((~>) a b))- where- FooSym0KindInference :: SameKind (Apply FooSym0 arg) (FooSym1 arg) =>- FooSym0 a0123456789876543210- type instance Apply FooSym0 a0123456789876543210 = FooSym1 a0123456789876543210- instance SuppressUnusedWarnings FooSym0 where- suppressUnusedWarnings = snd (((,) FooSym0KindInference) ())- type FooSym1 :: (~>) ((~>) a b) ((~>) a b)- -> (~>) ((~>) a b) ((~>) a b)- data FooSym1 (a0123456789876543210 :: (~>) ((~>) a b) ((~>) a b)) :: (~>) ((~>) a b) ((~>) a b)- where- FooSym1KindInference :: SameKind (Apply (FooSym1 a0123456789876543210) arg) (FooSym2 a0123456789876543210 arg) =>- FooSym1 a0123456789876543210 a0123456789876543210- type instance Apply (FooSym1 a0123456789876543210) a0123456789876543210 = FooSym2 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (FooSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) FooSym1KindInference) ())- type FooSym2 :: (~>) ((~>) a b) ((~>) a b) -> (~>) a b -> (~>) a b- data FooSym2 (a0123456789876543210 :: (~>) ((~>) a b) ((~>) a b)) (a0123456789876543210 :: (~>) a b) :: (~>) a b- where- FooSym2KindInference :: SameKind (Apply (FooSym2 a0123456789876543210 a0123456789876543210) arg) (FooSym3 a0123456789876543210 a0123456789876543210 arg) =>- FooSym2 a0123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply (FooSym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = Foo a0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (FooSym2 a0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) FooSym2KindInference) ())- type FooSym3 :: (~>) ((~>) a b) ((~>) a b) -> (~>) a b -> a -> b- type family FooSym3 (a0123456789876543210 :: (~>) ((~>) a b) ((~>) a b)) (a0123456789876543210 :: (~>) a b) (a0123456789876543210 :: a) :: b where- FooSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = Foo a0123456789876543210 a0123456789876543210 a0123456789876543210- type ZipWithSym0 :: (~>) ((~>) a ((~>) b c)) ((~>) [a] ((~>) [b] [c]))- data ZipWithSym0 :: (~>) ((~>) a ((~>) b c)) ((~>) [a] ((~>) [b] [c]))- where- ZipWithSym0KindInference :: SameKind (Apply ZipWithSym0 arg) (ZipWithSym1 arg) =>- ZipWithSym0 a0123456789876543210- type instance Apply ZipWithSym0 a0123456789876543210 = ZipWithSym1 a0123456789876543210- instance SuppressUnusedWarnings ZipWithSym0 where- suppressUnusedWarnings = snd (((,) ZipWithSym0KindInference) ())- type ZipWithSym1 :: (~>) a ((~>) b c) -> (~>) [a] ((~>) [b] [c])- data ZipWithSym1 (a0123456789876543210 :: (~>) a ((~>) b c)) :: (~>) [a] ((~>) [b] [c])- where- ZipWithSym1KindInference :: SameKind (Apply (ZipWithSym1 a0123456789876543210) arg) (ZipWithSym2 a0123456789876543210 arg) =>- ZipWithSym1 a0123456789876543210 a0123456789876543210- type instance Apply (ZipWithSym1 a0123456789876543210) a0123456789876543210 = ZipWithSym2 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ZipWithSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) ZipWithSym1KindInference) ())- type ZipWithSym2 :: (~>) a ((~>) b c) -> [a] -> (~>) [b] [c]- data ZipWithSym2 (a0123456789876543210 :: (~>) a ((~>) b c)) (a0123456789876543210 :: [a]) :: (~>) [b] [c]- where- ZipWithSym2KindInference :: SameKind (Apply (ZipWithSym2 a0123456789876543210 a0123456789876543210) arg) (ZipWithSym3 a0123456789876543210 a0123456789876543210 arg) =>- ZipWithSym2 a0123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply (ZipWithSym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = ZipWith a0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ZipWithSym2 a0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) ZipWithSym2KindInference) ())- type ZipWithSym3 :: (~>) a ((~>) b c) -> [a] -> [b] -> [c]- type family ZipWithSym3 (a0123456789876543210 :: (~>) a ((~>) b c)) (a0123456789876543210 :: [a]) (a0123456789876543210 :: [b]) :: [c] where- ZipWithSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = ZipWith a0123456789876543210 a0123456789876543210 a0123456789876543210- type LiftMaybeSym0 :: (~>) ((~>) a b) ((~>) (Maybe a) (Maybe b))- data LiftMaybeSym0 :: (~>) ((~>) a b) ((~>) (Maybe a) (Maybe b))- where- LiftMaybeSym0KindInference :: SameKind (Apply LiftMaybeSym0 arg) (LiftMaybeSym1 arg) =>- LiftMaybeSym0 a0123456789876543210- type instance Apply LiftMaybeSym0 a0123456789876543210 = LiftMaybeSym1 a0123456789876543210- instance SuppressUnusedWarnings LiftMaybeSym0 where- suppressUnusedWarnings = snd (((,) LiftMaybeSym0KindInference) ())- type LiftMaybeSym1 :: (~>) a b -> (~>) (Maybe a) (Maybe b)- data LiftMaybeSym1 (a0123456789876543210 :: (~>) a b) :: (~>) (Maybe a) (Maybe b)- where- LiftMaybeSym1KindInference :: SameKind (Apply (LiftMaybeSym1 a0123456789876543210) arg) (LiftMaybeSym2 a0123456789876543210 arg) =>- LiftMaybeSym1 a0123456789876543210 a0123456789876543210- type instance Apply (LiftMaybeSym1 a0123456789876543210) a0123456789876543210 = LiftMaybe a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (LiftMaybeSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) LiftMaybeSym1KindInference) ())- type LiftMaybeSym2 :: (~>) a b -> Maybe a -> Maybe b- type family LiftMaybeSym2 (a0123456789876543210 :: (~>) a b) (a0123456789876543210 :: Maybe a) :: Maybe b where- LiftMaybeSym2 a0123456789876543210 a0123456789876543210 = LiftMaybe a0123456789876543210 a0123456789876543210- type MapSym0 :: (~>) ((~>) a b) ((~>) [a] [b])- data MapSym0 :: (~>) ((~>) a b) ((~>) [a] [b])- where- MapSym0KindInference :: SameKind (Apply MapSym0 arg) (MapSym1 arg) =>- MapSym0 a0123456789876543210- type instance Apply MapSym0 a0123456789876543210 = MapSym1 a0123456789876543210- instance SuppressUnusedWarnings MapSym0 where- suppressUnusedWarnings = snd (((,) MapSym0KindInference) ())- type MapSym1 :: (~>) a b -> (~>) [a] [b]- data MapSym1 (a0123456789876543210 :: (~>) a b) :: (~>) [a] [b]- where- MapSym1KindInference :: SameKind (Apply (MapSym1 a0123456789876543210) arg) (MapSym2 a0123456789876543210 arg) =>- MapSym1 a0123456789876543210 a0123456789876543210- type instance Apply (MapSym1 a0123456789876543210) a0123456789876543210 = Map a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (MapSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) MapSym1KindInference) ())- type MapSym2 :: (~>) a b -> [a] -> [b]- type family MapSym2 (a0123456789876543210 :: (~>) a b) (a0123456789876543210 :: [a]) :: [b] where- MapSym2 a0123456789876543210 a0123456789876543210 = Map a0123456789876543210 a0123456789876543210- type Etad :: [Nat] -> [Bool] -> [Nat]- type family Etad (a :: [Nat]) (a :: [Bool]) :: [Nat] where- Etad a_0123456789876543210 a_0123456789876543210 = Apply (Apply (Apply ZipWithSym0 (Apply (Apply Lambda_0123456789876543210Sym0 a_0123456789876543210) a_0123456789876543210)) a_0123456789876543210) a_0123456789876543210- type Splunge :: [Nat] -> [Bool] -> [Nat]- type family Splunge (a :: [Nat]) (a :: [Bool]) :: [Nat] where- Splunge ns bs = Apply (Apply (Apply ZipWithSym0 (Apply (Apply Lambda_0123456789876543210Sym0 ns) bs)) ns) bs- type Foo :: (~>) ((~>) a b) ((~>) a b) -> (~>) a b -> a -> b- type family Foo (a :: (~>) ((~>) a b) ((~>) a b)) (a :: (~>) a b) (a :: a) :: b where- Foo f g a = Apply (Apply f g) a- type ZipWith :: (~>) a ((~>) b c) -> [a] -> [b] -> [c]- type family ZipWith (a :: (~>) a ((~>) b c)) (a :: [a]) (a :: [b]) :: [c] where- ZipWith f ('(:) x xs) ('(:) y ys) = Apply (Apply (:@#@$) (Apply (Apply f x) y)) (Apply (Apply (Apply ZipWithSym0 f) xs) ys)- ZipWith _ '[] '[] = NilSym0- ZipWith _ ('(:) _ _) '[] = NilSym0- ZipWith _ '[] ('(:) _ _) = NilSym0- type LiftMaybe :: (~>) a b -> Maybe a -> Maybe b- type family LiftMaybe (a :: (~>) a b) (a :: Maybe a) :: Maybe b where- LiftMaybe f ('Just x) = Apply JustSym0 (Apply f x)- LiftMaybe _ 'Nothing = NothingSym0- type Map :: (~>) a b -> [a] -> [b]- type family Map (a :: (~>) a b) (a :: [a]) :: [b] where- Map _ '[] = NilSym0- Map f ('(:) h t) = Apply (Apply (:@#@$) (Apply f h)) (Apply (Apply MapSym0 f) t)- sEtad ::- forall (t :: [Nat]) (t :: [Bool]). Sing t- -> Sing t -> Sing (Apply (Apply EtadSym0 t) t :: [Nat])- sSplunge ::- forall (t :: [Nat]) (t :: [Bool]). Sing t- -> Sing t -> Sing (Apply (Apply SplungeSym0 t) t :: [Nat])- sFoo ::- forall a- b- (t :: (~>) ((~>) a b) ((~>) a b))- (t :: (~>) a b)- (t :: a). Sing t- -> Sing t- -> Sing t -> Sing (Apply (Apply (Apply FooSym0 t) t) t :: b)- sZipWith ::- forall a b c (t :: (~>) a ((~>) b c)) (t :: [a]) (t :: [b]). Sing t- -> Sing t- -> Sing t- -> Sing (Apply (Apply (Apply ZipWithSym0 t) t) t :: [c])- sLiftMaybe ::- forall a b (t :: (~>) a b) (t :: Maybe a). Sing t- -> Sing t- -> Sing (Apply (Apply LiftMaybeSym0 t) t :: Maybe b)- sMap ::- forall a b (t :: (~>) a b) (t :: [a]). Sing t- -> Sing t -> Sing (Apply (Apply MapSym0 t) t :: [b])- sEtad- (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing- ((applySing ((singFun3 @ZipWithSym0) sZipWith))- ((singFun2- @(Apply (Apply Lambda_0123456789876543210Sym0 a_0123456789876543210) a_0123456789876543210))- (\ sN sB- -> case ((,) sN) sB of- (,) (_ :: Sing n) (_ :: Sing b)- -> (id- @(Sing (Case_0123456789876543210 n b a_0123456789876543210 a_0123456789876543210 b)))- (case sB of- STrue- -> (applySing ((singFun1 @SuccSym0) SSucc))- ((applySing ((singFun1 @SuccSym0) SSucc)) sN)- SFalse -> sN)))))- sA_0123456789876543210))- sA_0123456789876543210- sSplunge (sNs :: Sing ns) (sBs :: Sing bs)- = (applySing- ((applySing- ((applySing ((singFun3 @ZipWithSym0) sZipWith))- ((singFun2 @(Apply (Apply Lambda_0123456789876543210Sym0 ns) bs))- (\ sN sB- -> case ((,) sN) sB of- (,) (_ :: Sing n) (_ :: Sing b)- -> (id @(Sing (Case_0123456789876543210 n b ns bs b)))- (case sB of- STrue- -> (applySing ((singFun1 @SuccSym0) SSucc))- ((applySing ((singFun1 @SuccSym0) SSucc)) sN)- SFalse -> sN)))))- sNs))- sBs- sFoo (sF :: Sing f) (sG :: Sing g) (sA :: Sing a)- = (applySing ((applySing sF) sG)) sA- sZipWith- (sF :: Sing f)- (SCons (sX :: Sing x) (sXs :: Sing xs))- (SCons (sY :: Sing y) (sYs :: Sing ys))- = (applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing ((applySing sF) sX)) sY)))- ((applySing- ((applySing ((applySing ((singFun3 @ZipWithSym0) sZipWith)) sF))- sXs))- sYs)- sZipWith _ SNil SNil = SNil- sZipWith _ (SCons _ _) SNil = SNil- sZipWith _ SNil (SCons _ _) = SNil- sLiftMaybe (sF :: Sing f) (SJust (sX :: Sing x))- = (applySing ((singFun1 @JustSym0) SJust)) ((applySing sF) sX)- sLiftMaybe _ SNothing = SNothing- sMap _ SNil = SNil- sMap (sF :: Sing f) (SCons (sH :: Sing h) (sT :: Sing t))- = (applySing- ((applySing ((singFun2 @(:@#@$)) SCons)) ((applySing sF) sH)))- ((applySing ((applySing ((singFun2 @MapSym0) sMap)) sF)) sT)- instance SingI (EtadSym0 :: (~>) [Nat] ((~>) [Bool] [Nat])) where- sing = (singFun2 @EtadSym0) sEtad- instance SingI d =>- SingI (EtadSym1 (d :: [Nat]) :: (~>) [Bool] [Nat]) where- sing = (singFun1 @(EtadSym1 (d :: [Nat]))) (sEtad (sing @d))- instance SingI1 (EtadSym1 :: [Nat] -> (~>) [Bool] [Nat]) where- liftSing (s :: Sing (d :: [Nat]))- = (singFun1 @(EtadSym1 (d :: [Nat]))) (sEtad s)- instance SingI (SplungeSym0 :: (~>) [Nat] ((~>) [Bool] [Nat])) where- sing = (singFun2 @SplungeSym0) sSplunge- instance SingI d =>- SingI (SplungeSym1 (d :: [Nat]) :: (~>) [Bool] [Nat]) where- sing = (singFun1 @(SplungeSym1 (d :: [Nat]))) (sSplunge (sing @d))- instance SingI1 (SplungeSym1 :: [Nat] -> (~>) [Bool] [Nat]) where- liftSing (s :: Sing (d :: [Nat]))- = (singFun1 @(SplungeSym1 (d :: [Nat]))) (sSplunge s)- instance SingI (FooSym0 :: (~>) ((~>) ((~>) a b) ((~>) a b)) ((~>) ((~>) a b) ((~>) a b))) where- sing = (singFun3 @FooSym0) sFoo- instance SingI d =>- SingI (FooSym1 (d :: (~>) ((~>) a b) ((~>) a b)) :: (~>) ((~>) a b) ((~>) a b)) where- sing- = (singFun2 @(FooSym1 (d :: (~>) ((~>) a b) ((~>) a b))))- (sFoo (sing @d))- instance SingI1 (FooSym1 :: (~>) ((~>) a b) ((~>) a b)- -> (~>) ((~>) a b) ((~>) a b)) where- liftSing (s :: Sing (d :: (~>) ((~>) a b) ((~>) a b)))- = (singFun2 @(FooSym1 (d :: (~>) ((~>) a b) ((~>) a b)))) (sFoo s)- instance (SingI d, SingI d) =>- SingI (FooSym2 (d :: (~>) ((~>) a b) ((~>) a b)) (d :: (~>) a b) :: (~>) a b) where- sing- = (singFun1- @(FooSym2 (d :: (~>) ((~>) a b) ((~>) a b)) (d :: (~>) a b)))- ((sFoo (sing @d)) (sing @d))- instance SingI d =>- SingI1 (FooSym2 (d :: (~>) ((~>) a b) ((~>) a b)) :: (~>) a b- -> (~>) a b) where- liftSing (s :: Sing (d :: (~>) a b))- = (singFun1- @(FooSym2 (d :: (~>) ((~>) a b) ((~>) a b)) (d :: (~>) a b)))- ((sFoo (sing @d)) s)- instance SingI2 (FooSym2 :: (~>) ((~>) a b) ((~>) a b)- -> (~>) a b -> (~>) a b) where- liftSing2- (s :: Sing (d :: (~>) ((~>) a b) ((~>) a b)))- (s :: Sing (d :: (~>) a b))- = (singFun1- @(FooSym2 (d :: (~>) ((~>) a b) ((~>) a b)) (d :: (~>) a b)))- ((sFoo s) s)- instance SingI (ZipWithSym0 :: (~>) ((~>) a ((~>) b c)) ((~>) [a] ((~>) [b] [c]))) where- sing = (singFun3 @ZipWithSym0) sZipWith- instance SingI d =>- SingI (ZipWithSym1 (d :: (~>) a ((~>) b c)) :: (~>) [a] ((~>) [b] [c])) where- sing- = (singFun2 @(ZipWithSym1 (d :: (~>) a ((~>) b c))))- (sZipWith (sing @d))- instance SingI1 (ZipWithSym1 :: (~>) a ((~>) b c)- -> (~>) [a] ((~>) [b] [c])) where- liftSing (s :: Sing (d :: (~>) a ((~>) b c)))- = (singFun2 @(ZipWithSym1 (d :: (~>) a ((~>) b c)))) (sZipWith s)- instance (SingI d, SingI d) =>- SingI (ZipWithSym2 (d :: (~>) a ((~>) b c)) (d :: [a]) :: (~>) [b] [c]) where- sing- = (singFun1 @(ZipWithSym2 (d :: (~>) a ((~>) b c)) (d :: [a])))- ((sZipWith (sing @d)) (sing @d))- instance SingI d =>- SingI1 (ZipWithSym2 (d :: (~>) a ((~>) b c)) :: [a]- -> (~>) [b] [c]) where- liftSing (s :: Sing (d :: [a]))- = (singFun1 @(ZipWithSym2 (d :: (~>) a ((~>) b c)) (d :: [a])))- ((sZipWith (sing @d)) s)- instance SingI2 (ZipWithSym2 :: (~>) a ((~>) b c)- -> [a] -> (~>) [b] [c]) where- liftSing2- (s :: Sing (d :: (~>) a ((~>) b c)))- (s :: Sing (d :: [a]))- = (singFun1 @(ZipWithSym2 (d :: (~>) a ((~>) b c)) (d :: [a])))- ((sZipWith s) s)- instance SingI (LiftMaybeSym0 :: (~>) ((~>) a b) ((~>) (Maybe a) (Maybe b))) where- sing = (singFun2 @LiftMaybeSym0) sLiftMaybe- instance SingI d =>- SingI (LiftMaybeSym1 (d :: (~>) a b) :: (~>) (Maybe a) (Maybe b)) where- sing- = (singFun1 @(LiftMaybeSym1 (d :: (~>) a b)))- (sLiftMaybe (sing @d))- instance SingI1 (LiftMaybeSym1 :: (~>) a b- -> (~>) (Maybe a) (Maybe b)) where- liftSing (s :: Sing (d :: (~>) a b))- = (singFun1 @(LiftMaybeSym1 (d :: (~>) a b))) (sLiftMaybe s)- instance SingI (MapSym0 :: (~>) ((~>) a b) ((~>) [a] [b])) where- sing = (singFun2 @MapSym0) sMap- instance SingI d =>- SingI (MapSym1 (d :: (~>) a b) :: (~>) [a] [b]) where- sing = (singFun1 @(MapSym1 (d :: (~>) a b))) (sMap (sing @d))- instance SingI1 (MapSym1 :: (~>) a b -> (~>) [a] [b]) where- liftSing (s :: Sing (d :: (~>) a b))- = (singFun1 @(MapSym1 (d :: (~>) a b))) (sMap s)- data SEither :: forall a b. Either a b -> Type- where- SLeft :: forall a b (n :: a).- (Sing n) -> SEither (Left n :: Either a b)- SRight :: forall a b (n :: b).- (Sing n) -> SEither (Right n :: Either a b)- type instance Sing @(Either a b) = SEither- instance (SingKind a, SingKind b) => SingKind (Either a b) where- type Demote (Either a b) = Either (Demote a) (Demote b)- fromSing (SLeft b) = Left (fromSing b)- fromSing (SRight b) = Right (fromSing b)- toSing (Left (b :: Demote a))- = case toSing b :: SomeSing a of SomeSing c -> SomeSing (SLeft c)- toSing (Right (b :: Demote b))- = case toSing b :: SomeSing b of SomeSing c -> SomeSing (SRight c)- instance SingI n => SingI (Left (n :: a)) where- sing = SLeft sing- instance SingI1 Left where- liftSing = SLeft- instance SingI (LeftSym0 :: (~>) a (Either a b)) where- sing = (singFun1 @LeftSym0) SLeft- instance SingI n => SingI (Right (n :: b)) where- sing = SRight sing- instance SingI1 Right where- liftSing = SRight- instance SingI (RightSym0 :: (~>) b (Either a b)) where- sing = (singFun1 @RightSym0) SRight+Singletons/HigherOrder.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| map :: (a -> b) -> [a] -> [b] + map _ [] = [] + map f (h : t) = (f h) : (map f t) + liftMaybe :: (a -> b) -> Maybe a -> Maybe b + liftMaybe f (Just x) = Just (f x) + liftMaybe _ Nothing = Nothing + zipWith :: (a -> b -> c) -> [a] -> [b] -> [c] + zipWith f (x : xs) (y : ys) = f x y : zipWith f xs ys + zipWith _ [] [] = [] + zipWith _ (_ : _) [] = [] + zipWith _ [] (_ : _) = [] + foo :: ((a -> b) -> a -> b) -> (a -> b) -> a -> b + foo f g a = f g a + splunge :: [Nat] -> [Bool] -> [Nat] + splunge ns bs + = zipWith (\ n b -> if b then Succ (Succ n) else n) ns bs + etad :: [Nat] -> [Bool] -> [Nat] + etad = zipWith (\ n b -> if b then Succ (Succ n) else n) + + data Either a b = Left a | Right b |] + ======> + data Either a b = Left a | Right b + map :: (a -> b) -> [a] -> [b] + map _ [] = [] + map f (h : t) = (f h : map f t) + liftMaybe :: (a -> b) -> Maybe a -> Maybe b + liftMaybe f (Just x) = Just (f x) + liftMaybe _ Nothing = Nothing + zipWith :: (a -> b -> c) -> [a] -> [b] -> [c] + zipWith f (x : xs) (y : ys) = (f x y : zipWith f xs ys) + zipWith _ [] [] = [] + zipWith _ (_ : _) [] = [] + zipWith _ [] (_ : _) = [] + foo :: ((a -> b) -> a -> b) -> (a -> b) -> a -> b + foo f g a = f g a + splunge :: [Nat] -> [Bool] -> [Nat] + splunge ns bs + = zipWith (\ n b -> if b then Succ (Succ n) else n) ns bs + etad :: [Nat] -> [Bool] -> [Nat] + etad = zipWith (\ n b -> if b then Succ (Succ n) else n) + type LeftSym0 :: forall a b. (~>) a (Either a b) + data LeftSym0 :: (~>) a (Either a b) + where + LeftSym0KindInference :: SameKind (Apply LeftSym0 arg) (LeftSym1 arg) => + LeftSym0 a0123456789876543210 + type instance Apply LeftSym0 a0123456789876543210 = Left a0123456789876543210 + instance SuppressUnusedWarnings LeftSym0 where + suppressUnusedWarnings = snd ((,) LeftSym0KindInference ()) + type LeftSym1 :: forall a b. a -> Either a b + type family LeftSym1 (a0123456789876543210 :: a) :: Either a b where + LeftSym1 a0123456789876543210 = Left a0123456789876543210 + type RightSym0 :: forall a b. (~>) b (Either a b) + data RightSym0 :: (~>) b (Either a b) + where + RightSym0KindInference :: SameKind (Apply RightSym0 arg) (RightSym1 arg) => + RightSym0 a0123456789876543210 + type instance Apply RightSym0 a0123456789876543210 = Right a0123456789876543210 + instance SuppressUnusedWarnings RightSym0 where + suppressUnusedWarnings = snd ((,) RightSym0KindInference ()) + type RightSym1 :: forall a b. b -> Either a b + type family RightSym1 (a0123456789876543210 :: b) :: Either a b where + RightSym1 a0123456789876543210 = Right a0123456789876543210 + type family Case_0123456789876543210 n b a_0123456789876543210 a_0123456789876543210 t where + Case_0123456789876543210 n b a_0123456789876543210 a_0123456789876543210 'True = Apply SuccSym0 (Apply SuccSym0 n) + Case_0123456789876543210 n b a_0123456789876543210 a_0123456789876543210 'False = n + type family Lambda_0123456789876543210 a_0123456789876543210 a_0123456789876543210 n b where + Lambda_0123456789876543210 a_0123456789876543210 a_0123456789876543210 n b = Case_0123456789876543210 n b a_0123456789876543210 a_0123456789876543210 b + data Lambda_0123456789876543210Sym0 a_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) => + Lambda_0123456789876543210Sym0 a_01234567898765432100123456789876543210 + type instance Apply Lambda_0123456789876543210Sym0 a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym0KindInference ()) + data Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym1KindInference ()) + data Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n0123456789876543210 + where + Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym3 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n0123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) n0123456789876543210 = Lambda_0123456789876543210Sym3 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n0123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym2KindInference ()) + data Lambda_0123456789876543210Sym3 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n0123456789876543210 b0123456789876543210 + where + Lambda_0123456789876543210Sym3KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym3 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n0123456789876543210) arg) (Lambda_0123456789876543210Sym4 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n0123456789876543210 arg) => + Lambda_0123456789876543210Sym3 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n0123456789876543210 b0123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym3 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n0123456789876543210) b0123456789876543210 = Lambda_0123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n0123456789876543210 b0123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym3 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym3KindInference ()) + type family Lambda_0123456789876543210Sym4 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n0123456789876543210 b0123456789876543210 where + Lambda_0123456789876543210Sym4 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n0123456789876543210 b0123456789876543210 = Lambda_0123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 n0123456789876543210 b0123456789876543210 + type family Case_0123456789876543210 n b ns bs t where + Case_0123456789876543210 n b ns bs 'True = Apply SuccSym0 (Apply SuccSym0 n) + Case_0123456789876543210 n b ns bs 'False = n + type family Lambda_0123456789876543210 ns bs n b where + Lambda_0123456789876543210 ns bs n b = Case_0123456789876543210 n b ns bs b + data Lambda_0123456789876543210Sym0 ns0123456789876543210 + where + Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) => + Lambda_0123456789876543210Sym0 ns0123456789876543210 + type instance Apply Lambda_0123456789876543210Sym0 ns0123456789876543210 = Lambda_0123456789876543210Sym1 ns0123456789876543210 + instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym0KindInference ()) + data Lambda_0123456789876543210Sym1 ns0123456789876543210 bs0123456789876543210 + where + Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 ns0123456789876543210) arg) (Lambda_0123456789876543210Sym2 ns0123456789876543210 arg) => + Lambda_0123456789876543210Sym1 ns0123456789876543210 bs0123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym1 ns0123456789876543210) bs0123456789876543210 = Lambda_0123456789876543210Sym2 ns0123456789876543210 bs0123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 ns0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym1KindInference ()) + data Lambda_0123456789876543210Sym2 ns0123456789876543210 bs0123456789876543210 n0123456789876543210 + where + Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 ns0123456789876543210 bs0123456789876543210) arg) (Lambda_0123456789876543210Sym3 ns0123456789876543210 bs0123456789876543210 arg) => + Lambda_0123456789876543210Sym2 ns0123456789876543210 bs0123456789876543210 n0123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym2 ns0123456789876543210 bs0123456789876543210) n0123456789876543210 = Lambda_0123456789876543210Sym3 ns0123456789876543210 bs0123456789876543210 n0123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 ns0123456789876543210 bs0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym2KindInference ()) + data Lambda_0123456789876543210Sym3 ns0123456789876543210 bs0123456789876543210 n0123456789876543210 b0123456789876543210 + where + Lambda_0123456789876543210Sym3KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym3 ns0123456789876543210 bs0123456789876543210 n0123456789876543210) arg) (Lambda_0123456789876543210Sym4 ns0123456789876543210 bs0123456789876543210 n0123456789876543210 arg) => + Lambda_0123456789876543210Sym3 ns0123456789876543210 bs0123456789876543210 n0123456789876543210 b0123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym3 ns0123456789876543210 bs0123456789876543210 n0123456789876543210) b0123456789876543210 = Lambda_0123456789876543210 ns0123456789876543210 bs0123456789876543210 n0123456789876543210 b0123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym3 ns0123456789876543210 bs0123456789876543210 n0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym3KindInference ()) + type family Lambda_0123456789876543210Sym4 ns0123456789876543210 bs0123456789876543210 n0123456789876543210 b0123456789876543210 where + Lambda_0123456789876543210Sym4 ns0123456789876543210 bs0123456789876543210 n0123456789876543210 b0123456789876543210 = Lambda_0123456789876543210 ns0123456789876543210 bs0123456789876543210 n0123456789876543210 b0123456789876543210 + type EtadSym0 :: (~>) [Nat] ((~>) [Bool] [Nat]) + data EtadSym0 :: (~>) [Nat] ((~>) [Bool] [Nat]) + where + EtadSym0KindInference :: SameKind (Apply EtadSym0 arg) (EtadSym1 arg) => + EtadSym0 a0123456789876543210 + type instance Apply EtadSym0 a0123456789876543210 = EtadSym1 a0123456789876543210 + instance SuppressUnusedWarnings EtadSym0 where + suppressUnusedWarnings = snd ((,) EtadSym0KindInference ()) + type EtadSym1 :: [Nat] -> (~>) [Bool] [Nat] + data EtadSym1 (a0123456789876543210 :: [Nat]) :: (~>) [Bool] [Nat] + where + EtadSym1KindInference :: SameKind (Apply (EtadSym1 a0123456789876543210) arg) (EtadSym2 a0123456789876543210 arg) => + EtadSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (EtadSym1 a0123456789876543210) a0123456789876543210 = Etad a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (EtadSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) EtadSym1KindInference ()) + type EtadSym2 :: [Nat] -> [Bool] -> [Nat] + type family EtadSym2 (a0123456789876543210 :: [Nat]) (a0123456789876543210 :: [Bool]) :: [Nat] where + EtadSym2 a0123456789876543210 a0123456789876543210 = Etad a0123456789876543210 a0123456789876543210 + type SplungeSym0 :: (~>) [Nat] ((~>) [Bool] [Nat]) + data SplungeSym0 :: (~>) [Nat] ((~>) [Bool] [Nat]) + where + SplungeSym0KindInference :: SameKind (Apply SplungeSym0 arg) (SplungeSym1 arg) => + SplungeSym0 a0123456789876543210 + type instance Apply SplungeSym0 a0123456789876543210 = SplungeSym1 a0123456789876543210 + instance SuppressUnusedWarnings SplungeSym0 where + suppressUnusedWarnings = snd ((,) SplungeSym0KindInference ()) + type SplungeSym1 :: [Nat] -> (~>) [Bool] [Nat] + data SplungeSym1 (a0123456789876543210 :: [Nat]) :: (~>) [Bool] [Nat] + where + SplungeSym1KindInference :: SameKind (Apply (SplungeSym1 a0123456789876543210) arg) (SplungeSym2 a0123456789876543210 arg) => + SplungeSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (SplungeSym1 a0123456789876543210) a0123456789876543210 = Splunge a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (SplungeSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) SplungeSym1KindInference ()) + type SplungeSym2 :: [Nat] -> [Bool] -> [Nat] + type family SplungeSym2 (a0123456789876543210 :: [Nat]) (a0123456789876543210 :: [Bool]) :: [Nat] where + SplungeSym2 a0123456789876543210 a0123456789876543210 = Splunge a0123456789876543210 a0123456789876543210 + type FooSym0 :: (~>) ((~>) ((~>) a b) ((~>) a b)) ((~>) ((~>) a b) ((~>) a b)) + data FooSym0 :: (~>) ((~>) ((~>) a b) ((~>) a b)) ((~>) ((~>) a b) ((~>) a b)) + where + FooSym0KindInference :: SameKind (Apply FooSym0 arg) (FooSym1 arg) => + FooSym0 a0123456789876543210 + type instance Apply FooSym0 a0123456789876543210 = FooSym1 a0123456789876543210 + instance SuppressUnusedWarnings FooSym0 where + suppressUnusedWarnings = snd ((,) FooSym0KindInference ()) + type FooSym1 :: (~>) ((~>) a b) ((~>) a b) + -> (~>) ((~>) a b) ((~>) a b) + data FooSym1 (a0123456789876543210 :: (~>) ((~>) a b) ((~>) a b)) :: (~>) ((~>) a b) ((~>) a b) + where + FooSym1KindInference :: SameKind (Apply (FooSym1 a0123456789876543210) arg) (FooSym2 a0123456789876543210 arg) => + FooSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (FooSym1 a0123456789876543210) a0123456789876543210 = FooSym2 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (FooSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) FooSym1KindInference ()) + type FooSym2 :: (~>) ((~>) a b) ((~>) a b) -> (~>) a b -> (~>) a b + data FooSym2 (a0123456789876543210 :: (~>) ((~>) a b) ((~>) a b)) (a0123456789876543210 :: (~>) a b) :: (~>) a b + where + FooSym2KindInference :: SameKind (Apply (FooSym2 a0123456789876543210 a0123456789876543210) arg) (FooSym3 a0123456789876543210 a0123456789876543210 arg) => + FooSym2 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply (FooSym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = Foo a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (FooSym2 a0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) FooSym2KindInference ()) + type FooSym3 :: (~>) ((~>) a b) ((~>) a b) -> (~>) a b -> a -> b + type family FooSym3 (a0123456789876543210 :: (~>) ((~>) a b) ((~>) a b)) (a0123456789876543210 :: (~>) a b) (a0123456789876543210 :: a) :: b where + FooSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = Foo a0123456789876543210 a0123456789876543210 a0123456789876543210 + type ZipWithSym0 :: (~>) ((~>) a ((~>) b c)) ((~>) [a] ((~>) [b] [c])) + data ZipWithSym0 :: (~>) ((~>) a ((~>) b c)) ((~>) [a] ((~>) [b] [c])) + where + ZipWithSym0KindInference :: SameKind (Apply ZipWithSym0 arg) (ZipWithSym1 arg) => + ZipWithSym0 a0123456789876543210 + type instance Apply ZipWithSym0 a0123456789876543210 = ZipWithSym1 a0123456789876543210 + instance SuppressUnusedWarnings ZipWithSym0 where + suppressUnusedWarnings = snd ((,) ZipWithSym0KindInference ()) + type ZipWithSym1 :: (~>) a ((~>) b c) -> (~>) [a] ((~>) [b] [c]) + data ZipWithSym1 (a0123456789876543210 :: (~>) a ((~>) b c)) :: (~>) [a] ((~>) [b] [c]) + where + ZipWithSym1KindInference :: SameKind (Apply (ZipWithSym1 a0123456789876543210) arg) (ZipWithSym2 a0123456789876543210 arg) => + ZipWithSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (ZipWithSym1 a0123456789876543210) a0123456789876543210 = ZipWithSym2 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ZipWithSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) ZipWithSym1KindInference ()) + type ZipWithSym2 :: (~>) a ((~>) b c) -> [a] -> (~>) [b] [c] + data ZipWithSym2 (a0123456789876543210 :: (~>) a ((~>) b c)) (a0123456789876543210 :: [a]) :: (~>) [b] [c] + where + ZipWithSym2KindInference :: SameKind (Apply (ZipWithSym2 a0123456789876543210 a0123456789876543210) arg) (ZipWithSym3 a0123456789876543210 a0123456789876543210 arg) => + ZipWithSym2 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply (ZipWithSym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = ZipWith a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ZipWithSym2 a0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) ZipWithSym2KindInference ()) + type ZipWithSym3 :: (~>) a ((~>) b c) -> [a] -> [b] -> [c] + type family ZipWithSym3 (a0123456789876543210 :: (~>) a ((~>) b c)) (a0123456789876543210 :: [a]) (a0123456789876543210 :: [b]) :: [c] where + ZipWithSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = ZipWith a0123456789876543210 a0123456789876543210 a0123456789876543210 + type LiftMaybeSym0 :: (~>) ((~>) a b) ((~>) (Maybe a) (Maybe b)) + data LiftMaybeSym0 :: (~>) ((~>) a b) ((~>) (Maybe a) (Maybe b)) + where + LiftMaybeSym0KindInference :: SameKind (Apply LiftMaybeSym0 arg) (LiftMaybeSym1 arg) => + LiftMaybeSym0 a0123456789876543210 + type instance Apply LiftMaybeSym0 a0123456789876543210 = LiftMaybeSym1 a0123456789876543210 + instance SuppressUnusedWarnings LiftMaybeSym0 where + suppressUnusedWarnings = snd ((,) LiftMaybeSym0KindInference ()) + type LiftMaybeSym1 :: (~>) a b -> (~>) (Maybe a) (Maybe b) + data LiftMaybeSym1 (a0123456789876543210 :: (~>) a b) :: (~>) (Maybe a) (Maybe b) + where + LiftMaybeSym1KindInference :: SameKind (Apply (LiftMaybeSym1 a0123456789876543210) arg) (LiftMaybeSym2 a0123456789876543210 arg) => + LiftMaybeSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (LiftMaybeSym1 a0123456789876543210) a0123456789876543210 = LiftMaybe a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (LiftMaybeSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) LiftMaybeSym1KindInference ()) + type LiftMaybeSym2 :: (~>) a b -> Maybe a -> Maybe b + type family LiftMaybeSym2 (a0123456789876543210 :: (~>) a b) (a0123456789876543210 :: Maybe a) :: Maybe b where + LiftMaybeSym2 a0123456789876543210 a0123456789876543210 = LiftMaybe a0123456789876543210 a0123456789876543210 + type MapSym0 :: (~>) ((~>) a b) ((~>) [a] [b]) + data MapSym0 :: (~>) ((~>) a b) ((~>) [a] [b]) + where + MapSym0KindInference :: SameKind (Apply MapSym0 arg) (MapSym1 arg) => + MapSym0 a0123456789876543210 + type instance Apply MapSym0 a0123456789876543210 = MapSym1 a0123456789876543210 + instance SuppressUnusedWarnings MapSym0 where + suppressUnusedWarnings = snd ((,) MapSym0KindInference ()) + type MapSym1 :: (~>) a b -> (~>) [a] [b] + data MapSym1 (a0123456789876543210 :: (~>) a b) :: (~>) [a] [b] + where + MapSym1KindInference :: SameKind (Apply (MapSym1 a0123456789876543210) arg) (MapSym2 a0123456789876543210 arg) => + MapSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (MapSym1 a0123456789876543210) a0123456789876543210 = Map a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (MapSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) MapSym1KindInference ()) + type MapSym2 :: (~>) a b -> [a] -> [b] + type family MapSym2 (a0123456789876543210 :: (~>) a b) (a0123456789876543210 :: [a]) :: [b] where + MapSym2 a0123456789876543210 a0123456789876543210 = Map a0123456789876543210 a0123456789876543210 + type Etad :: [Nat] -> [Bool] -> [Nat] + type family Etad (a :: [Nat]) (a :: [Bool]) :: [Nat] where + Etad a_0123456789876543210 a_0123456789876543210 = Apply (Apply (Apply ZipWithSym0 (Apply (Apply Lambda_0123456789876543210Sym0 a_0123456789876543210) a_0123456789876543210)) a_0123456789876543210) a_0123456789876543210 + type Splunge :: [Nat] -> [Bool] -> [Nat] + type family Splunge (a :: [Nat]) (a :: [Bool]) :: [Nat] where + Splunge ns bs = Apply (Apply (Apply ZipWithSym0 (Apply (Apply Lambda_0123456789876543210Sym0 ns) bs)) ns) bs + type Foo :: (~>) ((~>) a b) ((~>) a b) -> (~>) a b -> a -> b + type family Foo (a :: (~>) ((~>) a b) ((~>) a b)) (a :: (~>) a b) (a :: a) :: b where + Foo f g a = Apply (Apply f g) a + type ZipWith :: (~>) a ((~>) b c) -> [a] -> [b] -> [c] + type family ZipWith (a :: (~>) a ((~>) b c)) (a :: [a]) (a :: [b]) :: [c] where + ZipWith f ('(:) x xs) ('(:) y ys) = Apply (Apply (:@#@$) (Apply (Apply f x) y)) (Apply (Apply (Apply ZipWithSym0 f) xs) ys) + ZipWith _ '[] '[] = NilSym0 + ZipWith _ ('(:) _ _) '[] = NilSym0 + ZipWith _ '[] ('(:) _ _) = NilSym0 + type LiftMaybe :: (~>) a b -> Maybe a -> Maybe b + type family LiftMaybe (a :: (~>) a b) (a :: Maybe a) :: Maybe b where + LiftMaybe f ('Just x) = Apply JustSym0 (Apply f x) + LiftMaybe _ 'Nothing = NothingSym0 + type Map :: (~>) a b -> [a] -> [b] + type family Map (a :: (~>) a b) (a :: [a]) :: [b] where + Map _ '[] = NilSym0 + Map f ('(:) h t) = Apply (Apply (:@#@$) (Apply f h)) (Apply (Apply MapSym0 f) t) + sEtad :: + (forall (t :: [Nat]) (t :: [Bool]). + Sing t + -> Sing t -> Sing (Apply (Apply EtadSym0 t) t :: [Nat]) :: Type) + sSplunge :: + (forall (t :: [Nat]) (t :: [Bool]). + Sing t + -> Sing t -> Sing (Apply (Apply SplungeSym0 t) t :: [Nat]) :: Type) + sFoo :: + (forall (t :: (~>) ((~>) a b) ((~>) a b)) (t :: (~>) a b) (t :: a). + Sing t + -> Sing t + -> Sing t + -> Sing (Apply (Apply (Apply FooSym0 t) t) t :: b) :: Type) + sZipWith :: + (forall (t :: (~>) a ((~>) b c)) (t :: [a]) (t :: [b]). + Sing t + -> Sing t + -> Sing t + -> Sing (Apply (Apply (Apply ZipWithSym0 t) t) t :: [c]) :: Type) + sLiftMaybe :: + (forall (t :: (~>) a b) (t :: Maybe a). + Sing t + -> Sing t + -> Sing (Apply (Apply LiftMaybeSym0 t) t :: Maybe b) :: Type) + sMap :: + (forall (t :: (~>) a b) (t :: [a]). + Sing t + -> Sing t -> Sing (Apply (Apply MapSym0 t) t :: [b]) :: Type) + sEtad + (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (applySing + (singFun3 @ZipWithSym0 sZipWith) + (singFun2 + @(Apply (Apply Lambda_0123456789876543210Sym0 a_0123456789876543210) a_0123456789876543210) + (\ sN sB + -> case (,) sN sB of + (,) (_ :: Sing n) (_ :: Sing b) + -> id + @(Sing (Case_0123456789876543210 n b a_0123456789876543210 a_0123456789876543210 b)) + (case sB of + STrue + -> applySing + (singFun1 @SuccSym0 SSucc) + (applySing (singFun1 @SuccSym0 SSucc) sN) + SFalse -> sN)))) + sA_0123456789876543210) + sA_0123456789876543210 + sSplunge (sNs :: Sing ns) (sBs :: Sing bs) + = applySing + (applySing + (applySing + (singFun3 @ZipWithSym0 sZipWith) + (singFun2 + @(Apply (Apply Lambda_0123456789876543210Sym0 ns) bs) + (\ sN sB + -> case (,) sN sB of + (,) (_ :: Sing n) (_ :: Sing b) + -> id + @(Sing (Case_0123456789876543210 n b ns bs b)) + (case sB of + STrue + -> applySing + (singFun1 @SuccSym0 SSucc) + (applySing (singFun1 @SuccSym0 SSucc) sN) + SFalse -> sN)))) + sNs) + sBs + sFoo (sF :: Sing f) (sG :: Sing g) (sA :: Sing a) + = applySing (applySing sF sG) sA + sZipWith + (sF :: Sing f) + (SCons (sX :: Sing x) (sXs :: Sing xs)) + (SCons (sY :: Sing y) (sYs :: Sing ys)) + = applySing + (applySing + (singFun2 @(:@#@$) SCons) (applySing (applySing sF sX) sY)) + (applySing + (applySing (applySing (singFun3 @ZipWithSym0 sZipWith) sF) sXs) + sYs) + sZipWith _ SNil SNil = SNil + sZipWith _ (SCons _ _) SNil = SNil + sZipWith _ SNil (SCons _ _) = SNil + sLiftMaybe (sF :: Sing f) (SJust (sX :: Sing x)) + = applySing (singFun1 @JustSym0 SJust) (applySing sF sX) + sLiftMaybe _ SNothing = SNothing + sMap _ SNil = SNil + sMap (sF :: Sing f) (SCons (sH :: Sing h) (sT :: Sing t)) + = applySing + (applySing (singFun2 @(:@#@$) SCons) (applySing sF sH)) + (applySing (applySing (singFun2 @MapSym0 sMap) sF) sT) + instance SingI (EtadSym0 :: (~>) [Nat] ((~>) [Bool] [Nat])) where + sing = singFun2 @EtadSym0 sEtad + instance SingI d => + SingI (EtadSym1 (d :: [Nat]) :: (~>) [Bool] [Nat]) where + sing = singFun1 @(EtadSym1 (d :: [Nat])) (sEtad (sing @d)) + instance SingI1 (EtadSym1 :: [Nat] -> (~>) [Bool] [Nat]) where + liftSing (s :: Sing (d :: [Nat])) + = singFun1 @(EtadSym1 (d :: [Nat])) (sEtad s) + instance SingI (SplungeSym0 :: (~>) [Nat] ((~>) [Bool] [Nat])) where + sing = singFun2 @SplungeSym0 sSplunge + instance SingI d => + SingI (SplungeSym1 (d :: [Nat]) :: (~>) [Bool] [Nat]) where + sing = singFun1 @(SplungeSym1 (d :: [Nat])) (sSplunge (sing @d)) + instance SingI1 (SplungeSym1 :: [Nat] -> (~>) [Bool] [Nat]) where + liftSing (s :: Sing (d :: [Nat])) + = singFun1 @(SplungeSym1 (d :: [Nat])) (sSplunge s) + instance SingI (FooSym0 :: (~>) ((~>) ((~>) a b) ((~>) a b)) ((~>) ((~>) a b) ((~>) a b))) where + sing = singFun3 @FooSym0 sFoo + instance SingI d => + SingI (FooSym1 (d :: (~>) ((~>) a b) ((~>) a b)) :: (~>) ((~>) a b) ((~>) a b)) where + sing + = singFun2 + @(FooSym1 (d :: (~>) ((~>) a b) ((~>) a b))) (sFoo (sing @d)) + instance SingI1 (FooSym1 :: (~>) ((~>) a b) ((~>) a b) + -> (~>) ((~>) a b) ((~>) a b)) where + liftSing (s :: Sing (d :: (~>) ((~>) a b) ((~>) a b))) + = singFun2 @(FooSym1 (d :: (~>) ((~>) a b) ((~>) a b))) (sFoo s) + instance (SingI d, SingI d) => + SingI (FooSym2 (d :: (~>) ((~>) a b) ((~>) a b)) (d :: (~>) a b) :: (~>) a b) where + sing + = singFun1 + @(FooSym2 (d :: (~>) ((~>) a b) ((~>) a b)) (d :: (~>) a b)) + (sFoo (sing @d) (sing @d)) + instance SingI d => + SingI1 (FooSym2 (d :: (~>) ((~>) a b) ((~>) a b)) :: (~>) a b + -> (~>) a b) where + liftSing (s :: Sing (d :: (~>) a b)) + = singFun1 + @(FooSym2 (d :: (~>) ((~>) a b) ((~>) a b)) (d :: (~>) a b)) + (sFoo (sing @d) s) + instance SingI2 (FooSym2 :: (~>) ((~>) a b) ((~>) a b) + -> (~>) a b -> (~>) a b) where + liftSing2 + (s :: Sing (d :: (~>) ((~>) a b) ((~>) a b))) + (s :: Sing (d :: (~>) a b)) + = singFun1 + @(FooSym2 (d :: (~>) ((~>) a b) ((~>) a b)) (d :: (~>) a b)) + (sFoo s s) + instance SingI (ZipWithSym0 :: (~>) ((~>) a ((~>) b c)) ((~>) [a] ((~>) [b] [c]))) where + sing = singFun3 @ZipWithSym0 sZipWith + instance SingI d => + SingI (ZipWithSym1 (d :: (~>) a ((~>) b c)) :: (~>) [a] ((~>) [b] [c])) where + sing + = singFun2 + @(ZipWithSym1 (d :: (~>) a ((~>) b c))) (sZipWith (sing @d)) + instance SingI1 (ZipWithSym1 :: (~>) a ((~>) b c) + -> (~>) [a] ((~>) [b] [c])) where + liftSing (s :: Sing (d :: (~>) a ((~>) b c))) + = singFun2 @(ZipWithSym1 (d :: (~>) a ((~>) b c))) (sZipWith s) + instance (SingI d, SingI d) => + SingI (ZipWithSym2 (d :: (~>) a ((~>) b c)) (d :: [a]) :: (~>) [b] [c]) where + sing + = singFun1 + @(ZipWithSym2 (d :: (~>) a ((~>) b c)) (d :: [a])) + (sZipWith (sing @d) (sing @d)) + instance SingI d => + SingI1 (ZipWithSym2 (d :: (~>) a ((~>) b c)) :: [a] + -> (~>) [b] [c]) where + liftSing (s :: Sing (d :: [a])) + = singFun1 + @(ZipWithSym2 (d :: (~>) a ((~>) b c)) (d :: [a])) + (sZipWith (sing @d) s) + instance SingI2 (ZipWithSym2 :: (~>) a ((~>) b c) + -> [a] -> (~>) [b] [c]) where + liftSing2 + (s :: Sing (d :: (~>) a ((~>) b c))) + (s :: Sing (d :: [a])) + = singFun1 + @(ZipWithSym2 (d :: (~>) a ((~>) b c)) (d :: [a])) (sZipWith s s) + instance SingI (LiftMaybeSym0 :: (~>) ((~>) a b) ((~>) (Maybe a) (Maybe b))) where + sing = singFun2 @LiftMaybeSym0 sLiftMaybe + instance SingI d => + SingI (LiftMaybeSym1 (d :: (~>) a b) :: (~>) (Maybe a) (Maybe b)) where + sing + = singFun1 @(LiftMaybeSym1 (d :: (~>) a b)) (sLiftMaybe (sing @d)) + instance SingI1 (LiftMaybeSym1 :: (~>) a b + -> (~>) (Maybe a) (Maybe b)) where + liftSing (s :: Sing (d :: (~>) a b)) + = singFun1 @(LiftMaybeSym1 (d :: (~>) a b)) (sLiftMaybe s) + instance SingI (MapSym0 :: (~>) ((~>) a b) ((~>) [a] [b])) where + sing = singFun2 @MapSym0 sMap + instance SingI d => + SingI (MapSym1 (d :: (~>) a b) :: (~>) [a] [b]) where + sing = singFun1 @(MapSym1 (d :: (~>) a b)) (sMap (sing @d)) + instance SingI1 (MapSym1 :: (~>) a b -> (~>) [a] [b]) where + liftSing (s :: Sing (d :: (~>) a b)) + = singFun1 @(MapSym1 (d :: (~>) a b)) (sMap s) + data SEither :: forall a b. Either a b -> Type + where + SLeft :: forall a b (n :: a). + (Sing n) -> SEither (Left n :: Either a b) + SRight :: forall a b (n :: b). + (Sing n) -> SEither (Right n :: Either a b) + type instance Sing @(Either a b) = SEither + instance (SingKind a, SingKind b) => SingKind (Either a b) where + type Demote (Either a b) = Either (Demote a) (Demote b) + fromSing (SLeft b) = Left (fromSing b) + fromSing (SRight b) = Right (fromSing b) + toSing (Left (b :: Demote a)) + = case toSing b :: SomeSing a of SomeSing c -> SomeSing (SLeft c) + toSing (Right (b :: Demote b)) + = case toSing b :: SomeSing b of SomeSing c -> SomeSing (SRight c) + instance SingI n => SingI (Left (n :: a)) where + sing = SLeft sing + instance SingI1 Left where + liftSing = SLeft + instance SingI (LeftSym0 :: (~>) a (Either a b)) where + sing = singFun1 @LeftSym0 SLeft + instance SingI n => SingI (Right (n :: b)) where + sing = SRight sing + instance SingI1 Right where + liftSing = SRight + instance SingI (RightSym0 :: (~>) b (Either a b)) where + sing = singFun1 @RightSym0 SRight
tests/compile-and-dump/Singletons/HigherOrder.hs view
@@ -1,55 +1,55 @@-module Singletons.HigherOrder where--import Data.List.Singletons hiding (- sMap, Map, MapSym0, MapSym1, MapSym2,- ZipWith, sZipWith, ZipWithSym0, ZipWithSym1, ZipWithSym2, ZipWithSym3 )-import Data.Maybe.Singletons-import Data.Singletons.Base.TH-import Prelude hiding (Either(..))-import Singletons.Nat--$(singletons [d|- data Either a b = Left a | Right b-- map :: (a -> b) -> [a] -> [b]- map _ [] = []- map f (h:t) = (f h) : (map f t)-- liftMaybe :: (a -> b) -> Maybe a -> Maybe b- liftMaybe f (Just x) = Just (f x)- liftMaybe _ Nothing = Nothing-- zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]- zipWith f (x:xs) (y:ys) = f x y : zipWith f xs ys- zipWith _ [] [] = []- zipWith _ (_:_) [] = []- zipWith _ [] (_:_) = []-- foo :: ((a -> b) -> a -> b) -> (a -> b) -> a -> b- foo f g a = f g a-- splunge :: [Nat] -> [Bool] -> [Nat]- splunge ns bs = zipWith (\n b -> if b then Succ (Succ n) else n) ns bs-- etad :: [Nat] -> [Bool] -> [Nat]- etad = zipWith (\n b -> if b then Succ (Succ n) else n)-- |])--foo1a :: Proxy (ZipWith (TyCon Either) '[Int, Bool] '[Char, Double])-foo1a = Proxy--foo1b :: Proxy ('[Either Int Char, Either Bool Double])-foo1b = foo1a--foo2a :: Proxy (Map (TyCon (Either Int)) '[Bool, Double])-foo2a = Proxy--foo2b :: Proxy ('[Either Int Bool, Either Int Double])-foo2b = foo2a--foo3a :: Proxy (Map PredSym0 '[Succ Zero, Succ (Succ Zero)])-foo3a = Proxy--foo3b :: Proxy '[Zero, Succ Zero]-foo3b = foo3a+module Singletons.HigherOrder where + +import Data.List.Singletons hiding ( + sMap, Map, MapSym0, MapSym1, MapSym2, + ZipWith, sZipWith, ZipWithSym0, ZipWithSym1, ZipWithSym2, ZipWithSym3 ) +import Data.Maybe.Singletons +import Data.Singletons.Base.TH +import Prelude hiding (Either(..)) +import Singletons.Nat + +$(singletons [d| + data Either a b = Left a | Right b + + map :: (a -> b) -> [a] -> [b] + map _ [] = [] + map f (h:t) = (f h) : (map f t) + + liftMaybe :: (a -> b) -> Maybe a -> Maybe b + liftMaybe f (Just x) = Just (f x) + liftMaybe _ Nothing = Nothing + + zipWith :: (a -> b -> c) -> [a] -> [b] -> [c] + zipWith f (x:xs) (y:ys) = f x y : zipWith f xs ys + zipWith _ [] [] = [] + zipWith _ (_:_) [] = [] + zipWith _ [] (_:_) = [] + + foo :: ((a -> b) -> a -> b) -> (a -> b) -> a -> b + foo f g a = f g a + + splunge :: [Nat] -> [Bool] -> [Nat] + splunge ns bs = zipWith (\n b -> if b then Succ (Succ n) else n) ns bs + + etad :: [Nat] -> [Bool] -> [Nat] + etad = zipWith (\n b -> if b then Succ (Succ n) else n) + + |]) + +foo1a :: Proxy (ZipWith (TyCon Either) '[Int, Bool] '[Char, Double]) +foo1a = Proxy + +foo1b :: Proxy ('[Either Int Char, Either Bool Double]) +foo1b = foo1a + +foo2a :: Proxy (Map (TyCon (Either Int)) '[Bool, Double]) +foo2a = Proxy + +foo2b :: Proxy ('[Either Int Bool, Either Int Double]) +foo2b = foo2a + +foo3a :: Proxy (Map PredSym0 '[Succ Zero, Succ (Succ Zero)]) +foo3a = Proxy + +foo3b :: Proxy '[Zero, Succ Zero] +foo3b = foo3a
tests/compile-and-dump/Singletons/LambdaCase.golden view
@@ -1,247 +1,250 @@-Singletons/LambdaCase.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| foo1 :: a -> Maybe a -> a- foo1 d x- = (\case- Just y -> y- Nothing -> d)- x- foo2 :: a -> Maybe a -> a- foo2 d _- = (\case- Just y -> y- Nothing -> d)- (Just d)- foo3 :: a -> b -> a- foo3 a b = (\case (p, _) -> p) (a, b) |]- ======>- foo1 :: a -> Maybe a -> a- foo1 d x- = (\case- Just y -> y- Nothing -> d)- x- foo2 :: a -> Maybe a -> a- foo2 d _- = (\case- Just y -> y- Nothing -> d)- (Just d)- foo3 :: a -> b -> a- foo3 a b = (\case (p, _) -> p) (a, b)- type family Case_0123456789876543210 x_0123456789876543210 a b t where- Case_0123456789876543210 x_0123456789876543210 a b '(p, _) = p- type family Lambda_0123456789876543210 a b x_0123456789876543210 where- Lambda_0123456789876543210 a b x_0123456789876543210 = Case_0123456789876543210 x_0123456789876543210 a b x_0123456789876543210- data Lambda_0123456789876543210Sym0 a0123456789876543210- where- Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) =>- Lambda_0123456789876543210Sym0 a0123456789876543210- type instance Apply Lambda_0123456789876543210Sym0 a0123456789876543210 = Lambda_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym0KindInference) ())- data Lambda_0123456789876543210Sym1 a0123456789876543210 b0123456789876543210- where- Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 a0123456789876543210) arg) (Lambda_0123456789876543210Sym2 a0123456789876543210 arg) =>- Lambda_0123456789876543210Sym1 a0123456789876543210 b0123456789876543210- type instance Apply (Lambda_0123456789876543210Sym1 a0123456789876543210) b0123456789876543210 = Lambda_0123456789876543210Sym2 a0123456789876543210 b0123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym1KindInference) ())- data Lambda_0123456789876543210Sym2 a0123456789876543210 b0123456789876543210 x_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 a0123456789876543210 b0123456789876543210) arg) (Lambda_0123456789876543210Sym3 a0123456789876543210 b0123456789876543210 arg) =>- Lambda_0123456789876543210Sym2 a0123456789876543210 b0123456789876543210 x_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym2 a0123456789876543210 b0123456789876543210) x_01234567898765432100123456789876543210 = Lambda_0123456789876543210 a0123456789876543210 b0123456789876543210 x_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 a0123456789876543210 b0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym2KindInference) ())- type family Lambda_0123456789876543210Sym3 a0123456789876543210 b0123456789876543210 x_01234567898765432100123456789876543210 where- Lambda_0123456789876543210Sym3 a0123456789876543210 b0123456789876543210 x_01234567898765432100123456789876543210 = Lambda_0123456789876543210 a0123456789876543210 b0123456789876543210 x_01234567898765432100123456789876543210- type family Case_0123456789876543210 x_0123456789876543210 d t where- Case_0123456789876543210 x_0123456789876543210 d ('Just y) = y- Case_0123456789876543210 x_0123456789876543210 d 'Nothing = d- type family Lambda_0123456789876543210 d x_0123456789876543210 where- Lambda_0123456789876543210 d x_0123456789876543210 = Case_0123456789876543210 x_0123456789876543210 d x_0123456789876543210- data Lambda_0123456789876543210Sym0 d0123456789876543210- where- Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) =>- Lambda_0123456789876543210Sym0 d0123456789876543210- type instance Apply Lambda_0123456789876543210Sym0 d0123456789876543210 = Lambda_0123456789876543210Sym1 d0123456789876543210- instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym0KindInference) ())- data Lambda_0123456789876543210Sym1 d0123456789876543210 x_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 d0123456789876543210) arg) (Lambda_0123456789876543210Sym2 d0123456789876543210 arg) =>- Lambda_0123456789876543210Sym1 d0123456789876543210 x_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym1 d0123456789876543210) x_01234567898765432100123456789876543210 = Lambda_0123456789876543210 d0123456789876543210 x_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 d0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym1KindInference) ())- type family Lambda_0123456789876543210Sym2 d0123456789876543210 x_01234567898765432100123456789876543210 where- Lambda_0123456789876543210Sym2 d0123456789876543210 x_01234567898765432100123456789876543210 = Lambda_0123456789876543210 d0123456789876543210 x_01234567898765432100123456789876543210- type family Case_0123456789876543210 x_0123456789876543210 d x t where- Case_0123456789876543210 x_0123456789876543210 d x ('Just y) = y- Case_0123456789876543210 x_0123456789876543210 d x 'Nothing = d- type family Lambda_0123456789876543210 d x x_0123456789876543210 where- Lambda_0123456789876543210 d x x_0123456789876543210 = Case_0123456789876543210 x_0123456789876543210 d x x_0123456789876543210- data Lambda_0123456789876543210Sym0 d0123456789876543210- where- Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) =>- Lambda_0123456789876543210Sym0 d0123456789876543210- type instance Apply Lambda_0123456789876543210Sym0 d0123456789876543210 = Lambda_0123456789876543210Sym1 d0123456789876543210- instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym0KindInference) ())- data Lambda_0123456789876543210Sym1 d0123456789876543210 x0123456789876543210- where- Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 d0123456789876543210) arg) (Lambda_0123456789876543210Sym2 d0123456789876543210 arg) =>- Lambda_0123456789876543210Sym1 d0123456789876543210 x0123456789876543210- type instance Apply (Lambda_0123456789876543210Sym1 d0123456789876543210) x0123456789876543210 = Lambda_0123456789876543210Sym2 d0123456789876543210 x0123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 d0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym1KindInference) ())- data Lambda_0123456789876543210Sym2 d0123456789876543210 x0123456789876543210 x_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 d0123456789876543210 x0123456789876543210) arg) (Lambda_0123456789876543210Sym3 d0123456789876543210 x0123456789876543210 arg) =>- Lambda_0123456789876543210Sym2 d0123456789876543210 x0123456789876543210 x_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym2 d0123456789876543210 x0123456789876543210) x_01234567898765432100123456789876543210 = Lambda_0123456789876543210 d0123456789876543210 x0123456789876543210 x_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 d0123456789876543210 x0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym2KindInference) ())- type family Lambda_0123456789876543210Sym3 d0123456789876543210 x0123456789876543210 x_01234567898765432100123456789876543210 where- Lambda_0123456789876543210Sym3 d0123456789876543210 x0123456789876543210 x_01234567898765432100123456789876543210 = Lambda_0123456789876543210 d0123456789876543210 x0123456789876543210 x_01234567898765432100123456789876543210- type Foo3Sym0 :: (~>) a ((~>) b a)- data Foo3Sym0 :: (~>) a ((~>) b a)- where- Foo3Sym0KindInference :: SameKind (Apply Foo3Sym0 arg) (Foo3Sym1 arg) =>- Foo3Sym0 a0123456789876543210- type instance Apply Foo3Sym0 a0123456789876543210 = Foo3Sym1 a0123456789876543210- instance SuppressUnusedWarnings Foo3Sym0 where- suppressUnusedWarnings = snd (((,) Foo3Sym0KindInference) ())- type Foo3Sym1 :: a -> (~>) b a- data Foo3Sym1 (a0123456789876543210 :: a) :: (~>) b a- where- Foo3Sym1KindInference :: SameKind (Apply (Foo3Sym1 a0123456789876543210) arg) (Foo3Sym2 a0123456789876543210 arg) =>- Foo3Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (Foo3Sym1 a0123456789876543210) a0123456789876543210 = Foo3 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Foo3Sym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) Foo3Sym1KindInference) ())- type Foo3Sym2 :: a -> b -> a- type family Foo3Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: a where- Foo3Sym2 a0123456789876543210 a0123456789876543210 = Foo3 a0123456789876543210 a0123456789876543210- type Foo2Sym0 :: (~>) a ((~>) (Maybe a) a)- data Foo2Sym0 :: (~>) a ((~>) (Maybe a) a)- where- Foo2Sym0KindInference :: SameKind (Apply Foo2Sym0 arg) (Foo2Sym1 arg) =>- Foo2Sym0 a0123456789876543210- type instance Apply Foo2Sym0 a0123456789876543210 = Foo2Sym1 a0123456789876543210- instance SuppressUnusedWarnings Foo2Sym0 where- suppressUnusedWarnings = snd (((,) Foo2Sym0KindInference) ())- type Foo2Sym1 :: a -> (~>) (Maybe a) a- data Foo2Sym1 (a0123456789876543210 :: a) :: (~>) (Maybe a) a- where- Foo2Sym1KindInference :: SameKind (Apply (Foo2Sym1 a0123456789876543210) arg) (Foo2Sym2 a0123456789876543210 arg) =>- Foo2Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (Foo2Sym1 a0123456789876543210) a0123456789876543210 = Foo2 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Foo2Sym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) Foo2Sym1KindInference) ())- type Foo2Sym2 :: a -> Maybe a -> a- type family Foo2Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: Maybe a) :: a where- Foo2Sym2 a0123456789876543210 a0123456789876543210 = Foo2 a0123456789876543210 a0123456789876543210- type Foo1Sym0 :: (~>) a ((~>) (Maybe a) a)- data Foo1Sym0 :: (~>) a ((~>) (Maybe a) a)- where- Foo1Sym0KindInference :: SameKind (Apply Foo1Sym0 arg) (Foo1Sym1 arg) =>- Foo1Sym0 a0123456789876543210- type instance Apply Foo1Sym0 a0123456789876543210 = Foo1Sym1 a0123456789876543210- instance SuppressUnusedWarnings Foo1Sym0 where- suppressUnusedWarnings = snd (((,) Foo1Sym0KindInference) ())- type Foo1Sym1 :: a -> (~>) (Maybe a) a- data Foo1Sym1 (a0123456789876543210 :: a) :: (~>) (Maybe a) a- where- Foo1Sym1KindInference :: SameKind (Apply (Foo1Sym1 a0123456789876543210) arg) (Foo1Sym2 a0123456789876543210 arg) =>- Foo1Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (Foo1Sym1 a0123456789876543210) a0123456789876543210 = Foo1 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Foo1Sym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) Foo1Sym1KindInference) ())- type Foo1Sym2 :: a -> Maybe a -> a- type family Foo1Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: Maybe a) :: a where- Foo1Sym2 a0123456789876543210 a0123456789876543210 = Foo1 a0123456789876543210 a0123456789876543210- type Foo3 :: a -> b -> a- type family Foo3 (a :: a) (a :: b) :: a where- Foo3 a b = Apply (Apply (Apply Lambda_0123456789876543210Sym0 a) b) (Apply (Apply Tuple2Sym0 a) b)- type Foo2 :: a -> Maybe a -> a- type family Foo2 (a :: a) (a :: Maybe a) :: a where- Foo2 d _ = Apply (Apply Lambda_0123456789876543210Sym0 d) (Apply JustSym0 d)- type Foo1 :: a -> Maybe a -> a- type family Foo1 (a :: a) (a :: Maybe a) :: a where- Foo1 d x = Apply (Apply (Apply Lambda_0123456789876543210Sym0 d) x) x- sFoo3 ::- forall a b (t :: a) (t :: b). Sing t- -> Sing t -> Sing (Apply (Apply Foo3Sym0 t) t :: a)- sFoo2 ::- forall a (t :: a) (t :: Maybe a). Sing t- -> Sing t -> Sing (Apply (Apply Foo2Sym0 t) t :: a)- sFoo1 ::- forall a (t :: a) (t :: Maybe a). Sing t- -> Sing t -> Sing (Apply (Apply Foo1Sym0 t) t :: a)- sFoo3 (sA :: Sing a) (sB :: Sing b)- = (applySing- ((singFun1 @(Apply (Apply Lambda_0123456789876543210Sym0 a) b))- (\ sX_0123456789876543210- -> case sX_0123456789876543210 of- (_ :: Sing x_0123456789876543210)- -> (id- @(Sing (Case_0123456789876543210 x_0123456789876543210 a b x_0123456789876543210)))- (case sX_0123456789876543210 of STuple2 (sP :: Sing p) _ -> sP))))- ((applySing ((applySing ((singFun2 @Tuple2Sym0) STuple2)) sA)) sB)- sFoo2 (sD :: Sing d) _- = (applySing- ((singFun1 @(Apply Lambda_0123456789876543210Sym0 d))- (\ sX_0123456789876543210- -> case sX_0123456789876543210 of- (_ :: Sing x_0123456789876543210)- -> (id- @(Sing (Case_0123456789876543210 x_0123456789876543210 d x_0123456789876543210)))- (case sX_0123456789876543210 of- SJust (sY :: Sing y) -> sY- SNothing -> sD))))- ((applySing ((singFun1 @JustSym0) SJust)) sD)- sFoo1 (sD :: Sing d) (sX :: Sing x)- = (applySing- ((singFun1 @(Apply (Apply Lambda_0123456789876543210Sym0 d) x))- (\ sX_0123456789876543210- -> case sX_0123456789876543210 of- (_ :: Sing x_0123456789876543210)- -> (id- @(Sing (Case_0123456789876543210 x_0123456789876543210 d x x_0123456789876543210)))- (case sX_0123456789876543210 of- SJust (sY :: Sing y) -> sY- SNothing -> sD))))- sX- instance SingI (Foo3Sym0 :: (~>) a ((~>) b a)) where- sing = (singFun2 @Foo3Sym0) sFoo3- instance SingI d => SingI (Foo3Sym1 (d :: a) :: (~>) b a) where- sing = (singFun1 @(Foo3Sym1 (d :: a))) (sFoo3 (sing @d))- instance SingI1 (Foo3Sym1 :: a -> (~>) b a) where- liftSing (s :: Sing (d :: a))- = (singFun1 @(Foo3Sym1 (d :: a))) (sFoo3 s)- instance SingI (Foo2Sym0 :: (~>) a ((~>) (Maybe a) a)) where- sing = (singFun2 @Foo2Sym0) sFoo2- instance SingI d =>- SingI (Foo2Sym1 (d :: a) :: (~>) (Maybe a) a) where- sing = (singFun1 @(Foo2Sym1 (d :: a))) (sFoo2 (sing @d))- instance SingI1 (Foo2Sym1 :: a -> (~>) (Maybe a) a) where- liftSing (s :: Sing (d :: a))- = (singFun1 @(Foo2Sym1 (d :: a))) (sFoo2 s)- instance SingI (Foo1Sym0 :: (~>) a ((~>) (Maybe a) a)) where- sing = (singFun2 @Foo1Sym0) sFoo1- instance SingI d =>- SingI (Foo1Sym1 (d :: a) :: (~>) (Maybe a) a) where- sing = (singFun1 @(Foo1Sym1 (d :: a))) (sFoo1 (sing @d))- instance SingI1 (Foo1Sym1 :: a -> (~>) (Maybe a) a) where- liftSing (s :: Sing (d :: a))- = (singFun1 @(Foo1Sym1 (d :: a))) (sFoo1 s)+Singletons/LambdaCase.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| foo1 :: a -> Maybe a -> a + foo1 d x + = (\case + Just y -> y + Nothing -> d) + x + foo2 :: a -> Maybe a -> a + foo2 d _ + = (\case + Just y -> y + Nothing -> d) + (Just d) + foo3 :: a -> b -> a + foo3 a b = (\case (p, _) -> p) (a, b) |] + ======> + foo1 :: a -> Maybe a -> a + foo1 d x + = (\case + Just y -> y + Nothing -> d) + x + foo2 :: a -> Maybe a -> a + foo2 d _ + = (\case + Just y -> y + Nothing -> d) + (Just d) + foo3 :: a -> b -> a + foo3 a b = (\case (p, _) -> p) (a, b) + type family Case_0123456789876543210 x_0123456789876543210 a b t where + Case_0123456789876543210 x_0123456789876543210 a b '(p, _) = p + type family Lambda_0123456789876543210 a b x_0123456789876543210 where + Lambda_0123456789876543210 a b x_0123456789876543210 = Case_0123456789876543210 x_0123456789876543210 a b x_0123456789876543210 + data Lambda_0123456789876543210Sym0 a0123456789876543210 + where + Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) => + Lambda_0123456789876543210Sym0 a0123456789876543210 + type instance Apply Lambda_0123456789876543210Sym0 a0123456789876543210 = Lambda_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym0KindInference ()) + data Lambda_0123456789876543210Sym1 a0123456789876543210 b0123456789876543210 + where + Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 a0123456789876543210) arg) (Lambda_0123456789876543210Sym2 a0123456789876543210 arg) => + Lambda_0123456789876543210Sym1 a0123456789876543210 b0123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym1 a0123456789876543210) b0123456789876543210 = Lambda_0123456789876543210Sym2 a0123456789876543210 b0123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym1KindInference ()) + data Lambda_0123456789876543210Sym2 a0123456789876543210 b0123456789876543210 x_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 a0123456789876543210 b0123456789876543210) arg) (Lambda_0123456789876543210Sym3 a0123456789876543210 b0123456789876543210 arg) => + Lambda_0123456789876543210Sym2 a0123456789876543210 b0123456789876543210 x_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym2 a0123456789876543210 b0123456789876543210) x_01234567898765432100123456789876543210 = Lambda_0123456789876543210 a0123456789876543210 b0123456789876543210 x_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 a0123456789876543210 b0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym2KindInference ()) + type family Lambda_0123456789876543210Sym3 a0123456789876543210 b0123456789876543210 x_01234567898765432100123456789876543210 where + Lambda_0123456789876543210Sym3 a0123456789876543210 b0123456789876543210 x_01234567898765432100123456789876543210 = Lambda_0123456789876543210 a0123456789876543210 b0123456789876543210 x_01234567898765432100123456789876543210 + type family Case_0123456789876543210 x_0123456789876543210 d t where + Case_0123456789876543210 x_0123456789876543210 d ('Just y) = y + Case_0123456789876543210 x_0123456789876543210 d 'Nothing = d + type family Lambda_0123456789876543210 d x_0123456789876543210 where + Lambda_0123456789876543210 d x_0123456789876543210 = Case_0123456789876543210 x_0123456789876543210 d x_0123456789876543210 + data Lambda_0123456789876543210Sym0 d0123456789876543210 + where + Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) => + Lambda_0123456789876543210Sym0 d0123456789876543210 + type instance Apply Lambda_0123456789876543210Sym0 d0123456789876543210 = Lambda_0123456789876543210Sym1 d0123456789876543210 + instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym0KindInference ()) + data Lambda_0123456789876543210Sym1 d0123456789876543210 x_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 d0123456789876543210) arg) (Lambda_0123456789876543210Sym2 d0123456789876543210 arg) => + Lambda_0123456789876543210Sym1 d0123456789876543210 x_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym1 d0123456789876543210) x_01234567898765432100123456789876543210 = Lambda_0123456789876543210 d0123456789876543210 x_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 d0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym1KindInference ()) + type family Lambda_0123456789876543210Sym2 d0123456789876543210 x_01234567898765432100123456789876543210 where + Lambda_0123456789876543210Sym2 d0123456789876543210 x_01234567898765432100123456789876543210 = Lambda_0123456789876543210 d0123456789876543210 x_01234567898765432100123456789876543210 + type family Case_0123456789876543210 x_0123456789876543210 d x t where + Case_0123456789876543210 x_0123456789876543210 d x ('Just y) = y + Case_0123456789876543210 x_0123456789876543210 d x 'Nothing = d + type family Lambda_0123456789876543210 d x x_0123456789876543210 where + Lambda_0123456789876543210 d x x_0123456789876543210 = Case_0123456789876543210 x_0123456789876543210 d x x_0123456789876543210 + data Lambda_0123456789876543210Sym0 d0123456789876543210 + where + Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) => + Lambda_0123456789876543210Sym0 d0123456789876543210 + type instance Apply Lambda_0123456789876543210Sym0 d0123456789876543210 = Lambda_0123456789876543210Sym1 d0123456789876543210 + instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym0KindInference ()) + data Lambda_0123456789876543210Sym1 d0123456789876543210 x0123456789876543210 + where + Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 d0123456789876543210) arg) (Lambda_0123456789876543210Sym2 d0123456789876543210 arg) => + Lambda_0123456789876543210Sym1 d0123456789876543210 x0123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym1 d0123456789876543210) x0123456789876543210 = Lambda_0123456789876543210Sym2 d0123456789876543210 x0123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 d0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym1KindInference ()) + data Lambda_0123456789876543210Sym2 d0123456789876543210 x0123456789876543210 x_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 d0123456789876543210 x0123456789876543210) arg) (Lambda_0123456789876543210Sym3 d0123456789876543210 x0123456789876543210 arg) => + Lambda_0123456789876543210Sym2 d0123456789876543210 x0123456789876543210 x_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym2 d0123456789876543210 x0123456789876543210) x_01234567898765432100123456789876543210 = Lambda_0123456789876543210 d0123456789876543210 x0123456789876543210 x_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 d0123456789876543210 x0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym2KindInference ()) + type family Lambda_0123456789876543210Sym3 d0123456789876543210 x0123456789876543210 x_01234567898765432100123456789876543210 where + Lambda_0123456789876543210Sym3 d0123456789876543210 x0123456789876543210 x_01234567898765432100123456789876543210 = Lambda_0123456789876543210 d0123456789876543210 x0123456789876543210 x_01234567898765432100123456789876543210 + type Foo3Sym0 :: (~>) a ((~>) b a) + data Foo3Sym0 :: (~>) a ((~>) b a) + where + Foo3Sym0KindInference :: SameKind (Apply Foo3Sym0 arg) (Foo3Sym1 arg) => + Foo3Sym0 a0123456789876543210 + type instance Apply Foo3Sym0 a0123456789876543210 = Foo3Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Foo3Sym0 where + suppressUnusedWarnings = snd ((,) Foo3Sym0KindInference ()) + type Foo3Sym1 :: a -> (~>) b a + data Foo3Sym1 (a0123456789876543210 :: a) :: (~>) b a + where + Foo3Sym1KindInference :: SameKind (Apply (Foo3Sym1 a0123456789876543210) arg) (Foo3Sym2 a0123456789876543210 arg) => + Foo3Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (Foo3Sym1 a0123456789876543210) a0123456789876543210 = Foo3 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Foo3Sym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) Foo3Sym1KindInference ()) + type Foo3Sym2 :: a -> b -> a + type family Foo3Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: a where + Foo3Sym2 a0123456789876543210 a0123456789876543210 = Foo3 a0123456789876543210 a0123456789876543210 + type Foo2Sym0 :: (~>) a ((~>) (Maybe a) a) + data Foo2Sym0 :: (~>) a ((~>) (Maybe a) a) + where + Foo2Sym0KindInference :: SameKind (Apply Foo2Sym0 arg) (Foo2Sym1 arg) => + Foo2Sym0 a0123456789876543210 + type instance Apply Foo2Sym0 a0123456789876543210 = Foo2Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Foo2Sym0 where + suppressUnusedWarnings = snd ((,) Foo2Sym0KindInference ()) + type Foo2Sym1 :: a -> (~>) (Maybe a) a + data Foo2Sym1 (a0123456789876543210 :: a) :: (~>) (Maybe a) a + where + Foo2Sym1KindInference :: SameKind (Apply (Foo2Sym1 a0123456789876543210) arg) (Foo2Sym2 a0123456789876543210 arg) => + Foo2Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (Foo2Sym1 a0123456789876543210) a0123456789876543210 = Foo2 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Foo2Sym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) Foo2Sym1KindInference ()) + type Foo2Sym2 :: a -> Maybe a -> a + type family Foo2Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: Maybe a) :: a where + Foo2Sym2 a0123456789876543210 a0123456789876543210 = Foo2 a0123456789876543210 a0123456789876543210 + type Foo1Sym0 :: (~>) a ((~>) (Maybe a) a) + data Foo1Sym0 :: (~>) a ((~>) (Maybe a) a) + where + Foo1Sym0KindInference :: SameKind (Apply Foo1Sym0 arg) (Foo1Sym1 arg) => + Foo1Sym0 a0123456789876543210 + type instance Apply Foo1Sym0 a0123456789876543210 = Foo1Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Foo1Sym0 where + suppressUnusedWarnings = snd ((,) Foo1Sym0KindInference ()) + type Foo1Sym1 :: a -> (~>) (Maybe a) a + data Foo1Sym1 (a0123456789876543210 :: a) :: (~>) (Maybe a) a + where + Foo1Sym1KindInference :: SameKind (Apply (Foo1Sym1 a0123456789876543210) arg) (Foo1Sym2 a0123456789876543210 arg) => + Foo1Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (Foo1Sym1 a0123456789876543210) a0123456789876543210 = Foo1 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Foo1Sym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) Foo1Sym1KindInference ()) + type Foo1Sym2 :: a -> Maybe a -> a + type family Foo1Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: Maybe a) :: a where + Foo1Sym2 a0123456789876543210 a0123456789876543210 = Foo1 a0123456789876543210 a0123456789876543210 + type Foo3 :: a -> b -> a + type family Foo3 (a :: a) (a :: b) :: a where + Foo3 a b = Apply (Apply (Apply Lambda_0123456789876543210Sym0 a) b) (Apply (Apply Tuple2Sym0 a) b) + type Foo2 :: a -> Maybe a -> a + type family Foo2 (a :: a) (a :: Maybe a) :: a where + Foo2 d _ = Apply (Apply Lambda_0123456789876543210Sym0 d) (Apply JustSym0 d) + type Foo1 :: a -> Maybe a -> a + type family Foo1 (a :: a) (a :: Maybe a) :: a where + Foo1 d x = Apply (Apply (Apply Lambda_0123456789876543210Sym0 d) x) x + sFoo3 :: + (forall (t :: a) (t :: b). + Sing t -> Sing t -> Sing (Apply (Apply Foo3Sym0 t) t :: a) :: Type) + sFoo2 :: + (forall (t :: a) (t :: Maybe a). + Sing t -> Sing t -> Sing (Apply (Apply Foo2Sym0 t) t :: a) :: Type) + sFoo1 :: + (forall (t :: a) (t :: Maybe a). + Sing t -> Sing t -> Sing (Apply (Apply Foo1Sym0 t) t :: a) :: Type) + sFoo3 (sA :: Sing a) (sB :: Sing b) + = applySing + (singFun1 + @(Apply (Apply Lambda_0123456789876543210Sym0 a) b) + (\ sX_0123456789876543210 + -> case sX_0123456789876543210 of + (_ :: Sing x_0123456789876543210) + -> id + @(Sing (Case_0123456789876543210 x_0123456789876543210 a b x_0123456789876543210)) + (case sX_0123456789876543210 of STuple2 (sP :: Sing p) _ -> sP))) + (applySing (applySing (singFun2 @Tuple2Sym0 STuple2) sA) sB) + sFoo2 (sD :: Sing d) _ + = applySing + (singFun1 + @(Apply Lambda_0123456789876543210Sym0 d) + (\ sX_0123456789876543210 + -> case sX_0123456789876543210 of + (_ :: Sing x_0123456789876543210) + -> id + @(Sing (Case_0123456789876543210 x_0123456789876543210 d x_0123456789876543210)) + (case sX_0123456789876543210 of + SJust (sY :: Sing y) -> sY + SNothing -> sD))) + (applySing (singFun1 @JustSym0 SJust) sD) + sFoo1 (sD :: Sing d) (sX :: Sing x) + = applySing + (singFun1 + @(Apply (Apply Lambda_0123456789876543210Sym0 d) x) + (\ sX_0123456789876543210 + -> case sX_0123456789876543210 of + (_ :: Sing x_0123456789876543210) + -> id + @(Sing (Case_0123456789876543210 x_0123456789876543210 d x x_0123456789876543210)) + (case sX_0123456789876543210 of + SJust (sY :: Sing y) -> sY + SNothing -> sD))) + sX + instance SingI (Foo3Sym0 :: (~>) a ((~>) b a)) where + sing = singFun2 @Foo3Sym0 sFoo3 + instance SingI d => SingI (Foo3Sym1 (d :: a) :: (~>) b a) where + sing = singFun1 @(Foo3Sym1 (d :: a)) (sFoo3 (sing @d)) + instance SingI1 (Foo3Sym1 :: a -> (~>) b a) where + liftSing (s :: Sing (d :: a)) + = singFun1 @(Foo3Sym1 (d :: a)) (sFoo3 s) + instance SingI (Foo2Sym0 :: (~>) a ((~>) (Maybe a) a)) where + sing = singFun2 @Foo2Sym0 sFoo2 + instance SingI d => + SingI (Foo2Sym1 (d :: a) :: (~>) (Maybe a) a) where + sing = singFun1 @(Foo2Sym1 (d :: a)) (sFoo2 (sing @d)) + instance SingI1 (Foo2Sym1 :: a -> (~>) (Maybe a) a) where + liftSing (s :: Sing (d :: a)) + = singFun1 @(Foo2Sym1 (d :: a)) (sFoo2 s) + instance SingI (Foo1Sym0 :: (~>) a ((~>) (Maybe a) a)) where + sing = singFun2 @Foo1Sym0 sFoo1 + instance SingI d => + SingI (Foo1Sym1 (d :: a) :: (~>) (Maybe a) a) where + sing = singFun1 @(Foo1Sym1 (d :: a)) (sFoo1 (sing @d)) + instance SingI1 (Foo1Sym1 :: a -> (~>) (Maybe a) a) where + liftSing (s :: Sing (d :: a)) + = singFun1 @(Foo1Sym1 (d :: a)) (sFoo1 s)
tests/compile-and-dump/Singletons/LambdaCase.hs view
@@ -1,38 +1,38 @@-module Singletons.LambdaCase where--import Data.Singletons.TH-import Prelude.Singletons--$(singletons [d|- foo1 :: a -> Maybe a -> a- foo1 d x = (\case- Just y -> y- Nothing -> d) x-- foo2 :: a -> Maybe a -> a- foo2 d _ = (\case- Just y -> y- Nothing -> d) (Just d)-- foo3 :: a -> b -> a- foo3 a b = (\case- (p, _) -> p) (a, b)- |])--foo1a :: Proxy (Foo1 Int (Just Char))-foo1a = Proxy--foo1b :: Proxy Char-foo1b = foo1a--foo2a :: Proxy (Foo2 Char Nothing)-foo2a = Proxy--foo2b :: Proxy Char-foo2b = foo2a--foo3a :: Proxy (Foo3 Int Char)-foo3a = Proxy--foo3b :: Proxy Int-foo3b = foo3a+module Singletons.LambdaCase where + +import Data.Singletons.TH +import Prelude.Singletons + +$(singletons [d| + foo1 :: a -> Maybe a -> a + foo1 d x = (\case + Just y -> y + Nothing -> d) x + + foo2 :: a -> Maybe a -> a + foo2 d _ = (\case + Just y -> y + Nothing -> d) (Just d) + + foo3 :: a -> b -> a + foo3 a b = (\case + (p, _) -> p) (a, b) + |]) + +foo1a :: Proxy (Foo1 Int (Just Char)) +foo1a = Proxy + +foo1b :: Proxy Char +foo1b = foo1a + +foo2a :: Proxy (Foo2 Char Nothing) +foo2a = Proxy + +foo2b :: Proxy Char +foo2b = foo2a + +foo3a :: Proxy (Foo3 Int Char) +foo3a = Proxy + +foo3b :: Proxy Int +foo3b = foo3a
tests/compile-and-dump/Singletons/Lambdas.golden view
@@ -1,779 +1,787 @@-Singletons/Lambdas.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| foo0 :: a -> b -> a- foo0 = (\ x y -> x)- foo1 :: a -> b -> a- foo1 x = (\ _ -> x)- foo2 :: a -> b -> a- foo2 x y = (\ _ -> x) y- foo3 :: a -> a- foo3 x = (\ y -> y) x- foo4 :: a -> b -> c -> a- foo4 x y z = (\ _ _ -> x) y z- foo5 :: a -> b -> b- foo5 x y = (\ x -> x) y- foo6 :: a -> b -> a- foo6 a b = (\ x -> \ _ -> x) a b- foo7 :: a -> b -> b- foo7 x y = (\ (_, b) -> b) (x, y)- foo8 :: Foo a b -> a- foo8 x = (\ (Foo a _) -> a) x- - data Foo a b = Foo a b |]- ======>- foo0 :: a -> b -> a- foo0 = \ x y -> x- foo1 :: a -> b -> a- foo1 x = \ _ -> x- foo2 :: a -> b -> a- foo2 x y = (\ _ -> x) y- foo3 :: a -> a- foo3 x = (\ y -> y) x- foo4 :: a -> b -> c -> a- foo4 x y z = ((\ _ _ -> x) y) z- foo5 :: a -> b -> b- foo5 x y = (\ x -> x) y- foo6 :: a -> b -> a- foo6 a b = ((\ x -> \ _ -> x) a) b- foo7 :: a -> b -> b- foo7 x y = (\ (_, b) -> b) (x, y)- data Foo a b = Foo a b- foo8 :: Foo a b -> a- foo8 x = (\ (Foo a _) -> a) x- type FooSym0 :: forall a b. (~>) a ((~>) b (Foo a b))- data FooSym0 :: (~>) a ((~>) b (Foo a b))- where- FooSym0KindInference :: SameKind (Apply FooSym0 arg) (FooSym1 arg) =>- FooSym0 a0123456789876543210- type instance Apply FooSym0 a0123456789876543210 = FooSym1 a0123456789876543210- instance SuppressUnusedWarnings FooSym0 where- suppressUnusedWarnings = snd (((,) FooSym0KindInference) ())- type FooSym1 :: forall a b. a -> (~>) b (Foo a b)- data FooSym1 (a0123456789876543210 :: a) :: (~>) b (Foo a b)- where- FooSym1KindInference :: SameKind (Apply (FooSym1 a0123456789876543210) arg) (FooSym2 a0123456789876543210 arg) =>- FooSym1 a0123456789876543210 a0123456789876543210- type instance Apply (FooSym1 a0123456789876543210) a0123456789876543210 = Foo a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (FooSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) FooSym1KindInference) ())- type FooSym2 :: forall a b. a -> b -> Foo a b- type family FooSym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: Foo a b where- FooSym2 a0123456789876543210 a0123456789876543210 = Foo a0123456789876543210 a0123456789876543210- type family Case_0123456789876543210 arg_0123456789876543210 x t where- Case_0123456789876543210 arg_0123456789876543210 x (Foo a _) = a- type family Lambda_0123456789876543210 x arg_0123456789876543210 where- Lambda_0123456789876543210 x arg_0123456789876543210 = Case_0123456789876543210 arg_0123456789876543210 x arg_0123456789876543210- data Lambda_0123456789876543210Sym0 x0123456789876543210- where- Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) =>- Lambda_0123456789876543210Sym0 x0123456789876543210- type instance Apply Lambda_0123456789876543210Sym0 x0123456789876543210 = Lambda_0123456789876543210Sym1 x0123456789876543210- instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym0KindInference) ())- data Lambda_0123456789876543210Sym1 x0123456789876543210 arg_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) arg) (Lambda_0123456789876543210Sym2 x0123456789876543210 arg) =>- Lambda_0123456789876543210Sym1 x0123456789876543210 arg_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 arg_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 x0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym1KindInference) ())- type family Lambda_0123456789876543210Sym2 x0123456789876543210 arg_01234567898765432100123456789876543210 where- Lambda_0123456789876543210Sym2 x0123456789876543210 arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 arg_01234567898765432100123456789876543210- type family Case_0123456789876543210 arg_0123456789876543210 x y t where- Case_0123456789876543210 arg_0123456789876543210 x y '(_, b) = b- type family Lambda_0123456789876543210 x y arg_0123456789876543210 where- Lambda_0123456789876543210 x y arg_0123456789876543210 = Case_0123456789876543210 arg_0123456789876543210 x y arg_0123456789876543210- data Lambda_0123456789876543210Sym0 x0123456789876543210- where- Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) =>- Lambda_0123456789876543210Sym0 x0123456789876543210- type instance Apply Lambda_0123456789876543210Sym0 x0123456789876543210 = Lambda_0123456789876543210Sym1 x0123456789876543210- instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym0KindInference) ())- data Lambda_0123456789876543210Sym1 x0123456789876543210 y0123456789876543210- where- Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) arg) (Lambda_0123456789876543210Sym2 x0123456789876543210 arg) =>- Lambda_0123456789876543210Sym1 x0123456789876543210 y0123456789876543210- type instance Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) y0123456789876543210 = Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 x0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym1KindInference) ())- data Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210 arg_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210) arg) (Lambda_0123456789876543210Sym3 x0123456789876543210 y0123456789876543210 arg) =>- Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210 arg_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210) arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 y0123456789876543210 arg_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym2KindInference) ())- type family Lambda_0123456789876543210Sym3 x0123456789876543210 y0123456789876543210 arg_01234567898765432100123456789876543210 where- Lambda_0123456789876543210Sym3 x0123456789876543210 y0123456789876543210 arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 y0123456789876543210 arg_01234567898765432100123456789876543210- type family Case_0123456789876543210 arg_0123456789876543210 x a b t where- Case_0123456789876543210 arg_0123456789876543210 x a b _ = x- type family Lambda_0123456789876543210 x a b arg_0123456789876543210 where- Lambda_0123456789876543210 x a b arg_0123456789876543210 = Case_0123456789876543210 arg_0123456789876543210 x a b arg_0123456789876543210- data Lambda_0123456789876543210Sym0 x0123456789876543210- where- Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) =>- Lambda_0123456789876543210Sym0 x0123456789876543210- type instance Apply Lambda_0123456789876543210Sym0 x0123456789876543210 = Lambda_0123456789876543210Sym1 x0123456789876543210- instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym0KindInference) ())- data Lambda_0123456789876543210Sym1 x0123456789876543210 a0123456789876543210- where- Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) arg) (Lambda_0123456789876543210Sym2 x0123456789876543210 arg) =>- Lambda_0123456789876543210Sym1 x0123456789876543210 a0123456789876543210- type instance Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) a0123456789876543210 = Lambda_0123456789876543210Sym2 x0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 x0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym1KindInference) ())- data Lambda_0123456789876543210Sym2 x0123456789876543210 a0123456789876543210 b0123456789876543210- where- Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 x0123456789876543210 a0123456789876543210) arg) (Lambda_0123456789876543210Sym3 x0123456789876543210 a0123456789876543210 arg) =>- Lambda_0123456789876543210Sym2 x0123456789876543210 a0123456789876543210 b0123456789876543210- type instance Apply (Lambda_0123456789876543210Sym2 x0123456789876543210 a0123456789876543210) b0123456789876543210 = Lambda_0123456789876543210Sym3 x0123456789876543210 a0123456789876543210 b0123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 x0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym2KindInference) ())- data Lambda_0123456789876543210Sym3 x0123456789876543210 a0123456789876543210 b0123456789876543210 arg_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym3KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym3 x0123456789876543210 a0123456789876543210 b0123456789876543210) arg) (Lambda_0123456789876543210Sym4 x0123456789876543210 a0123456789876543210 b0123456789876543210 arg) =>- Lambda_0123456789876543210Sym3 x0123456789876543210 a0123456789876543210 b0123456789876543210 arg_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym3 x0123456789876543210 a0123456789876543210 b0123456789876543210) arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 a0123456789876543210 b0123456789876543210 arg_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym3 x0123456789876543210 a0123456789876543210 b0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym3KindInference) ())- type family Lambda_0123456789876543210Sym4 x0123456789876543210 a0123456789876543210 b0123456789876543210 arg_01234567898765432100123456789876543210 where- Lambda_0123456789876543210Sym4 x0123456789876543210 a0123456789876543210 b0123456789876543210 arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 a0123456789876543210 b0123456789876543210 arg_01234567898765432100123456789876543210- type family Lambda_0123456789876543210 a b x where- Lambda_0123456789876543210 a b x = Apply (Apply (Apply Lambda_0123456789876543210Sym0 x) a) b- data Lambda_0123456789876543210Sym0 a0123456789876543210- where- Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) =>- Lambda_0123456789876543210Sym0 a0123456789876543210- type instance Apply Lambda_0123456789876543210Sym0 a0123456789876543210 = Lambda_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym0KindInference) ())- data Lambda_0123456789876543210Sym1 a0123456789876543210 b0123456789876543210- where- Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 a0123456789876543210) arg) (Lambda_0123456789876543210Sym2 a0123456789876543210 arg) =>- Lambda_0123456789876543210Sym1 a0123456789876543210 b0123456789876543210- type instance Apply (Lambda_0123456789876543210Sym1 a0123456789876543210) b0123456789876543210 = Lambda_0123456789876543210Sym2 a0123456789876543210 b0123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym1KindInference) ())- data Lambda_0123456789876543210Sym2 a0123456789876543210 b0123456789876543210 x0123456789876543210- where- Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 a0123456789876543210 b0123456789876543210) arg) (Lambda_0123456789876543210Sym3 a0123456789876543210 b0123456789876543210 arg) =>- Lambda_0123456789876543210Sym2 a0123456789876543210 b0123456789876543210 x0123456789876543210- type instance Apply (Lambda_0123456789876543210Sym2 a0123456789876543210 b0123456789876543210) x0123456789876543210 = Lambda_0123456789876543210 a0123456789876543210 b0123456789876543210 x0123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 a0123456789876543210 b0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym2KindInference) ())- type family Lambda_0123456789876543210Sym3 a0123456789876543210 b0123456789876543210 x0123456789876543210 where- Lambda_0123456789876543210Sym3 a0123456789876543210 b0123456789876543210 x0123456789876543210 = Lambda_0123456789876543210 a0123456789876543210 b0123456789876543210 x0123456789876543210- type family Lambda_0123456789876543210 x y x where- Lambda_0123456789876543210 x y x = x- data Lambda_0123456789876543210Sym0 x0123456789876543210- where- Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) =>- Lambda_0123456789876543210Sym0 x0123456789876543210- type instance Apply Lambda_0123456789876543210Sym0 x0123456789876543210 = Lambda_0123456789876543210Sym1 x0123456789876543210- instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym0KindInference) ())- data Lambda_0123456789876543210Sym1 x0123456789876543210 y0123456789876543210- where- Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) arg) (Lambda_0123456789876543210Sym2 x0123456789876543210 arg) =>- Lambda_0123456789876543210Sym1 x0123456789876543210 y0123456789876543210- type instance Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) y0123456789876543210 = Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 x0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym1KindInference) ())- data Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210 x0123456789876543210- where- Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210) arg) (Lambda_0123456789876543210Sym3 x0123456789876543210 y0123456789876543210 arg) =>- Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210 x0123456789876543210- type instance Apply (Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210) x0123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 y0123456789876543210 x0123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym2KindInference) ())- type family Lambda_0123456789876543210Sym3 x0123456789876543210 y0123456789876543210 x0123456789876543210 where- Lambda_0123456789876543210Sym3 x0123456789876543210 y0123456789876543210 x0123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 y0123456789876543210 x0123456789876543210- type family Case_0123456789876543210 arg_0123456789876543210 arg_0123456789876543210 x y z t where- Case_0123456789876543210 arg_0123456789876543210 arg_0123456789876543210 x y z '(_,- _) = x- type family Lambda_0123456789876543210 x y z arg_0123456789876543210 arg_0123456789876543210 where- Lambda_0123456789876543210 x y z arg_0123456789876543210 arg_0123456789876543210 = Case_0123456789876543210 arg_0123456789876543210 arg_0123456789876543210 x y z (Apply (Apply Tuple2Sym0 arg_0123456789876543210) arg_0123456789876543210)- data Lambda_0123456789876543210Sym0 x0123456789876543210- where- Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) =>- Lambda_0123456789876543210Sym0 x0123456789876543210- type instance Apply Lambda_0123456789876543210Sym0 x0123456789876543210 = Lambda_0123456789876543210Sym1 x0123456789876543210- instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym0KindInference) ())- data Lambda_0123456789876543210Sym1 x0123456789876543210 y0123456789876543210- where- Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) arg) (Lambda_0123456789876543210Sym2 x0123456789876543210 arg) =>- Lambda_0123456789876543210Sym1 x0123456789876543210 y0123456789876543210- type instance Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) y0123456789876543210 = Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 x0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym1KindInference) ())- data Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210 z0123456789876543210- where- Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210) arg) (Lambda_0123456789876543210Sym3 x0123456789876543210 y0123456789876543210 arg) =>- Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210 z0123456789876543210- type instance Apply (Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210) z0123456789876543210 = Lambda_0123456789876543210Sym3 x0123456789876543210 y0123456789876543210 z0123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym2KindInference) ())- data Lambda_0123456789876543210Sym3 x0123456789876543210 y0123456789876543210 z0123456789876543210 arg_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym3KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym3 x0123456789876543210 y0123456789876543210 z0123456789876543210) arg) (Lambda_0123456789876543210Sym4 x0123456789876543210 y0123456789876543210 z0123456789876543210 arg) =>- Lambda_0123456789876543210Sym3 x0123456789876543210 y0123456789876543210 z0123456789876543210 arg_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym3 x0123456789876543210 y0123456789876543210 z0123456789876543210) arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym4 x0123456789876543210 y0123456789876543210 z0123456789876543210 arg_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym3 x0123456789876543210 y0123456789876543210 z0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym3KindInference) ())- data Lambda_0123456789876543210Sym4 x0123456789876543210 y0123456789876543210 z0123456789876543210 arg_01234567898765432100123456789876543210 arg_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym4KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym4 x0123456789876543210 y0123456789876543210 z0123456789876543210 arg_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym5 x0123456789876543210 y0123456789876543210 z0123456789876543210 arg_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym4 x0123456789876543210 y0123456789876543210 z0123456789876543210 arg_01234567898765432100123456789876543210 arg_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym4 x0123456789876543210 y0123456789876543210 z0123456789876543210 arg_01234567898765432100123456789876543210) arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 y0123456789876543210 z0123456789876543210 arg_01234567898765432100123456789876543210 arg_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym4 x0123456789876543210 y0123456789876543210 z0123456789876543210 arg_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym4KindInference) ())- type family Lambda_0123456789876543210Sym5 x0123456789876543210 y0123456789876543210 z0123456789876543210 arg_01234567898765432100123456789876543210 arg_01234567898765432100123456789876543210 where- Lambda_0123456789876543210Sym5 x0123456789876543210 y0123456789876543210 z0123456789876543210 arg_01234567898765432100123456789876543210 arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 y0123456789876543210 z0123456789876543210 arg_01234567898765432100123456789876543210 arg_01234567898765432100123456789876543210- type family Lambda_0123456789876543210 x y where- Lambda_0123456789876543210 x y = y- data Lambda_0123456789876543210Sym0 x0123456789876543210- where- Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) =>- Lambda_0123456789876543210Sym0 x0123456789876543210- type instance Apply Lambda_0123456789876543210Sym0 x0123456789876543210 = Lambda_0123456789876543210Sym1 x0123456789876543210- instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym0KindInference) ())- data Lambda_0123456789876543210Sym1 x0123456789876543210 y0123456789876543210- where- Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) arg) (Lambda_0123456789876543210Sym2 x0123456789876543210 arg) =>- Lambda_0123456789876543210Sym1 x0123456789876543210 y0123456789876543210- type instance Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) y0123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 y0123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 x0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym1KindInference) ())- type family Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210 where- Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 y0123456789876543210- type family Case_0123456789876543210 arg_0123456789876543210 x y t where- Case_0123456789876543210 arg_0123456789876543210 x y _ = x- type family Lambda_0123456789876543210 x y arg_0123456789876543210 where- Lambda_0123456789876543210 x y arg_0123456789876543210 = Case_0123456789876543210 arg_0123456789876543210 x y arg_0123456789876543210- data Lambda_0123456789876543210Sym0 x0123456789876543210- where- Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) =>- Lambda_0123456789876543210Sym0 x0123456789876543210- type instance Apply Lambda_0123456789876543210Sym0 x0123456789876543210 = Lambda_0123456789876543210Sym1 x0123456789876543210- instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym0KindInference) ())- data Lambda_0123456789876543210Sym1 x0123456789876543210 y0123456789876543210- where- Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) arg) (Lambda_0123456789876543210Sym2 x0123456789876543210 arg) =>- Lambda_0123456789876543210Sym1 x0123456789876543210 y0123456789876543210- type instance Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) y0123456789876543210 = Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 x0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym1KindInference) ())- data Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210 arg_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210) arg) (Lambda_0123456789876543210Sym3 x0123456789876543210 y0123456789876543210 arg) =>- Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210 arg_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210) arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 y0123456789876543210 arg_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym2KindInference) ())- type family Lambda_0123456789876543210Sym3 x0123456789876543210 y0123456789876543210 arg_01234567898765432100123456789876543210 where- Lambda_0123456789876543210Sym3 x0123456789876543210 y0123456789876543210 arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 y0123456789876543210 arg_01234567898765432100123456789876543210- type family Case_0123456789876543210 arg_0123456789876543210 x a_0123456789876543210 t where- Case_0123456789876543210 arg_0123456789876543210 x a_0123456789876543210 _ = x- type family Lambda_0123456789876543210 x a_0123456789876543210 arg_0123456789876543210 where- Lambda_0123456789876543210 x a_0123456789876543210 arg_0123456789876543210 = Case_0123456789876543210 arg_0123456789876543210 x a_0123456789876543210 arg_0123456789876543210- data Lambda_0123456789876543210Sym0 x0123456789876543210- where- Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) =>- Lambda_0123456789876543210Sym0 x0123456789876543210- type instance Apply Lambda_0123456789876543210Sym0 x0123456789876543210 = Lambda_0123456789876543210Sym1 x0123456789876543210- instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym0KindInference) ())- data Lambda_0123456789876543210Sym1 x0123456789876543210 a_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) arg) (Lambda_0123456789876543210Sym2 x0123456789876543210 arg) =>- Lambda_0123456789876543210Sym1 x0123456789876543210 a_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym2 x0123456789876543210 a_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 x0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym1KindInference) ())- data Lambda_0123456789876543210Sym2 x0123456789876543210 a_01234567898765432100123456789876543210 arg_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 x0123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym3 x0123456789876543210 a_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym2 x0123456789876543210 a_01234567898765432100123456789876543210 arg_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym2 x0123456789876543210 a_01234567898765432100123456789876543210) arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 a_01234567898765432100123456789876543210 arg_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 x0123456789876543210 a_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym2KindInference) ())- type family Lambda_0123456789876543210Sym3 x0123456789876543210 a_01234567898765432100123456789876543210 arg_01234567898765432100123456789876543210 where- Lambda_0123456789876543210Sym3 x0123456789876543210 a_01234567898765432100123456789876543210 arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 a_01234567898765432100123456789876543210 arg_01234567898765432100123456789876543210- type family Lambda_0123456789876543210 a_0123456789876543210 a_0123456789876543210 x y where- Lambda_0123456789876543210 a_0123456789876543210 a_0123456789876543210 x y = x- data Lambda_0123456789876543210Sym0 a_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) =>- Lambda_0123456789876543210Sym0 a_01234567898765432100123456789876543210- type instance Apply Lambda_0123456789876543210Sym0 a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210- instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym0KindInference) ())- data Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym1KindInference) ())- data Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 x0123456789876543210- where- Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym3 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 x0123456789876543210- type instance Apply (Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) x0123456789876543210 = Lambda_0123456789876543210Sym3 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 x0123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym2KindInference) ())- data Lambda_0123456789876543210Sym3 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 x0123456789876543210 y0123456789876543210- where- Lambda_0123456789876543210Sym3KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym3 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 x0123456789876543210) arg) (Lambda_0123456789876543210Sym4 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 x0123456789876543210 arg) =>- Lambda_0123456789876543210Sym3 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 x0123456789876543210 y0123456789876543210- type instance Apply (Lambda_0123456789876543210Sym3 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 x0123456789876543210) y0123456789876543210 = Lambda_0123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 x0123456789876543210 y0123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym3 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 x0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym3KindInference) ())- type family Lambda_0123456789876543210Sym4 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 x0123456789876543210 y0123456789876543210 where- Lambda_0123456789876543210Sym4 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 x0123456789876543210 y0123456789876543210 = Lambda_0123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 x0123456789876543210 y0123456789876543210- type Foo8Sym0 :: (~>) (Foo a b) a- data Foo8Sym0 :: (~>) (Foo a b) a- where- Foo8Sym0KindInference :: SameKind (Apply Foo8Sym0 arg) (Foo8Sym1 arg) =>- Foo8Sym0 a0123456789876543210- type instance Apply Foo8Sym0 a0123456789876543210 = Foo8 a0123456789876543210- instance SuppressUnusedWarnings Foo8Sym0 where- suppressUnusedWarnings = snd (((,) Foo8Sym0KindInference) ())- type Foo8Sym1 :: Foo a b -> a- type family Foo8Sym1 (a0123456789876543210 :: Foo a b) :: a where- Foo8Sym1 a0123456789876543210 = Foo8 a0123456789876543210- type Foo7Sym0 :: (~>) a ((~>) b b)- data Foo7Sym0 :: (~>) a ((~>) b b)- where- Foo7Sym0KindInference :: SameKind (Apply Foo7Sym0 arg) (Foo7Sym1 arg) =>- Foo7Sym0 a0123456789876543210- type instance Apply Foo7Sym0 a0123456789876543210 = Foo7Sym1 a0123456789876543210- instance SuppressUnusedWarnings Foo7Sym0 where- suppressUnusedWarnings = snd (((,) Foo7Sym0KindInference) ())- type Foo7Sym1 :: a -> (~>) b b- data Foo7Sym1 (a0123456789876543210 :: a) :: (~>) b b- where- Foo7Sym1KindInference :: SameKind (Apply (Foo7Sym1 a0123456789876543210) arg) (Foo7Sym2 a0123456789876543210 arg) =>- Foo7Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (Foo7Sym1 a0123456789876543210) a0123456789876543210 = Foo7 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Foo7Sym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) Foo7Sym1KindInference) ())- type Foo7Sym2 :: a -> b -> b- type family Foo7Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: b where- Foo7Sym2 a0123456789876543210 a0123456789876543210 = Foo7 a0123456789876543210 a0123456789876543210- type Foo6Sym0 :: (~>) a ((~>) b a)- data Foo6Sym0 :: (~>) a ((~>) b a)- where- Foo6Sym0KindInference :: SameKind (Apply Foo6Sym0 arg) (Foo6Sym1 arg) =>- Foo6Sym0 a0123456789876543210- type instance Apply Foo6Sym0 a0123456789876543210 = Foo6Sym1 a0123456789876543210- instance SuppressUnusedWarnings Foo6Sym0 where- suppressUnusedWarnings = snd (((,) Foo6Sym0KindInference) ())- type Foo6Sym1 :: a -> (~>) b a- data Foo6Sym1 (a0123456789876543210 :: a) :: (~>) b a- where- Foo6Sym1KindInference :: SameKind (Apply (Foo6Sym1 a0123456789876543210) arg) (Foo6Sym2 a0123456789876543210 arg) =>- Foo6Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (Foo6Sym1 a0123456789876543210) a0123456789876543210 = Foo6 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Foo6Sym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) Foo6Sym1KindInference) ())- type Foo6Sym2 :: a -> b -> a- type family Foo6Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: a where- Foo6Sym2 a0123456789876543210 a0123456789876543210 = Foo6 a0123456789876543210 a0123456789876543210- type Foo5Sym0 :: (~>) a ((~>) b b)- data Foo5Sym0 :: (~>) a ((~>) b b)- where- Foo5Sym0KindInference :: SameKind (Apply Foo5Sym0 arg) (Foo5Sym1 arg) =>- Foo5Sym0 a0123456789876543210- type instance Apply Foo5Sym0 a0123456789876543210 = Foo5Sym1 a0123456789876543210- instance SuppressUnusedWarnings Foo5Sym0 where- suppressUnusedWarnings = snd (((,) Foo5Sym0KindInference) ())- type Foo5Sym1 :: a -> (~>) b b- data Foo5Sym1 (a0123456789876543210 :: a) :: (~>) b b- where- Foo5Sym1KindInference :: SameKind (Apply (Foo5Sym1 a0123456789876543210) arg) (Foo5Sym2 a0123456789876543210 arg) =>- Foo5Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (Foo5Sym1 a0123456789876543210) a0123456789876543210 = Foo5 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Foo5Sym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) Foo5Sym1KindInference) ())- type Foo5Sym2 :: a -> b -> b- type family Foo5Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: b where- Foo5Sym2 a0123456789876543210 a0123456789876543210 = Foo5 a0123456789876543210 a0123456789876543210- type Foo4Sym0 :: (~>) a ((~>) b ((~>) c a))- data Foo4Sym0 :: (~>) a ((~>) b ((~>) c a))- where- Foo4Sym0KindInference :: SameKind (Apply Foo4Sym0 arg) (Foo4Sym1 arg) =>- Foo4Sym0 a0123456789876543210- type instance Apply Foo4Sym0 a0123456789876543210 = Foo4Sym1 a0123456789876543210- instance SuppressUnusedWarnings Foo4Sym0 where- suppressUnusedWarnings = snd (((,) Foo4Sym0KindInference) ())- type Foo4Sym1 :: a -> (~>) b ((~>) c a)- data Foo4Sym1 (a0123456789876543210 :: a) :: (~>) b ((~>) c a)- where- Foo4Sym1KindInference :: SameKind (Apply (Foo4Sym1 a0123456789876543210) arg) (Foo4Sym2 a0123456789876543210 arg) =>- Foo4Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (Foo4Sym1 a0123456789876543210) a0123456789876543210 = Foo4Sym2 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Foo4Sym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) Foo4Sym1KindInference) ())- type Foo4Sym2 :: a -> b -> (~>) c a- data Foo4Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: (~>) c a- where- Foo4Sym2KindInference :: SameKind (Apply (Foo4Sym2 a0123456789876543210 a0123456789876543210) arg) (Foo4Sym3 a0123456789876543210 a0123456789876543210 arg) =>- Foo4Sym2 a0123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply (Foo4Sym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = Foo4 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Foo4Sym2 a0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) Foo4Sym2KindInference) ())- type Foo4Sym3 :: a -> b -> c -> a- type family Foo4Sym3 (a0123456789876543210 :: a) (a0123456789876543210 :: b) (a0123456789876543210 :: c) :: a where- Foo4Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = Foo4 a0123456789876543210 a0123456789876543210 a0123456789876543210- type Foo3Sym0 :: (~>) a a- data Foo3Sym0 :: (~>) a a- where- Foo3Sym0KindInference :: SameKind (Apply Foo3Sym0 arg) (Foo3Sym1 arg) =>- Foo3Sym0 a0123456789876543210- type instance Apply Foo3Sym0 a0123456789876543210 = Foo3 a0123456789876543210- instance SuppressUnusedWarnings Foo3Sym0 where- suppressUnusedWarnings = snd (((,) Foo3Sym0KindInference) ())- type Foo3Sym1 :: a -> a- type family Foo3Sym1 (a0123456789876543210 :: a) :: a where- Foo3Sym1 a0123456789876543210 = Foo3 a0123456789876543210- type Foo2Sym0 :: (~>) a ((~>) b a)- data Foo2Sym0 :: (~>) a ((~>) b a)- where- Foo2Sym0KindInference :: SameKind (Apply Foo2Sym0 arg) (Foo2Sym1 arg) =>- Foo2Sym0 a0123456789876543210- type instance Apply Foo2Sym0 a0123456789876543210 = Foo2Sym1 a0123456789876543210- instance SuppressUnusedWarnings Foo2Sym0 where- suppressUnusedWarnings = snd (((,) Foo2Sym0KindInference) ())- type Foo2Sym1 :: a -> (~>) b a- data Foo2Sym1 (a0123456789876543210 :: a) :: (~>) b a- where- Foo2Sym1KindInference :: SameKind (Apply (Foo2Sym1 a0123456789876543210) arg) (Foo2Sym2 a0123456789876543210 arg) =>- Foo2Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (Foo2Sym1 a0123456789876543210) a0123456789876543210 = Foo2 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Foo2Sym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) Foo2Sym1KindInference) ())- type Foo2Sym2 :: a -> b -> a- type family Foo2Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: a where- Foo2Sym2 a0123456789876543210 a0123456789876543210 = Foo2 a0123456789876543210 a0123456789876543210- type Foo1Sym0 :: (~>) a ((~>) b a)- data Foo1Sym0 :: (~>) a ((~>) b a)- where- Foo1Sym0KindInference :: SameKind (Apply Foo1Sym0 arg) (Foo1Sym1 arg) =>- Foo1Sym0 a0123456789876543210- type instance Apply Foo1Sym0 a0123456789876543210 = Foo1Sym1 a0123456789876543210- instance SuppressUnusedWarnings Foo1Sym0 where- suppressUnusedWarnings = snd (((,) Foo1Sym0KindInference) ())- type Foo1Sym1 :: a -> (~>) b a- data Foo1Sym1 (a0123456789876543210 :: a) :: (~>) b a- where- Foo1Sym1KindInference :: SameKind (Apply (Foo1Sym1 a0123456789876543210) arg) (Foo1Sym2 a0123456789876543210 arg) =>- Foo1Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (Foo1Sym1 a0123456789876543210) a0123456789876543210 = Foo1 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Foo1Sym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) Foo1Sym1KindInference) ())- type Foo1Sym2 :: a -> b -> a- type family Foo1Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: a where- Foo1Sym2 a0123456789876543210 a0123456789876543210 = Foo1 a0123456789876543210 a0123456789876543210- type Foo0Sym0 :: (~>) a ((~>) b a)- data Foo0Sym0 :: (~>) a ((~>) b a)- where- Foo0Sym0KindInference :: SameKind (Apply Foo0Sym0 arg) (Foo0Sym1 arg) =>- Foo0Sym0 a0123456789876543210- type instance Apply Foo0Sym0 a0123456789876543210 = Foo0Sym1 a0123456789876543210- instance SuppressUnusedWarnings Foo0Sym0 where- suppressUnusedWarnings = snd (((,) Foo0Sym0KindInference) ())- type Foo0Sym1 :: a -> (~>) b a- data Foo0Sym1 (a0123456789876543210 :: a) :: (~>) b a- where- Foo0Sym1KindInference :: SameKind (Apply (Foo0Sym1 a0123456789876543210) arg) (Foo0Sym2 a0123456789876543210 arg) =>- Foo0Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (Foo0Sym1 a0123456789876543210) a0123456789876543210 = Foo0 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Foo0Sym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) Foo0Sym1KindInference) ())- type Foo0Sym2 :: a -> b -> a- type family Foo0Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: a where- Foo0Sym2 a0123456789876543210 a0123456789876543210 = Foo0 a0123456789876543210 a0123456789876543210- type Foo8 :: Foo a b -> a- type family Foo8 (a :: Foo a b) :: a where- Foo8 x = Apply (Apply Lambda_0123456789876543210Sym0 x) x- type Foo7 :: a -> b -> b- type family Foo7 (a :: a) (a :: b) :: b where- Foo7 x y = Apply (Apply (Apply Lambda_0123456789876543210Sym0 x) y) (Apply (Apply Tuple2Sym0 x) y)- type Foo6 :: a -> b -> a- type family Foo6 (a :: a) (a :: b) :: a where- Foo6 a b = Apply (Apply (Apply (Apply Lambda_0123456789876543210Sym0 a) b) a) b- type Foo5 :: a -> b -> b- type family Foo5 (a :: a) (a :: b) :: b where- Foo5 x y = Apply (Apply (Apply Lambda_0123456789876543210Sym0 x) y) y- type Foo4 :: a -> b -> c -> a- type family Foo4 (a :: a) (a :: b) (a :: c) :: a where- Foo4 x y z = Apply (Apply (Apply (Apply (Apply Lambda_0123456789876543210Sym0 x) y) z) y) z- type Foo3 :: a -> a- type family Foo3 (a :: a) :: a where- Foo3 x = Apply (Apply Lambda_0123456789876543210Sym0 x) x- type Foo2 :: a -> b -> a- type family Foo2 (a :: a) (a :: b) :: a where- Foo2 x y = Apply (Apply (Apply Lambda_0123456789876543210Sym0 x) y) y- type Foo1 :: a -> b -> a- type family Foo1 (a :: a) (a :: b) :: a where- Foo1 x a_0123456789876543210 = Apply (Apply (Apply Lambda_0123456789876543210Sym0 x) a_0123456789876543210) a_0123456789876543210- type Foo0 :: a -> b -> a- type family Foo0 (a :: a) (a :: b) :: a where- Foo0 a_0123456789876543210 a_0123456789876543210 = Apply (Apply (Apply (Apply Lambda_0123456789876543210Sym0 a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210- sFoo8 ::- forall a b (t :: Foo a b). Sing t -> Sing (Apply Foo8Sym0 t :: a)- sFoo7 ::- forall a b (t :: a) (t :: b). Sing t- -> Sing t -> Sing (Apply (Apply Foo7Sym0 t) t :: b)- sFoo6 ::- forall a b (t :: a) (t :: b). Sing t- -> Sing t -> Sing (Apply (Apply Foo6Sym0 t) t :: a)- sFoo5 ::- forall a b (t :: a) (t :: b). Sing t- -> Sing t -> Sing (Apply (Apply Foo5Sym0 t) t :: b)- sFoo4 ::- forall a b c (t :: a) (t :: b) (t :: c). Sing t- -> Sing t- -> Sing t- -> Sing (Apply (Apply (Apply Foo4Sym0 t) t) t :: a)- sFoo3 :: forall a (t :: a). Sing t -> Sing (Apply Foo3Sym0 t :: a)- sFoo2 ::- forall a b (t :: a) (t :: b). Sing t- -> Sing t -> Sing (Apply (Apply Foo2Sym0 t) t :: a)- sFoo1 ::- forall a b (t :: a) (t :: b). Sing t- -> Sing t -> Sing (Apply (Apply Foo1Sym0 t) t :: a)- sFoo0 ::- forall a b (t :: a) (t :: b). Sing t- -> Sing t -> Sing (Apply (Apply Foo0Sym0 t) t :: a)- sFoo8 (sX :: Sing x)- = (applySing- ((singFun1 @(Apply Lambda_0123456789876543210Sym0 x))- (\ sArg_0123456789876543210- -> case sArg_0123456789876543210 of- (_ :: Sing arg_0123456789876543210)- -> (id- @(Sing (Case_0123456789876543210 arg_0123456789876543210 x arg_0123456789876543210)))- (case sArg_0123456789876543210 of SFoo (sA :: Sing a) _ -> sA))))- sX- sFoo7 (sX :: Sing x) (sY :: Sing y)- = (applySing- ((singFun1 @(Apply (Apply Lambda_0123456789876543210Sym0 x) y))- (\ sArg_0123456789876543210- -> case sArg_0123456789876543210 of- (_ :: Sing arg_0123456789876543210)- -> (id- @(Sing (Case_0123456789876543210 arg_0123456789876543210 x y arg_0123456789876543210)))- (case sArg_0123456789876543210 of- STuple2 _ (sB :: Sing b) -> sB))))- ((applySing ((applySing ((singFun2 @Tuple2Sym0) STuple2)) sX)) sY)- sFoo6 (sA :: Sing a) (sB :: Sing b)- = (applySing- ((applySing- ((singFun1 @(Apply (Apply Lambda_0123456789876543210Sym0 a) b))- (\ sX- -> case sX of- (_ :: Sing x)- -> (singFun1- @(Apply (Apply (Apply Lambda_0123456789876543210Sym0 x) a) b))- (\ sArg_0123456789876543210- -> case sArg_0123456789876543210 of- (_ :: Sing arg_0123456789876543210)- -> (id- @(Sing (Case_0123456789876543210 arg_0123456789876543210 x a b arg_0123456789876543210)))- (case sArg_0123456789876543210 of _ -> sX)))))- sA))- sB- sFoo5 (sX :: Sing x) (sY :: Sing y)- = (applySing- ((singFun1 @(Apply (Apply Lambda_0123456789876543210Sym0 x) y))- (\ sX -> case sX of (_ :: Sing x) -> sX)))- sY- sFoo4 (sX :: Sing x) (sY :: Sing y) (sZ :: Sing z)- = (applySing- ((applySing- ((singFun2- @(Apply (Apply (Apply Lambda_0123456789876543210Sym0 x) y) z))- (\ sArg_0123456789876543210 sArg_0123456789876543210- -> case ((,) sArg_0123456789876543210) sArg_0123456789876543210 of- (,) (_ :: Sing arg_0123456789876543210)- (_ :: Sing arg_0123456789876543210)- -> (id- @(Sing (Case_0123456789876543210 arg_0123456789876543210 arg_0123456789876543210 x y z (Apply (Apply Tuple2Sym0 arg_0123456789876543210) arg_0123456789876543210))))- (case- (applySing- ((applySing ((singFun2 @Tuple2Sym0) STuple2))- sArg_0123456789876543210))- sArg_0123456789876543210- of- STuple2 _ _ -> sX))))- sY))- sZ- sFoo3 (sX :: Sing x)- = (applySing- ((singFun1 @(Apply Lambda_0123456789876543210Sym0 x))- (\ sY -> case sY of (_ :: Sing y) -> sY)))- sX- sFoo2 (sX :: Sing x) (sY :: Sing y)- = (applySing- ((singFun1 @(Apply (Apply Lambda_0123456789876543210Sym0 x) y))- (\ sArg_0123456789876543210- -> case sArg_0123456789876543210 of- (_ :: Sing arg_0123456789876543210)- -> (id- @(Sing (Case_0123456789876543210 arg_0123456789876543210 x y arg_0123456789876543210)))- (case sArg_0123456789876543210 of _ -> sX))))- sY- sFoo1- (sX :: Sing x)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((singFun1- @(Apply (Apply Lambda_0123456789876543210Sym0 x) a_0123456789876543210))- (\ sArg_0123456789876543210- -> case sArg_0123456789876543210 of- (_ :: Sing arg_0123456789876543210)- -> (id- @(Sing (Case_0123456789876543210 arg_0123456789876543210 x a_0123456789876543210 arg_0123456789876543210)))- (case sArg_0123456789876543210 of _ -> sX))))- sA_0123456789876543210- sFoo0- (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing- ((singFun2- @(Apply (Apply Lambda_0123456789876543210Sym0 a_0123456789876543210) a_0123456789876543210))- (\ sX sY- -> case ((,) sX) sY of (,) (_ :: Sing x) (_ :: Sing y) -> sX)))- sA_0123456789876543210))- sA_0123456789876543210- instance SingI (Foo8Sym0 :: (~>) (Foo a b) a) where- sing = (singFun1 @Foo8Sym0) sFoo8- instance SingI (Foo7Sym0 :: (~>) a ((~>) b b)) where- sing = (singFun2 @Foo7Sym0) sFoo7- instance SingI d => SingI (Foo7Sym1 (d :: a) :: (~>) b b) where- sing = (singFun1 @(Foo7Sym1 (d :: a))) (sFoo7 (sing @d))- instance SingI1 (Foo7Sym1 :: a -> (~>) b b) where- liftSing (s :: Sing (d :: a))- = (singFun1 @(Foo7Sym1 (d :: a))) (sFoo7 s)- instance SingI (Foo6Sym0 :: (~>) a ((~>) b a)) where- sing = (singFun2 @Foo6Sym0) sFoo6- instance SingI d => SingI (Foo6Sym1 (d :: a) :: (~>) b a) where- sing = (singFun1 @(Foo6Sym1 (d :: a))) (sFoo6 (sing @d))- instance SingI1 (Foo6Sym1 :: a -> (~>) b a) where- liftSing (s :: Sing (d :: a))- = (singFun1 @(Foo6Sym1 (d :: a))) (sFoo6 s)- instance SingI (Foo5Sym0 :: (~>) a ((~>) b b)) where- sing = (singFun2 @Foo5Sym0) sFoo5- instance SingI d => SingI (Foo5Sym1 (d :: a) :: (~>) b b) where- sing = (singFun1 @(Foo5Sym1 (d :: a))) (sFoo5 (sing @d))- instance SingI1 (Foo5Sym1 :: a -> (~>) b b) where- liftSing (s :: Sing (d :: a))- = (singFun1 @(Foo5Sym1 (d :: a))) (sFoo5 s)- instance SingI (Foo4Sym0 :: (~>) a ((~>) b ((~>) c a))) where- sing = (singFun3 @Foo4Sym0) sFoo4- instance SingI d =>- SingI (Foo4Sym1 (d :: a) :: (~>) b ((~>) c a)) where- sing = (singFun2 @(Foo4Sym1 (d :: a))) (sFoo4 (sing @d))- instance SingI1 (Foo4Sym1 :: a -> (~>) b ((~>) c a)) where- liftSing (s :: Sing (d :: a))- = (singFun2 @(Foo4Sym1 (d :: a))) (sFoo4 s)- instance (SingI d, SingI d) =>- SingI (Foo4Sym2 (d :: a) (d :: b) :: (~>) c a) where- sing- = (singFun1 @(Foo4Sym2 (d :: a) (d :: b)))- ((sFoo4 (sing @d)) (sing @d))- instance SingI d =>- SingI1 (Foo4Sym2 (d :: a) :: b -> (~>) c a) where- liftSing (s :: Sing (d :: b))- = (singFun1 @(Foo4Sym2 (d :: a) (d :: b))) ((sFoo4 (sing @d)) s)- instance SingI2 (Foo4Sym2 :: a -> b -> (~>) c a) where- liftSing2 (s :: Sing (d :: a)) (s :: Sing (d :: b))- = (singFun1 @(Foo4Sym2 (d :: a) (d :: b))) ((sFoo4 s) s)- instance SingI (Foo3Sym0 :: (~>) a a) where- sing = (singFun1 @Foo3Sym0) sFoo3- instance SingI (Foo2Sym0 :: (~>) a ((~>) b a)) where- sing = (singFun2 @Foo2Sym0) sFoo2- instance SingI d => SingI (Foo2Sym1 (d :: a) :: (~>) b a) where- sing = (singFun1 @(Foo2Sym1 (d :: a))) (sFoo2 (sing @d))- instance SingI1 (Foo2Sym1 :: a -> (~>) b a) where- liftSing (s :: Sing (d :: a))- = (singFun1 @(Foo2Sym1 (d :: a))) (sFoo2 s)- instance SingI (Foo1Sym0 :: (~>) a ((~>) b a)) where- sing = (singFun2 @Foo1Sym0) sFoo1- instance SingI d => SingI (Foo1Sym1 (d :: a) :: (~>) b a) where- sing = (singFun1 @(Foo1Sym1 (d :: a))) (sFoo1 (sing @d))- instance SingI1 (Foo1Sym1 :: a -> (~>) b a) where- liftSing (s :: Sing (d :: a))- = (singFun1 @(Foo1Sym1 (d :: a))) (sFoo1 s)- instance SingI (Foo0Sym0 :: (~>) a ((~>) b a)) where- sing = (singFun2 @Foo0Sym0) sFoo0- instance SingI d => SingI (Foo0Sym1 (d :: a) :: (~>) b a) where- sing = (singFun1 @(Foo0Sym1 (d :: a))) (sFoo0 (sing @d))- instance SingI1 (Foo0Sym1 :: a -> (~>) b a) where- liftSing (s :: Sing (d :: a))- = (singFun1 @(Foo0Sym1 (d :: a))) (sFoo0 s)- data SFoo :: forall a b. Foo a b -> Type- where- SFoo :: forall a b (n :: a) (n :: b).- (Sing n) -> (Sing n) -> SFoo (Foo n n :: Foo a b)- type instance Sing @(Foo a b) = SFoo- instance (SingKind a, SingKind b) => SingKind (Foo a b) where- type Demote (Foo a b) = Foo (Demote a) (Demote b)- fromSing (SFoo b b) = (Foo (fromSing b)) (fromSing b)- toSing (Foo (b :: Demote a) (b :: Demote b))- = case ((,) (toSing b :: SomeSing a)) (toSing b :: SomeSing b) of- (,) (SomeSing c) (SomeSing c) -> SomeSing ((SFoo c) c)- instance (SingI n, SingI n) => SingI (Foo (n :: a) (n :: b)) where- sing = (SFoo sing) sing- instance SingI n => SingI1 (Foo (n :: a)) where- liftSing = SFoo sing- instance SingI2 Foo where- liftSing2 = SFoo- instance SingI (FooSym0 :: (~>) a ((~>) b (Foo a b))) where- sing = (singFun2 @FooSym0) SFoo- instance SingI d =>- SingI (FooSym1 (d :: a) :: (~>) b (Foo a b)) where- sing = (singFun1 @(FooSym1 (d :: a))) (SFoo (sing @d))- instance SingI1 (FooSym1 :: a -> (~>) b (Foo a b)) where- liftSing (s :: Sing (d :: a))- = (singFun1 @(FooSym1 (d :: a))) (SFoo s)+Singletons/Lambdas.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| foo0 :: a -> b -> a + foo0 = (\ x y -> x) + foo1 :: a -> b -> a + foo1 x = (\ _ -> x) + foo2 :: a -> b -> a + foo2 x y = (\ _ -> x) y + foo3 :: a -> a + foo3 x = (\ y -> y) x + foo4 :: a -> b -> c -> a + foo4 x y z = (\ _ _ -> x) y z + foo5 :: a -> b -> b + foo5 x y = (\ x -> x) y + foo6 :: a -> b -> a + foo6 a b = (\ x -> \ _ -> x) a b + foo7 :: a -> b -> b + foo7 x y = (\ (_, b) -> b) (x, y) + foo8 :: Foo a b -> a + foo8 x = (\ (Foo a _) -> a) x + + data Foo a b = Foo a b |] + ======> + foo0 :: a -> b -> a + foo0 = \ x y -> x + foo1 :: a -> b -> a + foo1 x = \ _ -> x + foo2 :: a -> b -> a + foo2 x y = (\ _ -> x) y + foo3 :: a -> a + foo3 x = (\ y -> y) x + foo4 :: a -> b -> c -> a + foo4 x y z = (\ _ _ -> x) y z + foo5 :: a -> b -> b + foo5 x y = (\ x -> x) y + foo6 :: a -> b -> a + foo6 a b = (\ x -> \ _ -> x) a b + foo7 :: a -> b -> b + foo7 x y = (\ (_, b) -> b) (x, y) + data Foo a b = Foo a b + foo8 :: Foo a b -> a + foo8 x = (\ (Foo a _) -> a) x + type FooSym0 :: forall a b. (~>) a ((~>) b (Foo a b)) + data FooSym0 :: (~>) a ((~>) b (Foo a b)) + where + FooSym0KindInference :: SameKind (Apply FooSym0 arg) (FooSym1 arg) => + FooSym0 a0123456789876543210 + type instance Apply FooSym0 a0123456789876543210 = FooSym1 a0123456789876543210 + instance SuppressUnusedWarnings FooSym0 where + suppressUnusedWarnings = snd ((,) FooSym0KindInference ()) + type FooSym1 :: forall a b. a -> (~>) b (Foo a b) + data FooSym1 (a0123456789876543210 :: a) :: (~>) b (Foo a b) + where + FooSym1KindInference :: SameKind (Apply (FooSym1 a0123456789876543210) arg) (FooSym2 a0123456789876543210 arg) => + FooSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (FooSym1 a0123456789876543210) a0123456789876543210 = Foo a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (FooSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) FooSym1KindInference ()) + type FooSym2 :: forall a b. a -> b -> Foo a b + type family FooSym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: Foo a b where + FooSym2 a0123456789876543210 a0123456789876543210 = Foo a0123456789876543210 a0123456789876543210 + type family Case_0123456789876543210 arg_0123456789876543210 x t where + Case_0123456789876543210 arg_0123456789876543210 x (Foo a _) = a + type family Lambda_0123456789876543210 x arg_0123456789876543210 where + Lambda_0123456789876543210 x arg_0123456789876543210 = Case_0123456789876543210 arg_0123456789876543210 x arg_0123456789876543210 + data Lambda_0123456789876543210Sym0 x0123456789876543210 + where + Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) => + Lambda_0123456789876543210Sym0 x0123456789876543210 + type instance Apply Lambda_0123456789876543210Sym0 x0123456789876543210 = Lambda_0123456789876543210Sym1 x0123456789876543210 + instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym0KindInference ()) + data Lambda_0123456789876543210Sym1 x0123456789876543210 arg_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) arg) (Lambda_0123456789876543210Sym2 x0123456789876543210 arg) => + Lambda_0123456789876543210Sym1 x0123456789876543210 arg_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 arg_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 x0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym1KindInference ()) + type family Lambda_0123456789876543210Sym2 x0123456789876543210 arg_01234567898765432100123456789876543210 where + Lambda_0123456789876543210Sym2 x0123456789876543210 arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 arg_01234567898765432100123456789876543210 + type family Case_0123456789876543210 arg_0123456789876543210 x y t where + Case_0123456789876543210 arg_0123456789876543210 x y '(_, b) = b + type family Lambda_0123456789876543210 x y arg_0123456789876543210 where + Lambda_0123456789876543210 x y arg_0123456789876543210 = Case_0123456789876543210 arg_0123456789876543210 x y arg_0123456789876543210 + data Lambda_0123456789876543210Sym0 x0123456789876543210 + where + Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) => + Lambda_0123456789876543210Sym0 x0123456789876543210 + type instance Apply Lambda_0123456789876543210Sym0 x0123456789876543210 = Lambda_0123456789876543210Sym1 x0123456789876543210 + instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym0KindInference ()) + data Lambda_0123456789876543210Sym1 x0123456789876543210 y0123456789876543210 + where + Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) arg) (Lambda_0123456789876543210Sym2 x0123456789876543210 arg) => + Lambda_0123456789876543210Sym1 x0123456789876543210 y0123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) y0123456789876543210 = Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 x0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym1KindInference ()) + data Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210 arg_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210) arg) (Lambda_0123456789876543210Sym3 x0123456789876543210 y0123456789876543210 arg) => + Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210 arg_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210) arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 y0123456789876543210 arg_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym2KindInference ()) + type family Lambda_0123456789876543210Sym3 x0123456789876543210 y0123456789876543210 arg_01234567898765432100123456789876543210 where + Lambda_0123456789876543210Sym3 x0123456789876543210 y0123456789876543210 arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 y0123456789876543210 arg_01234567898765432100123456789876543210 + type family Case_0123456789876543210 arg_0123456789876543210 x a b t where + Case_0123456789876543210 arg_0123456789876543210 x a b _ = x + type family Lambda_0123456789876543210 x a b arg_0123456789876543210 where + Lambda_0123456789876543210 x a b arg_0123456789876543210 = Case_0123456789876543210 arg_0123456789876543210 x a b arg_0123456789876543210 + data Lambda_0123456789876543210Sym0 x0123456789876543210 + where + Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) => + Lambda_0123456789876543210Sym0 x0123456789876543210 + type instance Apply Lambda_0123456789876543210Sym0 x0123456789876543210 = Lambda_0123456789876543210Sym1 x0123456789876543210 + instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym0KindInference ()) + data Lambda_0123456789876543210Sym1 x0123456789876543210 a0123456789876543210 + where + Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) arg) (Lambda_0123456789876543210Sym2 x0123456789876543210 arg) => + Lambda_0123456789876543210Sym1 x0123456789876543210 a0123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) a0123456789876543210 = Lambda_0123456789876543210Sym2 x0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 x0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym1KindInference ()) + data Lambda_0123456789876543210Sym2 x0123456789876543210 a0123456789876543210 b0123456789876543210 + where + Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 x0123456789876543210 a0123456789876543210) arg) (Lambda_0123456789876543210Sym3 x0123456789876543210 a0123456789876543210 arg) => + Lambda_0123456789876543210Sym2 x0123456789876543210 a0123456789876543210 b0123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym2 x0123456789876543210 a0123456789876543210) b0123456789876543210 = Lambda_0123456789876543210Sym3 x0123456789876543210 a0123456789876543210 b0123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 x0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym2KindInference ()) + data Lambda_0123456789876543210Sym3 x0123456789876543210 a0123456789876543210 b0123456789876543210 arg_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym3KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym3 x0123456789876543210 a0123456789876543210 b0123456789876543210) arg) (Lambda_0123456789876543210Sym4 x0123456789876543210 a0123456789876543210 b0123456789876543210 arg) => + Lambda_0123456789876543210Sym3 x0123456789876543210 a0123456789876543210 b0123456789876543210 arg_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym3 x0123456789876543210 a0123456789876543210 b0123456789876543210) arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 a0123456789876543210 b0123456789876543210 arg_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym3 x0123456789876543210 a0123456789876543210 b0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym3KindInference ()) + type family Lambda_0123456789876543210Sym4 x0123456789876543210 a0123456789876543210 b0123456789876543210 arg_01234567898765432100123456789876543210 where + Lambda_0123456789876543210Sym4 x0123456789876543210 a0123456789876543210 b0123456789876543210 arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 a0123456789876543210 b0123456789876543210 arg_01234567898765432100123456789876543210 + type family Lambda_0123456789876543210 a b x where + Lambda_0123456789876543210 a b x = Apply (Apply (Apply Lambda_0123456789876543210Sym0 x) a) b + data Lambda_0123456789876543210Sym0 a0123456789876543210 + where + Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) => + Lambda_0123456789876543210Sym0 a0123456789876543210 + type instance Apply Lambda_0123456789876543210Sym0 a0123456789876543210 = Lambda_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym0KindInference ()) + data Lambda_0123456789876543210Sym1 a0123456789876543210 b0123456789876543210 + where + Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 a0123456789876543210) arg) (Lambda_0123456789876543210Sym2 a0123456789876543210 arg) => + Lambda_0123456789876543210Sym1 a0123456789876543210 b0123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym1 a0123456789876543210) b0123456789876543210 = Lambda_0123456789876543210Sym2 a0123456789876543210 b0123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym1KindInference ()) + data Lambda_0123456789876543210Sym2 a0123456789876543210 b0123456789876543210 x0123456789876543210 + where + Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 a0123456789876543210 b0123456789876543210) arg) (Lambda_0123456789876543210Sym3 a0123456789876543210 b0123456789876543210 arg) => + Lambda_0123456789876543210Sym2 a0123456789876543210 b0123456789876543210 x0123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym2 a0123456789876543210 b0123456789876543210) x0123456789876543210 = Lambda_0123456789876543210 a0123456789876543210 b0123456789876543210 x0123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 a0123456789876543210 b0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym2KindInference ()) + type family Lambda_0123456789876543210Sym3 a0123456789876543210 b0123456789876543210 x0123456789876543210 where + Lambda_0123456789876543210Sym3 a0123456789876543210 b0123456789876543210 x0123456789876543210 = Lambda_0123456789876543210 a0123456789876543210 b0123456789876543210 x0123456789876543210 + type family Lambda_0123456789876543210 x y x where + Lambda_0123456789876543210 x y x = x + data Lambda_0123456789876543210Sym0 x0123456789876543210 + where + Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) => + Lambda_0123456789876543210Sym0 x0123456789876543210 + type instance Apply Lambda_0123456789876543210Sym0 x0123456789876543210 = Lambda_0123456789876543210Sym1 x0123456789876543210 + instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym0KindInference ()) + data Lambda_0123456789876543210Sym1 x0123456789876543210 y0123456789876543210 + where + Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) arg) (Lambda_0123456789876543210Sym2 x0123456789876543210 arg) => + Lambda_0123456789876543210Sym1 x0123456789876543210 y0123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) y0123456789876543210 = Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 x0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym1KindInference ()) + data Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210 x0123456789876543210 + where + Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210) arg) (Lambda_0123456789876543210Sym3 x0123456789876543210 y0123456789876543210 arg) => + Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210 x0123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210) x0123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 y0123456789876543210 x0123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym2KindInference ()) + type family Lambda_0123456789876543210Sym3 x0123456789876543210 y0123456789876543210 x0123456789876543210 where + Lambda_0123456789876543210Sym3 x0123456789876543210 y0123456789876543210 x0123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 y0123456789876543210 x0123456789876543210 + type family Case_0123456789876543210 arg_0123456789876543210 arg_0123456789876543210 x y z t where + Case_0123456789876543210 arg_0123456789876543210 arg_0123456789876543210 x y z '(_, + _) = x + type family Lambda_0123456789876543210 x y z arg_0123456789876543210 arg_0123456789876543210 where + Lambda_0123456789876543210 x y z arg_0123456789876543210 arg_0123456789876543210 = Case_0123456789876543210 arg_0123456789876543210 arg_0123456789876543210 x y z (Apply (Apply Tuple2Sym0 arg_0123456789876543210) arg_0123456789876543210) + data Lambda_0123456789876543210Sym0 x0123456789876543210 + where + Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) => + Lambda_0123456789876543210Sym0 x0123456789876543210 + type instance Apply Lambda_0123456789876543210Sym0 x0123456789876543210 = Lambda_0123456789876543210Sym1 x0123456789876543210 + instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym0KindInference ()) + data Lambda_0123456789876543210Sym1 x0123456789876543210 y0123456789876543210 + where + Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) arg) (Lambda_0123456789876543210Sym2 x0123456789876543210 arg) => + Lambda_0123456789876543210Sym1 x0123456789876543210 y0123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) y0123456789876543210 = Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 x0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym1KindInference ()) + data Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210 z0123456789876543210 + where + Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210) arg) (Lambda_0123456789876543210Sym3 x0123456789876543210 y0123456789876543210 arg) => + Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210 z0123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210) z0123456789876543210 = Lambda_0123456789876543210Sym3 x0123456789876543210 y0123456789876543210 z0123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym2KindInference ()) + data Lambda_0123456789876543210Sym3 x0123456789876543210 y0123456789876543210 z0123456789876543210 arg_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym3KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym3 x0123456789876543210 y0123456789876543210 z0123456789876543210) arg) (Lambda_0123456789876543210Sym4 x0123456789876543210 y0123456789876543210 z0123456789876543210 arg) => + Lambda_0123456789876543210Sym3 x0123456789876543210 y0123456789876543210 z0123456789876543210 arg_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym3 x0123456789876543210 y0123456789876543210 z0123456789876543210) arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym4 x0123456789876543210 y0123456789876543210 z0123456789876543210 arg_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym3 x0123456789876543210 y0123456789876543210 z0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym3KindInference ()) + data Lambda_0123456789876543210Sym4 x0123456789876543210 y0123456789876543210 z0123456789876543210 arg_01234567898765432100123456789876543210 arg_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym4KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym4 x0123456789876543210 y0123456789876543210 z0123456789876543210 arg_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym5 x0123456789876543210 y0123456789876543210 z0123456789876543210 arg_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym4 x0123456789876543210 y0123456789876543210 z0123456789876543210 arg_01234567898765432100123456789876543210 arg_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym4 x0123456789876543210 y0123456789876543210 z0123456789876543210 arg_01234567898765432100123456789876543210) arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 y0123456789876543210 z0123456789876543210 arg_01234567898765432100123456789876543210 arg_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym4 x0123456789876543210 y0123456789876543210 z0123456789876543210 arg_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym4KindInference ()) + type family Lambda_0123456789876543210Sym5 x0123456789876543210 y0123456789876543210 z0123456789876543210 arg_01234567898765432100123456789876543210 arg_01234567898765432100123456789876543210 where + Lambda_0123456789876543210Sym5 x0123456789876543210 y0123456789876543210 z0123456789876543210 arg_01234567898765432100123456789876543210 arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 y0123456789876543210 z0123456789876543210 arg_01234567898765432100123456789876543210 arg_01234567898765432100123456789876543210 + type family Lambda_0123456789876543210 x y where + Lambda_0123456789876543210 x y = y + data Lambda_0123456789876543210Sym0 x0123456789876543210 + where + Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) => + Lambda_0123456789876543210Sym0 x0123456789876543210 + type instance Apply Lambda_0123456789876543210Sym0 x0123456789876543210 = Lambda_0123456789876543210Sym1 x0123456789876543210 + instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym0KindInference ()) + data Lambda_0123456789876543210Sym1 x0123456789876543210 y0123456789876543210 + where + Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) arg) (Lambda_0123456789876543210Sym2 x0123456789876543210 arg) => + Lambda_0123456789876543210Sym1 x0123456789876543210 y0123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) y0123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 y0123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 x0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym1KindInference ()) + type family Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210 where + Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 y0123456789876543210 + type family Case_0123456789876543210 arg_0123456789876543210 x y t where + Case_0123456789876543210 arg_0123456789876543210 x y _ = x + type family Lambda_0123456789876543210 x y arg_0123456789876543210 where + Lambda_0123456789876543210 x y arg_0123456789876543210 = Case_0123456789876543210 arg_0123456789876543210 x y arg_0123456789876543210 + data Lambda_0123456789876543210Sym0 x0123456789876543210 + where + Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) => + Lambda_0123456789876543210Sym0 x0123456789876543210 + type instance Apply Lambda_0123456789876543210Sym0 x0123456789876543210 = Lambda_0123456789876543210Sym1 x0123456789876543210 + instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym0KindInference ()) + data Lambda_0123456789876543210Sym1 x0123456789876543210 y0123456789876543210 + where + Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) arg) (Lambda_0123456789876543210Sym2 x0123456789876543210 arg) => + Lambda_0123456789876543210Sym1 x0123456789876543210 y0123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) y0123456789876543210 = Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 x0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym1KindInference ()) + data Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210 arg_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210) arg) (Lambda_0123456789876543210Sym3 x0123456789876543210 y0123456789876543210 arg) => + Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210 arg_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210) arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 y0123456789876543210 arg_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym2KindInference ()) + type family Lambda_0123456789876543210Sym3 x0123456789876543210 y0123456789876543210 arg_01234567898765432100123456789876543210 where + Lambda_0123456789876543210Sym3 x0123456789876543210 y0123456789876543210 arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 y0123456789876543210 arg_01234567898765432100123456789876543210 + type family Case_0123456789876543210 arg_0123456789876543210 x a_0123456789876543210 t where + Case_0123456789876543210 arg_0123456789876543210 x a_0123456789876543210 _ = x + type family Lambda_0123456789876543210 x a_0123456789876543210 arg_0123456789876543210 where + Lambda_0123456789876543210 x a_0123456789876543210 arg_0123456789876543210 = Case_0123456789876543210 arg_0123456789876543210 x a_0123456789876543210 arg_0123456789876543210 + data Lambda_0123456789876543210Sym0 x0123456789876543210 + where + Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) => + Lambda_0123456789876543210Sym0 x0123456789876543210 + type instance Apply Lambda_0123456789876543210Sym0 x0123456789876543210 = Lambda_0123456789876543210Sym1 x0123456789876543210 + instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym0KindInference ()) + data Lambda_0123456789876543210Sym1 x0123456789876543210 a_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) arg) (Lambda_0123456789876543210Sym2 x0123456789876543210 arg) => + Lambda_0123456789876543210Sym1 x0123456789876543210 a_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym2 x0123456789876543210 a_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 x0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym1KindInference ()) + data Lambda_0123456789876543210Sym2 x0123456789876543210 a_01234567898765432100123456789876543210 arg_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 x0123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym3 x0123456789876543210 a_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym2 x0123456789876543210 a_01234567898765432100123456789876543210 arg_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym2 x0123456789876543210 a_01234567898765432100123456789876543210) arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 a_01234567898765432100123456789876543210 arg_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 x0123456789876543210 a_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym2KindInference ()) + type family Lambda_0123456789876543210Sym3 x0123456789876543210 a_01234567898765432100123456789876543210 arg_01234567898765432100123456789876543210 where + Lambda_0123456789876543210Sym3 x0123456789876543210 a_01234567898765432100123456789876543210 arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 a_01234567898765432100123456789876543210 arg_01234567898765432100123456789876543210 + type family Lambda_0123456789876543210 a_0123456789876543210 a_0123456789876543210 x y where + Lambda_0123456789876543210 a_0123456789876543210 a_0123456789876543210 x y = x + data Lambda_0123456789876543210Sym0 a_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) => + Lambda_0123456789876543210Sym0 a_01234567898765432100123456789876543210 + type instance Apply Lambda_0123456789876543210Sym0 a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym0KindInference ()) + data Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym1KindInference ()) + data Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 x0123456789876543210 + where + Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym3 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 x0123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) x0123456789876543210 = Lambda_0123456789876543210Sym3 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 x0123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym2KindInference ()) + data Lambda_0123456789876543210Sym3 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 x0123456789876543210 y0123456789876543210 + where + Lambda_0123456789876543210Sym3KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym3 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 x0123456789876543210) arg) (Lambda_0123456789876543210Sym4 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 x0123456789876543210 arg) => + Lambda_0123456789876543210Sym3 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 x0123456789876543210 y0123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym3 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 x0123456789876543210) y0123456789876543210 = Lambda_0123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 x0123456789876543210 y0123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym3 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 x0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym3KindInference ()) + type family Lambda_0123456789876543210Sym4 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 x0123456789876543210 y0123456789876543210 where + Lambda_0123456789876543210Sym4 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 x0123456789876543210 y0123456789876543210 = Lambda_0123456789876543210 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 x0123456789876543210 y0123456789876543210 + type Foo8Sym0 :: (~>) (Foo a b) a + data Foo8Sym0 :: (~>) (Foo a b) a + where + Foo8Sym0KindInference :: SameKind (Apply Foo8Sym0 arg) (Foo8Sym1 arg) => + Foo8Sym0 a0123456789876543210 + type instance Apply Foo8Sym0 a0123456789876543210 = Foo8 a0123456789876543210 + instance SuppressUnusedWarnings Foo8Sym0 where + suppressUnusedWarnings = snd ((,) Foo8Sym0KindInference ()) + type Foo8Sym1 :: Foo a b -> a + type family Foo8Sym1 (a0123456789876543210 :: Foo a b) :: a where + Foo8Sym1 a0123456789876543210 = Foo8 a0123456789876543210 + type Foo7Sym0 :: (~>) a ((~>) b b) + data Foo7Sym0 :: (~>) a ((~>) b b) + where + Foo7Sym0KindInference :: SameKind (Apply Foo7Sym0 arg) (Foo7Sym1 arg) => + Foo7Sym0 a0123456789876543210 + type instance Apply Foo7Sym0 a0123456789876543210 = Foo7Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Foo7Sym0 where + suppressUnusedWarnings = snd ((,) Foo7Sym0KindInference ()) + type Foo7Sym1 :: a -> (~>) b b + data Foo7Sym1 (a0123456789876543210 :: a) :: (~>) b b + where + Foo7Sym1KindInference :: SameKind (Apply (Foo7Sym1 a0123456789876543210) arg) (Foo7Sym2 a0123456789876543210 arg) => + Foo7Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (Foo7Sym1 a0123456789876543210) a0123456789876543210 = Foo7 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Foo7Sym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) Foo7Sym1KindInference ()) + type Foo7Sym2 :: a -> b -> b + type family Foo7Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: b where + Foo7Sym2 a0123456789876543210 a0123456789876543210 = Foo7 a0123456789876543210 a0123456789876543210 + type Foo6Sym0 :: (~>) a ((~>) b a) + data Foo6Sym0 :: (~>) a ((~>) b a) + where + Foo6Sym0KindInference :: SameKind (Apply Foo6Sym0 arg) (Foo6Sym1 arg) => + Foo6Sym0 a0123456789876543210 + type instance Apply Foo6Sym0 a0123456789876543210 = Foo6Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Foo6Sym0 where + suppressUnusedWarnings = snd ((,) Foo6Sym0KindInference ()) + type Foo6Sym1 :: a -> (~>) b a + data Foo6Sym1 (a0123456789876543210 :: a) :: (~>) b a + where + Foo6Sym1KindInference :: SameKind (Apply (Foo6Sym1 a0123456789876543210) arg) (Foo6Sym2 a0123456789876543210 arg) => + Foo6Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (Foo6Sym1 a0123456789876543210) a0123456789876543210 = Foo6 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Foo6Sym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) Foo6Sym1KindInference ()) + type Foo6Sym2 :: a -> b -> a + type family Foo6Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: a where + Foo6Sym2 a0123456789876543210 a0123456789876543210 = Foo6 a0123456789876543210 a0123456789876543210 + type Foo5Sym0 :: (~>) a ((~>) b b) + data Foo5Sym0 :: (~>) a ((~>) b b) + where + Foo5Sym0KindInference :: SameKind (Apply Foo5Sym0 arg) (Foo5Sym1 arg) => + Foo5Sym0 a0123456789876543210 + type instance Apply Foo5Sym0 a0123456789876543210 = Foo5Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Foo5Sym0 where + suppressUnusedWarnings = snd ((,) Foo5Sym0KindInference ()) + type Foo5Sym1 :: a -> (~>) b b + data Foo5Sym1 (a0123456789876543210 :: a) :: (~>) b b + where + Foo5Sym1KindInference :: SameKind (Apply (Foo5Sym1 a0123456789876543210) arg) (Foo5Sym2 a0123456789876543210 arg) => + Foo5Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (Foo5Sym1 a0123456789876543210) a0123456789876543210 = Foo5 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Foo5Sym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) Foo5Sym1KindInference ()) + type Foo5Sym2 :: a -> b -> b + type family Foo5Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: b where + Foo5Sym2 a0123456789876543210 a0123456789876543210 = Foo5 a0123456789876543210 a0123456789876543210 + type Foo4Sym0 :: (~>) a ((~>) b ((~>) c a)) + data Foo4Sym0 :: (~>) a ((~>) b ((~>) c a)) + where + Foo4Sym0KindInference :: SameKind (Apply Foo4Sym0 arg) (Foo4Sym1 arg) => + Foo4Sym0 a0123456789876543210 + type instance Apply Foo4Sym0 a0123456789876543210 = Foo4Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Foo4Sym0 where + suppressUnusedWarnings = snd ((,) Foo4Sym0KindInference ()) + type Foo4Sym1 :: a -> (~>) b ((~>) c a) + data Foo4Sym1 (a0123456789876543210 :: a) :: (~>) b ((~>) c a) + where + Foo4Sym1KindInference :: SameKind (Apply (Foo4Sym1 a0123456789876543210) arg) (Foo4Sym2 a0123456789876543210 arg) => + Foo4Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (Foo4Sym1 a0123456789876543210) a0123456789876543210 = Foo4Sym2 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Foo4Sym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) Foo4Sym1KindInference ()) + type Foo4Sym2 :: a -> b -> (~>) c a + data Foo4Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: (~>) c a + where + Foo4Sym2KindInference :: SameKind (Apply (Foo4Sym2 a0123456789876543210 a0123456789876543210) arg) (Foo4Sym3 a0123456789876543210 a0123456789876543210 arg) => + Foo4Sym2 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply (Foo4Sym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = Foo4 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Foo4Sym2 a0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) Foo4Sym2KindInference ()) + type Foo4Sym3 :: a -> b -> c -> a + type family Foo4Sym3 (a0123456789876543210 :: a) (a0123456789876543210 :: b) (a0123456789876543210 :: c) :: a where + Foo4Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = Foo4 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type Foo3Sym0 :: (~>) a a + data Foo3Sym0 :: (~>) a a + where + Foo3Sym0KindInference :: SameKind (Apply Foo3Sym0 arg) (Foo3Sym1 arg) => + Foo3Sym0 a0123456789876543210 + type instance Apply Foo3Sym0 a0123456789876543210 = Foo3 a0123456789876543210 + instance SuppressUnusedWarnings Foo3Sym0 where + suppressUnusedWarnings = snd ((,) Foo3Sym0KindInference ()) + type Foo3Sym1 :: a -> a + type family Foo3Sym1 (a0123456789876543210 :: a) :: a where + Foo3Sym1 a0123456789876543210 = Foo3 a0123456789876543210 + type Foo2Sym0 :: (~>) a ((~>) b a) + data Foo2Sym0 :: (~>) a ((~>) b a) + where + Foo2Sym0KindInference :: SameKind (Apply Foo2Sym0 arg) (Foo2Sym1 arg) => + Foo2Sym0 a0123456789876543210 + type instance Apply Foo2Sym0 a0123456789876543210 = Foo2Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Foo2Sym0 where + suppressUnusedWarnings = snd ((,) Foo2Sym0KindInference ()) + type Foo2Sym1 :: a -> (~>) b a + data Foo2Sym1 (a0123456789876543210 :: a) :: (~>) b a + where + Foo2Sym1KindInference :: SameKind (Apply (Foo2Sym1 a0123456789876543210) arg) (Foo2Sym2 a0123456789876543210 arg) => + Foo2Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (Foo2Sym1 a0123456789876543210) a0123456789876543210 = Foo2 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Foo2Sym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) Foo2Sym1KindInference ()) + type Foo2Sym2 :: a -> b -> a + type family Foo2Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: a where + Foo2Sym2 a0123456789876543210 a0123456789876543210 = Foo2 a0123456789876543210 a0123456789876543210 + type Foo1Sym0 :: (~>) a ((~>) b a) + data Foo1Sym0 :: (~>) a ((~>) b a) + where + Foo1Sym0KindInference :: SameKind (Apply Foo1Sym0 arg) (Foo1Sym1 arg) => + Foo1Sym0 a0123456789876543210 + type instance Apply Foo1Sym0 a0123456789876543210 = Foo1Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Foo1Sym0 where + suppressUnusedWarnings = snd ((,) Foo1Sym0KindInference ()) + type Foo1Sym1 :: a -> (~>) b a + data Foo1Sym1 (a0123456789876543210 :: a) :: (~>) b a + where + Foo1Sym1KindInference :: SameKind (Apply (Foo1Sym1 a0123456789876543210) arg) (Foo1Sym2 a0123456789876543210 arg) => + Foo1Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (Foo1Sym1 a0123456789876543210) a0123456789876543210 = Foo1 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Foo1Sym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) Foo1Sym1KindInference ()) + type Foo1Sym2 :: a -> b -> a + type family Foo1Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: a where + Foo1Sym2 a0123456789876543210 a0123456789876543210 = Foo1 a0123456789876543210 a0123456789876543210 + type Foo0Sym0 :: (~>) a ((~>) b a) + data Foo0Sym0 :: (~>) a ((~>) b a) + where + Foo0Sym0KindInference :: SameKind (Apply Foo0Sym0 arg) (Foo0Sym1 arg) => + Foo0Sym0 a0123456789876543210 + type instance Apply Foo0Sym0 a0123456789876543210 = Foo0Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Foo0Sym0 where + suppressUnusedWarnings = snd ((,) Foo0Sym0KindInference ()) + type Foo0Sym1 :: a -> (~>) b a + data Foo0Sym1 (a0123456789876543210 :: a) :: (~>) b a + where + Foo0Sym1KindInference :: SameKind (Apply (Foo0Sym1 a0123456789876543210) arg) (Foo0Sym2 a0123456789876543210 arg) => + Foo0Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (Foo0Sym1 a0123456789876543210) a0123456789876543210 = Foo0 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Foo0Sym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) Foo0Sym1KindInference ()) + type Foo0Sym2 :: a -> b -> a + type family Foo0Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: a where + Foo0Sym2 a0123456789876543210 a0123456789876543210 = Foo0 a0123456789876543210 a0123456789876543210 + type Foo8 :: Foo a b -> a + type family Foo8 (a :: Foo a b) :: a where + Foo8 x = Apply (Apply Lambda_0123456789876543210Sym0 x) x + type Foo7 :: a -> b -> b + type family Foo7 (a :: a) (a :: b) :: b where + Foo7 x y = Apply (Apply (Apply Lambda_0123456789876543210Sym0 x) y) (Apply (Apply Tuple2Sym0 x) y) + type Foo6 :: a -> b -> a + type family Foo6 (a :: a) (a :: b) :: a where + Foo6 a b = Apply (Apply (Apply (Apply Lambda_0123456789876543210Sym0 a) b) a) b + type Foo5 :: a -> b -> b + type family Foo5 (a :: a) (a :: b) :: b where + Foo5 x y = Apply (Apply (Apply Lambda_0123456789876543210Sym0 x) y) y + type Foo4 :: a -> b -> c -> a + type family Foo4 (a :: a) (a :: b) (a :: c) :: a where + Foo4 x y z = Apply (Apply (Apply (Apply (Apply Lambda_0123456789876543210Sym0 x) y) z) y) z + type Foo3 :: a -> a + type family Foo3 (a :: a) :: a where + Foo3 x = Apply (Apply Lambda_0123456789876543210Sym0 x) x + type Foo2 :: a -> b -> a + type family Foo2 (a :: a) (a :: b) :: a where + Foo2 x y = Apply (Apply (Apply Lambda_0123456789876543210Sym0 x) y) y + type Foo1 :: a -> b -> a + type family Foo1 (a :: a) (a :: b) :: a where + Foo1 x a_0123456789876543210 = Apply (Apply (Apply Lambda_0123456789876543210Sym0 x) a_0123456789876543210) a_0123456789876543210 + type Foo0 :: a -> b -> a + type family Foo0 (a :: a) (a :: b) :: a where + Foo0 a_0123456789876543210 a_0123456789876543210 = Apply (Apply (Apply (Apply Lambda_0123456789876543210Sym0 a_0123456789876543210) a_0123456789876543210) a_0123456789876543210) a_0123456789876543210 + sFoo8 :: + (forall (t :: Foo a b). + Sing t -> Sing (Apply Foo8Sym0 t :: a) :: Type) + sFoo7 :: + (forall (t :: a) (t :: b). + Sing t -> Sing t -> Sing (Apply (Apply Foo7Sym0 t) t :: b) :: Type) + sFoo6 :: + (forall (t :: a) (t :: b). + Sing t -> Sing t -> Sing (Apply (Apply Foo6Sym0 t) t :: a) :: Type) + sFoo5 :: + (forall (t :: a) (t :: b). + Sing t -> Sing t -> Sing (Apply (Apply Foo5Sym0 t) t :: b) :: Type) + sFoo4 :: + (forall (t :: a) (t :: b) (t :: c). + Sing t + -> Sing t + -> Sing t + -> Sing (Apply (Apply (Apply Foo4Sym0 t) t) t :: a) :: Type) + sFoo3 :: + (forall (t :: a). Sing t -> Sing (Apply Foo3Sym0 t :: a) :: Type) + sFoo2 :: + (forall (t :: a) (t :: b). + Sing t -> Sing t -> Sing (Apply (Apply Foo2Sym0 t) t :: a) :: Type) + sFoo1 :: + (forall (t :: a) (t :: b). + Sing t -> Sing t -> Sing (Apply (Apply Foo1Sym0 t) t :: a) :: Type) + sFoo0 :: + (forall (t :: a) (t :: b). + Sing t -> Sing t -> Sing (Apply (Apply Foo0Sym0 t) t :: a) :: Type) + sFoo8 (sX :: Sing x) + = applySing + (singFun1 + @(Apply Lambda_0123456789876543210Sym0 x) + (\ sArg_0123456789876543210 + -> case sArg_0123456789876543210 of + (_ :: Sing arg_0123456789876543210) + -> id + @(Sing (Case_0123456789876543210 arg_0123456789876543210 x arg_0123456789876543210)) + (case sArg_0123456789876543210 of SFoo (sA :: Sing a) _ -> sA))) + sX + sFoo7 (sX :: Sing x) (sY :: Sing y) + = applySing + (singFun1 + @(Apply (Apply Lambda_0123456789876543210Sym0 x) y) + (\ sArg_0123456789876543210 + -> case sArg_0123456789876543210 of + (_ :: Sing arg_0123456789876543210) + -> id + @(Sing (Case_0123456789876543210 arg_0123456789876543210 x y arg_0123456789876543210)) + (case sArg_0123456789876543210 of STuple2 _ (sB :: Sing b) -> sB))) + (applySing (applySing (singFun2 @Tuple2Sym0 STuple2) sX) sY) + sFoo6 (sA :: Sing a) (sB :: Sing b) + = applySing + (applySing + (singFun1 + @(Apply (Apply Lambda_0123456789876543210Sym0 a) b) + (\ sX + -> case sX of + (_ :: Sing x) + -> singFun1 + @(Apply (Apply (Apply Lambda_0123456789876543210Sym0 x) a) b) + (\ sArg_0123456789876543210 + -> case sArg_0123456789876543210 of + (_ :: Sing arg_0123456789876543210) + -> id + @(Sing (Case_0123456789876543210 arg_0123456789876543210 x a b arg_0123456789876543210)) + (case sArg_0123456789876543210 of _ -> sX)))) + sA) + sB + sFoo5 (sX :: Sing x) (sY :: Sing y) + = applySing + (singFun1 + @(Apply (Apply Lambda_0123456789876543210Sym0 x) y) + (\ sX -> case sX of (_ :: Sing x) -> sX)) + sY + sFoo4 (sX :: Sing x) (sY :: Sing y) (sZ :: Sing z) + = applySing + (applySing + (singFun2 + @(Apply (Apply (Apply Lambda_0123456789876543210Sym0 x) y) z) + (\ sArg_0123456789876543210 sArg_0123456789876543210 + -> case (,) sArg_0123456789876543210 sArg_0123456789876543210 of + (,) (_ :: Sing arg_0123456789876543210) + (_ :: Sing arg_0123456789876543210) + -> id + @(Sing (Case_0123456789876543210 arg_0123456789876543210 arg_0123456789876543210 x y z (Apply (Apply Tuple2Sym0 arg_0123456789876543210) arg_0123456789876543210))) + (case + applySing + (applySing + (singFun2 @Tuple2Sym0 STuple2) sArg_0123456789876543210) + sArg_0123456789876543210 + of + STuple2 _ _ -> sX))) + sY) + sZ + sFoo3 (sX :: Sing x) + = applySing + (singFun1 + @(Apply Lambda_0123456789876543210Sym0 x) + (\ sY -> case sY of (_ :: Sing y) -> sY)) + sX + sFoo2 (sX :: Sing x) (sY :: Sing y) + = applySing + (singFun1 + @(Apply (Apply Lambda_0123456789876543210Sym0 x) y) + (\ sArg_0123456789876543210 + -> case sArg_0123456789876543210 of + (_ :: Sing arg_0123456789876543210) + -> id + @(Sing (Case_0123456789876543210 arg_0123456789876543210 x y arg_0123456789876543210)) + (case sArg_0123456789876543210 of _ -> sX))) + sY + sFoo1 + (sX :: Sing x) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (singFun1 + @(Apply (Apply Lambda_0123456789876543210Sym0 x) a_0123456789876543210) + (\ sArg_0123456789876543210 + -> case sArg_0123456789876543210 of + (_ :: Sing arg_0123456789876543210) + -> id + @(Sing (Case_0123456789876543210 arg_0123456789876543210 x a_0123456789876543210 arg_0123456789876543210)) + (case sArg_0123456789876543210 of _ -> sX))) + sA_0123456789876543210 + sFoo0 + (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (singFun2 + @(Apply (Apply Lambda_0123456789876543210Sym0 a_0123456789876543210) a_0123456789876543210) + (\ sX sY + -> case (,) sX sY of (,) (_ :: Sing x) (_ :: Sing y) -> sX)) + sA_0123456789876543210) + sA_0123456789876543210 + instance SingI (Foo8Sym0 :: (~>) (Foo a b) a) where + sing = singFun1 @Foo8Sym0 sFoo8 + instance SingI (Foo7Sym0 :: (~>) a ((~>) b b)) where + sing = singFun2 @Foo7Sym0 sFoo7 + instance SingI d => SingI (Foo7Sym1 (d :: a) :: (~>) b b) where + sing = singFun1 @(Foo7Sym1 (d :: a)) (sFoo7 (sing @d)) + instance SingI1 (Foo7Sym1 :: a -> (~>) b b) where + liftSing (s :: Sing (d :: a)) + = singFun1 @(Foo7Sym1 (d :: a)) (sFoo7 s) + instance SingI (Foo6Sym0 :: (~>) a ((~>) b a)) where + sing = singFun2 @Foo6Sym0 sFoo6 + instance SingI d => SingI (Foo6Sym1 (d :: a) :: (~>) b a) where + sing = singFun1 @(Foo6Sym1 (d :: a)) (sFoo6 (sing @d)) + instance SingI1 (Foo6Sym1 :: a -> (~>) b a) where + liftSing (s :: Sing (d :: a)) + = singFun1 @(Foo6Sym1 (d :: a)) (sFoo6 s) + instance SingI (Foo5Sym0 :: (~>) a ((~>) b b)) where + sing = singFun2 @Foo5Sym0 sFoo5 + instance SingI d => SingI (Foo5Sym1 (d :: a) :: (~>) b b) where + sing = singFun1 @(Foo5Sym1 (d :: a)) (sFoo5 (sing @d)) + instance SingI1 (Foo5Sym1 :: a -> (~>) b b) where + liftSing (s :: Sing (d :: a)) + = singFun1 @(Foo5Sym1 (d :: a)) (sFoo5 s) + instance SingI (Foo4Sym0 :: (~>) a ((~>) b ((~>) c a))) where + sing = singFun3 @Foo4Sym0 sFoo4 + instance SingI d => + SingI (Foo4Sym1 (d :: a) :: (~>) b ((~>) c a)) where + sing = singFun2 @(Foo4Sym1 (d :: a)) (sFoo4 (sing @d)) + instance SingI1 (Foo4Sym1 :: a -> (~>) b ((~>) c a)) where + liftSing (s :: Sing (d :: a)) + = singFun2 @(Foo4Sym1 (d :: a)) (sFoo4 s) + instance (SingI d, SingI d) => + SingI (Foo4Sym2 (d :: a) (d :: b) :: (~>) c a) where + sing + = singFun1 + @(Foo4Sym2 (d :: a) (d :: b)) (sFoo4 (sing @d) (sing @d)) + instance SingI d => + SingI1 (Foo4Sym2 (d :: a) :: b -> (~>) c a) where + liftSing (s :: Sing (d :: b)) + = singFun1 @(Foo4Sym2 (d :: a) (d :: b)) (sFoo4 (sing @d) s) + instance SingI2 (Foo4Sym2 :: a -> b -> (~>) c a) where + liftSing2 (s :: Sing (d :: a)) (s :: Sing (d :: b)) + = singFun1 @(Foo4Sym2 (d :: a) (d :: b)) (sFoo4 s s) + instance SingI (Foo3Sym0 :: (~>) a a) where + sing = singFun1 @Foo3Sym0 sFoo3 + instance SingI (Foo2Sym0 :: (~>) a ((~>) b a)) where + sing = singFun2 @Foo2Sym0 sFoo2 + instance SingI d => SingI (Foo2Sym1 (d :: a) :: (~>) b a) where + sing = singFun1 @(Foo2Sym1 (d :: a)) (sFoo2 (sing @d)) + instance SingI1 (Foo2Sym1 :: a -> (~>) b a) where + liftSing (s :: Sing (d :: a)) + = singFun1 @(Foo2Sym1 (d :: a)) (sFoo2 s) + instance SingI (Foo1Sym0 :: (~>) a ((~>) b a)) where + sing = singFun2 @Foo1Sym0 sFoo1 + instance SingI d => SingI (Foo1Sym1 (d :: a) :: (~>) b a) where + sing = singFun1 @(Foo1Sym1 (d :: a)) (sFoo1 (sing @d)) + instance SingI1 (Foo1Sym1 :: a -> (~>) b a) where + liftSing (s :: Sing (d :: a)) + = singFun1 @(Foo1Sym1 (d :: a)) (sFoo1 s) + instance SingI (Foo0Sym0 :: (~>) a ((~>) b a)) where + sing = singFun2 @Foo0Sym0 sFoo0 + instance SingI d => SingI (Foo0Sym1 (d :: a) :: (~>) b a) where + sing = singFun1 @(Foo0Sym1 (d :: a)) (sFoo0 (sing @d)) + instance SingI1 (Foo0Sym1 :: a -> (~>) b a) where + liftSing (s :: Sing (d :: a)) + = singFun1 @(Foo0Sym1 (d :: a)) (sFoo0 s) + data SFoo :: forall a b. Foo a b -> Type + where + SFoo :: forall a b (n :: a) (n :: b). + (Sing n) -> (Sing n) -> SFoo (Foo n n :: Foo a b) + type instance Sing @(Foo a b) = SFoo + instance (SingKind a, SingKind b) => SingKind (Foo a b) where + type Demote (Foo a b) = Foo (Demote a) (Demote b) + fromSing (SFoo b b) = Foo (fromSing b) (fromSing b) + toSing (Foo (b :: Demote a) (b :: Demote b)) + = case (,) (toSing b :: SomeSing a) (toSing b :: SomeSing b) of + (,) (SomeSing c) (SomeSing c) -> SomeSing (SFoo c c) + instance (SingI n, SingI n) => SingI (Foo (n :: a) (n :: b)) where + sing = SFoo sing sing + instance SingI n => SingI1 (Foo (n :: a)) where + liftSing = SFoo sing + instance SingI2 Foo where + liftSing2 = SFoo + instance SingI (FooSym0 :: (~>) a ((~>) b (Foo a b))) where + sing = singFun2 @FooSym0 SFoo + instance SingI d => + SingI (FooSym1 (d :: a) :: (~>) b (Foo a b)) where + sing = singFun1 @(FooSym1 (d :: a)) (SFoo (sing @d)) + instance SingI1 (FooSym1 :: a -> (~>) b (Foo a b)) where + liftSing (s :: Sing (d :: a)) + = singFun1 @(FooSym1 (d :: a)) (SFoo s)
tests/compile-and-dump/Singletons/Lambdas.hs view
@@ -1,92 +1,92 @@-{-# OPTIONS_GHC -Wno-unused-matches -Wno-name-shadowing #-}---- We expect unused binds and name shadowing in foo5 test.-module Singletons.Lambdas where--import Data.Proxy-import Data.Singletons.Base.TH--$(singletons [d|- -- nothing in scope- foo0 :: a -> b -> a- foo0 = (\x y -> x)-- -- eta-reduced function- foo1 :: a -> b -> a- foo1 x = (\_ -> x)-- -- same as before, but without eta-reduction- foo2 :: a -> b -> a- foo2 x y = (\_ -> x) y-- foo3 :: a -> a- foo3 x = (\y -> y) x-- -- more lambda parameters + returning in-scope variable- foo4 :: a -> b -> c -> a- foo4 x y z = (\_ _ -> x) y z-- -- name shadowing- -- Note: due to -dsuppress-uniques output of this test does not really- -- prove that the result is correct. Compiling this file manually and- -- examining dumped splise of relevant Lamdba reveals that indeed that Lambda- -- returns its last parameter (ie. y passed in a call) rather than the- -- first one (ie. x that is shadowed by the binder in a lambda).- foo5 :: a -> b -> b- foo5 x y = (\x -> x) y-- -- nested lambdas- foo6 :: a -> b -> a- foo6 a b = (\x -> \_ -> x) a b-- -- tuple patterns- foo7 :: a -> b -> b- foo7 x y = (\(_, b) -> b) (x, y)-- -- constructor patters=ns- data Foo a b = Foo a b- foo8 :: Foo a b -> a- foo8 x = (\(Foo a _) -> a) x- |])--foo1a :: Proxy (Foo1 Int Char)-foo1a = Proxy--foo1b :: Proxy Int-foo1b = foo1a--foo2a :: Proxy (Foo2 Int Char)-foo2a = Proxy--foo2b :: Proxy Int-foo2b = foo2a--foo3a :: Proxy (Foo3 Int)-foo3a = Proxy--foo3b :: Proxy Int-foo3b = foo3a--foo4a :: Proxy (Foo4 Int Char Bool)-foo4a = Proxy--foo4b :: Proxy Int-foo4b = foo4a--foo5a :: Proxy (Foo5 Int Bool)-foo5a = Proxy--foo5b :: Proxy Bool-foo5b = foo5a--foo6a :: Proxy (Foo6 Int Char)-foo6a = Proxy--foo6b :: Proxy Int-foo6b = foo6a--foo7a :: Proxy (Foo7 Int Char)-foo7a = Proxy--foo7b :: Proxy Char-foo7b = foo7a+{-# OPTIONS_GHC -Wno-unused-matches -Wno-name-shadowing #-} + +-- We expect unused binds and name shadowing in foo5 test. +module Singletons.Lambdas where + +import Data.Proxy +import Data.Singletons.Base.TH + +$(singletons [d| + -- nothing in scope + foo0 :: a -> b -> a + foo0 = (\x y -> x) + + -- eta-reduced function + foo1 :: a -> b -> a + foo1 x = (\_ -> x) + + -- same as before, but without eta-reduction + foo2 :: a -> b -> a + foo2 x y = (\_ -> x) y + + foo3 :: a -> a + foo3 x = (\y -> y) x + + -- more lambda parameters + returning in-scope variable + foo4 :: a -> b -> c -> a + foo4 x y z = (\_ _ -> x) y z + + -- name shadowing + -- Note: due to -dsuppress-uniques output of this test does not really + -- prove that the result is correct. Compiling this file manually and + -- examining dumped splise of relevant Lamdba reveals that indeed that Lambda + -- returns its last parameter (ie. y passed in a call) rather than the + -- first one (ie. x that is shadowed by the binder in a lambda). + foo5 :: a -> b -> b + foo5 x y = (\x -> x) y + + -- nested lambdas + foo6 :: a -> b -> a + foo6 a b = (\x -> \_ -> x) a b + + -- tuple patterns + foo7 :: a -> b -> b + foo7 x y = (\(_, b) -> b) (x, y) + + -- constructor patters=ns + data Foo a b = Foo a b + foo8 :: Foo a b -> a + foo8 x = (\(Foo a _) -> a) x + |]) + +foo1a :: Proxy (Foo1 Int Char) +foo1a = Proxy + +foo1b :: Proxy Int +foo1b = foo1a + +foo2a :: Proxy (Foo2 Int Char) +foo2a = Proxy + +foo2b :: Proxy Int +foo2b = foo2a + +foo3a :: Proxy (Foo3 Int) +foo3a = Proxy + +foo3b :: Proxy Int +foo3b = foo3a + +foo4a :: Proxy (Foo4 Int Char Bool) +foo4a = Proxy + +foo4b :: Proxy Int +foo4b = foo4a + +foo5a :: Proxy (Foo5 Int Bool) +foo5a = Proxy + +foo5b :: Proxy Bool +foo5b = foo5a + +foo6a :: Proxy (Foo6 Int Char) +foo6a = Proxy + +foo6b :: Proxy Int +foo6b = foo6a + +foo7a :: Proxy (Foo7 Int Char) +foo7a = Proxy + +foo7b :: Proxy Char +foo7b = foo7a
tests/compile-and-dump/Singletons/LambdasComprehensive.golden view
@@ -1,76 +1,84 @@-Singletons/LambdasComprehensive.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| foo :: [Nat]- foo- = map (\ x -> either_ pred Succ x) [Left Zero, Right (Succ Zero)]- bar :: [Nat]- bar = map (either_ pred Succ) [Left Zero, Right (Succ Zero)] |]- ======>- foo :: [Nat]- foo- = (map (\ x -> ((either_ pred) Succ) x))- [Left Zero, Right (Succ Zero)]- bar :: [Nat]- bar = (map ((either_ pred) Succ)) [Left Zero, Right (Succ Zero)]- type family Lambda_0123456789876543210 x where- Lambda_0123456789876543210 x = Apply (Apply (Apply Either_Sym0 PredSym0) SuccSym0) x- data Lambda_0123456789876543210Sym0 x0123456789876543210- where- Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) =>- Lambda_0123456789876543210Sym0 x0123456789876543210- type instance Apply Lambda_0123456789876543210Sym0 x0123456789876543210 = Lambda_0123456789876543210 x0123456789876543210- instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym0KindInference) ())- type family Lambda_0123456789876543210Sym1 x0123456789876543210 where- Lambda_0123456789876543210Sym1 x0123456789876543210 = Lambda_0123456789876543210 x0123456789876543210- type BarSym0 :: [Nat]- type family BarSym0 :: [Nat] where- BarSym0 = Bar- type FooSym0 :: [Nat]- type family FooSym0 :: [Nat] where- FooSym0 = Foo- type Bar :: [Nat]- type family Bar :: [Nat] where- Bar = Apply (Apply MapSym0 (Apply (Apply Either_Sym0 PredSym0) SuccSym0)) (Apply (Apply (:@#@$) (Apply LeftSym0 ZeroSym0)) (Apply (Apply (:@#@$) (Apply RightSym0 (Apply SuccSym0 ZeroSym0))) NilSym0))- type Foo :: [Nat]- type family Foo :: [Nat] where- Foo = Apply (Apply MapSym0 Lambda_0123456789876543210Sym0) (Apply (Apply (:@#@$) (Apply LeftSym0 ZeroSym0)) (Apply (Apply (:@#@$) (Apply RightSym0 (Apply SuccSym0 ZeroSym0))) NilSym0))- sBar :: Sing (BarSym0 :: [Nat])- sFoo :: Sing (FooSym0 :: [Nat])- sBar- = (applySing- ((applySing ((singFun2 @MapSym0) sMap))- ((applySing- ((applySing ((singFun3 @Either_Sym0) sEither_))- ((singFun1 @PredSym0) sPred)))- ((singFun1 @SuccSym0) SSucc))))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing ((singFun1 @LeftSym0) SLeft)) SZero)))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing ((singFun1 @RightSym0) SRight))- ((applySing ((singFun1 @SuccSym0) SSucc)) SZero))))- SNil))- sFoo- = (applySing- ((applySing ((singFun2 @MapSym0) sMap))- ((singFun1 @Lambda_0123456789876543210Sym0)- (\ sX- -> case sX of- (_ :: Sing x)- -> (applySing- ((applySing- ((applySing ((singFun3 @Either_Sym0) sEither_))- ((singFun1 @PredSym0) sPred)))- ((singFun1 @SuccSym0) SSucc)))- sX))))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing ((singFun1 @LeftSym0) SLeft)) SZero)))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing ((singFun1 @RightSym0) SRight))- ((applySing ((singFun1 @SuccSym0) SSucc)) SZero))))- SNil))+Singletons/LambdasComprehensive.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| foo :: [Nat] + foo + = map (\ x -> either_ pred Succ x) [Left Zero, Right (Succ Zero)] + bar :: [Nat] + bar = map (either_ pred Succ) [Left Zero, Right (Succ Zero)] |] + ======> + foo :: [Nat] + foo + = map (\ x -> either_ pred Succ x) [Left Zero, Right (Succ Zero)] + bar :: [Nat] + bar = map (either_ pred Succ) [Left Zero, Right (Succ Zero)] + type family Lambda_0123456789876543210 x where + Lambda_0123456789876543210 x = Apply (Apply (Apply Either_Sym0 PredSym0) SuccSym0) x + data Lambda_0123456789876543210Sym0 x0123456789876543210 + where + Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) => + Lambda_0123456789876543210Sym0 x0123456789876543210 + type instance Apply Lambda_0123456789876543210Sym0 x0123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 + instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym0KindInference ()) + type family Lambda_0123456789876543210Sym1 x0123456789876543210 where + Lambda_0123456789876543210Sym1 x0123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 + type BarSym0 :: [Nat] + type family BarSym0 :: [Nat] where + BarSym0 = Bar + type FooSym0 :: [Nat] + type family FooSym0 :: [Nat] where + FooSym0 = Foo + type Bar :: [Nat] + type family Bar :: [Nat] where + Bar = Apply (Apply MapSym0 (Apply (Apply Either_Sym0 PredSym0) SuccSym0)) (Apply (Apply (:@#@$) (Apply LeftSym0 ZeroSym0)) (Apply (Apply (:@#@$) (Apply RightSym0 (Apply SuccSym0 ZeroSym0))) NilSym0)) + type Foo :: [Nat] + type family Foo :: [Nat] where + Foo = Apply (Apply MapSym0 Lambda_0123456789876543210Sym0) (Apply (Apply (:@#@$) (Apply LeftSym0 ZeroSym0)) (Apply (Apply (:@#@$) (Apply RightSym0 (Apply SuccSym0 ZeroSym0))) NilSym0)) + sBar :: (Sing (BarSym0 :: [Nat]) :: Type) + sFoo :: (Sing (FooSym0 :: [Nat]) :: Type) + sBar + = applySing + (applySing + (singFun2 @MapSym0 sMap) + (applySing + (applySing + (singFun3 @Either_Sym0 sEither_) (singFun1 @PredSym0 sPred)) + (singFun1 @SuccSym0 SSucc))) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing (singFun1 @LeftSym0 SLeft) SZero)) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing + (singFun1 @RightSym0 SRight) + (applySing (singFun1 @SuccSym0 SSucc) SZero))) + SNil)) + sFoo + = applySing + (applySing + (singFun2 @MapSym0 sMap) + (singFun1 + @Lambda_0123456789876543210Sym0 + (\ sX + -> case sX of + (_ :: Sing x) + -> applySing + (applySing + (applySing + (singFun3 @Either_Sym0 sEither_) (singFun1 @PredSym0 sPred)) + (singFun1 @SuccSym0 SSucc)) + sX))) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing (singFun1 @LeftSym0 SLeft) SZero)) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing + (singFun1 @RightSym0 SRight) + (applySing (singFun1 @SuccSym0 SSucc) SZero))) + SNil))
tests/compile-and-dump/Singletons/LambdasComprehensive.hs view
@@ -1,27 +1,27 @@-module Singletons.LambdasComprehensive where--import Data.Singletons.TH-import Prelude hiding (pred)-import Prelude.Singletons-import Singletons.Nat--$(singletons [d|- foo :: [Nat]- foo = map (\x -> either_ pred Succ x) [Left Zero, Right (Succ Zero)]-- -- this is the same as above except that it does not use lambdas- bar :: [Nat]- bar = map (either_ pred Succ) [Left Zero, Right (Succ Zero)]- |])--fooTest1a :: Proxy Foo-fooTest1a = Proxy--fooTest1b :: Proxy [Zero, Succ (Succ Zero)]-fooTest1b = fooTest1a--barTest1a :: Proxy Bar-barTest1a = Proxy--barTest1b :: Proxy [Zero, Succ (Succ Zero)]-barTest1b = barTest1a+module Singletons.LambdasComprehensive where + +import Data.Singletons.TH +import Prelude hiding (pred) +import Prelude.Singletons +import Singletons.Nat + +$(singletons [d| + foo :: [Nat] + foo = map (\x -> either_ pred Succ x) [Left Zero, Right (Succ Zero)] + + -- this is the same as above except that it does not use lambdas + bar :: [Nat] + bar = map (either_ pred Succ) [Left Zero, Right (Succ Zero)] + |]) + +fooTest1a :: Proxy Foo +fooTest1a = Proxy + +fooTest1b :: Proxy [Zero, Succ (Succ Zero)] +fooTest1b = fooTest1a + +barTest1a :: Proxy Bar +barTest1a = Proxy + +barTest1b :: Proxy [Zero, Succ (Succ Zero)] +barTest1b = barTest1a
tests/compile-and-dump/Singletons/LetStatements.golden view
@@ -1,981 +1,1003 @@-Singletons/LetStatements.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| foo1 :: Nat -> Nat- foo1 x- = let- y :: Nat- y = Succ Zero- in y- foo2 :: Nat- foo2- = let- y = Succ Zero- z = Succ y- in z- foo3 :: Nat -> Nat- foo3 x- = let- y :: Nat- y = Succ x- in y- foo4 :: Nat -> Nat- foo4 x- = let- f :: Nat -> Nat- f y = Succ y- in f x- foo5 :: Nat -> Nat- foo5 x- = let- f :: Nat -> Nat- f y- = let- z :: Nat- z = Succ y- in Succ z- in f x- foo6 :: Nat -> Nat- foo6 x- = let- f :: Nat -> Nat- f y = Succ y in- let- z :: Nat- z = f x- in z- foo7 :: Nat -> Nat- foo7 x- = let- x :: Nat- x = Zero- in x- foo8 :: Nat -> Nat- foo8 x- = let- z :: Nat- z = (\ x -> x) Zero- in z- foo9 :: Nat -> Nat- foo9 x- = let- z :: Nat -> Nat- z = (\ x -> x)- in z x- foo10 :: Nat -> Nat- foo10 x- = let- (+) :: Nat -> Nat -> Nat- Zero + m = m- (Succ n) + m = Succ (n + m)- in (Succ Zero) + x- foo11 :: Nat -> Nat- foo11 x- = let- (+) :: Nat -> Nat -> Nat- Zero + m = m- (Succ n) + m = Succ (n + m)- z :: Nat- z = x- in (Succ Zero) + z- foo12 :: Nat -> Nat- foo12 x- = let- (+) :: Nat -> Nat -> Nat- Zero + m = m- (Succ n) + m = Succ (n + x)- in x + (Succ (Succ Zero))- foo13 :: forall a. a -> a- foo13 x- = let- bar :: a- bar = x- in foo13_ bar- foo13_ :: a -> a- foo13_ y = y- foo14 :: Nat -> (Nat, Nat)- foo14 x = let (y, z) = (Succ x, x) in (z, y) |]- ======>- foo1 :: Nat -> Nat- foo1 x- = let- y :: Nat- y = Succ Zero- in y- foo2 :: Nat- foo2- = let- y = Succ Zero- z = Succ y- in z- foo3 :: Nat -> Nat- foo3 x- = let- y :: Nat- y = Succ x- in y- foo4 :: Nat -> Nat- foo4 x- = let- f :: Nat -> Nat- f y = Succ y- in f x- foo5 :: Nat -> Nat- foo5 x- = let- f :: Nat -> Nat- f y- = let- z :: Nat- z = Succ y- in Succ z- in f x- foo6 :: Nat -> Nat- foo6 x- = let- f :: Nat -> Nat- f y = Succ y in- let- z :: Nat- z = f x- in z- foo7 :: Nat -> Nat- foo7 x- = let- x :: Nat- x = Zero- in x- foo8 :: Nat -> Nat- foo8 x- = let- z :: Nat- z = (\ x -> x) Zero- in z- foo9 :: Nat -> Nat- foo9 x- = let- z :: Nat -> Nat- z = \ x -> x- in z x- foo10 :: Nat -> Nat- foo10 x- = let- (+) :: Nat -> Nat -> Nat- (+) Zero m = m- (+) (Succ n) m = Succ (n + m)- in (Succ Zero + x)- foo11 :: Nat -> Nat- foo11 x- = let- (+) :: Nat -> Nat -> Nat- z :: Nat- (+) Zero m = m- (+) (Succ n) m = Succ (n + m)- z = x- in (Succ Zero + z)- foo12 :: Nat -> Nat- foo12 x- = let- (+) :: Nat -> Nat -> Nat- (+) Zero m = m- (+) (Succ n) m = Succ (n + x)- in (x + Succ (Succ Zero))- foo13 :: forall a. a -> a- foo13 x- = let- bar :: a- bar = x- in foo13_ bar- foo13_ :: a -> a- foo13_ y = y- foo14 :: Nat -> (Nat, Nat)- foo14 x = let (y, z) = (Succ x, x) in (z, y)- type family Case_0123456789876543210 x t where- Case_0123456789876543210 x '(_,- y_0123456789876543210) = y_0123456789876543210- type family Case_0123456789876543210 x t where- Case_0123456789876543210 x '(y_0123456789876543210,- _) = y_0123456789876543210- data Let0123456789876543210ZSym0 x0123456789876543210- where- Let0123456789876543210ZSym0KindInference :: SameKind (Apply Let0123456789876543210ZSym0 arg) (Let0123456789876543210ZSym1 arg) =>- Let0123456789876543210ZSym0 x0123456789876543210- type instance Apply Let0123456789876543210ZSym0 x0123456789876543210 = Let0123456789876543210Z x0123456789876543210- instance SuppressUnusedWarnings Let0123456789876543210ZSym0 where- suppressUnusedWarnings- = snd (((,) Let0123456789876543210ZSym0KindInference) ())- type family Let0123456789876543210ZSym1 x0123456789876543210 where- Let0123456789876543210ZSym1 x0123456789876543210 = Let0123456789876543210Z x0123456789876543210- data Let0123456789876543210YSym0 x0123456789876543210- where- Let0123456789876543210YSym0KindInference :: SameKind (Apply Let0123456789876543210YSym0 arg) (Let0123456789876543210YSym1 arg) =>- Let0123456789876543210YSym0 x0123456789876543210- type instance Apply Let0123456789876543210YSym0 x0123456789876543210 = Let0123456789876543210Y x0123456789876543210- instance SuppressUnusedWarnings Let0123456789876543210YSym0 where- suppressUnusedWarnings- = snd (((,) Let0123456789876543210YSym0KindInference) ())- type family Let0123456789876543210YSym1 x0123456789876543210 where- Let0123456789876543210YSym1 x0123456789876543210 = Let0123456789876543210Y x0123456789876543210- data Let0123456789876543210X_0123456789876543210Sym0 x0123456789876543210- where- Let0123456789876543210X_0123456789876543210Sym0KindInference :: SameKind (Apply Let0123456789876543210X_0123456789876543210Sym0 arg) (Let0123456789876543210X_0123456789876543210Sym1 arg) =>- Let0123456789876543210X_0123456789876543210Sym0 x0123456789876543210- type instance Apply Let0123456789876543210X_0123456789876543210Sym0 x0123456789876543210 = Let0123456789876543210X_0123456789876543210 x0123456789876543210- instance SuppressUnusedWarnings Let0123456789876543210X_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd- (((,) Let0123456789876543210X_0123456789876543210Sym0KindInference)- ())- type family Let0123456789876543210X_0123456789876543210Sym1 x0123456789876543210 where- Let0123456789876543210X_0123456789876543210Sym1 x0123456789876543210 = Let0123456789876543210X_0123456789876543210 x0123456789876543210- type family Let0123456789876543210Z x where- Let0123456789876543210Z x = Case_0123456789876543210 x (Let0123456789876543210X_0123456789876543210Sym1 x)- type family Let0123456789876543210Y x where- Let0123456789876543210Y x = Case_0123456789876543210 x (Let0123456789876543210X_0123456789876543210Sym1 x)- type family Let0123456789876543210X_0123456789876543210 x where- Let0123456789876543210X_0123456789876543210 x = Apply (Apply Tuple2Sym0 (Apply SuccSym0 x)) x- data Let0123456789876543210BarSym0 x0123456789876543210- where- Let0123456789876543210BarSym0KindInference :: SameKind (Apply Let0123456789876543210BarSym0 arg) (Let0123456789876543210BarSym1 arg) =>- Let0123456789876543210BarSym0 x0123456789876543210- type instance Apply Let0123456789876543210BarSym0 x0123456789876543210 = Let0123456789876543210Bar x0123456789876543210- instance SuppressUnusedWarnings Let0123456789876543210BarSym0 where- suppressUnusedWarnings- = snd (((,) Let0123456789876543210BarSym0KindInference) ())- type family Let0123456789876543210BarSym1 x0123456789876543210 :: a0123456789876543210 where- Let0123456789876543210BarSym1 x0123456789876543210 = Let0123456789876543210Bar x0123456789876543210- type family Let0123456789876543210Bar x :: a where- Let0123456789876543210Bar x = x- data (<<<%%%%%%%%%%%%%%%%%%%%@#@$) x0123456789876543210- where- (:<<<%%%%%%%%%%%%%%%%%%%%@#@$###) :: SameKind (Apply (<<<%%%%%%%%%%%%%%%%%%%%@#@$) arg) ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) arg) =>- (<<<%%%%%%%%%%%%%%%%%%%%@#@$) x0123456789876543210- type instance Apply (<<<%%%%%%%%%%%%%%%%%%%%@#@$) x0123456789876543210 = (<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x0123456789876543210- instance SuppressUnusedWarnings (<<<%%%%%%%%%%%%%%%%%%%%@#@$) where- suppressUnusedWarnings- = snd (((,) (:<<<%%%%%%%%%%%%%%%%%%%%@#@$###)) ())- data (<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x0123456789876543210 :: (~>) Nat ((~>) Nat Nat)- where- (:<<<%%%%%%%%%%%%%%%%%%%%@#@$$###) :: SameKind (Apply ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x0123456789876543210) arg) ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$$) x0123456789876543210 arg) =>- (<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x0123456789876543210 a0123456789876543210- type instance Apply ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x0123456789876543210) a0123456789876543210 = (<<<%%%%%%%%%%%%%%%%%%%%@#@$$$) x0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x0123456789876543210) where- suppressUnusedWarnings- = snd (((,) (:<<<%%%%%%%%%%%%%%%%%%%%@#@$$###)) ())- data (<<<%%%%%%%%%%%%%%%%%%%%@#@$$$) x0123456789876543210 (a0123456789876543210 :: Nat) :: (~>) Nat Nat- where- (:<<<%%%%%%%%%%%%%%%%%%%%@#@$$$###) :: SameKind (Apply ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$$) x0123456789876543210 a0123456789876543210) arg) ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$$$) x0123456789876543210 a0123456789876543210 arg) =>- (<<<%%%%%%%%%%%%%%%%%%%%@#@$$$) x0123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$$) x0123456789876543210 a0123456789876543210) a0123456789876543210 = (<<<%%%%%%%%%%%%%%%%%%%%) x0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$$) x0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) (:<<<%%%%%%%%%%%%%%%%%%%%@#@$$$###)) ())- type family (<<<%%%%%%%%%%%%%%%%%%%%@#@$$$$) x0123456789876543210 (a0123456789876543210 :: Nat) (a0123456789876543210 :: Nat) :: Nat where- (<<<%%%%%%%%%%%%%%%%%%%%@#@$$$$) x0123456789876543210 a0123456789876543210 a0123456789876543210 = (<<<%%%%%%%%%%%%%%%%%%%%) x0123456789876543210 a0123456789876543210 a0123456789876543210- type family (<<<%%%%%%%%%%%%%%%%%%%%) x (a :: Nat) (a :: Nat) :: Nat where- (<<<%%%%%%%%%%%%%%%%%%%%) x 'Zero m = m- (<<<%%%%%%%%%%%%%%%%%%%%) x ('Succ n) m = Apply SuccSym0 (Apply (Apply ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x) n) x)- data Let0123456789876543210ZSym0 x0123456789876543210- where- Let0123456789876543210ZSym0KindInference :: SameKind (Apply Let0123456789876543210ZSym0 arg) (Let0123456789876543210ZSym1 arg) =>- Let0123456789876543210ZSym0 x0123456789876543210- type instance Apply Let0123456789876543210ZSym0 x0123456789876543210 = Let0123456789876543210Z x0123456789876543210- instance SuppressUnusedWarnings Let0123456789876543210ZSym0 where- suppressUnusedWarnings- = snd (((,) Let0123456789876543210ZSym0KindInference) ())- type family Let0123456789876543210ZSym1 x0123456789876543210 :: Nat where- Let0123456789876543210ZSym1 x0123456789876543210 = Let0123456789876543210Z x0123456789876543210- data (<<<%%%%%%%%%%%%%%%%%%%%@#@$) x0123456789876543210- where- (:<<<%%%%%%%%%%%%%%%%%%%%@#@$###) :: SameKind (Apply (<<<%%%%%%%%%%%%%%%%%%%%@#@$) arg) ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) arg) =>- (<<<%%%%%%%%%%%%%%%%%%%%@#@$) x0123456789876543210- type instance Apply (<<<%%%%%%%%%%%%%%%%%%%%@#@$) x0123456789876543210 = (<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x0123456789876543210- instance SuppressUnusedWarnings (<<<%%%%%%%%%%%%%%%%%%%%@#@$) where- suppressUnusedWarnings- = snd (((,) (:<<<%%%%%%%%%%%%%%%%%%%%@#@$###)) ())- data (<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x0123456789876543210 :: (~>) Nat ((~>) Nat Nat)- where- (:<<<%%%%%%%%%%%%%%%%%%%%@#@$$###) :: SameKind (Apply ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x0123456789876543210) arg) ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$$) x0123456789876543210 arg) =>- (<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x0123456789876543210 a0123456789876543210- type instance Apply ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x0123456789876543210) a0123456789876543210 = (<<<%%%%%%%%%%%%%%%%%%%%@#@$$$) x0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x0123456789876543210) where- suppressUnusedWarnings- = snd (((,) (:<<<%%%%%%%%%%%%%%%%%%%%@#@$$###)) ())- data (<<<%%%%%%%%%%%%%%%%%%%%@#@$$$) x0123456789876543210 (a0123456789876543210 :: Nat) :: (~>) Nat Nat- where- (:<<<%%%%%%%%%%%%%%%%%%%%@#@$$$###) :: SameKind (Apply ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$$) x0123456789876543210 a0123456789876543210) arg) ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$$$) x0123456789876543210 a0123456789876543210 arg) =>- (<<<%%%%%%%%%%%%%%%%%%%%@#@$$$) x0123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$$) x0123456789876543210 a0123456789876543210) a0123456789876543210 = (<<<%%%%%%%%%%%%%%%%%%%%) x0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$$) x0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) (:<<<%%%%%%%%%%%%%%%%%%%%@#@$$$###)) ())- type family (<<<%%%%%%%%%%%%%%%%%%%%@#@$$$$) x0123456789876543210 (a0123456789876543210 :: Nat) (a0123456789876543210 :: Nat) :: Nat where- (<<<%%%%%%%%%%%%%%%%%%%%@#@$$$$) x0123456789876543210 a0123456789876543210 a0123456789876543210 = (<<<%%%%%%%%%%%%%%%%%%%%) x0123456789876543210 a0123456789876543210 a0123456789876543210- type family Let0123456789876543210Z x :: Nat where- Let0123456789876543210Z x = x- type family (<<<%%%%%%%%%%%%%%%%%%%%) x (a :: Nat) (a :: Nat) :: Nat where- (<<<%%%%%%%%%%%%%%%%%%%%) x 'Zero m = m- (<<<%%%%%%%%%%%%%%%%%%%%) x ('Succ n) m = Apply SuccSym0 (Apply (Apply ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x) n) m)- data (<<<%%%%%%%%%%%%%%%%%%%%@#@$) x0123456789876543210- where- (:<<<%%%%%%%%%%%%%%%%%%%%@#@$###) :: SameKind (Apply (<<<%%%%%%%%%%%%%%%%%%%%@#@$) arg) ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) arg) =>- (<<<%%%%%%%%%%%%%%%%%%%%@#@$) x0123456789876543210- type instance Apply (<<<%%%%%%%%%%%%%%%%%%%%@#@$) x0123456789876543210 = (<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x0123456789876543210- instance SuppressUnusedWarnings (<<<%%%%%%%%%%%%%%%%%%%%@#@$) where- suppressUnusedWarnings- = snd (((,) (:<<<%%%%%%%%%%%%%%%%%%%%@#@$###)) ())- data (<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x0123456789876543210 :: (~>) Nat ((~>) Nat Nat)- where- (:<<<%%%%%%%%%%%%%%%%%%%%@#@$$###) :: SameKind (Apply ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x0123456789876543210) arg) ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$$) x0123456789876543210 arg) =>- (<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x0123456789876543210 a0123456789876543210- type instance Apply ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x0123456789876543210) a0123456789876543210 = (<<<%%%%%%%%%%%%%%%%%%%%@#@$$$) x0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x0123456789876543210) where- suppressUnusedWarnings- = snd (((,) (:<<<%%%%%%%%%%%%%%%%%%%%@#@$$###)) ())- data (<<<%%%%%%%%%%%%%%%%%%%%@#@$$$) x0123456789876543210 (a0123456789876543210 :: Nat) :: (~>) Nat Nat- where- (:<<<%%%%%%%%%%%%%%%%%%%%@#@$$$###) :: SameKind (Apply ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$$) x0123456789876543210 a0123456789876543210) arg) ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$$$) x0123456789876543210 a0123456789876543210 arg) =>- (<<<%%%%%%%%%%%%%%%%%%%%@#@$$$) x0123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$$) x0123456789876543210 a0123456789876543210) a0123456789876543210 = (<<<%%%%%%%%%%%%%%%%%%%%) x0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$$) x0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) (:<<<%%%%%%%%%%%%%%%%%%%%@#@$$$###)) ())- type family (<<<%%%%%%%%%%%%%%%%%%%%@#@$$$$) x0123456789876543210 (a0123456789876543210 :: Nat) (a0123456789876543210 :: Nat) :: Nat where- (<<<%%%%%%%%%%%%%%%%%%%%@#@$$$$) x0123456789876543210 a0123456789876543210 a0123456789876543210 = (<<<%%%%%%%%%%%%%%%%%%%%) x0123456789876543210 a0123456789876543210 a0123456789876543210- type family (<<<%%%%%%%%%%%%%%%%%%%%) x (a :: Nat) (a :: Nat) :: Nat where- (<<<%%%%%%%%%%%%%%%%%%%%) x 'Zero m = m- (<<<%%%%%%%%%%%%%%%%%%%%) x ('Succ n) m = Apply SuccSym0 (Apply (Apply ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x) n) m)- type family Lambda_0123456789876543210 a_0123456789876543210 x x where- Lambda_0123456789876543210 a_0123456789876543210 x x = x- data Lambda_0123456789876543210Sym0 a_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) =>- Lambda_0123456789876543210Sym0 a_01234567898765432100123456789876543210- type instance Apply Lambda_0123456789876543210Sym0 a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210- instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym0KindInference) ())- data Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210 x0123456789876543210- where- Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210 x0123456789876543210- type instance Apply (Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210) x0123456789876543210 = Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 x0123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym1KindInference) ())- data Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 x0123456789876543210 x0123456789876543210- where- Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 x0123456789876543210) arg) (Lambda_0123456789876543210Sym3 a_01234567898765432100123456789876543210 x0123456789876543210 arg) =>- Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 x0123456789876543210 x0123456789876543210- type instance Apply (Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 x0123456789876543210) x0123456789876543210 = Lambda_0123456789876543210 a_01234567898765432100123456789876543210 x0123456789876543210 x0123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 x0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym2KindInference) ())- type family Lambda_0123456789876543210Sym3 a_01234567898765432100123456789876543210 x0123456789876543210 x0123456789876543210 where- Lambda_0123456789876543210Sym3 a_01234567898765432100123456789876543210 x0123456789876543210 x0123456789876543210 = Lambda_0123456789876543210 a_01234567898765432100123456789876543210 x0123456789876543210 x0123456789876543210- data Let0123456789876543210ZSym0 x0123456789876543210- where- Let0123456789876543210ZSym0KindInference :: SameKind (Apply Let0123456789876543210ZSym0 arg) (Let0123456789876543210ZSym1 arg) =>- Let0123456789876543210ZSym0 x0123456789876543210- type instance Apply Let0123456789876543210ZSym0 x0123456789876543210 = Let0123456789876543210ZSym1 x0123456789876543210- instance SuppressUnusedWarnings Let0123456789876543210ZSym0 where- suppressUnusedWarnings- = snd (((,) Let0123456789876543210ZSym0KindInference) ())- data Let0123456789876543210ZSym1 x0123456789876543210 :: (~>) Nat Nat- where- Let0123456789876543210ZSym1KindInference :: SameKind (Apply (Let0123456789876543210ZSym1 x0123456789876543210) arg) (Let0123456789876543210ZSym2 x0123456789876543210 arg) =>- Let0123456789876543210ZSym1 x0123456789876543210 a0123456789876543210- type instance Apply (Let0123456789876543210ZSym1 x0123456789876543210) a0123456789876543210 = Let0123456789876543210Z x0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Let0123456789876543210ZSym1 x0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Let0123456789876543210ZSym1KindInference) ())- type family Let0123456789876543210ZSym2 x0123456789876543210 (a0123456789876543210 :: Nat) :: Nat where- Let0123456789876543210ZSym2 x0123456789876543210 a0123456789876543210 = Let0123456789876543210Z x0123456789876543210 a0123456789876543210- type family Let0123456789876543210Z x (a :: Nat) :: Nat where- Let0123456789876543210Z x a_0123456789876543210 = Apply (Apply (Apply Lambda_0123456789876543210Sym0 a_0123456789876543210) x) a_0123456789876543210- type family Lambda_0123456789876543210 x x where- Lambda_0123456789876543210 x x = x- data Lambda_0123456789876543210Sym0 x0123456789876543210- where- Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) =>- Lambda_0123456789876543210Sym0 x0123456789876543210- type instance Apply Lambda_0123456789876543210Sym0 x0123456789876543210 = Lambda_0123456789876543210Sym1 x0123456789876543210- instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym0KindInference) ())- data Lambda_0123456789876543210Sym1 x0123456789876543210 x0123456789876543210- where- Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) arg) (Lambda_0123456789876543210Sym2 x0123456789876543210 arg) =>- Lambda_0123456789876543210Sym1 x0123456789876543210 x0123456789876543210- type instance Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) x0123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 x0123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 x0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym1KindInference) ())- type family Lambda_0123456789876543210Sym2 x0123456789876543210 x0123456789876543210 where- Lambda_0123456789876543210Sym2 x0123456789876543210 x0123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 x0123456789876543210- data Let0123456789876543210ZSym0 x0123456789876543210- where- Let0123456789876543210ZSym0KindInference :: SameKind (Apply Let0123456789876543210ZSym0 arg) (Let0123456789876543210ZSym1 arg) =>- Let0123456789876543210ZSym0 x0123456789876543210- type instance Apply Let0123456789876543210ZSym0 x0123456789876543210 = Let0123456789876543210Z x0123456789876543210- instance SuppressUnusedWarnings Let0123456789876543210ZSym0 where- suppressUnusedWarnings- = snd (((,) Let0123456789876543210ZSym0KindInference) ())- type family Let0123456789876543210ZSym1 x0123456789876543210 :: Nat where- Let0123456789876543210ZSym1 x0123456789876543210 = Let0123456789876543210Z x0123456789876543210- type family Let0123456789876543210Z x :: Nat where- Let0123456789876543210Z x = Apply (Apply Lambda_0123456789876543210Sym0 x) ZeroSym0- data Let0123456789876543210XSym0 x0123456789876543210- where- Let0123456789876543210XSym0KindInference :: SameKind (Apply Let0123456789876543210XSym0 arg) (Let0123456789876543210XSym1 arg) =>- Let0123456789876543210XSym0 x0123456789876543210- type instance Apply Let0123456789876543210XSym0 x0123456789876543210 = Let0123456789876543210X x0123456789876543210- instance SuppressUnusedWarnings Let0123456789876543210XSym0 where- suppressUnusedWarnings- = snd (((,) Let0123456789876543210XSym0KindInference) ())- type family Let0123456789876543210XSym1 x0123456789876543210 :: Nat where- Let0123456789876543210XSym1 x0123456789876543210 = Let0123456789876543210X x0123456789876543210- type family Let0123456789876543210X x :: Nat where- Let0123456789876543210X x = ZeroSym0- data Let0123456789876543210FSym0 x0123456789876543210- where- Let0123456789876543210FSym0KindInference :: SameKind (Apply Let0123456789876543210FSym0 arg) (Let0123456789876543210FSym1 arg) =>- Let0123456789876543210FSym0 x0123456789876543210- type instance Apply Let0123456789876543210FSym0 x0123456789876543210 = Let0123456789876543210FSym1 x0123456789876543210- instance SuppressUnusedWarnings Let0123456789876543210FSym0 where- suppressUnusedWarnings- = snd (((,) Let0123456789876543210FSym0KindInference) ())- data Let0123456789876543210FSym1 x0123456789876543210 :: (~>) Nat Nat- where- Let0123456789876543210FSym1KindInference :: SameKind (Apply (Let0123456789876543210FSym1 x0123456789876543210) arg) (Let0123456789876543210FSym2 x0123456789876543210 arg) =>- Let0123456789876543210FSym1 x0123456789876543210 a0123456789876543210- type instance Apply (Let0123456789876543210FSym1 x0123456789876543210) a0123456789876543210 = Let0123456789876543210F x0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Let0123456789876543210FSym1 x0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Let0123456789876543210FSym1KindInference) ())- type family Let0123456789876543210FSym2 x0123456789876543210 (a0123456789876543210 :: Nat) :: Nat where- Let0123456789876543210FSym2 x0123456789876543210 a0123456789876543210 = Let0123456789876543210F x0123456789876543210 a0123456789876543210- type family Let0123456789876543210F x (a :: Nat) :: Nat where- Let0123456789876543210F x y = Apply SuccSym0 y- data Let0123456789876543210ZSym0 x0123456789876543210- where- Let0123456789876543210ZSym0KindInference :: SameKind (Apply Let0123456789876543210ZSym0 arg) (Let0123456789876543210ZSym1 arg) =>- Let0123456789876543210ZSym0 x0123456789876543210- type instance Apply Let0123456789876543210ZSym0 x0123456789876543210 = Let0123456789876543210Z x0123456789876543210- instance SuppressUnusedWarnings Let0123456789876543210ZSym0 where- suppressUnusedWarnings- = snd (((,) Let0123456789876543210ZSym0KindInference) ())- type family Let0123456789876543210ZSym1 x0123456789876543210 :: Nat where- Let0123456789876543210ZSym1 x0123456789876543210 = Let0123456789876543210Z x0123456789876543210- type family Let0123456789876543210Z x :: Nat where- Let0123456789876543210Z x = Apply (Let0123456789876543210FSym1 x) x- data Let0123456789876543210ZSym0 y0123456789876543210- where- Let0123456789876543210ZSym0KindInference :: SameKind (Apply Let0123456789876543210ZSym0 arg) (Let0123456789876543210ZSym1 arg) =>- Let0123456789876543210ZSym0 y0123456789876543210- type instance Apply Let0123456789876543210ZSym0 y0123456789876543210 = Let0123456789876543210ZSym1 y0123456789876543210- instance SuppressUnusedWarnings Let0123456789876543210ZSym0 where- suppressUnusedWarnings- = snd (((,) Let0123456789876543210ZSym0KindInference) ())- data Let0123456789876543210ZSym1 y0123456789876543210 x0123456789876543210- where- Let0123456789876543210ZSym1KindInference :: SameKind (Apply (Let0123456789876543210ZSym1 y0123456789876543210) arg) (Let0123456789876543210ZSym2 y0123456789876543210 arg) =>- Let0123456789876543210ZSym1 y0123456789876543210 x0123456789876543210- type instance Apply (Let0123456789876543210ZSym1 y0123456789876543210) x0123456789876543210 = Let0123456789876543210Z y0123456789876543210 x0123456789876543210- instance SuppressUnusedWarnings (Let0123456789876543210ZSym1 y0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Let0123456789876543210ZSym1KindInference) ())- type family Let0123456789876543210ZSym2 y0123456789876543210 x0123456789876543210 :: Nat where- Let0123456789876543210ZSym2 y0123456789876543210 x0123456789876543210 = Let0123456789876543210Z y0123456789876543210 x0123456789876543210- type family Let0123456789876543210Z y x :: Nat where- Let0123456789876543210Z y x = Apply SuccSym0 y- data Let0123456789876543210FSym0 x0123456789876543210- where- Let0123456789876543210FSym0KindInference :: SameKind (Apply Let0123456789876543210FSym0 arg) (Let0123456789876543210FSym1 arg) =>- Let0123456789876543210FSym0 x0123456789876543210- type instance Apply Let0123456789876543210FSym0 x0123456789876543210 = Let0123456789876543210FSym1 x0123456789876543210- instance SuppressUnusedWarnings Let0123456789876543210FSym0 where- suppressUnusedWarnings- = snd (((,) Let0123456789876543210FSym0KindInference) ())- data Let0123456789876543210FSym1 x0123456789876543210 :: (~>) Nat Nat- where- Let0123456789876543210FSym1KindInference :: SameKind (Apply (Let0123456789876543210FSym1 x0123456789876543210) arg) (Let0123456789876543210FSym2 x0123456789876543210 arg) =>- Let0123456789876543210FSym1 x0123456789876543210 a0123456789876543210- type instance Apply (Let0123456789876543210FSym1 x0123456789876543210) a0123456789876543210 = Let0123456789876543210F x0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Let0123456789876543210FSym1 x0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Let0123456789876543210FSym1KindInference) ())- type family Let0123456789876543210FSym2 x0123456789876543210 (a0123456789876543210 :: Nat) :: Nat where- Let0123456789876543210FSym2 x0123456789876543210 a0123456789876543210 = Let0123456789876543210F x0123456789876543210 a0123456789876543210- type family Let0123456789876543210F x (a :: Nat) :: Nat where- Let0123456789876543210F x y = Apply SuccSym0 (Let0123456789876543210ZSym2 y x)- data Let0123456789876543210FSym0 x0123456789876543210- where- Let0123456789876543210FSym0KindInference :: SameKind (Apply Let0123456789876543210FSym0 arg) (Let0123456789876543210FSym1 arg) =>- Let0123456789876543210FSym0 x0123456789876543210- type instance Apply Let0123456789876543210FSym0 x0123456789876543210 = Let0123456789876543210FSym1 x0123456789876543210- instance SuppressUnusedWarnings Let0123456789876543210FSym0 where- suppressUnusedWarnings- = snd (((,) Let0123456789876543210FSym0KindInference) ())- data Let0123456789876543210FSym1 x0123456789876543210 :: (~>) Nat Nat- where- Let0123456789876543210FSym1KindInference :: SameKind (Apply (Let0123456789876543210FSym1 x0123456789876543210) arg) (Let0123456789876543210FSym2 x0123456789876543210 arg) =>- Let0123456789876543210FSym1 x0123456789876543210 a0123456789876543210- type instance Apply (Let0123456789876543210FSym1 x0123456789876543210) a0123456789876543210 = Let0123456789876543210F x0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Let0123456789876543210FSym1 x0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Let0123456789876543210FSym1KindInference) ())- type family Let0123456789876543210FSym2 x0123456789876543210 (a0123456789876543210 :: Nat) :: Nat where- Let0123456789876543210FSym2 x0123456789876543210 a0123456789876543210 = Let0123456789876543210F x0123456789876543210 a0123456789876543210- type family Let0123456789876543210F x (a :: Nat) :: Nat where- Let0123456789876543210F x y = Apply SuccSym0 y- data Let0123456789876543210YSym0 x0123456789876543210- where- Let0123456789876543210YSym0KindInference :: SameKind (Apply Let0123456789876543210YSym0 arg) (Let0123456789876543210YSym1 arg) =>- Let0123456789876543210YSym0 x0123456789876543210- type instance Apply Let0123456789876543210YSym0 x0123456789876543210 = Let0123456789876543210Y x0123456789876543210- instance SuppressUnusedWarnings Let0123456789876543210YSym0 where- suppressUnusedWarnings- = snd (((,) Let0123456789876543210YSym0KindInference) ())- type family Let0123456789876543210YSym1 x0123456789876543210 :: Nat where- Let0123456789876543210YSym1 x0123456789876543210 = Let0123456789876543210Y x0123456789876543210- type family Let0123456789876543210Y x :: Nat where- Let0123456789876543210Y x = Apply SuccSym0 x- type family Let0123456789876543210ZSym0 where- Let0123456789876543210ZSym0 = Let0123456789876543210Z- type family Let0123456789876543210YSym0 where- Let0123456789876543210YSym0 = Let0123456789876543210Y- type family Let0123456789876543210Z where- Let0123456789876543210Z = Apply SuccSym0 Let0123456789876543210YSym0- type family Let0123456789876543210Y where- Let0123456789876543210Y = Apply SuccSym0 ZeroSym0- data Let0123456789876543210YSym0 x0123456789876543210- where- Let0123456789876543210YSym0KindInference :: SameKind (Apply Let0123456789876543210YSym0 arg) (Let0123456789876543210YSym1 arg) =>- Let0123456789876543210YSym0 x0123456789876543210- type instance Apply Let0123456789876543210YSym0 x0123456789876543210 = Let0123456789876543210Y x0123456789876543210- instance SuppressUnusedWarnings Let0123456789876543210YSym0 where- suppressUnusedWarnings- = snd (((,) Let0123456789876543210YSym0KindInference) ())- type family Let0123456789876543210YSym1 x0123456789876543210 :: Nat where- Let0123456789876543210YSym1 x0123456789876543210 = Let0123456789876543210Y x0123456789876543210- type family Let0123456789876543210Y x :: Nat where- Let0123456789876543210Y x = Apply SuccSym0 ZeroSym0- type Foo14Sym0 :: (~>) Nat (Nat, Nat)- data Foo14Sym0 :: (~>) Nat (Nat, Nat)- where- Foo14Sym0KindInference :: SameKind (Apply Foo14Sym0 arg) (Foo14Sym1 arg) =>- Foo14Sym0 a0123456789876543210- type instance Apply Foo14Sym0 a0123456789876543210 = Foo14 a0123456789876543210- instance SuppressUnusedWarnings Foo14Sym0 where- suppressUnusedWarnings = snd (((,) Foo14Sym0KindInference) ())- type Foo14Sym1 :: Nat -> (Nat, Nat)- type family Foo14Sym1 (a0123456789876543210 :: Nat) :: (Nat,- Nat) where- Foo14Sym1 a0123456789876543210 = Foo14 a0123456789876543210- type Foo13_Sym0 :: (~>) a a- data Foo13_Sym0 :: (~>) a a- where- Foo13_Sym0KindInference :: SameKind (Apply Foo13_Sym0 arg) (Foo13_Sym1 arg) =>- Foo13_Sym0 a0123456789876543210- type instance Apply Foo13_Sym0 a0123456789876543210 = Foo13_ a0123456789876543210- instance SuppressUnusedWarnings Foo13_Sym0 where- suppressUnusedWarnings = snd (((,) Foo13_Sym0KindInference) ())- type Foo13_Sym1 :: a -> a- type family Foo13_Sym1 (a0123456789876543210 :: a) :: a where- Foo13_Sym1 a0123456789876543210 = Foo13_ a0123456789876543210- type Foo13Sym0 :: forall a. (~>) a a- data Foo13Sym0 :: (~>) a a- where- Foo13Sym0KindInference :: SameKind (Apply Foo13Sym0 arg) (Foo13Sym1 arg) =>- Foo13Sym0 a0123456789876543210- type instance Apply Foo13Sym0 a0123456789876543210 = Foo13 a0123456789876543210- instance SuppressUnusedWarnings Foo13Sym0 where- suppressUnusedWarnings = snd (((,) Foo13Sym0KindInference) ())- type Foo13Sym1 :: forall a. a -> a- type family Foo13Sym1 (a0123456789876543210 :: a) :: a where- Foo13Sym1 a0123456789876543210 = Foo13 a0123456789876543210- type Foo12Sym0 :: (~>) Nat Nat- data Foo12Sym0 :: (~>) Nat Nat- where- Foo12Sym0KindInference :: SameKind (Apply Foo12Sym0 arg) (Foo12Sym1 arg) =>- Foo12Sym0 a0123456789876543210- type instance Apply Foo12Sym0 a0123456789876543210 = Foo12 a0123456789876543210- instance SuppressUnusedWarnings Foo12Sym0 where- suppressUnusedWarnings = snd (((,) Foo12Sym0KindInference) ())- type Foo12Sym1 :: Nat -> Nat- type family Foo12Sym1 (a0123456789876543210 :: Nat) :: Nat where- Foo12Sym1 a0123456789876543210 = Foo12 a0123456789876543210- type Foo11Sym0 :: (~>) Nat Nat- data Foo11Sym0 :: (~>) Nat Nat- where- Foo11Sym0KindInference :: SameKind (Apply Foo11Sym0 arg) (Foo11Sym1 arg) =>- Foo11Sym0 a0123456789876543210- type instance Apply Foo11Sym0 a0123456789876543210 = Foo11 a0123456789876543210- instance SuppressUnusedWarnings Foo11Sym0 where- suppressUnusedWarnings = snd (((,) Foo11Sym0KindInference) ())- type Foo11Sym1 :: Nat -> Nat- type family Foo11Sym1 (a0123456789876543210 :: Nat) :: Nat where- Foo11Sym1 a0123456789876543210 = Foo11 a0123456789876543210- type Foo10Sym0 :: (~>) Nat Nat- data Foo10Sym0 :: (~>) Nat Nat- where- Foo10Sym0KindInference :: SameKind (Apply Foo10Sym0 arg) (Foo10Sym1 arg) =>- Foo10Sym0 a0123456789876543210- type instance Apply Foo10Sym0 a0123456789876543210 = Foo10 a0123456789876543210- instance SuppressUnusedWarnings Foo10Sym0 where- suppressUnusedWarnings = snd (((,) Foo10Sym0KindInference) ())- type Foo10Sym1 :: Nat -> Nat- type family Foo10Sym1 (a0123456789876543210 :: Nat) :: Nat where- Foo10Sym1 a0123456789876543210 = Foo10 a0123456789876543210- type Foo9Sym0 :: (~>) Nat Nat- data Foo9Sym0 :: (~>) Nat Nat- where- Foo9Sym0KindInference :: SameKind (Apply Foo9Sym0 arg) (Foo9Sym1 arg) =>- Foo9Sym0 a0123456789876543210- type instance Apply Foo9Sym0 a0123456789876543210 = Foo9 a0123456789876543210- instance SuppressUnusedWarnings Foo9Sym0 where- suppressUnusedWarnings = snd (((,) Foo9Sym0KindInference) ())- type Foo9Sym1 :: Nat -> Nat- type family Foo9Sym1 (a0123456789876543210 :: Nat) :: Nat where- Foo9Sym1 a0123456789876543210 = Foo9 a0123456789876543210- type Foo8Sym0 :: (~>) Nat Nat- data Foo8Sym0 :: (~>) Nat Nat- where- Foo8Sym0KindInference :: SameKind (Apply Foo8Sym0 arg) (Foo8Sym1 arg) =>- Foo8Sym0 a0123456789876543210- type instance Apply Foo8Sym0 a0123456789876543210 = Foo8 a0123456789876543210- instance SuppressUnusedWarnings Foo8Sym0 where- suppressUnusedWarnings = snd (((,) Foo8Sym0KindInference) ())- type Foo8Sym1 :: Nat -> Nat- type family Foo8Sym1 (a0123456789876543210 :: Nat) :: Nat where- Foo8Sym1 a0123456789876543210 = Foo8 a0123456789876543210- type Foo7Sym0 :: (~>) Nat Nat- data Foo7Sym0 :: (~>) Nat Nat- where- Foo7Sym0KindInference :: SameKind (Apply Foo7Sym0 arg) (Foo7Sym1 arg) =>- Foo7Sym0 a0123456789876543210- type instance Apply Foo7Sym0 a0123456789876543210 = Foo7 a0123456789876543210- instance SuppressUnusedWarnings Foo7Sym0 where- suppressUnusedWarnings = snd (((,) Foo7Sym0KindInference) ())- type Foo7Sym1 :: Nat -> Nat- type family Foo7Sym1 (a0123456789876543210 :: Nat) :: Nat where- Foo7Sym1 a0123456789876543210 = Foo7 a0123456789876543210- type Foo6Sym0 :: (~>) Nat Nat- data Foo6Sym0 :: (~>) Nat Nat- where- Foo6Sym0KindInference :: SameKind (Apply Foo6Sym0 arg) (Foo6Sym1 arg) =>- Foo6Sym0 a0123456789876543210- type instance Apply Foo6Sym0 a0123456789876543210 = Foo6 a0123456789876543210- instance SuppressUnusedWarnings Foo6Sym0 where- suppressUnusedWarnings = snd (((,) Foo6Sym0KindInference) ())- type Foo6Sym1 :: Nat -> Nat- type family Foo6Sym1 (a0123456789876543210 :: Nat) :: Nat where- Foo6Sym1 a0123456789876543210 = Foo6 a0123456789876543210- type Foo5Sym0 :: (~>) Nat Nat- data Foo5Sym0 :: (~>) Nat Nat- where- Foo5Sym0KindInference :: SameKind (Apply Foo5Sym0 arg) (Foo5Sym1 arg) =>- Foo5Sym0 a0123456789876543210- type instance Apply Foo5Sym0 a0123456789876543210 = Foo5 a0123456789876543210- instance SuppressUnusedWarnings Foo5Sym0 where- suppressUnusedWarnings = snd (((,) Foo5Sym0KindInference) ())- type Foo5Sym1 :: Nat -> Nat- type family Foo5Sym1 (a0123456789876543210 :: Nat) :: Nat where- Foo5Sym1 a0123456789876543210 = Foo5 a0123456789876543210- type Foo4Sym0 :: (~>) Nat Nat- data Foo4Sym0 :: (~>) Nat Nat- where- Foo4Sym0KindInference :: SameKind (Apply Foo4Sym0 arg) (Foo4Sym1 arg) =>- Foo4Sym0 a0123456789876543210- type instance Apply Foo4Sym0 a0123456789876543210 = Foo4 a0123456789876543210- instance SuppressUnusedWarnings Foo4Sym0 where- suppressUnusedWarnings = snd (((,) Foo4Sym0KindInference) ())- type Foo4Sym1 :: Nat -> Nat- type family Foo4Sym1 (a0123456789876543210 :: Nat) :: Nat where- Foo4Sym1 a0123456789876543210 = Foo4 a0123456789876543210- type Foo3Sym0 :: (~>) Nat Nat- data Foo3Sym0 :: (~>) Nat Nat- where- Foo3Sym0KindInference :: SameKind (Apply Foo3Sym0 arg) (Foo3Sym1 arg) =>- Foo3Sym0 a0123456789876543210- type instance Apply Foo3Sym0 a0123456789876543210 = Foo3 a0123456789876543210- instance SuppressUnusedWarnings Foo3Sym0 where- suppressUnusedWarnings = snd (((,) Foo3Sym0KindInference) ())- type Foo3Sym1 :: Nat -> Nat- type family Foo3Sym1 (a0123456789876543210 :: Nat) :: Nat where- Foo3Sym1 a0123456789876543210 = Foo3 a0123456789876543210- type Foo2Sym0 :: Nat- type family Foo2Sym0 :: Nat where- Foo2Sym0 = Foo2- type Foo1Sym0 :: (~>) Nat Nat- data Foo1Sym0 :: (~>) Nat Nat- where- Foo1Sym0KindInference :: SameKind (Apply Foo1Sym0 arg) (Foo1Sym1 arg) =>- Foo1Sym0 a0123456789876543210- type instance Apply Foo1Sym0 a0123456789876543210 = Foo1 a0123456789876543210- instance SuppressUnusedWarnings Foo1Sym0 where- suppressUnusedWarnings = snd (((,) Foo1Sym0KindInference) ())- type Foo1Sym1 :: Nat -> Nat- type family Foo1Sym1 (a0123456789876543210 :: Nat) :: Nat where- Foo1Sym1 a0123456789876543210 = Foo1 a0123456789876543210- type Foo14 :: Nat -> (Nat, Nat)- type family Foo14 (a :: Nat) :: (Nat, Nat) where- Foo14 x = Apply (Apply Tuple2Sym0 (Let0123456789876543210ZSym1 x)) (Let0123456789876543210YSym1 x)- type Foo13_ :: a -> a- type family Foo13_ (a :: a) :: a where- Foo13_ y = y- type Foo13 :: forall a. a -> a- type family Foo13 (a :: a) :: a where- Foo13 x = Apply Foo13_Sym0 (Let0123456789876543210BarSym1 x)- type Foo12 :: Nat -> Nat- type family Foo12 (a :: Nat) :: Nat where- Foo12 x = Apply (Apply ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x) x) (Apply SuccSym0 (Apply SuccSym0 ZeroSym0))- type Foo11 :: Nat -> Nat- type family Foo11 (a :: Nat) :: Nat where- Foo11 x = Apply (Apply ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x) (Apply SuccSym0 ZeroSym0)) (Let0123456789876543210ZSym1 x)- type Foo10 :: Nat -> Nat- type family Foo10 (a :: Nat) :: Nat where- Foo10 x = Apply (Apply ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x) (Apply SuccSym0 ZeroSym0)) x- type Foo9 :: Nat -> Nat- type family Foo9 (a :: Nat) :: Nat where- Foo9 x = Apply (Let0123456789876543210ZSym1 x) x- type Foo8 :: Nat -> Nat- type family Foo8 (a :: Nat) :: Nat where- Foo8 x = Let0123456789876543210ZSym1 x- type Foo7 :: Nat -> Nat- type family Foo7 (a :: Nat) :: Nat where- Foo7 x = Let0123456789876543210XSym1 x- type Foo6 :: Nat -> Nat- type family Foo6 (a :: Nat) :: Nat where- Foo6 x = Let0123456789876543210ZSym1 x- type Foo5 :: Nat -> Nat- type family Foo5 (a :: Nat) :: Nat where- Foo5 x = Apply (Let0123456789876543210FSym1 x) x- type Foo4 :: Nat -> Nat- type family Foo4 (a :: Nat) :: Nat where- Foo4 x = Apply (Let0123456789876543210FSym1 x) x- type Foo3 :: Nat -> Nat- type family Foo3 (a :: Nat) :: Nat where- Foo3 x = Let0123456789876543210YSym1 x- type Foo2 :: Nat- type family Foo2 :: Nat where- Foo2 = Let0123456789876543210ZSym0- type Foo1 :: Nat -> Nat- type family Foo1 (a :: Nat) :: Nat where- Foo1 x = Let0123456789876543210YSym1 x- sFoo14 ::- forall (t :: Nat). Sing t -> Sing (Apply Foo14Sym0 t :: (Nat, Nat))- sFoo13_ ::- forall a (t :: a). Sing t -> Sing (Apply Foo13_Sym0 t :: a)- sFoo13 ::- forall a (t :: a). Sing t -> Sing (Apply Foo13Sym0 t :: a)- sFoo12 ::- forall (t :: Nat). Sing t -> Sing (Apply Foo12Sym0 t :: Nat)- sFoo11 ::- forall (t :: Nat). Sing t -> Sing (Apply Foo11Sym0 t :: Nat)- sFoo10 ::- forall (t :: Nat). Sing t -> Sing (Apply Foo10Sym0 t :: Nat)- sFoo9 ::- forall (t :: Nat). Sing t -> Sing (Apply Foo9Sym0 t :: Nat)- sFoo8 ::- forall (t :: Nat). Sing t -> Sing (Apply Foo8Sym0 t :: Nat)- sFoo7 ::- forall (t :: Nat). Sing t -> Sing (Apply Foo7Sym0 t :: Nat)- sFoo6 ::- forall (t :: Nat). Sing t -> Sing (Apply Foo6Sym0 t :: Nat)- sFoo5 ::- forall (t :: Nat). Sing t -> Sing (Apply Foo5Sym0 t :: Nat)- sFoo4 ::- forall (t :: Nat). Sing t -> Sing (Apply Foo4Sym0 t :: Nat)- sFoo3 ::- forall (t :: Nat). Sing t -> Sing (Apply Foo3Sym0 t :: Nat)- sFoo2 :: Sing (Foo2Sym0 :: Nat)- sFoo1 ::- forall (t :: Nat). Sing t -> Sing (Apply Foo1Sym0 t :: Nat)- sFoo14 (sX :: Sing x)- = let- sZ :: Sing @_ (Let0123456789876543210ZSym1 x)- sY :: Sing @_ (Let0123456789876543210YSym1 x)- sX_0123456789876543210 ::- Sing @_ (Let0123456789876543210X_0123456789876543210Sym1 x)- sZ- = (id- @(Sing (Case_0123456789876543210 x (Let0123456789876543210X_0123456789876543210Sym1 x))))- (case sX_0123456789876543210 of- STuple2 _ (sY_0123456789876543210 :: Sing y_0123456789876543210)- -> sY_0123456789876543210)- sY- = (id- @(Sing (Case_0123456789876543210 x (Let0123456789876543210X_0123456789876543210Sym1 x))))- (case sX_0123456789876543210 of- STuple2 (sY_0123456789876543210 :: Sing y_0123456789876543210) _- -> sY_0123456789876543210)- sX_0123456789876543210- = (applySing- ((applySing ((singFun2 @Tuple2Sym0) STuple2))- ((applySing ((singFun1 @SuccSym0) SSucc)) sX)))- sX- in (applySing ((applySing ((singFun2 @Tuple2Sym0) STuple2)) sZ)) sY- sFoo13_ (sY :: Sing y) = sY- sFoo13 (sX :: Sing x)- = let- sBar :: Sing (Let0123456789876543210BarSym1 x :: a)- sBar = sX- in (applySing ((singFun1 @Foo13_Sym0) sFoo13_)) sBar- sFoo12 (sX :: Sing x)- = let- (%+) ::- forall (t :: Nat) (t :: Nat). Sing t- -> Sing t- -> Sing (Apply (Apply ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x) t) t :: Nat)- (%+) SZero (sM :: Sing m) = sM- (%+) (SSucc (sN :: Sing n)) (sM :: Sing m)- = (applySing ((singFun1 @SuccSym0) SSucc))- ((applySing- ((applySing ((singFun2 @((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x)) (%+)))- sN))- sX)- in- (applySing- ((applySing ((singFun2 @((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x)) (%+)))- sX))- ((applySing ((singFun1 @SuccSym0) SSucc))- ((applySing ((singFun1 @SuccSym0) SSucc)) SZero))- sFoo11 (sX :: Sing x)- = let- sZ :: Sing (Let0123456789876543210ZSym1 x :: Nat)- (%+) ::- forall (t :: Nat) (t :: Nat). Sing t- -> Sing t- -> Sing (Apply (Apply ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x) t) t :: Nat)- sZ = sX- (%+) SZero (sM :: Sing m) = sM- (%+) (SSucc (sN :: Sing n)) (sM :: Sing m)- = (applySing ((singFun1 @SuccSym0) SSucc))- ((applySing- ((applySing ((singFun2 @((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x)) (%+)))- sN))- sM)- in- (applySing- ((applySing ((singFun2 @((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x)) (%+)))- ((applySing ((singFun1 @SuccSym0) SSucc)) SZero)))- sZ- sFoo10 (sX :: Sing x)- = let- (%+) ::- forall (t :: Nat) (t :: Nat). Sing t- -> Sing t- -> Sing (Apply (Apply ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x) t) t :: Nat)- (%+) SZero (sM :: Sing m) = sM- (%+) (SSucc (sN :: Sing n)) (sM :: Sing m)- = (applySing ((singFun1 @SuccSym0) SSucc))- ((applySing- ((applySing ((singFun2 @((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x)) (%+)))- sN))- sM)- in- (applySing- ((applySing ((singFun2 @((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x)) (%+)))- ((applySing ((singFun1 @SuccSym0) SSucc)) SZero)))- sX- sFoo9 (sX :: Sing x)- = let- sZ ::- forall (t :: Nat). Sing t- -> Sing (Apply (Let0123456789876543210ZSym1 x) t :: Nat)- sZ (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((singFun1- @(Apply (Apply Lambda_0123456789876543210Sym0 a_0123456789876543210) x))- (\ sX -> case sX of (_ :: Sing x) -> sX)))- sA_0123456789876543210- in (applySing ((singFun1 @(Let0123456789876543210ZSym1 x)) sZ)) sX- sFoo8 (sX :: Sing x)- = let- sZ :: Sing (Let0123456789876543210ZSym1 x :: Nat)- sZ- = (applySing- ((singFun1 @(Apply Lambda_0123456789876543210Sym0 x))- (\ sX -> case sX of (_ :: Sing x) -> sX)))- SZero- in sZ- sFoo7 (sX :: Sing x)- = let- sX :: Sing (Let0123456789876543210XSym1 x :: Nat)- sX = SZero- in sX- sFoo6 (sX :: Sing x)- = let- sF ::- forall (t :: Nat). Sing t- -> Sing (Apply (Let0123456789876543210FSym1 x) t :: Nat)- sF (sY :: Sing y) = (applySing ((singFun1 @SuccSym0) SSucc)) sY in- let- sZ :: Sing (Let0123456789876543210ZSym1 x :: Nat)- sZ- = (applySing ((singFun1 @(Let0123456789876543210FSym1 x)) sF)) sX- in sZ- sFoo5 (sX :: Sing x)- = let- sF ::- forall (t :: Nat). Sing t- -> Sing (Apply (Let0123456789876543210FSym1 x) t :: Nat)- sF (sY :: Sing y)- = let- sZ :: Sing (Let0123456789876543210ZSym2 y x :: Nat)- sZ = (applySing ((singFun1 @SuccSym0) SSucc)) sY- in (applySing ((singFun1 @SuccSym0) SSucc)) sZ- in (applySing ((singFun1 @(Let0123456789876543210FSym1 x)) sF)) sX- sFoo4 (sX :: Sing x)- = let- sF ::- forall (t :: Nat). Sing t- -> Sing (Apply (Let0123456789876543210FSym1 x) t :: Nat)- sF (sY :: Sing y) = (applySing ((singFun1 @SuccSym0) SSucc)) sY- in (applySing ((singFun1 @(Let0123456789876543210FSym1 x)) sF)) sX- sFoo3 (sX :: Sing x)- = let- sY :: Sing (Let0123456789876543210YSym1 x :: Nat)- sY = (applySing ((singFun1 @SuccSym0) SSucc)) sX- in sY- sFoo2- = let- sZ :: Sing @_ Let0123456789876543210ZSym0- sY :: Sing @_ Let0123456789876543210YSym0- sZ = (applySing ((singFun1 @SuccSym0) SSucc)) sY- sY = (applySing ((singFun1 @SuccSym0) SSucc)) SZero- in sZ- sFoo1 (sX :: Sing x)- = let- sY :: Sing (Let0123456789876543210YSym1 x :: Nat)- sY = (applySing ((singFun1 @SuccSym0) SSucc)) SZero- in sY- instance SingI (Foo14Sym0 :: (~>) Nat (Nat, Nat)) where- sing = (singFun1 @Foo14Sym0) sFoo14- instance SingI (Foo13_Sym0 :: (~>) a a) where- sing = (singFun1 @Foo13_Sym0) sFoo13_- instance SingI (Foo13Sym0 :: (~>) a a) where- sing = (singFun1 @Foo13Sym0) sFoo13- instance SingI (Foo12Sym0 :: (~>) Nat Nat) where- sing = (singFun1 @Foo12Sym0) sFoo12- instance SingI (Foo11Sym0 :: (~>) Nat Nat) where- sing = (singFun1 @Foo11Sym0) sFoo11- instance SingI (Foo10Sym0 :: (~>) Nat Nat) where- sing = (singFun1 @Foo10Sym0) sFoo10- instance SingI (Foo9Sym0 :: (~>) Nat Nat) where- sing = (singFun1 @Foo9Sym0) sFoo9- instance SingI (Foo8Sym0 :: (~>) Nat Nat) where- sing = (singFun1 @Foo8Sym0) sFoo8- instance SingI (Foo7Sym0 :: (~>) Nat Nat) where- sing = (singFun1 @Foo7Sym0) sFoo7- instance SingI (Foo6Sym0 :: (~>) Nat Nat) where- sing = (singFun1 @Foo6Sym0) sFoo6- instance SingI (Foo5Sym0 :: (~>) Nat Nat) where- sing = (singFun1 @Foo5Sym0) sFoo5- instance SingI (Foo4Sym0 :: (~>) Nat Nat) where- sing = (singFun1 @Foo4Sym0) sFoo4- instance SingI (Foo3Sym0 :: (~>) Nat Nat) where- sing = (singFun1 @Foo3Sym0) sFoo3- instance SingI (Foo1Sym0 :: (~>) Nat Nat) where- sing = (singFun1 @Foo1Sym0) sFoo1+Singletons/LetStatements.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| foo1 :: Nat -> Nat + foo1 x + = let + y :: Nat + y = Succ Zero + in y + foo2 :: Nat + foo2 + = let + y = Succ Zero + z = Succ y + in z + foo3 :: Nat -> Nat + foo3 x + = let + y :: Nat + y = Succ x + in y + foo4 :: Nat -> Nat + foo4 x + = let + f :: Nat -> Nat + f y = Succ y + in f x + foo5 :: Nat -> Nat + foo5 x + = let + f :: Nat -> Nat + f y + = let + z :: Nat + z = Succ y + in Succ z + in f x + foo6 :: Nat -> Nat + foo6 x + = let + f :: Nat -> Nat + f y = Succ y in + let + z :: Nat + z = f x + in z + foo7 :: Nat -> Nat + foo7 x + = let + x :: Nat + x = Zero + in x + foo8 :: Nat -> Nat + foo8 x + = let + z :: Nat + z = (\ x -> x) Zero + in z + foo9 :: Nat -> Nat + foo9 x + = let + z :: Nat -> Nat + z = (\ x -> x) + in z x + foo10 :: Nat -> Nat + foo10 x + = let + (+) :: Nat -> Nat -> Nat + Zero + m = m + (Succ n) + m = Succ (n + m) + in (Succ Zero) + x + foo11 :: Nat -> Nat + foo11 x + = let + (+) :: Nat -> Nat -> Nat + Zero + m = m + (Succ n) + m = Succ (n + m) + z :: Nat + z = x + in (Succ Zero) + z + foo12 :: Nat -> Nat + foo12 x + = let + (+) :: Nat -> Nat -> Nat + Zero + m = m + (Succ n) + m = Succ (n + x) + in x + (Succ (Succ Zero)) + foo13 :: forall a. a -> a + foo13 x + = let + bar :: a + bar = x + in foo13_ bar + foo13_ :: a -> a + foo13_ y = y + foo14 :: Nat -> (Nat, Nat) + foo14 x = let (y, z) = (Succ x, x) in (z, y) |] + ======> + foo1 :: Nat -> Nat + foo1 x + = let + y :: Nat + y = Succ Zero + in y + foo2 :: Nat + foo2 + = let + y = Succ Zero + z = Succ y + in z + foo3 :: Nat -> Nat + foo3 x + = let + y :: Nat + y = Succ x + in y + foo4 :: Nat -> Nat + foo4 x + = let + f :: Nat -> Nat + f y = Succ y + in f x + foo5 :: Nat -> Nat + foo5 x + = let + f :: Nat -> Nat + f y + = let + z :: Nat + z = Succ y + in Succ z + in f x + foo6 :: Nat -> Nat + foo6 x + = let + f :: Nat -> Nat + f y = Succ y in + let + z :: Nat + z = f x + in z + foo7 :: Nat -> Nat + foo7 x + = let + x :: Nat + x = Zero + in x + foo8 :: Nat -> Nat + foo8 x + = let + z :: Nat + z = (\ x -> x) Zero + in z + foo9 :: Nat -> Nat + foo9 x + = let + z :: Nat -> Nat + z = \ x -> x + in z x + foo10 :: Nat -> Nat + foo10 x + = let + (+) :: Nat -> Nat -> Nat + (+) Zero m = m + (+) (Succ n) m = Succ (n + m) + in (Succ Zero + x) + foo11 :: Nat -> Nat + foo11 x + = let + (+) :: Nat -> Nat -> Nat + z :: Nat + (+) Zero m = m + (+) (Succ n) m = Succ (n + m) + z = x + in (Succ Zero + z) + foo12 :: Nat -> Nat + foo12 x + = let + (+) :: Nat -> Nat -> Nat + (+) Zero m = m + (+) (Succ n) m = Succ (n + x) + in (x + Succ (Succ Zero)) + foo13 :: forall a. a -> a + foo13 x + = let + bar :: a + bar = x + in foo13_ bar + foo13_ :: a -> a + foo13_ y = y + foo14 :: Nat -> (Nat, Nat) + foo14 x = let (y, z) = (Succ x, x) in (z, y) + type family Case_0123456789876543210 x t where + Case_0123456789876543210 x '(_, + y_0123456789876543210) = y_0123456789876543210 + type family Case_0123456789876543210 x t where + Case_0123456789876543210 x '(y_0123456789876543210, + _) = y_0123456789876543210 + data Let0123456789876543210ZSym0 x0123456789876543210 + where + Let0123456789876543210ZSym0KindInference :: SameKind (Apply Let0123456789876543210ZSym0 arg) (Let0123456789876543210ZSym1 arg) => + Let0123456789876543210ZSym0 x0123456789876543210 + type instance Apply Let0123456789876543210ZSym0 x0123456789876543210 = Let0123456789876543210Z x0123456789876543210 + instance SuppressUnusedWarnings Let0123456789876543210ZSym0 where + suppressUnusedWarnings + = snd ((,) Let0123456789876543210ZSym0KindInference ()) + type family Let0123456789876543210ZSym1 x0123456789876543210 where + Let0123456789876543210ZSym1 x0123456789876543210 = Let0123456789876543210Z x0123456789876543210 + data Let0123456789876543210YSym0 x0123456789876543210 + where + Let0123456789876543210YSym0KindInference :: SameKind (Apply Let0123456789876543210YSym0 arg) (Let0123456789876543210YSym1 arg) => + Let0123456789876543210YSym0 x0123456789876543210 + type instance Apply Let0123456789876543210YSym0 x0123456789876543210 = Let0123456789876543210Y x0123456789876543210 + instance SuppressUnusedWarnings Let0123456789876543210YSym0 where + suppressUnusedWarnings + = snd ((,) Let0123456789876543210YSym0KindInference ()) + type family Let0123456789876543210YSym1 x0123456789876543210 where + Let0123456789876543210YSym1 x0123456789876543210 = Let0123456789876543210Y x0123456789876543210 + data Let0123456789876543210X_0123456789876543210Sym0 x0123456789876543210 + where + Let0123456789876543210X_0123456789876543210Sym0KindInference :: SameKind (Apply Let0123456789876543210X_0123456789876543210Sym0 arg) (Let0123456789876543210X_0123456789876543210Sym1 arg) => + Let0123456789876543210X_0123456789876543210Sym0 x0123456789876543210 + type instance Apply Let0123456789876543210X_0123456789876543210Sym0 x0123456789876543210 = Let0123456789876543210X_0123456789876543210 x0123456789876543210 + instance SuppressUnusedWarnings Let0123456789876543210X_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd + ((,) + Let0123456789876543210X_0123456789876543210Sym0KindInference ()) + type family Let0123456789876543210X_0123456789876543210Sym1 x0123456789876543210 where + Let0123456789876543210X_0123456789876543210Sym1 x0123456789876543210 = Let0123456789876543210X_0123456789876543210 x0123456789876543210 + type family Let0123456789876543210Z x where + Let0123456789876543210Z x = Case_0123456789876543210 x (Let0123456789876543210X_0123456789876543210Sym1 x) + type family Let0123456789876543210Y x where + Let0123456789876543210Y x = Case_0123456789876543210 x (Let0123456789876543210X_0123456789876543210Sym1 x) + type family Let0123456789876543210X_0123456789876543210 x where + Let0123456789876543210X_0123456789876543210 x = Apply (Apply Tuple2Sym0 (Apply SuccSym0 x)) x + data Let0123456789876543210BarSym0 x0123456789876543210 + where + Let0123456789876543210BarSym0KindInference :: SameKind (Apply Let0123456789876543210BarSym0 arg) (Let0123456789876543210BarSym1 arg) => + Let0123456789876543210BarSym0 x0123456789876543210 + type instance Apply Let0123456789876543210BarSym0 x0123456789876543210 = Let0123456789876543210Bar x0123456789876543210 + instance SuppressUnusedWarnings Let0123456789876543210BarSym0 where + suppressUnusedWarnings + = snd ((,) Let0123456789876543210BarSym0KindInference ()) + type family Let0123456789876543210BarSym1 x0123456789876543210 :: a0123456789876543210 where + Let0123456789876543210BarSym1 x0123456789876543210 = Let0123456789876543210Bar x0123456789876543210 + type family Let0123456789876543210Bar x :: a where + Let0123456789876543210Bar x = x + data (<<<%%%%%%%%%%%%%%%%%%%%@#@$) x0123456789876543210 + where + (:<<<%%%%%%%%%%%%%%%%%%%%@#@$###) :: SameKind (Apply (<<<%%%%%%%%%%%%%%%%%%%%@#@$) arg) ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) arg) => + (<<<%%%%%%%%%%%%%%%%%%%%@#@$) x0123456789876543210 + type instance Apply (<<<%%%%%%%%%%%%%%%%%%%%@#@$) x0123456789876543210 = (<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x0123456789876543210 + instance SuppressUnusedWarnings (<<<%%%%%%%%%%%%%%%%%%%%@#@$) where + suppressUnusedWarnings + = snd ((,) (:<<<%%%%%%%%%%%%%%%%%%%%@#@$###) ()) + data (<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x0123456789876543210 :: (~>) Nat ((~>) Nat Nat) + where + (:<<<%%%%%%%%%%%%%%%%%%%%@#@$$###) :: SameKind (Apply ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x0123456789876543210) arg) ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$$) x0123456789876543210 arg) => + (<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x0123456789876543210 a0123456789876543210 + type instance Apply ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x0123456789876543210) a0123456789876543210 = (<<<%%%%%%%%%%%%%%%%%%%%@#@$$$) x0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x0123456789876543210) where + suppressUnusedWarnings + = snd ((,) (:<<<%%%%%%%%%%%%%%%%%%%%@#@$$###) ()) + data (<<<%%%%%%%%%%%%%%%%%%%%@#@$$$) x0123456789876543210 (a0123456789876543210 :: Nat) :: (~>) Nat Nat + where + (:<<<%%%%%%%%%%%%%%%%%%%%@#@$$$###) :: SameKind (Apply ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$$) x0123456789876543210 a0123456789876543210) arg) ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$$$) x0123456789876543210 a0123456789876543210 arg) => + (<<<%%%%%%%%%%%%%%%%%%%%@#@$$$) x0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$$) x0123456789876543210 a0123456789876543210) a0123456789876543210 = (<<<%%%%%%%%%%%%%%%%%%%%) x0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$$) x0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) (:<<<%%%%%%%%%%%%%%%%%%%%@#@$$$###) ()) + type family (<<<%%%%%%%%%%%%%%%%%%%%@#@$$$$) x0123456789876543210 (a0123456789876543210 :: Nat) (a0123456789876543210 :: Nat) :: Nat where + (<<<%%%%%%%%%%%%%%%%%%%%@#@$$$$) x0123456789876543210 a0123456789876543210 a0123456789876543210 = (<<<%%%%%%%%%%%%%%%%%%%%) x0123456789876543210 a0123456789876543210 a0123456789876543210 + type family (<<<%%%%%%%%%%%%%%%%%%%%) x (a :: Nat) (a :: Nat) :: Nat where + (<<<%%%%%%%%%%%%%%%%%%%%) x 'Zero m = m + (<<<%%%%%%%%%%%%%%%%%%%%) x ('Succ n) m = Apply SuccSym0 (Apply (Apply ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x) n) x) + data Let0123456789876543210ZSym0 x0123456789876543210 + where + Let0123456789876543210ZSym0KindInference :: SameKind (Apply Let0123456789876543210ZSym0 arg) (Let0123456789876543210ZSym1 arg) => + Let0123456789876543210ZSym0 x0123456789876543210 + type instance Apply Let0123456789876543210ZSym0 x0123456789876543210 = Let0123456789876543210Z x0123456789876543210 + instance SuppressUnusedWarnings Let0123456789876543210ZSym0 where + suppressUnusedWarnings + = snd ((,) Let0123456789876543210ZSym0KindInference ()) + type family Let0123456789876543210ZSym1 x0123456789876543210 :: Nat where + Let0123456789876543210ZSym1 x0123456789876543210 = Let0123456789876543210Z x0123456789876543210 + data (<<<%%%%%%%%%%%%%%%%%%%%@#@$) x0123456789876543210 + where + (:<<<%%%%%%%%%%%%%%%%%%%%@#@$###) :: SameKind (Apply (<<<%%%%%%%%%%%%%%%%%%%%@#@$) arg) ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) arg) => + (<<<%%%%%%%%%%%%%%%%%%%%@#@$) x0123456789876543210 + type instance Apply (<<<%%%%%%%%%%%%%%%%%%%%@#@$) x0123456789876543210 = (<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x0123456789876543210 + instance SuppressUnusedWarnings (<<<%%%%%%%%%%%%%%%%%%%%@#@$) where + suppressUnusedWarnings + = snd ((,) (:<<<%%%%%%%%%%%%%%%%%%%%@#@$###) ()) + data (<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x0123456789876543210 :: (~>) Nat ((~>) Nat Nat) + where + (:<<<%%%%%%%%%%%%%%%%%%%%@#@$$###) :: SameKind (Apply ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x0123456789876543210) arg) ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$$) x0123456789876543210 arg) => + (<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x0123456789876543210 a0123456789876543210 + type instance Apply ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x0123456789876543210) a0123456789876543210 = (<<<%%%%%%%%%%%%%%%%%%%%@#@$$$) x0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x0123456789876543210) where + suppressUnusedWarnings + = snd ((,) (:<<<%%%%%%%%%%%%%%%%%%%%@#@$$###) ()) + data (<<<%%%%%%%%%%%%%%%%%%%%@#@$$$) x0123456789876543210 (a0123456789876543210 :: Nat) :: (~>) Nat Nat + where + (:<<<%%%%%%%%%%%%%%%%%%%%@#@$$$###) :: SameKind (Apply ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$$) x0123456789876543210 a0123456789876543210) arg) ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$$$) x0123456789876543210 a0123456789876543210 arg) => + (<<<%%%%%%%%%%%%%%%%%%%%@#@$$$) x0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$$) x0123456789876543210 a0123456789876543210) a0123456789876543210 = (<<<%%%%%%%%%%%%%%%%%%%%) x0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$$) x0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) (:<<<%%%%%%%%%%%%%%%%%%%%@#@$$$###) ()) + type family (<<<%%%%%%%%%%%%%%%%%%%%@#@$$$$) x0123456789876543210 (a0123456789876543210 :: Nat) (a0123456789876543210 :: Nat) :: Nat where + (<<<%%%%%%%%%%%%%%%%%%%%@#@$$$$) x0123456789876543210 a0123456789876543210 a0123456789876543210 = (<<<%%%%%%%%%%%%%%%%%%%%) x0123456789876543210 a0123456789876543210 a0123456789876543210 + type family Let0123456789876543210Z x :: Nat where + Let0123456789876543210Z x = x + type family (<<<%%%%%%%%%%%%%%%%%%%%) x (a :: Nat) (a :: Nat) :: Nat where + (<<<%%%%%%%%%%%%%%%%%%%%) x 'Zero m = m + (<<<%%%%%%%%%%%%%%%%%%%%) x ('Succ n) m = Apply SuccSym0 (Apply (Apply ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x) n) m) + data (<<<%%%%%%%%%%%%%%%%%%%%@#@$) x0123456789876543210 + where + (:<<<%%%%%%%%%%%%%%%%%%%%@#@$###) :: SameKind (Apply (<<<%%%%%%%%%%%%%%%%%%%%@#@$) arg) ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) arg) => + (<<<%%%%%%%%%%%%%%%%%%%%@#@$) x0123456789876543210 + type instance Apply (<<<%%%%%%%%%%%%%%%%%%%%@#@$) x0123456789876543210 = (<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x0123456789876543210 + instance SuppressUnusedWarnings (<<<%%%%%%%%%%%%%%%%%%%%@#@$) where + suppressUnusedWarnings + = snd ((,) (:<<<%%%%%%%%%%%%%%%%%%%%@#@$###) ()) + data (<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x0123456789876543210 :: (~>) Nat ((~>) Nat Nat) + where + (:<<<%%%%%%%%%%%%%%%%%%%%@#@$$###) :: SameKind (Apply ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x0123456789876543210) arg) ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$$) x0123456789876543210 arg) => + (<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x0123456789876543210 a0123456789876543210 + type instance Apply ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x0123456789876543210) a0123456789876543210 = (<<<%%%%%%%%%%%%%%%%%%%%@#@$$$) x0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x0123456789876543210) where + suppressUnusedWarnings + = snd ((,) (:<<<%%%%%%%%%%%%%%%%%%%%@#@$$###) ()) + data (<<<%%%%%%%%%%%%%%%%%%%%@#@$$$) x0123456789876543210 (a0123456789876543210 :: Nat) :: (~>) Nat Nat + where + (:<<<%%%%%%%%%%%%%%%%%%%%@#@$$$###) :: SameKind (Apply ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$$) x0123456789876543210 a0123456789876543210) arg) ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$$$) x0123456789876543210 a0123456789876543210 arg) => + (<<<%%%%%%%%%%%%%%%%%%%%@#@$$$) x0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$$) x0123456789876543210 a0123456789876543210) a0123456789876543210 = (<<<%%%%%%%%%%%%%%%%%%%%) x0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$$) x0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) (:<<<%%%%%%%%%%%%%%%%%%%%@#@$$$###) ()) + type family (<<<%%%%%%%%%%%%%%%%%%%%@#@$$$$) x0123456789876543210 (a0123456789876543210 :: Nat) (a0123456789876543210 :: Nat) :: Nat where + (<<<%%%%%%%%%%%%%%%%%%%%@#@$$$$) x0123456789876543210 a0123456789876543210 a0123456789876543210 = (<<<%%%%%%%%%%%%%%%%%%%%) x0123456789876543210 a0123456789876543210 a0123456789876543210 + type family (<<<%%%%%%%%%%%%%%%%%%%%) x (a :: Nat) (a :: Nat) :: Nat where + (<<<%%%%%%%%%%%%%%%%%%%%) x 'Zero m = m + (<<<%%%%%%%%%%%%%%%%%%%%) x ('Succ n) m = Apply SuccSym0 (Apply (Apply ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x) n) m) + type family Lambda_0123456789876543210 a_0123456789876543210 x x where + Lambda_0123456789876543210 a_0123456789876543210 x x = x + data Lambda_0123456789876543210Sym0 a_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) => + Lambda_0123456789876543210Sym0 a_01234567898765432100123456789876543210 + type instance Apply Lambda_0123456789876543210Sym0 a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym0KindInference ()) + data Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210 x0123456789876543210 + where + Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210 x0123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210) x0123456789876543210 = Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 x0123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym1KindInference ()) + data Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 x0123456789876543210 x0123456789876543210 + where + Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 x0123456789876543210) arg) (Lambda_0123456789876543210Sym3 a_01234567898765432100123456789876543210 x0123456789876543210 arg) => + Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 x0123456789876543210 x0123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 x0123456789876543210) x0123456789876543210 = Lambda_0123456789876543210 a_01234567898765432100123456789876543210 x0123456789876543210 x0123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 x0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym2KindInference ()) + type family Lambda_0123456789876543210Sym3 a_01234567898765432100123456789876543210 x0123456789876543210 x0123456789876543210 where + Lambda_0123456789876543210Sym3 a_01234567898765432100123456789876543210 x0123456789876543210 x0123456789876543210 = Lambda_0123456789876543210 a_01234567898765432100123456789876543210 x0123456789876543210 x0123456789876543210 + data Let0123456789876543210ZSym0 x0123456789876543210 + where + Let0123456789876543210ZSym0KindInference :: SameKind (Apply Let0123456789876543210ZSym0 arg) (Let0123456789876543210ZSym1 arg) => + Let0123456789876543210ZSym0 x0123456789876543210 + type instance Apply Let0123456789876543210ZSym0 x0123456789876543210 = Let0123456789876543210ZSym1 x0123456789876543210 + instance SuppressUnusedWarnings Let0123456789876543210ZSym0 where + suppressUnusedWarnings + = snd ((,) Let0123456789876543210ZSym0KindInference ()) + data Let0123456789876543210ZSym1 x0123456789876543210 :: (~>) Nat Nat + where + Let0123456789876543210ZSym1KindInference :: SameKind (Apply (Let0123456789876543210ZSym1 x0123456789876543210) arg) (Let0123456789876543210ZSym2 x0123456789876543210 arg) => + Let0123456789876543210ZSym1 x0123456789876543210 a0123456789876543210 + type instance Apply (Let0123456789876543210ZSym1 x0123456789876543210) a0123456789876543210 = Let0123456789876543210Z x0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Let0123456789876543210ZSym1 x0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Let0123456789876543210ZSym1KindInference ()) + type family Let0123456789876543210ZSym2 x0123456789876543210 (a0123456789876543210 :: Nat) :: Nat where + Let0123456789876543210ZSym2 x0123456789876543210 a0123456789876543210 = Let0123456789876543210Z x0123456789876543210 a0123456789876543210 + type family Let0123456789876543210Z x (a :: Nat) :: Nat where + Let0123456789876543210Z x a_0123456789876543210 = Apply (Apply (Apply Lambda_0123456789876543210Sym0 a_0123456789876543210) x) a_0123456789876543210 + type family Lambda_0123456789876543210 x x where + Lambda_0123456789876543210 x x = x + data Lambda_0123456789876543210Sym0 x0123456789876543210 + where + Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) => + Lambda_0123456789876543210Sym0 x0123456789876543210 + type instance Apply Lambda_0123456789876543210Sym0 x0123456789876543210 = Lambda_0123456789876543210Sym1 x0123456789876543210 + instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym0KindInference ()) + data Lambda_0123456789876543210Sym1 x0123456789876543210 x0123456789876543210 + where + Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) arg) (Lambda_0123456789876543210Sym2 x0123456789876543210 arg) => + Lambda_0123456789876543210Sym1 x0123456789876543210 x0123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) x0123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 x0123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 x0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym1KindInference ()) + type family Lambda_0123456789876543210Sym2 x0123456789876543210 x0123456789876543210 where + Lambda_0123456789876543210Sym2 x0123456789876543210 x0123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 x0123456789876543210 + data Let0123456789876543210ZSym0 x0123456789876543210 + where + Let0123456789876543210ZSym0KindInference :: SameKind (Apply Let0123456789876543210ZSym0 arg) (Let0123456789876543210ZSym1 arg) => + Let0123456789876543210ZSym0 x0123456789876543210 + type instance Apply Let0123456789876543210ZSym0 x0123456789876543210 = Let0123456789876543210Z x0123456789876543210 + instance SuppressUnusedWarnings Let0123456789876543210ZSym0 where + suppressUnusedWarnings + = snd ((,) Let0123456789876543210ZSym0KindInference ()) + type family Let0123456789876543210ZSym1 x0123456789876543210 :: Nat where + Let0123456789876543210ZSym1 x0123456789876543210 = Let0123456789876543210Z x0123456789876543210 + type family Let0123456789876543210Z x :: Nat where + Let0123456789876543210Z x = Apply (Apply Lambda_0123456789876543210Sym0 x) ZeroSym0 + data Let0123456789876543210XSym0 x0123456789876543210 + where + Let0123456789876543210XSym0KindInference :: SameKind (Apply Let0123456789876543210XSym0 arg) (Let0123456789876543210XSym1 arg) => + Let0123456789876543210XSym0 x0123456789876543210 + type instance Apply Let0123456789876543210XSym0 x0123456789876543210 = Let0123456789876543210X x0123456789876543210 + instance SuppressUnusedWarnings Let0123456789876543210XSym0 where + suppressUnusedWarnings + = snd ((,) Let0123456789876543210XSym0KindInference ()) + type family Let0123456789876543210XSym1 x0123456789876543210 :: Nat where + Let0123456789876543210XSym1 x0123456789876543210 = Let0123456789876543210X x0123456789876543210 + type family Let0123456789876543210X x :: Nat where + Let0123456789876543210X x = ZeroSym0 + data Let0123456789876543210FSym0 x0123456789876543210 + where + Let0123456789876543210FSym0KindInference :: SameKind (Apply Let0123456789876543210FSym0 arg) (Let0123456789876543210FSym1 arg) => + Let0123456789876543210FSym0 x0123456789876543210 + type instance Apply Let0123456789876543210FSym0 x0123456789876543210 = Let0123456789876543210FSym1 x0123456789876543210 + instance SuppressUnusedWarnings Let0123456789876543210FSym0 where + suppressUnusedWarnings + = snd ((,) Let0123456789876543210FSym0KindInference ()) + data Let0123456789876543210FSym1 x0123456789876543210 :: (~>) Nat Nat + where + Let0123456789876543210FSym1KindInference :: SameKind (Apply (Let0123456789876543210FSym1 x0123456789876543210) arg) (Let0123456789876543210FSym2 x0123456789876543210 arg) => + Let0123456789876543210FSym1 x0123456789876543210 a0123456789876543210 + type instance Apply (Let0123456789876543210FSym1 x0123456789876543210) a0123456789876543210 = Let0123456789876543210F x0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Let0123456789876543210FSym1 x0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Let0123456789876543210FSym1KindInference ()) + type family Let0123456789876543210FSym2 x0123456789876543210 (a0123456789876543210 :: Nat) :: Nat where + Let0123456789876543210FSym2 x0123456789876543210 a0123456789876543210 = Let0123456789876543210F x0123456789876543210 a0123456789876543210 + type family Let0123456789876543210F x (a :: Nat) :: Nat where + Let0123456789876543210F x y = Apply SuccSym0 y + data Let0123456789876543210ZSym0 x0123456789876543210 + where + Let0123456789876543210ZSym0KindInference :: SameKind (Apply Let0123456789876543210ZSym0 arg) (Let0123456789876543210ZSym1 arg) => + Let0123456789876543210ZSym0 x0123456789876543210 + type instance Apply Let0123456789876543210ZSym0 x0123456789876543210 = Let0123456789876543210Z x0123456789876543210 + instance SuppressUnusedWarnings Let0123456789876543210ZSym0 where + suppressUnusedWarnings + = snd ((,) Let0123456789876543210ZSym0KindInference ()) + type family Let0123456789876543210ZSym1 x0123456789876543210 :: Nat where + Let0123456789876543210ZSym1 x0123456789876543210 = Let0123456789876543210Z x0123456789876543210 + type family Let0123456789876543210Z x :: Nat where + Let0123456789876543210Z x = Apply (Let0123456789876543210FSym1 x) x + data Let0123456789876543210ZSym0 y0123456789876543210 + where + Let0123456789876543210ZSym0KindInference :: SameKind (Apply Let0123456789876543210ZSym0 arg) (Let0123456789876543210ZSym1 arg) => + Let0123456789876543210ZSym0 y0123456789876543210 + type instance Apply Let0123456789876543210ZSym0 y0123456789876543210 = Let0123456789876543210ZSym1 y0123456789876543210 + instance SuppressUnusedWarnings Let0123456789876543210ZSym0 where + suppressUnusedWarnings + = snd ((,) Let0123456789876543210ZSym0KindInference ()) + data Let0123456789876543210ZSym1 y0123456789876543210 x0123456789876543210 + where + Let0123456789876543210ZSym1KindInference :: SameKind (Apply (Let0123456789876543210ZSym1 y0123456789876543210) arg) (Let0123456789876543210ZSym2 y0123456789876543210 arg) => + Let0123456789876543210ZSym1 y0123456789876543210 x0123456789876543210 + type instance Apply (Let0123456789876543210ZSym1 y0123456789876543210) x0123456789876543210 = Let0123456789876543210Z y0123456789876543210 x0123456789876543210 + instance SuppressUnusedWarnings (Let0123456789876543210ZSym1 y0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Let0123456789876543210ZSym1KindInference ()) + type family Let0123456789876543210ZSym2 y0123456789876543210 x0123456789876543210 :: Nat where + Let0123456789876543210ZSym2 y0123456789876543210 x0123456789876543210 = Let0123456789876543210Z y0123456789876543210 x0123456789876543210 + type family Let0123456789876543210Z y x :: Nat where + Let0123456789876543210Z y x = Apply SuccSym0 y + data Let0123456789876543210FSym0 x0123456789876543210 + where + Let0123456789876543210FSym0KindInference :: SameKind (Apply Let0123456789876543210FSym0 arg) (Let0123456789876543210FSym1 arg) => + Let0123456789876543210FSym0 x0123456789876543210 + type instance Apply Let0123456789876543210FSym0 x0123456789876543210 = Let0123456789876543210FSym1 x0123456789876543210 + instance SuppressUnusedWarnings Let0123456789876543210FSym0 where + suppressUnusedWarnings + = snd ((,) Let0123456789876543210FSym0KindInference ()) + data Let0123456789876543210FSym1 x0123456789876543210 :: (~>) Nat Nat + where + Let0123456789876543210FSym1KindInference :: SameKind (Apply (Let0123456789876543210FSym1 x0123456789876543210) arg) (Let0123456789876543210FSym2 x0123456789876543210 arg) => + Let0123456789876543210FSym1 x0123456789876543210 a0123456789876543210 + type instance Apply (Let0123456789876543210FSym1 x0123456789876543210) a0123456789876543210 = Let0123456789876543210F x0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Let0123456789876543210FSym1 x0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Let0123456789876543210FSym1KindInference ()) + type family Let0123456789876543210FSym2 x0123456789876543210 (a0123456789876543210 :: Nat) :: Nat where + Let0123456789876543210FSym2 x0123456789876543210 a0123456789876543210 = Let0123456789876543210F x0123456789876543210 a0123456789876543210 + type family Let0123456789876543210F x (a :: Nat) :: Nat where + Let0123456789876543210F x y = Apply SuccSym0 (Let0123456789876543210ZSym2 y x) + data Let0123456789876543210FSym0 x0123456789876543210 + where + Let0123456789876543210FSym0KindInference :: SameKind (Apply Let0123456789876543210FSym0 arg) (Let0123456789876543210FSym1 arg) => + Let0123456789876543210FSym0 x0123456789876543210 + type instance Apply Let0123456789876543210FSym0 x0123456789876543210 = Let0123456789876543210FSym1 x0123456789876543210 + instance SuppressUnusedWarnings Let0123456789876543210FSym0 where + suppressUnusedWarnings + = snd ((,) Let0123456789876543210FSym0KindInference ()) + data Let0123456789876543210FSym1 x0123456789876543210 :: (~>) Nat Nat + where + Let0123456789876543210FSym1KindInference :: SameKind (Apply (Let0123456789876543210FSym1 x0123456789876543210) arg) (Let0123456789876543210FSym2 x0123456789876543210 arg) => + Let0123456789876543210FSym1 x0123456789876543210 a0123456789876543210 + type instance Apply (Let0123456789876543210FSym1 x0123456789876543210) a0123456789876543210 = Let0123456789876543210F x0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Let0123456789876543210FSym1 x0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Let0123456789876543210FSym1KindInference ()) + type family Let0123456789876543210FSym2 x0123456789876543210 (a0123456789876543210 :: Nat) :: Nat where + Let0123456789876543210FSym2 x0123456789876543210 a0123456789876543210 = Let0123456789876543210F x0123456789876543210 a0123456789876543210 + type family Let0123456789876543210F x (a :: Nat) :: Nat where + Let0123456789876543210F x y = Apply SuccSym0 y + data Let0123456789876543210YSym0 x0123456789876543210 + where + Let0123456789876543210YSym0KindInference :: SameKind (Apply Let0123456789876543210YSym0 arg) (Let0123456789876543210YSym1 arg) => + Let0123456789876543210YSym0 x0123456789876543210 + type instance Apply Let0123456789876543210YSym0 x0123456789876543210 = Let0123456789876543210Y x0123456789876543210 + instance SuppressUnusedWarnings Let0123456789876543210YSym0 where + suppressUnusedWarnings + = snd ((,) Let0123456789876543210YSym0KindInference ()) + type family Let0123456789876543210YSym1 x0123456789876543210 :: Nat where + Let0123456789876543210YSym1 x0123456789876543210 = Let0123456789876543210Y x0123456789876543210 + type family Let0123456789876543210Y x :: Nat where + Let0123456789876543210Y x = Apply SuccSym0 x + type family Let0123456789876543210ZSym0 where + Let0123456789876543210ZSym0 = Let0123456789876543210Z + type family Let0123456789876543210YSym0 where + Let0123456789876543210YSym0 = Let0123456789876543210Y + type family Let0123456789876543210Z where + Let0123456789876543210Z = Apply SuccSym0 Let0123456789876543210YSym0 + type family Let0123456789876543210Y where + Let0123456789876543210Y = Apply SuccSym0 ZeroSym0 + data Let0123456789876543210YSym0 x0123456789876543210 + where + Let0123456789876543210YSym0KindInference :: SameKind (Apply Let0123456789876543210YSym0 arg) (Let0123456789876543210YSym1 arg) => + Let0123456789876543210YSym0 x0123456789876543210 + type instance Apply Let0123456789876543210YSym0 x0123456789876543210 = Let0123456789876543210Y x0123456789876543210 + instance SuppressUnusedWarnings Let0123456789876543210YSym0 where + suppressUnusedWarnings + = snd ((,) Let0123456789876543210YSym0KindInference ()) + type family Let0123456789876543210YSym1 x0123456789876543210 :: Nat where + Let0123456789876543210YSym1 x0123456789876543210 = Let0123456789876543210Y x0123456789876543210 + type family Let0123456789876543210Y x :: Nat where + Let0123456789876543210Y x = Apply SuccSym0 ZeroSym0 + type Foo14Sym0 :: (~>) Nat (Nat, Nat) + data Foo14Sym0 :: (~>) Nat (Nat, Nat) + where + Foo14Sym0KindInference :: SameKind (Apply Foo14Sym0 arg) (Foo14Sym1 arg) => + Foo14Sym0 a0123456789876543210 + type instance Apply Foo14Sym0 a0123456789876543210 = Foo14 a0123456789876543210 + instance SuppressUnusedWarnings Foo14Sym0 where + suppressUnusedWarnings = snd ((,) Foo14Sym0KindInference ()) + type Foo14Sym1 :: Nat -> (Nat, Nat) + type family Foo14Sym1 (a0123456789876543210 :: Nat) :: (Nat, + Nat) where + Foo14Sym1 a0123456789876543210 = Foo14 a0123456789876543210 + type Foo13_Sym0 :: (~>) a a + data Foo13_Sym0 :: (~>) a a + where + Foo13_Sym0KindInference :: SameKind (Apply Foo13_Sym0 arg) (Foo13_Sym1 arg) => + Foo13_Sym0 a0123456789876543210 + type instance Apply Foo13_Sym0 a0123456789876543210 = Foo13_ a0123456789876543210 + instance SuppressUnusedWarnings Foo13_Sym0 where + suppressUnusedWarnings = snd ((,) Foo13_Sym0KindInference ()) + type Foo13_Sym1 :: a -> a + type family Foo13_Sym1 (a0123456789876543210 :: a) :: a where + Foo13_Sym1 a0123456789876543210 = Foo13_ a0123456789876543210 + type Foo13Sym0 :: forall a. (~>) a a + data Foo13Sym0 :: (~>) a a + where + Foo13Sym0KindInference :: SameKind (Apply Foo13Sym0 arg) (Foo13Sym1 arg) => + Foo13Sym0 a0123456789876543210 + type instance Apply Foo13Sym0 a0123456789876543210 = Foo13 a0123456789876543210 + instance SuppressUnusedWarnings Foo13Sym0 where + suppressUnusedWarnings = snd ((,) Foo13Sym0KindInference ()) + type Foo13Sym1 :: forall a. a -> a + type family Foo13Sym1 (a0123456789876543210 :: a) :: a where + Foo13Sym1 a0123456789876543210 = Foo13 a0123456789876543210 + type Foo12Sym0 :: (~>) Nat Nat + data Foo12Sym0 :: (~>) Nat Nat + where + Foo12Sym0KindInference :: SameKind (Apply Foo12Sym0 arg) (Foo12Sym1 arg) => + Foo12Sym0 a0123456789876543210 + type instance Apply Foo12Sym0 a0123456789876543210 = Foo12 a0123456789876543210 + instance SuppressUnusedWarnings Foo12Sym0 where + suppressUnusedWarnings = snd ((,) Foo12Sym0KindInference ()) + type Foo12Sym1 :: Nat -> Nat + type family Foo12Sym1 (a0123456789876543210 :: Nat) :: Nat where + Foo12Sym1 a0123456789876543210 = Foo12 a0123456789876543210 + type Foo11Sym0 :: (~>) Nat Nat + data Foo11Sym0 :: (~>) Nat Nat + where + Foo11Sym0KindInference :: SameKind (Apply Foo11Sym0 arg) (Foo11Sym1 arg) => + Foo11Sym0 a0123456789876543210 + type instance Apply Foo11Sym0 a0123456789876543210 = Foo11 a0123456789876543210 + instance SuppressUnusedWarnings Foo11Sym0 where + suppressUnusedWarnings = snd ((,) Foo11Sym0KindInference ()) + type Foo11Sym1 :: Nat -> Nat + type family Foo11Sym1 (a0123456789876543210 :: Nat) :: Nat where + Foo11Sym1 a0123456789876543210 = Foo11 a0123456789876543210 + type Foo10Sym0 :: (~>) Nat Nat + data Foo10Sym0 :: (~>) Nat Nat + where + Foo10Sym0KindInference :: SameKind (Apply Foo10Sym0 arg) (Foo10Sym1 arg) => + Foo10Sym0 a0123456789876543210 + type instance Apply Foo10Sym0 a0123456789876543210 = Foo10 a0123456789876543210 + instance SuppressUnusedWarnings Foo10Sym0 where + suppressUnusedWarnings = snd ((,) Foo10Sym0KindInference ()) + type Foo10Sym1 :: Nat -> Nat + type family Foo10Sym1 (a0123456789876543210 :: Nat) :: Nat where + Foo10Sym1 a0123456789876543210 = Foo10 a0123456789876543210 + type Foo9Sym0 :: (~>) Nat Nat + data Foo9Sym0 :: (~>) Nat Nat + where + Foo9Sym0KindInference :: SameKind (Apply Foo9Sym0 arg) (Foo9Sym1 arg) => + Foo9Sym0 a0123456789876543210 + type instance Apply Foo9Sym0 a0123456789876543210 = Foo9 a0123456789876543210 + instance SuppressUnusedWarnings Foo9Sym0 where + suppressUnusedWarnings = snd ((,) Foo9Sym0KindInference ()) + type Foo9Sym1 :: Nat -> Nat + type family Foo9Sym1 (a0123456789876543210 :: Nat) :: Nat where + Foo9Sym1 a0123456789876543210 = Foo9 a0123456789876543210 + type Foo8Sym0 :: (~>) Nat Nat + data Foo8Sym0 :: (~>) Nat Nat + where + Foo8Sym0KindInference :: SameKind (Apply Foo8Sym0 arg) (Foo8Sym1 arg) => + Foo8Sym0 a0123456789876543210 + type instance Apply Foo8Sym0 a0123456789876543210 = Foo8 a0123456789876543210 + instance SuppressUnusedWarnings Foo8Sym0 where + suppressUnusedWarnings = snd ((,) Foo8Sym0KindInference ()) + type Foo8Sym1 :: Nat -> Nat + type family Foo8Sym1 (a0123456789876543210 :: Nat) :: Nat where + Foo8Sym1 a0123456789876543210 = Foo8 a0123456789876543210 + type Foo7Sym0 :: (~>) Nat Nat + data Foo7Sym0 :: (~>) Nat Nat + where + Foo7Sym0KindInference :: SameKind (Apply Foo7Sym0 arg) (Foo7Sym1 arg) => + Foo7Sym0 a0123456789876543210 + type instance Apply Foo7Sym0 a0123456789876543210 = Foo7 a0123456789876543210 + instance SuppressUnusedWarnings Foo7Sym0 where + suppressUnusedWarnings = snd ((,) Foo7Sym0KindInference ()) + type Foo7Sym1 :: Nat -> Nat + type family Foo7Sym1 (a0123456789876543210 :: Nat) :: Nat where + Foo7Sym1 a0123456789876543210 = Foo7 a0123456789876543210 + type Foo6Sym0 :: (~>) Nat Nat + data Foo6Sym0 :: (~>) Nat Nat + where + Foo6Sym0KindInference :: SameKind (Apply Foo6Sym0 arg) (Foo6Sym1 arg) => + Foo6Sym0 a0123456789876543210 + type instance Apply Foo6Sym0 a0123456789876543210 = Foo6 a0123456789876543210 + instance SuppressUnusedWarnings Foo6Sym0 where + suppressUnusedWarnings = snd ((,) Foo6Sym0KindInference ()) + type Foo6Sym1 :: Nat -> Nat + type family Foo6Sym1 (a0123456789876543210 :: Nat) :: Nat where + Foo6Sym1 a0123456789876543210 = Foo6 a0123456789876543210 + type Foo5Sym0 :: (~>) Nat Nat + data Foo5Sym0 :: (~>) Nat Nat + where + Foo5Sym0KindInference :: SameKind (Apply Foo5Sym0 arg) (Foo5Sym1 arg) => + Foo5Sym0 a0123456789876543210 + type instance Apply Foo5Sym0 a0123456789876543210 = Foo5 a0123456789876543210 + instance SuppressUnusedWarnings Foo5Sym0 where + suppressUnusedWarnings = snd ((,) Foo5Sym0KindInference ()) + type Foo5Sym1 :: Nat -> Nat + type family Foo5Sym1 (a0123456789876543210 :: Nat) :: Nat where + Foo5Sym1 a0123456789876543210 = Foo5 a0123456789876543210 + type Foo4Sym0 :: (~>) Nat Nat + data Foo4Sym0 :: (~>) Nat Nat + where + Foo4Sym0KindInference :: SameKind (Apply Foo4Sym0 arg) (Foo4Sym1 arg) => + Foo4Sym0 a0123456789876543210 + type instance Apply Foo4Sym0 a0123456789876543210 = Foo4 a0123456789876543210 + instance SuppressUnusedWarnings Foo4Sym0 where + suppressUnusedWarnings = snd ((,) Foo4Sym0KindInference ()) + type Foo4Sym1 :: Nat -> Nat + type family Foo4Sym1 (a0123456789876543210 :: Nat) :: Nat where + Foo4Sym1 a0123456789876543210 = Foo4 a0123456789876543210 + type Foo3Sym0 :: (~>) Nat Nat + data Foo3Sym0 :: (~>) Nat Nat + where + Foo3Sym0KindInference :: SameKind (Apply Foo3Sym0 arg) (Foo3Sym1 arg) => + Foo3Sym0 a0123456789876543210 + type instance Apply Foo3Sym0 a0123456789876543210 = Foo3 a0123456789876543210 + instance SuppressUnusedWarnings Foo3Sym0 where + suppressUnusedWarnings = snd ((,) Foo3Sym0KindInference ()) + type Foo3Sym1 :: Nat -> Nat + type family Foo3Sym1 (a0123456789876543210 :: Nat) :: Nat where + Foo3Sym1 a0123456789876543210 = Foo3 a0123456789876543210 + type Foo2Sym0 :: Nat + type family Foo2Sym0 :: Nat where + Foo2Sym0 = Foo2 + type Foo1Sym0 :: (~>) Nat Nat + data Foo1Sym0 :: (~>) Nat Nat + where + Foo1Sym0KindInference :: SameKind (Apply Foo1Sym0 arg) (Foo1Sym1 arg) => + Foo1Sym0 a0123456789876543210 + type instance Apply Foo1Sym0 a0123456789876543210 = Foo1 a0123456789876543210 + instance SuppressUnusedWarnings Foo1Sym0 where + suppressUnusedWarnings = snd ((,) Foo1Sym0KindInference ()) + type Foo1Sym1 :: Nat -> Nat + type family Foo1Sym1 (a0123456789876543210 :: Nat) :: Nat where + Foo1Sym1 a0123456789876543210 = Foo1 a0123456789876543210 + type Foo14 :: Nat -> (Nat, Nat) + type family Foo14 (a :: Nat) :: (Nat, Nat) where + Foo14 x = Apply (Apply Tuple2Sym0 (Let0123456789876543210ZSym1 x)) (Let0123456789876543210YSym1 x) + type Foo13_ :: a -> a + type family Foo13_ (a :: a) :: a where + Foo13_ y = y + type Foo13 :: forall a. a -> a + type family Foo13 (a :: a) :: a where + Foo13 x = Apply Foo13_Sym0 (Let0123456789876543210BarSym1 x) + type Foo12 :: Nat -> Nat + type family Foo12 (a :: Nat) :: Nat where + Foo12 x = Apply (Apply ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x) x) (Apply SuccSym0 (Apply SuccSym0 ZeroSym0)) + type Foo11 :: Nat -> Nat + type family Foo11 (a :: Nat) :: Nat where + Foo11 x = Apply (Apply ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x) (Apply SuccSym0 ZeroSym0)) (Let0123456789876543210ZSym1 x) + type Foo10 :: Nat -> Nat + type family Foo10 (a :: Nat) :: Nat where + Foo10 x = Apply (Apply ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x) (Apply SuccSym0 ZeroSym0)) x + type Foo9 :: Nat -> Nat + type family Foo9 (a :: Nat) :: Nat where + Foo9 x = Apply (Let0123456789876543210ZSym1 x) x + type Foo8 :: Nat -> Nat + type family Foo8 (a :: Nat) :: Nat where + Foo8 x = Let0123456789876543210ZSym1 x + type Foo7 :: Nat -> Nat + type family Foo7 (a :: Nat) :: Nat where + Foo7 x = Let0123456789876543210XSym1 x + type Foo6 :: Nat -> Nat + type family Foo6 (a :: Nat) :: Nat where + Foo6 x = Let0123456789876543210ZSym1 x + type Foo5 :: Nat -> Nat + type family Foo5 (a :: Nat) :: Nat where + Foo5 x = Apply (Let0123456789876543210FSym1 x) x + type Foo4 :: Nat -> Nat + type family Foo4 (a :: Nat) :: Nat where + Foo4 x = Apply (Let0123456789876543210FSym1 x) x + type Foo3 :: Nat -> Nat + type family Foo3 (a :: Nat) :: Nat where + Foo3 x = Let0123456789876543210YSym1 x + type Foo2 :: Nat + type family Foo2 :: Nat where + Foo2 = Let0123456789876543210ZSym0 + type Foo1 :: Nat -> Nat + type family Foo1 (a :: Nat) :: Nat where + Foo1 x = Let0123456789876543210YSym1 x + sFoo14 :: + (forall (t :: Nat). + Sing t -> Sing (Apply Foo14Sym0 t :: (Nat, Nat)) :: Type) + sFoo13_ :: + (forall (t :: a). Sing t -> Sing (Apply Foo13_Sym0 t :: a) :: Type) + sFoo13 :: + forall a (t :: a). Sing t -> Sing (Apply Foo13Sym0 t :: a) + sFoo12 :: + (forall (t :: Nat). + Sing t -> Sing (Apply Foo12Sym0 t :: Nat) :: Type) + sFoo11 :: + (forall (t :: Nat). + Sing t -> Sing (Apply Foo11Sym0 t :: Nat) :: Type) + sFoo10 :: + (forall (t :: Nat). + Sing t -> Sing (Apply Foo10Sym0 t :: Nat) :: Type) + sFoo9 :: + (forall (t :: Nat). + Sing t -> Sing (Apply Foo9Sym0 t :: Nat) :: Type) + sFoo8 :: + (forall (t :: Nat). + Sing t -> Sing (Apply Foo8Sym0 t :: Nat) :: Type) + sFoo7 :: + (forall (t :: Nat). + Sing t -> Sing (Apply Foo7Sym0 t :: Nat) :: Type) + sFoo6 :: + (forall (t :: Nat). + Sing t -> Sing (Apply Foo6Sym0 t :: Nat) :: Type) + sFoo5 :: + (forall (t :: Nat). + Sing t -> Sing (Apply Foo5Sym0 t :: Nat) :: Type) + sFoo4 :: + (forall (t :: Nat). + Sing t -> Sing (Apply Foo4Sym0 t :: Nat) :: Type) + sFoo3 :: + (forall (t :: Nat). + Sing t -> Sing (Apply Foo3Sym0 t :: Nat) :: Type) + sFoo2 :: (Sing (Foo2Sym0 :: Nat) :: Type) + sFoo1 :: + (forall (t :: Nat). + Sing t -> Sing (Apply Foo1Sym0 t :: Nat) :: Type) + sFoo14 (sX :: Sing x) + = let + sZ :: Sing @_ (Let0123456789876543210ZSym1 x) + sY :: Sing @_ (Let0123456789876543210YSym1 x) + sX_0123456789876543210 :: + Sing @_ (Let0123456789876543210X_0123456789876543210Sym1 x) + sZ + = id + @(Sing (Case_0123456789876543210 x (Let0123456789876543210X_0123456789876543210Sym1 x))) + (case sX_0123456789876543210 of + STuple2 _ (sY_0123456789876543210 :: Sing y_0123456789876543210) + -> sY_0123456789876543210) + sY + = id + @(Sing (Case_0123456789876543210 x (Let0123456789876543210X_0123456789876543210Sym1 x))) + (case sX_0123456789876543210 of + STuple2 (sY_0123456789876543210 :: Sing y_0123456789876543210) _ + -> sY_0123456789876543210) + sX_0123456789876543210 + = applySing + (applySing + (singFun2 @Tuple2Sym0 STuple2) + (applySing (singFun1 @SuccSym0 SSucc) sX)) + sX + in applySing (applySing (singFun2 @Tuple2Sym0 STuple2) sZ) sY + sFoo13_ (sY :: Sing y) = sY + sFoo13 (sX :: Sing x) + = let + sBar :: (Sing (Let0123456789876543210BarSym1 x :: a) :: Type) + sBar = sX + in applySing (singFun1 @Foo13_Sym0 sFoo13_) sBar + sFoo12 (sX :: Sing x) + = let + (%+) :: + (forall (t :: Nat) (t :: Nat). + Sing t + -> Sing t + -> Sing (Apply (Apply ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x) t) t :: Nat) :: Type) + (%+) SZero (sM :: Sing m) = sM + (%+) (SSucc (sN :: Sing n)) (sM :: Sing m) + = applySing + (singFun1 @SuccSym0 SSucc) + (applySing + (applySing (singFun2 @((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x) (%+)) sN) + sX) + in + applySing + (applySing (singFun2 @((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x) (%+)) sX) + (applySing + (singFun1 @SuccSym0 SSucc) + (applySing (singFun1 @SuccSym0 SSucc) SZero)) + sFoo11 (sX :: Sing x) + = let + sZ :: (Sing (Let0123456789876543210ZSym1 x :: Nat) :: Type) + (%+) :: + (forall (t :: Nat) (t :: Nat). + Sing t + -> Sing t + -> Sing (Apply (Apply ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x) t) t :: Nat) :: Type) + sZ = sX + (%+) SZero (sM :: Sing m) = sM + (%+) (SSucc (sN :: Sing n)) (sM :: Sing m) + = applySing + (singFun1 @SuccSym0 SSucc) + (applySing + (applySing (singFun2 @((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x) (%+)) sN) + sM) + in + applySing + (applySing + (singFun2 @((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x) (%+)) + (applySing (singFun1 @SuccSym0 SSucc) SZero)) + sZ + sFoo10 (sX :: Sing x) + = let + (%+) :: + (forall (t :: Nat) (t :: Nat). + Sing t + -> Sing t + -> Sing (Apply (Apply ((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x) t) t :: Nat) :: Type) + (%+) SZero (sM :: Sing m) = sM + (%+) (SSucc (sN :: Sing n)) (sM :: Sing m) + = applySing + (singFun1 @SuccSym0 SSucc) + (applySing + (applySing (singFun2 @((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x) (%+)) sN) + sM) + in + applySing + (applySing + (singFun2 @((<<<%%%%%%%%%%%%%%%%%%%%@#@$$) x) (%+)) + (applySing (singFun1 @SuccSym0 SSucc) SZero)) + sX + sFoo9 (sX :: Sing x) + = let + sZ :: + (forall (t :: Nat). + Sing t + -> Sing (Apply (Let0123456789876543210ZSym1 x) t :: Nat) :: Type) + sZ (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (singFun1 + @(Apply (Apply Lambda_0123456789876543210Sym0 a_0123456789876543210) x) + (\ sX -> case sX of (_ :: Sing x) -> sX)) + sA_0123456789876543210 + in applySing (singFun1 @(Let0123456789876543210ZSym1 x) sZ) sX + sFoo8 (sX :: Sing x) + = let + sZ :: (Sing (Let0123456789876543210ZSym1 x :: Nat) :: Type) + sZ + = applySing + (singFun1 + @(Apply Lambda_0123456789876543210Sym0 x) + (\ sX -> case sX of (_ :: Sing x) -> sX)) + SZero + in sZ + sFoo7 (sX :: Sing x) + = let + sX :: (Sing (Let0123456789876543210XSym1 x :: Nat) :: Type) + sX = SZero + in sX + sFoo6 (sX :: Sing x) + = let + sF :: + (forall (t :: Nat). + Sing t + -> Sing (Apply (Let0123456789876543210FSym1 x) t :: Nat) :: Type) + sF (sY :: Sing y) = applySing (singFun1 @SuccSym0 SSucc) sY in + let + sZ :: (Sing (Let0123456789876543210ZSym1 x :: Nat) :: Type) + sZ = applySing (singFun1 @(Let0123456789876543210FSym1 x) sF) sX + in sZ + sFoo5 (sX :: Sing x) + = let + sF :: + (forall (t :: Nat). + Sing t + -> Sing (Apply (Let0123456789876543210FSym1 x) t :: Nat) :: Type) + sF (sY :: Sing y) + = let + sZ :: (Sing (Let0123456789876543210ZSym2 y x :: Nat) :: Type) + sZ = applySing (singFun1 @SuccSym0 SSucc) sY + in applySing (singFun1 @SuccSym0 SSucc) sZ + in applySing (singFun1 @(Let0123456789876543210FSym1 x) sF) sX + sFoo4 (sX :: Sing x) + = let + sF :: + (forall (t :: Nat). + Sing t + -> Sing (Apply (Let0123456789876543210FSym1 x) t :: Nat) :: Type) + sF (sY :: Sing y) = applySing (singFun1 @SuccSym0 SSucc) sY + in applySing (singFun1 @(Let0123456789876543210FSym1 x) sF) sX + sFoo3 (sX :: Sing x) + = let + sY :: (Sing (Let0123456789876543210YSym1 x :: Nat) :: Type) + sY = applySing (singFun1 @SuccSym0 SSucc) sX + in sY + sFoo2 + = let + sZ :: Sing @_ Let0123456789876543210ZSym0 + sY :: Sing @_ Let0123456789876543210YSym0 + sZ = applySing (singFun1 @SuccSym0 SSucc) sY + sY = applySing (singFun1 @SuccSym0 SSucc) SZero + in sZ + sFoo1 (sX :: Sing x) + = let + sY :: (Sing (Let0123456789876543210YSym1 x :: Nat) :: Type) + sY = applySing (singFun1 @SuccSym0 SSucc) SZero + in sY + instance SingI (Foo14Sym0 :: (~>) Nat (Nat, Nat)) where + sing = singFun1 @Foo14Sym0 sFoo14 + instance SingI (Foo13_Sym0 :: (~>) a a) where + sing = singFun1 @Foo13_Sym0 sFoo13_ + instance SingI (Foo13Sym0 :: (~>) a a) where + sing = singFun1 @Foo13Sym0 sFoo13 + instance SingI (Foo12Sym0 :: (~>) Nat Nat) where + sing = singFun1 @Foo12Sym0 sFoo12 + instance SingI (Foo11Sym0 :: (~>) Nat Nat) where + sing = singFun1 @Foo11Sym0 sFoo11 + instance SingI (Foo10Sym0 :: (~>) Nat Nat) where + sing = singFun1 @Foo10Sym0 sFoo10 + instance SingI (Foo9Sym0 :: (~>) Nat Nat) where + sing = singFun1 @Foo9Sym0 sFoo9 + instance SingI (Foo8Sym0 :: (~>) Nat Nat) where + sing = singFun1 @Foo8Sym0 sFoo8 + instance SingI (Foo7Sym0 :: (~>) Nat Nat) where + sing = singFun1 @Foo7Sym0 sFoo7 + instance SingI (Foo6Sym0 :: (~>) Nat Nat) where + sing = singFun1 @Foo6Sym0 sFoo6 + instance SingI (Foo5Sym0 :: (~>) Nat Nat) where + sing = singFun1 @Foo5Sym0 sFoo5 + instance SingI (Foo4Sym0 :: (~>) Nat Nat) where + sing = singFun1 @Foo4Sym0 sFoo4 + instance SingI (Foo3Sym0 :: (~>) Nat Nat) where + sing = singFun1 @Foo3Sym0 sFoo3 + instance SingI (Foo1Sym0 :: (~>) Nat Nat) where + sing = singFun1 @Foo1Sym0 sFoo1
tests/compile-and-dump/Singletons/LetStatements.hs view
@@ -1,192 +1,192 @@-{-# OPTIONS_GHC -Wno-unused-binds -Wno-unused-matches- -Wno-name-shadowing #-}--module Singletons.LetStatements where--import Data.Singletons-import Data.Singletons.TH-import Prelude.Singletons-import Singletons.Nat--$(singletons [d|- -- type signature required for a constant- foo1 :: Nat -> Nat- foo1 x = let y :: Nat- y = Succ Zero- in y-- -- nothing in scope, no type signatures required- foo2 :: Nat- foo2 = let y = Succ Zero- z = Succ y- in z-- -- using in-scope variable- foo3 :: Nat -> Nat- foo3 x = let y :: Nat- y = Succ x- in y-- -- passing in-scope variable to a function. Tests also adding in-scope binders- -- at the call site of f- foo4 :: Nat -> Nat- foo4 x = let f :: Nat -> Nat- f y = Succ y- in f x-- -- nested lets, version 1. This could potentially be problematic.- foo5 :: Nat -> Nat- foo5 x = let f :: Nat -> Nat- f y = let z :: Nat- z = Succ y- in Succ z- in f x-- -- nested lets, version 2. This shouldn't cause any problems, so that's just a- -- sanity check.- foo6 :: Nat -> Nat- foo6 x = let f :: Nat -> Nat- f y = Succ y- in let z :: Nat- z = f x- in z-- -- name shadowing- foo7 :: Nat -> Nat- foo7 x = let x :: Nat- x = Zero- in x-- -- lambda binder in let shadows pattern-bound variable- foo8 :: Nat -> Nat- foo8 x = let z :: Nat- z = (\x -> x) Zero- in z-- -- let-declaring lambdas- foo9 :: Nat -> Nat- foo9 x = let z :: Nat -> Nat- z = (\x -> x)- in z x- -- infix declaration- foo10 :: Nat -> Nat- foo10 x = let (+) :: Nat -> Nat -> Nat- Zero + m = m- (Succ n) + m = Succ (n + m)- in (Succ Zero) + x-- -- infix call uses let-bound binder- foo11 :: Nat -> Nat- foo11 x = let (+) :: Nat -> Nat -> Nat- Zero + m = m- (Succ n) + m = Succ (n + m)- z :: Nat- z = x- in (Succ Zero) + z-- -- infix let-declaration uses in-scope variable- foo12 :: Nat -> Nat- foo12 x = let (+) :: Nat -> Nat -> Nat- Zero + m = m- (Succ n) + m = Succ (n + x)- in x + (Succ (Succ Zero))-- -- make sure that calls to functions declared outside of let don't receive- -- extra parameters with in-scope bindings. See #18.- foo13 :: forall a. a -> a- foo13 x = let bar :: a- bar = x- in foo13_ bar-- foo13_ :: a -> a- foo13_ y = y-- -- tuple patterns in let statements. See #20- foo14 :: Nat -> (Nat, Nat)- foo14 x = let (y, z) = (Succ x, x)- in (z, y)- |])--foo1a :: Proxy (Foo1 Zero)-foo1a = Proxy--foo1b :: Proxy (Succ Zero)-foo1b = foo1a--foo2a :: Proxy Foo2-foo2a = Proxy--foo2b :: Proxy (Succ (Succ Zero))-foo2b = foo2a--foo3a :: Proxy (Foo3 (Succ Zero))-foo3a = Proxy--foo3b :: Proxy (Succ (Succ Zero))-foo3b = foo3a--foo4a :: Proxy (Foo4 (Succ Zero))-foo4a = Proxy--foo4b :: Proxy (Succ (Succ Zero))-foo4b = foo4a--foo5a :: Proxy (Foo5 Zero)-foo5a = Proxy--foo5b :: Proxy (Succ (Succ Zero))-foo5b = foo5a--foo6a :: Proxy (Foo6 Zero)-foo6a = Proxy--foo6b :: Proxy (Succ Zero)-foo6b = foo6a--foo7a :: Proxy (Foo7 (Succ (Succ Zero)))-foo7a = Proxy--foo7b :: Proxy Zero-foo7b = foo7a--foo8a :: Proxy (Foo8 (Succ (Succ Zero)))-foo8a = Proxy--foo8b :: Proxy Zero-foo8b = foo8a--foo9a :: Proxy (Foo9 (Succ (Succ Zero)))-foo9a = Proxy--foo9b :: Proxy (Succ (Succ Zero))-foo9b = foo9a--foo10a :: Proxy (Foo10 (Succ (Succ Zero)))-foo10a = Proxy--foo10b :: Proxy (Succ (Succ (Succ Zero)))-foo10b = foo10a--foo11a :: Proxy (Foo11 (Succ (Succ Zero)))-foo11a = Proxy--foo11b :: Proxy (Succ (Succ (Succ Zero)))-foo11b = foo11a--foo12a :: Proxy (Foo12 (Succ (Succ (Succ Zero))))-foo12a = Proxy--foo12b :: Proxy (Succ (Succ (Succ (Succ (Succ (Succ Zero))))))-foo12b = foo12a--foo13a :: Proxy (Foo13 Zero)-foo13a = Proxy--foo13b :: Proxy Zero-foo13b = foo13a--foo14a :: Proxy (Foo14 Zero)-foo14a = Proxy--foo14b :: Proxy '(Zero, Succ Zero)-foo14b = foo14a+{-# OPTIONS_GHC -Wno-unused-binds -Wno-unused-matches + -Wno-name-shadowing #-} + +module Singletons.LetStatements where + +import Data.Singletons +import Data.Singletons.TH +import Prelude.Singletons +import Singletons.Nat + +$(singletons [d| + -- type signature required for a constant + foo1 :: Nat -> Nat + foo1 x = let y :: Nat + y = Succ Zero + in y + + -- nothing in scope, no type signatures required + foo2 :: Nat + foo2 = let y = Succ Zero + z = Succ y + in z + + -- using in-scope variable + foo3 :: Nat -> Nat + foo3 x = let y :: Nat + y = Succ x + in y + + -- passing in-scope variable to a function. Tests also adding in-scope binders + -- at the call site of f + foo4 :: Nat -> Nat + foo4 x = let f :: Nat -> Nat + f y = Succ y + in f x + + -- nested lets, version 1. This could potentially be problematic. + foo5 :: Nat -> Nat + foo5 x = let f :: Nat -> Nat + f y = let z :: Nat + z = Succ y + in Succ z + in f x + + -- nested lets, version 2. This shouldn't cause any problems, so that's just a + -- sanity check. + foo6 :: Nat -> Nat + foo6 x = let f :: Nat -> Nat + f y = Succ y + in let z :: Nat + z = f x + in z + + -- name shadowing + foo7 :: Nat -> Nat + foo7 x = let x :: Nat + x = Zero + in x + + -- lambda binder in let shadows pattern-bound variable + foo8 :: Nat -> Nat + foo8 x = let z :: Nat + z = (\x -> x) Zero + in z + + -- let-declaring lambdas + foo9 :: Nat -> Nat + foo9 x = let z :: Nat -> Nat + z = (\x -> x) + in z x + -- infix declaration + foo10 :: Nat -> Nat + foo10 x = let (+) :: Nat -> Nat -> Nat + Zero + m = m + (Succ n) + m = Succ (n + m) + in (Succ Zero) + x + + -- infix call uses let-bound binder + foo11 :: Nat -> Nat + foo11 x = let (+) :: Nat -> Nat -> Nat + Zero + m = m + (Succ n) + m = Succ (n + m) + z :: Nat + z = x + in (Succ Zero) + z + + -- infix let-declaration uses in-scope variable + foo12 :: Nat -> Nat + foo12 x = let (+) :: Nat -> Nat -> Nat + Zero + m = m + (Succ n) + m = Succ (n + x) + in x + (Succ (Succ Zero)) + + -- make sure that calls to functions declared outside of let don't receive + -- extra parameters with in-scope bindings. See #18. + foo13 :: forall a. a -> a + foo13 x = let bar :: a + bar = x + in foo13_ bar + + foo13_ :: a -> a + foo13_ y = y + + -- tuple patterns in let statements. See #20 + foo14 :: Nat -> (Nat, Nat) + foo14 x = let (y, z) = (Succ x, x) + in (z, y) + |]) + +foo1a :: Proxy (Foo1 Zero) +foo1a = Proxy + +foo1b :: Proxy (Succ Zero) +foo1b = foo1a + +foo2a :: Proxy Foo2 +foo2a = Proxy + +foo2b :: Proxy (Succ (Succ Zero)) +foo2b = foo2a + +foo3a :: Proxy (Foo3 (Succ Zero)) +foo3a = Proxy + +foo3b :: Proxy (Succ (Succ Zero)) +foo3b = foo3a + +foo4a :: Proxy (Foo4 (Succ Zero)) +foo4a = Proxy + +foo4b :: Proxy (Succ (Succ Zero)) +foo4b = foo4a + +foo5a :: Proxy (Foo5 Zero) +foo5a = Proxy + +foo5b :: Proxy (Succ (Succ Zero)) +foo5b = foo5a + +foo6a :: Proxy (Foo6 Zero) +foo6a = Proxy + +foo6b :: Proxy (Succ Zero) +foo6b = foo6a + +foo7a :: Proxy (Foo7 (Succ (Succ Zero))) +foo7a = Proxy + +foo7b :: Proxy Zero +foo7b = foo7a + +foo8a :: Proxy (Foo8 (Succ (Succ Zero))) +foo8a = Proxy + +foo8b :: Proxy Zero +foo8b = foo8a + +foo9a :: Proxy (Foo9 (Succ (Succ Zero))) +foo9a = Proxy + +foo9b :: Proxy (Succ (Succ Zero)) +foo9b = foo9a + +foo10a :: Proxy (Foo10 (Succ (Succ Zero))) +foo10a = Proxy + +foo10b :: Proxy (Succ (Succ (Succ Zero))) +foo10b = foo10a + +foo11a :: Proxy (Foo11 (Succ (Succ Zero))) +foo11a = Proxy + +foo11b :: Proxy (Succ (Succ (Succ Zero))) +foo11b = foo11a + +foo12a :: Proxy (Foo12 (Succ (Succ (Succ Zero)))) +foo12a = Proxy + +foo12b :: Proxy (Succ (Succ (Succ (Succ (Succ (Succ Zero)))))) +foo12b = foo12a + +foo13a :: Proxy (Foo13 Zero) +foo13a = Proxy + +foo13b :: Proxy Zero +foo13b = foo13a + +foo14a :: Proxy (Foo14 Zero) +foo14a = Proxy + +foo14b :: Proxy '(Zero, Succ Zero) +foo14b = foo14a
tests/compile-and-dump/Singletons/Maybe.golden view
@@ -1,183 +1,186 @@-Singletons/Maybe.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| data Maybe a- = Nothing | Just a- deriving (Eq, Show) |]- ======>- data Maybe a- = Nothing | Just a- deriving (Eq, Show)- type NothingSym0 :: forall a. Maybe a- type family NothingSym0 :: Maybe a where- NothingSym0 = Nothing- type JustSym0 :: forall a. (~>) a (Maybe a)- data JustSym0 :: (~>) a (Maybe a)- where- JustSym0KindInference :: SameKind (Apply JustSym0 arg) (JustSym1 arg) =>- JustSym0 a0123456789876543210- type instance Apply JustSym0 a0123456789876543210 = Just a0123456789876543210- instance SuppressUnusedWarnings JustSym0 where- suppressUnusedWarnings = snd (((,) JustSym0KindInference) ())- type JustSym1 :: forall a. a -> Maybe a- type family JustSym1 (a0123456789876543210 :: a) :: Maybe a where- JustSym1 a0123456789876543210 = Just a0123456789876543210- type TFHelper_0123456789876543210 :: Maybe a -> Maybe a -> Bool- type family TFHelper_0123456789876543210 (a :: Maybe a) (a :: Maybe a) :: Bool where- TFHelper_0123456789876543210 Nothing Nothing = TrueSym0- TFHelper_0123456789876543210 Nothing (Just _) = FalseSym0- TFHelper_0123456789876543210 (Just _) Nothing = FalseSym0- TFHelper_0123456789876543210 (Just a_0123456789876543210) (Just b_0123456789876543210) = Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210- type TFHelper_0123456789876543210Sym0 :: (~>) (Maybe a) ((~>) (Maybe a) Bool)- data TFHelper_0123456789876543210Sym0 :: (~>) (Maybe a) ((~>) (Maybe a) Bool)- where- TFHelper_0123456789876543210Sym0KindInference :: SameKind (Apply TFHelper_0123456789876543210Sym0 arg) (TFHelper_0123456789876543210Sym1 arg) =>- TFHelper_0123456789876543210Sym0 a0123456789876543210- type instance Apply TFHelper_0123456789876543210Sym0 a0123456789876543210 = TFHelper_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings TFHelper_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) TFHelper_0123456789876543210Sym0KindInference) ())- type TFHelper_0123456789876543210Sym1 :: Maybe a- -> (~>) (Maybe a) Bool- data TFHelper_0123456789876543210Sym1 (a0123456789876543210 :: Maybe a) :: (~>) (Maybe a) Bool- where- TFHelper_0123456789876543210Sym1KindInference :: SameKind (Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) arg) (TFHelper_0123456789876543210Sym2 a0123456789876543210 arg) =>- TFHelper_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (TFHelper_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) TFHelper_0123456789876543210Sym1KindInference) ())- type TFHelper_0123456789876543210Sym2 :: Maybe a -> Maybe a -> Bool- type family TFHelper_0123456789876543210Sym2 (a0123456789876543210 :: Maybe a) (a0123456789876543210 :: Maybe a) :: Bool where- TFHelper_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210- instance PEq (Maybe a) where- type (==) a a = Apply (Apply TFHelper_0123456789876543210Sym0 a) a- type ShowsPrec_0123456789876543210 :: GHC.Num.Natural.Natural- -> Maybe a -> GHC.Types.Symbol -> GHC.Types.Symbol- type family ShowsPrec_0123456789876543210 (a :: GHC.Num.Natural.Natural) (a :: Maybe a) (a :: GHC.Types.Symbol) :: GHC.Types.Symbol where- ShowsPrec_0123456789876543210 _ Nothing a_0123456789876543210 = Apply (Apply ShowStringSym0 "Nothing") a_0123456789876543210- ShowsPrec_0123456789876543210 p_0123456789876543210 (Just arg_0123456789876543210) a_0123456789876543210 = Apply (Apply (Apply ShowParenSym0 (Apply (Apply (>@#@$) p_0123456789876543210) (FromInteger 10))) (Apply (Apply (.@#@$) (Apply ShowStringSym0 "Just ")) (Apply (Apply ShowsPrecSym0 (FromInteger 11)) arg_0123456789876543210))) a_0123456789876543210- type ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) (Maybe a) ((~>) GHC.Types.Symbol GHC.Types.Symbol))- data ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) (Maybe a) ((~>) GHC.Types.Symbol GHC.Types.Symbol))- where- ShowsPrec_0123456789876543210Sym0KindInference :: SameKind (Apply ShowsPrec_0123456789876543210Sym0 arg) (ShowsPrec_0123456789876543210Sym1 arg) =>- ShowsPrec_0123456789876543210Sym0 a0123456789876543210- type instance Apply ShowsPrec_0123456789876543210Sym0 a0123456789876543210 = ShowsPrec_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings ShowsPrec_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym0KindInference) ())- type ShowsPrec_0123456789876543210Sym1 :: GHC.Num.Natural.Natural- -> (~>) (Maybe a) ((~>) GHC.Types.Symbol GHC.Types.Symbol)- data ShowsPrec_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Num.Natural.Natural) :: (~>) (Maybe a) ((~>) GHC.Types.Symbol GHC.Types.Symbol)- where- ShowsPrec_0123456789876543210Sym1KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 arg) =>- ShowsPrec_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym1KindInference) ())- type ShowsPrec_0123456789876543210Sym2 :: GHC.Num.Natural.Natural- -> Maybe a -> (~>) GHC.Types.Symbol GHC.Types.Symbol- data ShowsPrec_0123456789876543210Sym2 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: Maybe a) :: (~>) GHC.Types.Symbol GHC.Types.Symbol- where- ShowsPrec_0123456789876543210Sym2KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 arg) =>- ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym2KindInference) ())- type ShowsPrec_0123456789876543210Sym3 :: GHC.Num.Natural.Natural- -> Maybe a -> GHC.Types.Symbol -> GHC.Types.Symbol- type family ShowsPrec_0123456789876543210Sym3 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: Maybe a) (a0123456789876543210 :: GHC.Types.Symbol) :: GHC.Types.Symbol where- ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance PShow (Maybe a) where- type ShowsPrec a a a = Apply (Apply (Apply ShowsPrec_0123456789876543210Sym0 a) a) a- data SMaybe :: forall a. Maybe a -> Type- where- SNothing :: forall a. SMaybe (Nothing :: Maybe a)- SJust :: forall a (n :: a). (Sing n) -> SMaybe (Just n :: Maybe a)- type instance Sing @(Maybe a) = SMaybe- instance SingKind a => SingKind (Maybe a) where- type Demote (Maybe a) = Maybe (Demote a)- fromSing SNothing = Nothing- fromSing (SJust b) = Just (fromSing b)- toSing Nothing = SomeSing SNothing- toSing (Just (b :: Demote a))- = case toSing b :: SomeSing a of SomeSing c -> SomeSing (SJust c)- instance SEq a => SEq (Maybe a) where- (%==) ::- forall (t1 :: Maybe a) (t2 :: Maybe a). Sing t1- -> Sing t2- -> Sing (Apply (Apply ((==@#@$) :: TyFun (Maybe a) ((~>) (Maybe a) Bool)- -> Type) t1) t2)- (%==) SNothing SNothing = STrue- (%==) SNothing (SJust _) = SFalse- (%==) (SJust _) SNothing = SFalse- (%==)- (SJust (sA_0123456789876543210 :: Sing a_0123456789876543210))- (SJust (sB_0123456789876543210 :: Sing b_0123456789876543210))- = (applySing- ((applySing ((singFun2 @(==@#@$)) (%==))) sA_0123456789876543210))- sB_0123456789876543210- instance SShow a => SShow (Maybe a) where- sShowsPrec ::- forall (t1 :: GHC.Num.Natural.Natural)- (t2 :: Maybe a)- (t3 :: GHC.Types.Symbol). Sing t1- -> Sing t2- -> Sing t3- -> Sing (Apply (Apply (Apply (ShowsPrecSym0 :: TyFun GHC.Num.Natural.Natural ((~>) (Maybe a) ((~>) GHC.Types.Symbol GHC.Types.Symbol))- -> Type) t1) t2) t3)- sShowsPrec- _- SNothing- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "Nothing")))- sA_0123456789876543210- sShowsPrec- (sP_0123456789876543210 :: Sing p_0123456789876543210)- (SJust (sArg_0123456789876543210 :: Sing arg_0123456789876543210))- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing- ((applySing ((singFun3 @ShowParenSym0) sShowParen))- ((applySing- ((applySing ((singFun2 @(>@#@$)) (%>))) sP_0123456789876543210))- (sFromInteger (sing :: Sing 10)))))- ((applySing- ((applySing ((singFun3 @(.@#@$)) (%.)))- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "Just "))))- ((applySing- ((applySing ((singFun3 @ShowsPrecSym0) sShowsPrec))- (sFromInteger (sing :: Sing 11))))- sArg_0123456789876543210))))- sA_0123456789876543210- instance SDecide a => SDecide (Maybe a) where- (%~) SNothing SNothing = Proved Refl- (%~) SNothing (SJust _) = Disproved (\ x -> case x of {})- (%~) (SJust _) SNothing = Disproved (\ x -> case x of {})- (%~) (SJust a) (SJust b)- = case ((%~) a) b of- Proved Refl -> Proved Refl- Disproved contra- -> Disproved (\ refl -> case refl of Refl -> contra Refl)- instance SDecide a =>- Data.Type.Equality.TestEquality (SMaybe :: Maybe a -> Type) where- Data.Type.Equality.testEquality- = Data.Singletons.Decide.decideEquality- instance SDecide a =>- Data.Type.Coercion.TestCoercion (SMaybe :: Maybe a -> Type) where- Data.Type.Coercion.testCoercion- = Data.Singletons.Decide.decideCoercion- deriving instance Data.Singletons.ShowSing.ShowSing a =>- Show (SMaybe (z :: Maybe a))- instance SingI Nothing where- sing = SNothing- instance SingI n => SingI (Just (n :: a)) where- sing = SJust sing- instance SingI1 Just where- liftSing = SJust- instance SingI (JustSym0 :: (~>) a (Maybe a)) where- sing = (singFun1 @JustSym0) SJust+Singletons/Maybe.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| data Maybe a + = Nothing | Just a + deriving (Eq, Show) |] + ======> + data Maybe a + = Nothing | Just a + deriving (Eq, Show) + type NothingSym0 :: forall a. Maybe a + type family NothingSym0 :: Maybe a where + NothingSym0 = Nothing + type JustSym0 :: forall a. (~>) a (Maybe a) + data JustSym0 :: (~>) a (Maybe a) + where + JustSym0KindInference :: SameKind (Apply JustSym0 arg) (JustSym1 arg) => + JustSym0 a0123456789876543210 + type instance Apply JustSym0 a0123456789876543210 = Just a0123456789876543210 + instance SuppressUnusedWarnings JustSym0 where + suppressUnusedWarnings = snd ((,) JustSym0KindInference ()) + type JustSym1 :: forall a. a -> Maybe a + type family JustSym1 (a0123456789876543210 :: a) :: Maybe a where + JustSym1 a0123456789876543210 = Just a0123456789876543210 + type TFHelper_0123456789876543210 :: Maybe a -> Maybe a -> Bool + type family TFHelper_0123456789876543210 (a :: Maybe a) (a :: Maybe a) :: Bool where + TFHelper_0123456789876543210 Nothing Nothing = TrueSym0 + TFHelper_0123456789876543210 Nothing (Just _) = FalseSym0 + TFHelper_0123456789876543210 (Just _) Nothing = FalseSym0 + TFHelper_0123456789876543210 (Just a_0123456789876543210) (Just b_0123456789876543210) = Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210 + type TFHelper_0123456789876543210Sym0 :: (~>) (Maybe a) ((~>) (Maybe a) Bool) + data TFHelper_0123456789876543210Sym0 :: (~>) (Maybe a) ((~>) (Maybe a) Bool) + where + TFHelper_0123456789876543210Sym0KindInference :: SameKind (Apply TFHelper_0123456789876543210Sym0 arg) (TFHelper_0123456789876543210Sym1 arg) => + TFHelper_0123456789876543210Sym0 a0123456789876543210 + type instance Apply TFHelper_0123456789876543210Sym0 a0123456789876543210 = TFHelper_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings TFHelper_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) TFHelper_0123456789876543210Sym0KindInference ()) + type TFHelper_0123456789876543210Sym1 :: Maybe a + -> (~>) (Maybe a) Bool + data TFHelper_0123456789876543210Sym1 (a0123456789876543210 :: Maybe a) :: (~>) (Maybe a) Bool + where + TFHelper_0123456789876543210Sym1KindInference :: SameKind (Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) arg) (TFHelper_0123456789876543210Sym2 a0123456789876543210 arg) => + TFHelper_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (TFHelper_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) TFHelper_0123456789876543210Sym1KindInference ()) + type TFHelper_0123456789876543210Sym2 :: Maybe a -> Maybe a -> Bool + type family TFHelper_0123456789876543210Sym2 (a0123456789876543210 :: Maybe a) (a0123456789876543210 :: Maybe a) :: Bool where + TFHelper_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PEq (Maybe a) where + type (==) a a = Apply (Apply TFHelper_0123456789876543210Sym0 a) a + type ShowsPrec_0123456789876543210 :: GHC.Num.Natural.Natural + -> Maybe a -> GHC.Types.Symbol -> GHC.Types.Symbol + type family ShowsPrec_0123456789876543210 (a :: GHC.Num.Natural.Natural) (a :: Maybe a) (a :: GHC.Types.Symbol) :: GHC.Types.Symbol where + ShowsPrec_0123456789876543210 _ Nothing a_0123456789876543210 = Apply (Apply ShowStringSym0 "Nothing") a_0123456789876543210 + ShowsPrec_0123456789876543210 p_0123456789876543210 (Just arg_0123456789876543210) a_0123456789876543210 = Apply (Apply (Apply ShowParenSym0 (Apply (Apply (>@#@$) p_0123456789876543210) (FromInteger 10))) (Apply (Apply (.@#@$) (Apply ShowStringSym0 "Just ")) (Apply (Apply ShowsPrecSym0 (FromInteger 11)) arg_0123456789876543210))) a_0123456789876543210 + type ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) (Maybe a) ((~>) GHC.Types.Symbol GHC.Types.Symbol)) + data ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) (Maybe a) ((~>) GHC.Types.Symbol GHC.Types.Symbol)) + where + ShowsPrec_0123456789876543210Sym0KindInference :: SameKind (Apply ShowsPrec_0123456789876543210Sym0 arg) (ShowsPrec_0123456789876543210Sym1 arg) => + ShowsPrec_0123456789876543210Sym0 a0123456789876543210 + type instance Apply ShowsPrec_0123456789876543210Sym0 a0123456789876543210 = ShowsPrec_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings ShowsPrec_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym0KindInference ()) + type ShowsPrec_0123456789876543210Sym1 :: GHC.Num.Natural.Natural + -> (~>) (Maybe a) ((~>) GHC.Types.Symbol GHC.Types.Symbol) + data ShowsPrec_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Num.Natural.Natural) :: (~>) (Maybe a) ((~>) GHC.Types.Symbol GHC.Types.Symbol) + where + ShowsPrec_0123456789876543210Sym1KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 arg) => + ShowsPrec_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym1KindInference ()) + type ShowsPrec_0123456789876543210Sym2 :: GHC.Num.Natural.Natural + -> Maybe a -> (~>) GHC.Types.Symbol GHC.Types.Symbol + data ShowsPrec_0123456789876543210Sym2 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: Maybe a) :: (~>) GHC.Types.Symbol GHC.Types.Symbol + where + ShowsPrec_0123456789876543210Sym2KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 arg) => + ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym2KindInference ()) + type ShowsPrec_0123456789876543210Sym3 :: GHC.Num.Natural.Natural + -> Maybe a -> GHC.Types.Symbol -> GHC.Types.Symbol + type family ShowsPrec_0123456789876543210Sym3 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: Maybe a) (a0123456789876543210 :: GHC.Types.Symbol) :: GHC.Types.Symbol where + ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PShow (Maybe a) where + type ShowsPrec a a a = Apply (Apply (Apply ShowsPrec_0123456789876543210Sym0 a) a) a + data SMaybe :: forall a. Maybe a -> Type + where + SNothing :: forall a. SMaybe (Nothing :: Maybe a) + SJust :: forall a (n :: a). (Sing n) -> SMaybe (Just n :: Maybe a) + type instance Sing @(Maybe a) = SMaybe + instance SingKind a => SingKind (Maybe a) where + type Demote (Maybe a) = Maybe (Demote a) + fromSing SNothing = Nothing + fromSing (SJust b) = Just (fromSing b) + toSing Nothing = SomeSing SNothing + toSing (Just (b :: Demote a)) + = case toSing b :: SomeSing a of SomeSing c -> SomeSing (SJust c) + instance SEq a => SEq (Maybe a) where + (%==) :: + forall (t1 :: Maybe a) (t2 :: Maybe a). Sing t1 + -> Sing t2 + -> Sing (Apply (Apply ((==@#@$) :: TyFun (Maybe a) ((~>) (Maybe a) Bool) + -> Type) t1) t2) + (%==) SNothing SNothing = STrue + (%==) SNothing (SJust _) = SFalse + (%==) (SJust _) SNothing = SFalse + (%==) + (SJust (sA_0123456789876543210 :: Sing a_0123456789876543210)) + (SJust (sB_0123456789876543210 :: Sing b_0123456789876543210)) + = applySing + (applySing (singFun2 @(==@#@$) (%==)) sA_0123456789876543210) + sB_0123456789876543210 + instance SShow a => SShow (Maybe a) where + sShowsPrec :: + forall (t1 :: GHC.Num.Natural.Natural) + (t2 :: Maybe a) + (t3 :: GHC.Types.Symbol). Sing t1 + -> Sing t2 + -> Sing t3 + -> Sing (Apply (Apply (Apply (ShowsPrecSym0 :: TyFun GHC.Num.Natural.Natural ((~>) (Maybe a) ((~>) GHC.Types.Symbol GHC.Types.Symbol)) + -> Type) t1) t2) t3) + sShowsPrec + _ + SNothing + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "Nothing")) + sA_0123456789876543210 + sShowsPrec + (sP_0123456789876543210 :: Sing p_0123456789876543210) + (SJust (sArg_0123456789876543210 :: Sing arg_0123456789876543210)) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (applySing + (singFun3 @ShowParenSym0 sShowParen) + (applySing + (applySing (singFun2 @(>@#@$) (%>)) sP_0123456789876543210) + (sFromInteger (sing :: Sing 10)))) + (applySing + (applySing + (singFun3 @(.@#@$) (%.)) + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "Just "))) + (applySing + (applySing + (singFun3 @ShowsPrecSym0 sShowsPrec) + (sFromInteger (sing :: Sing 11))) + sArg_0123456789876543210))) + sA_0123456789876543210 + instance SDecide a => SDecide (Maybe a) where + (%~) SNothing SNothing = Proved Refl + (%~) SNothing (SJust _) = Disproved (\ x -> case x of {}) + (%~) (SJust _) SNothing = Disproved (\ x -> case x of {}) + (%~) (SJust a) (SJust b) + = case (%~) a b of + Proved Refl -> Proved Refl + Disproved contra + -> Disproved (\ refl -> case refl of Refl -> contra Refl) + instance SDecide a => + Data.Type.Equality.TestEquality (SMaybe :: Maybe a -> Type) where + Data.Type.Equality.testEquality + = Data.Singletons.Decide.decideEquality + instance SDecide a => + Data.Type.Coercion.TestCoercion (SMaybe :: Maybe a -> Type) where + Data.Type.Coercion.testCoercion + = Data.Singletons.Decide.decideCoercion + deriving instance Data.Singletons.ShowSing.ShowSing a => + Show (SMaybe (z :: Maybe a)) + instance SingI Nothing where + sing = SNothing + instance SingI n => SingI (Just (n :: a)) where + sing = SJust sing + instance SingI1 Just where + liftSing = SJust + instance SingI (JustSym0 :: (~>) a (Maybe a)) where + sing = singFun1 @JustSym0 SJust
tests/compile-and-dump/Singletons/Maybe.hs view
@@ -1,7 +1,7 @@-module Singletons.Maybe where--import Data.Singletons.Base.TH--$(singletons [d|- data Maybe a = Nothing | Just a deriving (Eq, Show)- |])+module Singletons.Maybe where + +import Data.Singletons.Base.TH + +$(singletons [d| + data Maybe a = Nothing | Just a deriving (Eq, Show) + |])
tests/compile-and-dump/Singletons/Nat.golden view
@@ -1,317 +1,321 @@-Singletons/Nat.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| plus :: Nat -> Nat -> Nat- plus Zero m = m- plus (Succ n) m = Succ (plus n m)- pred :: Nat -> Nat- pred Zero = Zero- pred (Succ n) = n- - data Nat- where- Zero :: Nat- Succ :: Nat -> Nat- deriving (Eq, Show, Read, Ord) |]- ======>- data Nat- where- Zero :: Nat- Succ :: Nat -> Nat- deriving (Eq, Show, Read, Ord)- plus :: Nat -> Nat -> Nat- plus Zero m = m- plus (Succ n) m = Succ ((plus n) m)- pred :: Nat -> Nat- pred Zero = Zero- pred (Succ n) = n- type ZeroSym0 :: Nat- type family ZeroSym0 :: Nat where- ZeroSym0 = Zero- type SuccSym0 :: (~>) Nat Nat- data SuccSym0 :: (~>) Nat Nat- where- SuccSym0KindInference :: SameKind (Apply SuccSym0 arg) (SuccSym1 arg) =>- SuccSym0 a0123456789876543210- type instance Apply SuccSym0 a0123456789876543210 = Succ a0123456789876543210- instance SuppressUnusedWarnings SuccSym0 where- suppressUnusedWarnings = snd (((,) SuccSym0KindInference) ())- type SuccSym1 :: Nat -> Nat- type family SuccSym1 (a0123456789876543210 :: Nat) :: Nat where- SuccSym1 a0123456789876543210 = Succ a0123456789876543210- type PredSym0 :: (~>) Nat Nat- data PredSym0 :: (~>) Nat Nat- where- PredSym0KindInference :: SameKind (Apply PredSym0 arg) (PredSym1 arg) =>- PredSym0 a0123456789876543210- type instance Apply PredSym0 a0123456789876543210 = Pred a0123456789876543210- instance SuppressUnusedWarnings PredSym0 where- suppressUnusedWarnings = snd (((,) PredSym0KindInference) ())- type PredSym1 :: Nat -> Nat- type family PredSym1 (a0123456789876543210 :: Nat) :: Nat where- PredSym1 a0123456789876543210 = Pred a0123456789876543210- type PlusSym0 :: (~>) Nat ((~>) Nat Nat)- data PlusSym0 :: (~>) Nat ((~>) Nat Nat)- where- PlusSym0KindInference :: SameKind (Apply PlusSym0 arg) (PlusSym1 arg) =>- PlusSym0 a0123456789876543210- type instance Apply PlusSym0 a0123456789876543210 = PlusSym1 a0123456789876543210- instance SuppressUnusedWarnings PlusSym0 where- suppressUnusedWarnings = snd (((,) PlusSym0KindInference) ())- type PlusSym1 :: Nat -> (~>) Nat Nat- data PlusSym1 (a0123456789876543210 :: Nat) :: (~>) Nat Nat- where- PlusSym1KindInference :: SameKind (Apply (PlusSym1 a0123456789876543210) arg) (PlusSym2 a0123456789876543210 arg) =>- PlusSym1 a0123456789876543210 a0123456789876543210- type instance Apply (PlusSym1 a0123456789876543210) a0123456789876543210 = Plus a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (PlusSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) PlusSym1KindInference) ())- type PlusSym2 :: Nat -> Nat -> Nat- type family PlusSym2 (a0123456789876543210 :: Nat) (a0123456789876543210 :: Nat) :: Nat where- PlusSym2 a0123456789876543210 a0123456789876543210 = Plus a0123456789876543210 a0123456789876543210- type Pred :: Nat -> Nat- type family Pred (a :: Nat) :: Nat where- Pred Zero = ZeroSym0- Pred (Succ n) = n- type Plus :: Nat -> Nat -> Nat- type family Plus (a :: Nat) (a :: Nat) :: Nat where- Plus Zero m = m- Plus (Succ n) m = Apply SuccSym0 (Apply (Apply PlusSym0 n) m)- type TFHelper_0123456789876543210 :: Nat -> Nat -> Bool- type family TFHelper_0123456789876543210 (a :: Nat) (a :: Nat) :: Bool where- TFHelper_0123456789876543210 Zero Zero = TrueSym0- TFHelper_0123456789876543210 Zero (Succ _) = FalseSym0- TFHelper_0123456789876543210 (Succ _) Zero = FalseSym0- TFHelper_0123456789876543210 (Succ a_0123456789876543210) (Succ b_0123456789876543210) = Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210- type TFHelper_0123456789876543210Sym0 :: (~>) Nat ((~>) Nat Bool)- data TFHelper_0123456789876543210Sym0 :: (~>) Nat ((~>) Nat Bool)- where- TFHelper_0123456789876543210Sym0KindInference :: SameKind (Apply TFHelper_0123456789876543210Sym0 arg) (TFHelper_0123456789876543210Sym1 arg) =>- TFHelper_0123456789876543210Sym0 a0123456789876543210- type instance Apply TFHelper_0123456789876543210Sym0 a0123456789876543210 = TFHelper_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings TFHelper_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) TFHelper_0123456789876543210Sym0KindInference) ())- type TFHelper_0123456789876543210Sym1 :: Nat -> (~>) Nat Bool- data TFHelper_0123456789876543210Sym1 (a0123456789876543210 :: Nat) :: (~>) Nat Bool- where- TFHelper_0123456789876543210Sym1KindInference :: SameKind (Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) arg) (TFHelper_0123456789876543210Sym2 a0123456789876543210 arg) =>- TFHelper_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (TFHelper_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) TFHelper_0123456789876543210Sym1KindInference) ())- type TFHelper_0123456789876543210Sym2 :: Nat -> Nat -> Bool- type family TFHelper_0123456789876543210Sym2 (a0123456789876543210 :: Nat) (a0123456789876543210 :: Nat) :: Bool where- TFHelper_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210- instance PEq Nat where- type (==) a a = Apply (Apply TFHelper_0123456789876543210Sym0 a) a- type ShowsPrec_0123456789876543210 :: GHC.Num.Natural.Natural- -> Nat -> GHC.Types.Symbol -> GHC.Types.Symbol- type family ShowsPrec_0123456789876543210 (a :: GHC.Num.Natural.Natural) (a :: Nat) (a :: GHC.Types.Symbol) :: GHC.Types.Symbol where- ShowsPrec_0123456789876543210 _ Zero a_0123456789876543210 = Apply (Apply ShowStringSym0 "Zero") a_0123456789876543210- ShowsPrec_0123456789876543210 p_0123456789876543210 (Succ arg_0123456789876543210) a_0123456789876543210 = Apply (Apply (Apply ShowParenSym0 (Apply (Apply (>@#@$) p_0123456789876543210) (FromInteger 10))) (Apply (Apply (.@#@$) (Apply ShowStringSym0 "Succ ")) (Apply (Apply ShowsPrecSym0 (FromInteger 11)) arg_0123456789876543210))) a_0123456789876543210- type ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) Nat ((~>) GHC.Types.Symbol GHC.Types.Symbol))- data ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) Nat ((~>) GHC.Types.Symbol GHC.Types.Symbol))- where- ShowsPrec_0123456789876543210Sym0KindInference :: SameKind (Apply ShowsPrec_0123456789876543210Sym0 arg) (ShowsPrec_0123456789876543210Sym1 arg) =>- ShowsPrec_0123456789876543210Sym0 a0123456789876543210- type instance Apply ShowsPrec_0123456789876543210Sym0 a0123456789876543210 = ShowsPrec_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings ShowsPrec_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym0KindInference) ())- type ShowsPrec_0123456789876543210Sym1 :: GHC.Num.Natural.Natural- -> (~>) Nat ((~>) GHC.Types.Symbol GHC.Types.Symbol)- data ShowsPrec_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Num.Natural.Natural) :: (~>) Nat ((~>) GHC.Types.Symbol GHC.Types.Symbol)- where- ShowsPrec_0123456789876543210Sym1KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 arg) =>- ShowsPrec_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym1KindInference) ())- type ShowsPrec_0123456789876543210Sym2 :: GHC.Num.Natural.Natural- -> Nat -> (~>) GHC.Types.Symbol GHC.Types.Symbol- data ShowsPrec_0123456789876543210Sym2 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: Nat) :: (~>) GHC.Types.Symbol GHC.Types.Symbol- where- ShowsPrec_0123456789876543210Sym2KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 arg) =>- ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym2KindInference) ())- type ShowsPrec_0123456789876543210Sym3 :: GHC.Num.Natural.Natural- -> Nat -> GHC.Types.Symbol -> GHC.Types.Symbol- type family ShowsPrec_0123456789876543210Sym3 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: Nat) (a0123456789876543210 :: GHC.Types.Symbol) :: GHC.Types.Symbol where- ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance PShow Nat where- type ShowsPrec a a a = Apply (Apply (Apply ShowsPrec_0123456789876543210Sym0 a) a) a- type Compare_0123456789876543210 :: Nat -> Nat -> Ordering- type family Compare_0123456789876543210 (a :: Nat) (a :: Nat) :: Ordering where- Compare_0123456789876543210 Zero Zero = Apply (Apply (Apply FoldlSym0 ThenCmpSym0) EQSym0) NilSym0- Compare_0123456789876543210 (Succ a_0123456789876543210) (Succ b_0123456789876543210) = Apply (Apply (Apply FoldlSym0 ThenCmpSym0) EQSym0) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) NilSym0)- Compare_0123456789876543210 Zero (Succ _) = LTSym0- Compare_0123456789876543210 (Succ _) Zero = GTSym0- type Compare_0123456789876543210Sym0 :: (~>) Nat ((~>) Nat Ordering)- data Compare_0123456789876543210Sym0 :: (~>) Nat ((~>) Nat Ordering)- where- Compare_0123456789876543210Sym0KindInference :: SameKind (Apply Compare_0123456789876543210Sym0 arg) (Compare_0123456789876543210Sym1 arg) =>- Compare_0123456789876543210Sym0 a0123456789876543210- type instance Apply Compare_0123456789876543210Sym0 a0123456789876543210 = Compare_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings Compare_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Compare_0123456789876543210Sym0KindInference) ())- type Compare_0123456789876543210Sym1 :: Nat -> (~>) Nat Ordering- data Compare_0123456789876543210Sym1 (a0123456789876543210 :: Nat) :: (~>) Nat Ordering- where- Compare_0123456789876543210Sym1KindInference :: SameKind (Apply (Compare_0123456789876543210Sym1 a0123456789876543210) arg) (Compare_0123456789876543210Sym2 a0123456789876543210 arg) =>- Compare_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (Compare_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Compare_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Compare_0123456789876543210Sym1KindInference) ())- type Compare_0123456789876543210Sym2 :: Nat -> Nat -> Ordering- type family Compare_0123456789876543210Sym2 (a0123456789876543210 :: Nat) (a0123456789876543210 :: Nat) :: Ordering where- Compare_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210- instance POrd Nat where- type Compare a a = Apply (Apply Compare_0123456789876543210Sym0 a) a- sPred ::- forall (t :: Nat). Sing t -> Sing (Apply PredSym0 t :: Nat)- sPlus ::- forall (t :: Nat) (t :: Nat). Sing t- -> Sing t -> Sing (Apply (Apply PlusSym0 t) t :: Nat)- sPred SZero = SZero- sPred (SSucc (sN :: Sing n)) = sN- sPlus SZero (sM :: Sing m) = sM- sPlus (SSucc (sN :: Sing n)) (sM :: Sing m)- = (applySing ((singFun1 @SuccSym0) SSucc))- ((applySing ((applySing ((singFun2 @PlusSym0) sPlus)) sN)) sM)- instance SingI (PredSym0 :: (~>) Nat Nat) where- sing = (singFun1 @PredSym0) sPred- instance SingI (PlusSym0 :: (~>) Nat ((~>) Nat Nat)) where- sing = (singFun2 @PlusSym0) sPlus- instance SingI d =>- SingI (PlusSym1 (d :: Nat) :: (~>) Nat Nat) where- sing = (singFun1 @(PlusSym1 (d :: Nat))) (sPlus (sing @d))- instance SingI1 (PlusSym1 :: Nat -> (~>) Nat Nat) where- liftSing (s :: Sing (d :: Nat))- = (singFun1 @(PlusSym1 (d :: Nat))) (sPlus s)- data SNat :: Nat -> Type- where- SZero :: SNat (Zero :: Nat)- SSucc :: forall (n :: Nat). (Sing n) -> SNat (Succ n :: Nat)- type instance Sing @Nat = SNat- instance SingKind Nat where- type Demote Nat = Nat- fromSing SZero = Zero- fromSing (SSucc b) = Succ (fromSing b)- toSing Zero = SomeSing SZero- toSing (Succ (b :: Demote Nat))- = case toSing b :: SomeSing Nat of SomeSing c -> SomeSing (SSucc c)- instance SEq Nat => SEq Nat where- (%==) ::- forall (t1 :: Nat) (t2 :: Nat). Sing t1- -> Sing t2- -> Sing (Apply (Apply ((==@#@$) :: TyFun Nat ((~>) Nat Bool)- -> Type) t1) t2)- (%==) SZero SZero = STrue- (%==) SZero (SSucc _) = SFalse- (%==) (SSucc _) SZero = SFalse- (%==)- (SSucc (sA_0123456789876543210 :: Sing a_0123456789876543210))- (SSucc (sB_0123456789876543210 :: Sing b_0123456789876543210))- = (applySing- ((applySing ((singFun2 @(==@#@$)) (%==))) sA_0123456789876543210))- sB_0123456789876543210- instance SShow Nat => SShow Nat where- sShowsPrec ::- forall (t1 :: GHC.Num.Natural.Natural)- (t2 :: Nat)- (t3 :: GHC.Types.Symbol). Sing t1- -> Sing t2- -> Sing t3- -> Sing (Apply (Apply (Apply (ShowsPrecSym0 :: TyFun GHC.Num.Natural.Natural ((~>) Nat ((~>) GHC.Types.Symbol GHC.Types.Symbol))- -> Type) t1) t2) t3)- sShowsPrec- _- SZero- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "Zero")))- sA_0123456789876543210- sShowsPrec- (sP_0123456789876543210 :: Sing p_0123456789876543210)- (SSucc (sArg_0123456789876543210 :: Sing arg_0123456789876543210))- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing- ((applySing ((singFun3 @ShowParenSym0) sShowParen))- ((applySing- ((applySing ((singFun2 @(>@#@$)) (%>))) sP_0123456789876543210))- (sFromInteger (sing :: Sing 10)))))- ((applySing- ((applySing ((singFun3 @(.@#@$)) (%.)))- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "Succ "))))- ((applySing- ((applySing ((singFun3 @ShowsPrecSym0) sShowsPrec))- (sFromInteger (sing :: Sing 11))))- sArg_0123456789876543210))))- sA_0123456789876543210- instance SOrd Nat => SOrd Nat where- sCompare ::- forall (t1 :: Nat) (t2 :: Nat). Sing t1- -> Sing t2- -> Sing (Apply (Apply (CompareSym0 :: TyFun Nat ((~>) Nat Ordering)- -> Type) t1) t2)- sCompare SZero SZero- = (applySing- ((applySing- ((applySing ((singFun3 @FoldlSym0) sFoldl))- ((singFun2 @ThenCmpSym0) sThenCmp)))- SEQ))- SNil- sCompare- (SSucc (sA_0123456789876543210 :: Sing a_0123456789876543210))- (SSucc (sB_0123456789876543210 :: Sing b_0123456789876543210))- = (applySing- ((applySing- ((applySing ((singFun3 @FoldlSym0) sFoldl))- ((singFun2 @ThenCmpSym0) sThenCmp)))- SEQ))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing- ((applySing ((singFun2 @CompareSym0) sCompare))- sA_0123456789876543210))- sB_0123456789876543210)))- SNil)- sCompare SZero (SSucc _) = SLT- sCompare (SSucc _) SZero = SGT- instance SDecide Nat => SDecide Nat where- (%~) SZero SZero = Proved Refl- (%~) SZero (SSucc _) = Disproved (\ x -> case x of {})- (%~) (SSucc _) SZero = Disproved (\ x -> case x of {})- (%~) (SSucc a) (SSucc b)- = case ((%~) a) b of- Proved Refl -> Proved Refl- Disproved contra- -> Disproved (\ refl -> case refl of Refl -> contra Refl)- instance SDecide Nat =>- Data.Type.Equality.TestEquality (SNat :: Nat -> Type) where- Data.Type.Equality.testEquality- = Data.Singletons.Decide.decideEquality- instance SDecide Nat =>- Data.Type.Coercion.TestCoercion (SNat :: Nat -> Type) where- Data.Type.Coercion.testCoercion- = Data.Singletons.Decide.decideCoercion- deriving instance Data.Singletons.ShowSing.ShowSing Nat =>- Show (SNat (z :: Nat))- instance SingI Zero where- sing = SZero- instance SingI n => SingI (Succ (n :: Nat)) where- sing = SSucc sing- instance SingI1 Succ where- liftSing = SSucc- instance SingI (SuccSym0 :: (~>) Nat Nat) where- sing = (singFun1 @SuccSym0) SSucc+Singletons/Nat.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| plus :: Nat -> Nat -> Nat + plus Zero m = m + plus (Succ n) m = Succ (plus n m) + pred :: Nat -> Nat + pred Zero = Zero + pred (Succ n) = n + + data Nat + where + Zero :: Nat + Succ :: Nat -> Nat + deriving (Eq, Show, Read, Ord) |] + ======> + data Nat + where + Zero :: Nat + Succ :: Nat -> Nat + deriving (Eq, Show, Read, Ord) + plus :: Nat -> Nat -> Nat + plus Zero m = m + plus (Succ n) m = Succ (plus n m) + pred :: Nat -> Nat + pred Zero = Zero + pred (Succ n) = n + type ZeroSym0 :: Nat + type family ZeroSym0 :: Nat where + ZeroSym0 = Zero + type SuccSym0 :: (~>) Nat Nat + data SuccSym0 :: (~>) Nat Nat + where + SuccSym0KindInference :: SameKind (Apply SuccSym0 arg) (SuccSym1 arg) => + SuccSym0 a0123456789876543210 + type instance Apply SuccSym0 a0123456789876543210 = Succ a0123456789876543210 + instance SuppressUnusedWarnings SuccSym0 where + suppressUnusedWarnings = snd ((,) SuccSym0KindInference ()) + type SuccSym1 :: Nat -> Nat + type family SuccSym1 (a0123456789876543210 :: Nat) :: Nat where + SuccSym1 a0123456789876543210 = Succ a0123456789876543210 + type PredSym0 :: (~>) Nat Nat + data PredSym0 :: (~>) Nat Nat + where + PredSym0KindInference :: SameKind (Apply PredSym0 arg) (PredSym1 arg) => + PredSym0 a0123456789876543210 + type instance Apply PredSym0 a0123456789876543210 = Pred a0123456789876543210 + instance SuppressUnusedWarnings PredSym0 where + suppressUnusedWarnings = snd ((,) PredSym0KindInference ()) + type PredSym1 :: Nat -> Nat + type family PredSym1 (a0123456789876543210 :: Nat) :: Nat where + PredSym1 a0123456789876543210 = Pred a0123456789876543210 + type PlusSym0 :: (~>) Nat ((~>) Nat Nat) + data PlusSym0 :: (~>) Nat ((~>) Nat Nat) + where + PlusSym0KindInference :: SameKind (Apply PlusSym0 arg) (PlusSym1 arg) => + PlusSym0 a0123456789876543210 + type instance Apply PlusSym0 a0123456789876543210 = PlusSym1 a0123456789876543210 + instance SuppressUnusedWarnings PlusSym0 where + suppressUnusedWarnings = snd ((,) PlusSym0KindInference ()) + type PlusSym1 :: Nat -> (~>) Nat Nat + data PlusSym1 (a0123456789876543210 :: Nat) :: (~>) Nat Nat + where + PlusSym1KindInference :: SameKind (Apply (PlusSym1 a0123456789876543210) arg) (PlusSym2 a0123456789876543210 arg) => + PlusSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (PlusSym1 a0123456789876543210) a0123456789876543210 = Plus a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (PlusSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) PlusSym1KindInference ()) + type PlusSym2 :: Nat -> Nat -> Nat + type family PlusSym2 (a0123456789876543210 :: Nat) (a0123456789876543210 :: Nat) :: Nat where + PlusSym2 a0123456789876543210 a0123456789876543210 = Plus a0123456789876543210 a0123456789876543210 + type Pred :: Nat -> Nat + type family Pred (a :: Nat) :: Nat where + Pred Zero = ZeroSym0 + Pred (Succ n) = n + type Plus :: Nat -> Nat -> Nat + type family Plus (a :: Nat) (a :: Nat) :: Nat where + Plus Zero m = m + Plus (Succ n) m = Apply SuccSym0 (Apply (Apply PlusSym0 n) m) + type TFHelper_0123456789876543210 :: Nat -> Nat -> Bool + type family TFHelper_0123456789876543210 (a :: Nat) (a :: Nat) :: Bool where + TFHelper_0123456789876543210 Zero Zero = TrueSym0 + TFHelper_0123456789876543210 Zero (Succ _) = FalseSym0 + TFHelper_0123456789876543210 (Succ _) Zero = FalseSym0 + TFHelper_0123456789876543210 (Succ a_0123456789876543210) (Succ b_0123456789876543210) = Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210 + type TFHelper_0123456789876543210Sym0 :: (~>) Nat ((~>) Nat Bool) + data TFHelper_0123456789876543210Sym0 :: (~>) Nat ((~>) Nat Bool) + where + TFHelper_0123456789876543210Sym0KindInference :: SameKind (Apply TFHelper_0123456789876543210Sym0 arg) (TFHelper_0123456789876543210Sym1 arg) => + TFHelper_0123456789876543210Sym0 a0123456789876543210 + type instance Apply TFHelper_0123456789876543210Sym0 a0123456789876543210 = TFHelper_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings TFHelper_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) TFHelper_0123456789876543210Sym0KindInference ()) + type TFHelper_0123456789876543210Sym1 :: Nat -> (~>) Nat Bool + data TFHelper_0123456789876543210Sym1 (a0123456789876543210 :: Nat) :: (~>) Nat Bool + where + TFHelper_0123456789876543210Sym1KindInference :: SameKind (Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) arg) (TFHelper_0123456789876543210Sym2 a0123456789876543210 arg) => + TFHelper_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (TFHelper_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) TFHelper_0123456789876543210Sym1KindInference ()) + type TFHelper_0123456789876543210Sym2 :: Nat -> Nat -> Bool + type family TFHelper_0123456789876543210Sym2 (a0123456789876543210 :: Nat) (a0123456789876543210 :: Nat) :: Bool where + TFHelper_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PEq Nat where + type (==) a a = Apply (Apply TFHelper_0123456789876543210Sym0 a) a + type ShowsPrec_0123456789876543210 :: GHC.Num.Natural.Natural + -> Nat -> GHC.Types.Symbol -> GHC.Types.Symbol + type family ShowsPrec_0123456789876543210 (a :: GHC.Num.Natural.Natural) (a :: Nat) (a :: GHC.Types.Symbol) :: GHC.Types.Symbol where + ShowsPrec_0123456789876543210 _ Zero a_0123456789876543210 = Apply (Apply ShowStringSym0 "Zero") a_0123456789876543210 + ShowsPrec_0123456789876543210 p_0123456789876543210 (Succ arg_0123456789876543210) a_0123456789876543210 = Apply (Apply (Apply ShowParenSym0 (Apply (Apply (>@#@$) p_0123456789876543210) (FromInteger 10))) (Apply (Apply (.@#@$) (Apply ShowStringSym0 "Succ ")) (Apply (Apply ShowsPrecSym0 (FromInteger 11)) arg_0123456789876543210))) a_0123456789876543210 + type ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) Nat ((~>) GHC.Types.Symbol GHC.Types.Symbol)) + data ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) Nat ((~>) GHC.Types.Symbol GHC.Types.Symbol)) + where + ShowsPrec_0123456789876543210Sym0KindInference :: SameKind (Apply ShowsPrec_0123456789876543210Sym0 arg) (ShowsPrec_0123456789876543210Sym1 arg) => + ShowsPrec_0123456789876543210Sym0 a0123456789876543210 + type instance Apply ShowsPrec_0123456789876543210Sym0 a0123456789876543210 = ShowsPrec_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings ShowsPrec_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym0KindInference ()) + type ShowsPrec_0123456789876543210Sym1 :: GHC.Num.Natural.Natural + -> (~>) Nat ((~>) GHC.Types.Symbol GHC.Types.Symbol) + data ShowsPrec_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Num.Natural.Natural) :: (~>) Nat ((~>) GHC.Types.Symbol GHC.Types.Symbol) + where + ShowsPrec_0123456789876543210Sym1KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 arg) => + ShowsPrec_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym1KindInference ()) + type ShowsPrec_0123456789876543210Sym2 :: GHC.Num.Natural.Natural + -> Nat -> (~>) GHC.Types.Symbol GHC.Types.Symbol + data ShowsPrec_0123456789876543210Sym2 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: Nat) :: (~>) GHC.Types.Symbol GHC.Types.Symbol + where + ShowsPrec_0123456789876543210Sym2KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 arg) => + ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym2KindInference ()) + type ShowsPrec_0123456789876543210Sym3 :: GHC.Num.Natural.Natural + -> Nat -> GHC.Types.Symbol -> GHC.Types.Symbol + type family ShowsPrec_0123456789876543210Sym3 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: Nat) (a0123456789876543210 :: GHC.Types.Symbol) :: GHC.Types.Symbol where + ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PShow Nat where + type ShowsPrec a a a = Apply (Apply (Apply ShowsPrec_0123456789876543210Sym0 a) a) a + type Compare_0123456789876543210 :: Nat -> Nat -> Ordering + type family Compare_0123456789876543210 (a :: Nat) (a :: Nat) :: Ordering where + Compare_0123456789876543210 Zero Zero = Apply (Apply (Apply FoldlSym0 (<>@#@$)) EQSym0) NilSym0 + Compare_0123456789876543210 (Succ a_0123456789876543210) (Succ b_0123456789876543210) = Apply (Apply (Apply FoldlSym0 (<>@#@$)) EQSym0) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) NilSym0) + Compare_0123456789876543210 Zero (Succ _) = LTSym0 + Compare_0123456789876543210 (Succ _) Zero = GTSym0 + type Compare_0123456789876543210Sym0 :: (~>) Nat ((~>) Nat Ordering) + data Compare_0123456789876543210Sym0 :: (~>) Nat ((~>) Nat Ordering) + where + Compare_0123456789876543210Sym0KindInference :: SameKind (Apply Compare_0123456789876543210Sym0 arg) (Compare_0123456789876543210Sym1 arg) => + Compare_0123456789876543210Sym0 a0123456789876543210 + type instance Apply Compare_0123456789876543210Sym0 a0123456789876543210 = Compare_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Compare_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Compare_0123456789876543210Sym0KindInference ()) + type Compare_0123456789876543210Sym1 :: Nat -> (~>) Nat Ordering + data Compare_0123456789876543210Sym1 (a0123456789876543210 :: Nat) :: (~>) Nat Ordering + where + Compare_0123456789876543210Sym1KindInference :: SameKind (Apply (Compare_0123456789876543210Sym1 a0123456789876543210) arg) (Compare_0123456789876543210Sym2 a0123456789876543210 arg) => + Compare_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (Compare_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Compare_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Compare_0123456789876543210Sym1KindInference ()) + type Compare_0123456789876543210Sym2 :: Nat -> Nat -> Ordering + type family Compare_0123456789876543210Sym2 (a0123456789876543210 :: Nat) (a0123456789876543210 :: Nat) :: Ordering where + Compare_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance POrd Nat where + type Compare a a = Apply (Apply Compare_0123456789876543210Sym0 a) a + sPred :: + (forall (t :: Nat). + Sing t -> Sing (Apply PredSym0 t :: Nat) :: Type) + sPlus :: + (forall (t :: Nat) (t :: Nat). + Sing t + -> Sing t -> Sing (Apply (Apply PlusSym0 t) t :: Nat) :: Type) + sPred SZero = SZero + sPred (SSucc (sN :: Sing n)) = sN + sPlus SZero (sM :: Sing m) = sM + sPlus (SSucc (sN :: Sing n)) (sM :: Sing m) + = applySing + (singFun1 @SuccSym0 SSucc) + (applySing (applySing (singFun2 @PlusSym0 sPlus) sN) sM) + instance SingI (PredSym0 :: (~>) Nat Nat) where + sing = singFun1 @PredSym0 sPred + instance SingI (PlusSym0 :: (~>) Nat ((~>) Nat Nat)) where + sing = singFun2 @PlusSym0 sPlus + instance SingI d => + SingI (PlusSym1 (d :: Nat) :: (~>) Nat Nat) where + sing = singFun1 @(PlusSym1 (d :: Nat)) (sPlus (sing @d)) + instance SingI1 (PlusSym1 :: Nat -> (~>) Nat Nat) where + liftSing (s :: Sing (d :: Nat)) + = singFun1 @(PlusSym1 (d :: Nat)) (sPlus s) + data SNat :: Nat -> Type + where + SZero :: SNat (Zero :: Nat) + SSucc :: forall (n :: Nat). (Sing n) -> SNat (Succ n :: Nat) + type instance Sing @Nat = SNat + instance SingKind Nat where + type Demote Nat = Nat + fromSing SZero = Zero + fromSing (SSucc b) = Succ (fromSing b) + toSing Zero = SomeSing SZero + toSing (Succ (b :: Demote Nat)) + = case toSing b :: SomeSing Nat of SomeSing c -> SomeSing (SSucc c) + instance SEq Nat => SEq Nat where + (%==) :: + forall (t1 :: Nat) (t2 :: Nat). Sing t1 + -> Sing t2 + -> Sing (Apply (Apply ((==@#@$) :: TyFun Nat ((~>) Nat Bool) + -> Type) t1) t2) + (%==) SZero SZero = STrue + (%==) SZero (SSucc _) = SFalse + (%==) (SSucc _) SZero = SFalse + (%==) + (SSucc (sA_0123456789876543210 :: Sing a_0123456789876543210)) + (SSucc (sB_0123456789876543210 :: Sing b_0123456789876543210)) + = applySing + (applySing (singFun2 @(==@#@$) (%==)) sA_0123456789876543210) + sB_0123456789876543210 + instance SShow Nat => SShow Nat where + sShowsPrec :: + forall (t1 :: GHC.Num.Natural.Natural) + (t2 :: Nat) + (t3 :: GHC.Types.Symbol). Sing t1 + -> Sing t2 + -> Sing t3 + -> Sing (Apply (Apply (Apply (ShowsPrecSym0 :: TyFun GHC.Num.Natural.Natural ((~>) Nat ((~>) GHC.Types.Symbol GHC.Types.Symbol)) + -> Type) t1) t2) t3) + sShowsPrec + _ + SZero + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "Zero")) + sA_0123456789876543210 + sShowsPrec + (sP_0123456789876543210 :: Sing p_0123456789876543210) + (SSucc (sArg_0123456789876543210 :: Sing arg_0123456789876543210)) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (applySing + (singFun3 @ShowParenSym0 sShowParen) + (applySing + (applySing (singFun2 @(>@#@$) (%>)) sP_0123456789876543210) + (sFromInteger (sing :: Sing 10)))) + (applySing + (applySing + (singFun3 @(.@#@$) (%.)) + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "Succ "))) + (applySing + (applySing + (singFun3 @ShowsPrecSym0 sShowsPrec) + (sFromInteger (sing :: Sing 11))) + sArg_0123456789876543210))) + sA_0123456789876543210 + instance SOrd Nat => SOrd Nat where + sCompare :: + forall (t1 :: Nat) (t2 :: Nat). Sing t1 + -> Sing t2 + -> Sing (Apply (Apply (CompareSym0 :: TyFun Nat ((~>) Nat Ordering) + -> Type) t1) t2) + sCompare SZero SZero + = applySing + (applySing + (applySing (singFun3 @FoldlSym0 sFoldl) (singFun2 @(<>@#@$) (%<>))) + SEQ) + SNil + sCompare + (SSucc (sA_0123456789876543210 :: Sing a_0123456789876543210)) + (SSucc (sB_0123456789876543210 :: Sing b_0123456789876543210)) + = applySing + (applySing + (applySing (singFun3 @FoldlSym0 sFoldl) (singFun2 @(<>@#@$) (%<>))) + SEQ) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing + (applySing (singFun2 @CompareSym0 sCompare) sA_0123456789876543210) + sB_0123456789876543210)) + SNil) + sCompare SZero (SSucc _) = SLT + sCompare (SSucc _) SZero = SGT + instance SDecide Nat => SDecide Nat where + (%~) SZero SZero = Proved Refl + (%~) SZero (SSucc _) = Disproved (\ x -> case x of {}) + (%~) (SSucc _) SZero = Disproved (\ x -> case x of {}) + (%~) (SSucc a) (SSucc b) + = case (%~) a b of + Proved Refl -> Proved Refl + Disproved contra + -> Disproved (\ refl -> case refl of Refl -> contra Refl) + instance SDecide Nat => + Data.Type.Equality.TestEquality (SNat :: Nat -> Type) where + Data.Type.Equality.testEquality + = Data.Singletons.Decide.decideEquality + instance SDecide Nat => + Data.Type.Coercion.TestCoercion (SNat :: Nat -> Type) where + Data.Type.Coercion.testCoercion + = Data.Singletons.Decide.decideCoercion + deriving instance Data.Singletons.ShowSing.ShowSing Nat => + Show (SNat (z :: Nat)) + instance SingI Zero where + sing = SZero + instance SingI n => SingI (Succ (n :: Nat)) where + sing = SSucc sing + instance SingI1 Succ where + liftSing = SSucc + instance SingI (SuccSym0 :: (~>) Nat Nat) where + sing = singFun1 @SuccSym0 SSucc
tests/compile-and-dump/Singletons/Nat.hs view
@@ -1,18 +1,18 @@-module Singletons.Nat where--import Data.Singletons.Base.TH--$(singletons [d|- data Nat where- Zero :: Nat- Succ :: Nat -> Nat- deriving (Eq, Show, Read, Ord)-- plus :: Nat -> Nat -> Nat- plus Zero m = m- plus (Succ n) m = Succ (plus n m)-- pred :: Nat -> Nat- pred Zero = Zero- pred (Succ n) = n- |])+module Singletons.Nat where + +import Data.Singletons.Base.TH + +$(singletons [d| + data Nat where + Zero :: Nat + Succ :: Nat -> Nat + deriving (Eq, Show, Read, Ord) + + plus :: Nat -> Nat -> Nat + plus Zero m = m + plus (Succ n) m = Succ (plus n m) + + pred :: Nat -> Nat + pred Zero = Zero + pred (Succ n) = n + |])
tests/compile-and-dump/Singletons/NatSymbolReflexive.hs view
@@ -1,11 +1,11 @@-module NatSymbolReflexive where--import Data.Type.Equality ((:~:)(..))-import GHC.TypeLits-import Prelude.Singletons--test1 :: forall (a :: Natural). Sing a -> (a == a) :~: True-test1 _ = Refl--test2 :: forall (a :: Symbol). Sing a -> (a == a) :~: True-test2 _ = Refl+module NatSymbolReflexive where + +import Data.Type.Equality ((:~:)(..)) +import GHC.TypeLits +import Prelude.Singletons + +test1 :: forall (a :: Natural). Sing a -> (a == a) :~: True +test1 _ = Refl + +test2 :: forall (a :: Symbol). Sing a -> (a == a) :~: True +test2 _ = Refl
tests/compile-and-dump/Singletons/Natural.golden view
@@ -1,78 +1,80 @@-Singletons/Natural.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| addAge :: Age -> Age -> Age- addAge (MkAge (x :: Natural)) (MkAge (y :: Natural))- = MkAge (x + y :: Natural)- - newtype Age = MkAge Natural |]- ======>- newtype Age = MkAge Natural- addAge :: Age -> Age -> Age- addAge (MkAge (x :: Natural)) (MkAge (y :: Natural))- = MkAge ((x + y) :: Natural)- type MkAgeSym0 :: (~>) Natural Age- data MkAgeSym0 :: (~>) Natural Age- where- MkAgeSym0KindInference :: SameKind (Apply MkAgeSym0 arg) (MkAgeSym1 arg) =>- MkAgeSym0 a0123456789876543210- type instance Apply MkAgeSym0 a0123456789876543210 = MkAge a0123456789876543210- instance SuppressUnusedWarnings MkAgeSym0 where- suppressUnusedWarnings = snd (((,) MkAgeSym0KindInference) ())- type MkAgeSym1 :: Natural -> Age- type family MkAgeSym1 (a0123456789876543210 :: Natural) :: Age where- MkAgeSym1 a0123456789876543210 = MkAge a0123456789876543210- type AddAgeSym0 :: (~>) Age ((~>) Age Age)- data AddAgeSym0 :: (~>) Age ((~>) Age Age)- where- AddAgeSym0KindInference :: SameKind (Apply AddAgeSym0 arg) (AddAgeSym1 arg) =>- AddAgeSym0 a0123456789876543210- type instance Apply AddAgeSym0 a0123456789876543210 = AddAgeSym1 a0123456789876543210- instance SuppressUnusedWarnings AddAgeSym0 where- suppressUnusedWarnings = snd (((,) AddAgeSym0KindInference) ())- type AddAgeSym1 :: Age -> (~>) Age Age- data AddAgeSym1 (a0123456789876543210 :: Age) :: (~>) Age Age- where- AddAgeSym1KindInference :: SameKind (Apply (AddAgeSym1 a0123456789876543210) arg) (AddAgeSym2 a0123456789876543210 arg) =>- AddAgeSym1 a0123456789876543210 a0123456789876543210- type instance Apply (AddAgeSym1 a0123456789876543210) a0123456789876543210 = AddAge a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (AddAgeSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) AddAgeSym1KindInference) ())- type AddAgeSym2 :: Age -> Age -> Age- type family AddAgeSym2 (a0123456789876543210 :: Age) (a0123456789876543210 :: Age) :: Age where- AddAgeSym2 a0123456789876543210 a0123456789876543210 = AddAge a0123456789876543210 a0123456789876543210- type AddAge :: Age -> Age -> Age- type family AddAge (a :: Age) (a :: Age) :: Age where- AddAge (MkAge (x :: Natural)) (MkAge (y :: Natural)) = Apply MkAgeSym0 (Apply (Apply (+@#@$) x) y :: Natural)- sAddAge ::- forall (t :: Age) (t :: Age). Sing t- -> Sing t -> Sing (Apply (Apply AddAgeSym0 t) t :: Age)- sAddAge (SMkAge (sX :: Sing x)) (SMkAge (sY :: Sing y))- = case ((,) (sX :: Sing x)) (sY :: Sing y) of- (,) (_ :: Sing (x :: Natural)) (_ :: Sing (y :: Natural))- -> (applySing ((singFun1 @MkAgeSym0) SMkAge))- ((applySing ((applySing ((singFun2 @(+@#@$)) (%+))) sX)) sY ::- Sing (Apply (Apply (+@#@$) x) y :: Natural))- instance SingI (AddAgeSym0 :: (~>) Age ((~>) Age Age)) where- sing = (singFun2 @AddAgeSym0) sAddAge- instance SingI d =>- SingI (AddAgeSym1 (d :: Age) :: (~>) Age Age) where- sing = (singFun1 @(AddAgeSym1 (d :: Age))) (sAddAge (sing @d))- instance SingI1 (AddAgeSym1 :: Age -> (~>) Age Age) where- liftSing (s :: Sing (d :: Age))- = (singFun1 @(AddAgeSym1 (d :: Age))) (sAddAge s)- data SAge :: Age -> Type- where- SMkAge :: forall (n :: Natural). (Sing n) -> SAge (MkAge n :: Age)- type instance Sing @Age = SAge- instance SingKind Age where- type Demote Age = Age- fromSing (SMkAge b) = MkAge (fromSing b)- toSing (MkAge (b :: Demote Natural))- = case toSing b :: SomeSing Natural of- SomeSing c -> SomeSing (SMkAge c)- instance SingI n => SingI (MkAge (n :: Natural)) where- sing = SMkAge sing- instance SingI1 MkAge where- liftSing = SMkAge- instance SingI (MkAgeSym0 :: (~>) Natural Age) where- sing = (singFun1 @MkAgeSym0) SMkAge+Singletons/Natural.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| addAge :: Age -> Age -> Age + addAge (MkAge (x :: Natural)) (MkAge (y :: Natural)) + = MkAge (x + y :: Natural) + + newtype Age = MkAge Natural |] + ======> + newtype Age = MkAge Natural + addAge :: Age -> Age -> Age + addAge (MkAge (x :: Natural)) (MkAge (y :: Natural)) + = MkAge ((x + y) :: Natural) + type MkAgeSym0 :: (~>) Natural Age + data MkAgeSym0 :: (~>) Natural Age + where + MkAgeSym0KindInference :: SameKind (Apply MkAgeSym0 arg) (MkAgeSym1 arg) => + MkAgeSym0 a0123456789876543210 + type instance Apply MkAgeSym0 a0123456789876543210 = MkAge a0123456789876543210 + instance SuppressUnusedWarnings MkAgeSym0 where + suppressUnusedWarnings = snd ((,) MkAgeSym0KindInference ()) + type MkAgeSym1 :: Natural -> Age + type family MkAgeSym1 (a0123456789876543210 :: Natural) :: Age where + MkAgeSym1 a0123456789876543210 = MkAge a0123456789876543210 + type AddAgeSym0 :: (~>) Age ((~>) Age Age) + data AddAgeSym0 :: (~>) Age ((~>) Age Age) + where + AddAgeSym0KindInference :: SameKind (Apply AddAgeSym0 arg) (AddAgeSym1 arg) => + AddAgeSym0 a0123456789876543210 + type instance Apply AddAgeSym0 a0123456789876543210 = AddAgeSym1 a0123456789876543210 + instance SuppressUnusedWarnings AddAgeSym0 where + suppressUnusedWarnings = snd ((,) AddAgeSym0KindInference ()) + type AddAgeSym1 :: Age -> (~>) Age Age + data AddAgeSym1 (a0123456789876543210 :: Age) :: (~>) Age Age + where + AddAgeSym1KindInference :: SameKind (Apply (AddAgeSym1 a0123456789876543210) arg) (AddAgeSym2 a0123456789876543210 arg) => + AddAgeSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (AddAgeSym1 a0123456789876543210) a0123456789876543210 = AddAge a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (AddAgeSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) AddAgeSym1KindInference ()) + type AddAgeSym2 :: Age -> Age -> Age + type family AddAgeSym2 (a0123456789876543210 :: Age) (a0123456789876543210 :: Age) :: Age where + AddAgeSym2 a0123456789876543210 a0123456789876543210 = AddAge a0123456789876543210 a0123456789876543210 + type AddAge :: Age -> Age -> Age + type family AddAge (a :: Age) (a :: Age) :: Age where + AddAge (MkAge (x :: Natural)) (MkAge (y :: Natural)) = Apply MkAgeSym0 (Apply (Apply (+@#@$) x) y :: Natural) + sAddAge :: + (forall (t :: Age) (t :: Age). + Sing t + -> Sing t -> Sing (Apply (Apply AddAgeSym0 t) t :: Age) :: Type) + sAddAge (SMkAge (sX :: Sing x)) (SMkAge (sY :: Sing y)) + = case (,) (sX :: Sing x) (sY :: Sing y) of + (,) (_ :: Sing (x :: Natural)) (_ :: Sing (y :: Natural)) + -> applySing + (singFun1 @MkAgeSym0 SMkAge) + (applySing (applySing (singFun2 @(+@#@$) (%+)) sX) sY :: + Sing (Apply (Apply (+@#@$) x) y :: Natural)) + instance SingI (AddAgeSym0 :: (~>) Age ((~>) Age Age)) where + sing = singFun2 @AddAgeSym0 sAddAge + instance SingI d => + SingI (AddAgeSym1 (d :: Age) :: (~>) Age Age) where + sing = singFun1 @(AddAgeSym1 (d :: Age)) (sAddAge (sing @d)) + instance SingI1 (AddAgeSym1 :: Age -> (~>) Age Age) where + liftSing (s :: Sing (d :: Age)) + = singFun1 @(AddAgeSym1 (d :: Age)) (sAddAge s) + data SAge :: Age -> Type + where + SMkAge :: forall (n :: Natural). (Sing n) -> SAge (MkAge n :: Age) + type instance Sing @Age = SAge + instance SingKind Age where + type Demote Age = Age + fromSing (SMkAge b) = MkAge (fromSing b) + toSing (MkAge (b :: Demote Natural)) + = case toSing b :: SomeSing Natural of + SomeSing c -> SomeSing (SMkAge c) + instance SingI n => SingI (MkAge (n :: Natural)) where + sing = SMkAge sing + instance SingI1 MkAge where + liftSing = SMkAge + instance SingI (MkAgeSym0 :: (~>) Natural Age) where + sing = singFun1 @MkAgeSym0 SMkAge
tests/compile-and-dump/Singletons/Natural.hs view
@@ -1,13 +1,13 @@-module Singletons.Natural where--import Data.Singletons.TH-import Numeric.Natural (Natural)-import Prelude.Singletons--$(singletons [d|- newtype Age = MkAge Natural-- addAge :: Age -> Age -> Age- addAge (MkAge (x :: Natural)) (MkAge (y :: Natural)) =- MkAge (x + y :: Natural)- |])+module Singletons.Natural where + +import Data.Singletons.TH +import Numeric.Natural (Natural) +import Prelude.Singletons + +$(singletons [d| + newtype Age = MkAge Natural + + addAge :: Age -> Age -> Age + addAge (MkAge (x :: Natural)) (MkAge (y :: Natural)) = + MkAge (x + y :: Natural) + |])
tests/compile-and-dump/Singletons/NegativeLiterals.golden view
@@ -1,21 +1,21 @@-Singletons/NegativeLiterals.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| f :: Natural- f = -1 |]- ======>- f :: Natural- f = (-1)- type FSym0 :: Natural- type family FSym0 :: Natural where- FSym0 = F- type F :: Natural- type family F :: Natural where- F = Negate (FromInteger 1)- sF :: Sing (FSym0 :: Natural)- sF = sNegate (sFromInteger (sing :: Sing 1))--Singletons/NegativeLiterals.hs:0:0: warning: [-Woverflowed-literals]- Literal -1 is negative but Natural only supports positive numbers- |-8 | $(singletons [d|- | ^^^^^^^^^^^^^^^...+Singletons/NegativeLiterals.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| f :: Natural + f = -1 |] + ======> + f :: Natural + f = (-1) + type FSym0 :: Natural + type family FSym0 :: Natural where + FSym0 = F + type F :: Natural + type family F :: Natural where + F = Negate (FromInteger 1) + sF :: (Sing (FSym0 :: Natural) :: Type) + sF = sNegate (sFromInteger (sing :: Sing 1)) + +Singletons/NegativeLiterals.hs:0:0: warning: [GHC-97441] [-Woverflowed-literals] + Literal -1 is negative but Natural only supports positive numbers + | +8 | $(singletons [d| + | ^^^^^^^^^^^^^^^...
tests/compile-and-dump/Singletons/NegativeLiterals.hs view
@@ -1,11 +1,11 @@-{-# LANGUAGE NegativeLiterals #-}--module Singletons.NegativeLiterals where--import Data.Singletons.Base.TH-import Numeric.Natural (Natural)--$(singletons [d|- f :: Natural- f = -1- |])+{-# LANGUAGE NegativeLiterals #-} + +module Singletons.NegativeLiterals where + +import Data.Singletons.Base.TH +import Numeric.Natural (Natural) + +$(singletons [d| + f :: Natural + f = -1 + |])
tests/compile-and-dump/Singletons/Operators.golden view
@@ -1,138 +1,139 @@-Singletons/Operators.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| child :: Foo -> Foo- child FLeaf = FLeaf- child (a :+: _) = a- (+) :: Nat -> Nat -> Nat- Zero + m = m- (Succ n) + m = Succ (n + m)- - data Foo- where- FLeaf :: Foo- (:+:) :: Foo -> Foo -> Foo |]- ======>- data Foo- where- FLeaf :: Foo- (:+:) :: Foo -> Foo -> Foo- child :: Foo -> Foo- child FLeaf = FLeaf- child (a :+: _) = a- (+) :: Nat -> Nat -> Nat- (+) Zero m = m- (+) (Succ n) m = Succ (n + m)- type FLeafSym0 :: Foo- type family FLeafSym0 :: Foo where- FLeafSym0 = FLeaf- type (:+:@#@$) :: (~>) Foo ((~>) Foo Foo)- data (:+:@#@$) :: (~>) Foo ((~>) Foo Foo)- where- (::+:@#@$###) :: SameKind (Apply (:+:@#@$) arg) ((:+:@#@$$) arg) =>- (:+:@#@$) a0123456789876543210- type instance Apply (:+:@#@$) a0123456789876543210 = (:+:@#@$$) a0123456789876543210- instance SuppressUnusedWarnings (:+:@#@$) where- suppressUnusedWarnings = snd (((,) (::+:@#@$###)) ())- type (:+:@#@$$) :: Foo -> (~>) Foo Foo- data (:+:@#@$$) (a0123456789876543210 :: Foo) :: (~>) Foo Foo- where- (::+:@#@$$###) :: SameKind (Apply ((:+:@#@$$) a0123456789876543210) arg) ((:+:@#@$$$) a0123456789876543210 arg) =>- (:+:@#@$$) a0123456789876543210 a0123456789876543210- type instance Apply ((:+:@#@$$) a0123456789876543210) a0123456789876543210 = (:+:) a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings ((:+:@#@$$) a0123456789876543210) where- suppressUnusedWarnings = snd (((,) (::+:@#@$$###)) ())- type (:+:@#@$$$) :: Foo -> Foo -> Foo- type family (:+:@#@$$$) (a0123456789876543210 :: Foo) (a0123456789876543210 :: Foo) :: Foo where- (:+:@#@$$$) a0123456789876543210 a0123456789876543210 = (:+:) a0123456789876543210 a0123456789876543210- type (+@#@$) :: (~>) Nat ((~>) Nat Nat)- data (+@#@$) :: (~>) Nat ((~>) Nat Nat)- where- (:+@#@$###) :: SameKind (Apply (+@#@$) arg) ((+@#@$$) arg) =>- (+@#@$) a0123456789876543210- type instance Apply (+@#@$) a0123456789876543210 = (+@#@$$) a0123456789876543210- instance SuppressUnusedWarnings (+@#@$) where- suppressUnusedWarnings = snd (((,) (:+@#@$###)) ())- type (+@#@$$) :: Nat -> (~>) Nat Nat- data (+@#@$$) (a0123456789876543210 :: Nat) :: (~>) Nat Nat- where- (:+@#@$$###) :: SameKind (Apply ((+@#@$$) a0123456789876543210) arg) ((+@#@$$$) a0123456789876543210 arg) =>- (+@#@$$) a0123456789876543210 a0123456789876543210- type instance Apply ((+@#@$$) a0123456789876543210) a0123456789876543210 = (+) a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings ((+@#@$$) a0123456789876543210) where- suppressUnusedWarnings = snd (((,) (:+@#@$$###)) ())- type (+@#@$$$) :: Nat -> Nat -> Nat- type family (+@#@$$$) (a0123456789876543210 :: Nat) (a0123456789876543210 :: Nat) :: Nat where- (+@#@$$$) a0123456789876543210 a0123456789876543210 = (+) a0123456789876543210 a0123456789876543210- type ChildSym0 :: (~>) Foo Foo- data ChildSym0 :: (~>) Foo Foo- where- ChildSym0KindInference :: SameKind (Apply ChildSym0 arg) (ChildSym1 arg) =>- ChildSym0 a0123456789876543210- type instance Apply ChildSym0 a0123456789876543210 = Child a0123456789876543210- instance SuppressUnusedWarnings ChildSym0 where- suppressUnusedWarnings = snd (((,) ChildSym0KindInference) ())- type ChildSym1 :: Foo -> Foo- type family ChildSym1 (a0123456789876543210 :: Foo) :: Foo where- ChildSym1 a0123456789876543210 = Child a0123456789876543210- type (+) :: Nat -> Nat -> Nat- type family (+) (a :: Nat) (a :: Nat) :: Nat where- (+) 'Zero m = m- (+) ('Succ n) m = Apply SuccSym0 (Apply (Apply (+@#@$) n) m)- type Child :: Foo -> Foo- type family Child (a :: Foo) :: Foo where- Child FLeaf = FLeafSym0- Child ((:+:) a _) = a- (%+) ::- forall (t :: Nat) (t :: Nat). Sing t- -> Sing t -> Sing (Apply (Apply (+@#@$) t) t :: Nat)- sChild ::- forall (t :: Foo). Sing t -> Sing (Apply ChildSym0 t :: Foo)- (%+) SZero (sM :: Sing m) = sM- (%+) (SSucc (sN :: Sing n)) (sM :: Sing m)- = (applySing ((singFun1 @SuccSym0) SSucc))- ((applySing ((applySing ((singFun2 @(+@#@$)) (%+))) sN)) sM)- sChild SFLeaf = SFLeaf- sChild ((:%+:) (sA :: Sing a) _) = sA- instance SingI ((+@#@$) :: (~>) Nat ((~>) Nat Nat)) where- sing = (singFun2 @(+@#@$)) (%+)- instance SingI d =>- SingI ((+@#@$$) (d :: Nat) :: (~>) Nat Nat) where- sing = (singFun1 @((+@#@$$) (d :: Nat))) ((%+) (sing @d))- instance SingI1 ((+@#@$$) :: Nat -> (~>) Nat Nat) where- liftSing (s :: Sing (d :: Nat))- = (singFun1 @((+@#@$$) (d :: Nat))) ((%+) s)- instance SingI (ChildSym0 :: (~>) Foo Foo) where- sing = (singFun1 @ChildSym0) sChild- data SFoo :: Foo -> Type- where- SFLeaf :: SFoo (FLeaf :: Foo)- (:%+:) :: forall (n :: Foo) (n :: Foo).- (Sing n) -> (Sing n) -> SFoo ((:+:) n n :: Foo)- type instance Sing @Foo = SFoo- instance SingKind Foo where- type Demote Foo = Foo- fromSing SFLeaf = FLeaf- fromSing ((:%+:) b b) = ((:+:) (fromSing b)) (fromSing b)- toSing FLeaf = SomeSing SFLeaf- toSing ((:+:) (b :: Demote Foo) (b :: Demote Foo))- = case- ((,) (toSing b :: SomeSing Foo)) (toSing b :: SomeSing Foo)- of- (,) (SomeSing c) (SomeSing c) -> SomeSing (((:%+:) c) c)- instance SingI FLeaf where- sing = SFLeaf- instance (SingI n, SingI n) =>- SingI ((:+:) (n :: Foo) (n :: Foo)) where- sing = ((:%+:) sing) sing- instance SingI n => SingI1 ((:+:) (n :: Foo)) where- liftSing = (:%+:) sing- instance SingI2 (:+:) where- liftSing2 = (:%+:)- instance SingI ((:+:@#@$) :: (~>) Foo ((~>) Foo Foo)) where- sing = (singFun2 @(:+:@#@$)) (:%+:)- instance SingI d =>- SingI ((:+:@#@$$) (d :: Foo) :: (~>) Foo Foo) where- sing = (singFun1 @((:+:@#@$$) (d :: Foo))) ((:%+:) (sing @d))- instance SingI1 ((:+:@#@$$) :: Foo -> (~>) Foo Foo) where- liftSing (s :: Sing (d :: Foo))- = (singFun1 @((:+:@#@$$) (d :: Foo))) ((:%+:) s)+Singletons/Operators.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| child :: Foo -> Foo + child FLeaf = FLeaf + child (a :+: _) = a + (+) :: Nat -> Nat -> Nat + Zero + m = m + (Succ n) + m = Succ (n + m) + + data Foo + where + FLeaf :: Foo + (:+:) :: Foo -> Foo -> Foo |] + ======> + data Foo + where + FLeaf :: Foo + (:+:) :: Foo -> Foo -> Foo + child :: Foo -> Foo + child FLeaf = FLeaf + child (a :+: _) = a + (+) :: Nat -> Nat -> Nat + (+) Zero m = m + (+) (Succ n) m = Succ (n + m) + type FLeafSym0 :: Foo + type family FLeafSym0 :: Foo where + FLeafSym0 = FLeaf + type (:+:@#@$) :: (~>) Foo ((~>) Foo Foo) + data (:+:@#@$) :: (~>) Foo ((~>) Foo Foo) + where + (::+:@#@$###) :: SameKind (Apply (:+:@#@$) arg) ((:+:@#@$$) arg) => + (:+:@#@$) a0123456789876543210 + type instance Apply (:+:@#@$) a0123456789876543210 = (:+:@#@$$) a0123456789876543210 + instance SuppressUnusedWarnings (:+:@#@$) where + suppressUnusedWarnings = snd ((,) (::+:@#@$###) ()) + type (:+:@#@$$) :: Foo -> (~>) Foo Foo + data (:+:@#@$$) (a0123456789876543210 :: Foo) :: (~>) Foo Foo + where + (::+:@#@$$###) :: SameKind (Apply ((:+:@#@$$) a0123456789876543210) arg) ((:+:@#@$$$) a0123456789876543210 arg) => + (:+:@#@$$) a0123456789876543210 a0123456789876543210 + type instance Apply ((:+:@#@$$) a0123456789876543210) a0123456789876543210 = (:+:) a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings ((:+:@#@$$) a0123456789876543210) where + suppressUnusedWarnings = snd ((,) (::+:@#@$$###) ()) + type (:+:@#@$$$) :: Foo -> Foo -> Foo + type family (:+:@#@$$$) (a0123456789876543210 :: Foo) (a0123456789876543210 :: Foo) :: Foo where + (:+:@#@$$$) a0123456789876543210 a0123456789876543210 = (:+:) a0123456789876543210 a0123456789876543210 + type (+@#@$) :: (~>) Nat ((~>) Nat Nat) + data (+@#@$) :: (~>) Nat ((~>) Nat Nat) + where + (:+@#@$###) :: SameKind (Apply (+@#@$) arg) ((+@#@$$) arg) => + (+@#@$) a0123456789876543210 + type instance Apply (+@#@$) a0123456789876543210 = (+@#@$$) a0123456789876543210 + instance SuppressUnusedWarnings (+@#@$) where + suppressUnusedWarnings = snd ((,) (:+@#@$###) ()) + type (+@#@$$) :: Nat -> (~>) Nat Nat + data (+@#@$$) (a0123456789876543210 :: Nat) :: (~>) Nat Nat + where + (:+@#@$$###) :: SameKind (Apply ((+@#@$$) a0123456789876543210) arg) ((+@#@$$$) a0123456789876543210 arg) => + (+@#@$$) a0123456789876543210 a0123456789876543210 + type instance Apply ((+@#@$$) a0123456789876543210) a0123456789876543210 = (+) a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings ((+@#@$$) a0123456789876543210) where + suppressUnusedWarnings = snd ((,) (:+@#@$$###) ()) + type (+@#@$$$) :: Nat -> Nat -> Nat + type family (+@#@$$$) (a0123456789876543210 :: Nat) (a0123456789876543210 :: Nat) :: Nat where + (+@#@$$$) a0123456789876543210 a0123456789876543210 = (+) a0123456789876543210 a0123456789876543210 + type ChildSym0 :: (~>) Foo Foo + data ChildSym0 :: (~>) Foo Foo + where + ChildSym0KindInference :: SameKind (Apply ChildSym0 arg) (ChildSym1 arg) => + ChildSym0 a0123456789876543210 + type instance Apply ChildSym0 a0123456789876543210 = Child a0123456789876543210 + instance SuppressUnusedWarnings ChildSym0 where + suppressUnusedWarnings = snd ((,) ChildSym0KindInference ()) + type ChildSym1 :: Foo -> Foo + type family ChildSym1 (a0123456789876543210 :: Foo) :: Foo where + ChildSym1 a0123456789876543210 = Child a0123456789876543210 + type (+) :: Nat -> Nat -> Nat + type family (+) (a :: Nat) (a :: Nat) :: Nat where + (+) 'Zero m = m + (+) ('Succ n) m = Apply SuccSym0 (Apply (Apply (+@#@$) n) m) + type Child :: Foo -> Foo + type family Child (a :: Foo) :: Foo where + Child FLeaf = FLeafSym0 + Child ((:+:) a _) = a + (%+) :: + (forall (t :: Nat) (t :: Nat). + Sing t + -> Sing t -> Sing (Apply (Apply (+@#@$) t) t :: Nat) :: Type) + sChild :: + (forall (t :: Foo). + Sing t -> Sing (Apply ChildSym0 t :: Foo) :: Type) + (%+) SZero (sM :: Sing m) = sM + (%+) (SSucc (sN :: Sing n)) (sM :: Sing m) + = applySing + (singFun1 @SuccSym0 SSucc) + (applySing (applySing (singFun2 @(+@#@$) (%+)) sN) sM) + sChild SFLeaf = SFLeaf + sChild ((:%+:) (sA :: Sing a) _) = sA + instance SingI ((+@#@$) :: (~>) Nat ((~>) Nat Nat)) where + sing = singFun2 @(+@#@$) (%+) + instance SingI d => + SingI ((+@#@$$) (d :: Nat) :: (~>) Nat Nat) where + sing = singFun1 @((+@#@$$) (d :: Nat)) ((%+) (sing @d)) + instance SingI1 ((+@#@$$) :: Nat -> (~>) Nat Nat) where + liftSing (s :: Sing (d :: Nat)) + = singFun1 @((+@#@$$) (d :: Nat)) ((%+) s) + instance SingI (ChildSym0 :: (~>) Foo Foo) where + sing = singFun1 @ChildSym0 sChild + data SFoo :: Foo -> Type + where + SFLeaf :: SFoo (FLeaf :: Foo) + (:%+:) :: forall (n :: Foo) (n :: Foo). + (Sing n) -> (Sing n) -> SFoo ((:+:) n n :: Foo) + type instance Sing @Foo = SFoo + instance SingKind Foo where + type Demote Foo = Foo + fromSing SFLeaf = FLeaf + fromSing ((:%+:) b b) = (:+:) (fromSing b) (fromSing b) + toSing FLeaf = SomeSing SFLeaf + toSing ((:+:) (b :: Demote Foo) (b :: Demote Foo)) + = case (,) (toSing b :: SomeSing Foo) (toSing b :: SomeSing Foo) of + (,) (SomeSing c) (SomeSing c) -> SomeSing ((:%+:) c c) + instance SingI FLeaf where + sing = SFLeaf + instance (SingI n, SingI n) => + SingI ((:+:) (n :: Foo) (n :: Foo)) where + sing = (:%+:) sing sing + instance SingI n => SingI1 ((:+:) (n :: Foo)) where + liftSing = (:%+:) sing + instance SingI2 (:+:) where + liftSing2 = (:%+:) + instance SingI ((:+:@#@$) :: (~>) Foo ((~>) Foo Foo)) where + sing = singFun2 @(:+:@#@$) (:%+:) + instance SingI d => + SingI ((:+:@#@$$) (d :: Foo) :: (~>) Foo Foo) where + sing = singFun1 @((:+:@#@$$) (d :: Foo)) ((:%+:) (sing @d)) + instance SingI1 ((:+:@#@$$) :: Foo -> (~>) Foo Foo) where + liftSing (s :: Sing (d :: Foo)) + = singFun1 @((:+:@#@$$) (d :: Foo)) ((:%+:) s)
tests/compile-and-dump/Singletons/Operators.hs view
@@ -1,19 +1,19 @@-module Singletons.Operators where--import Data.Singletons-import Data.Singletons.TH-import Singletons.Nat--$(singletons [d|- data Foo where- FLeaf :: Foo- (:+:) :: Foo -> Foo -> Foo-- child :: Foo -> Foo- child FLeaf = FLeaf- child (a :+: _) = a-- (+) :: Nat -> Nat -> Nat- Zero + m = m- (Succ n) + m = Succ (n + m)- |])+module Singletons.Operators where + +import Data.Singletons +import Data.Singletons.TH +import Singletons.Nat + +$(singletons [d| + data Foo where + FLeaf :: Foo + (:+:) :: Foo -> Foo -> Foo + + child :: Foo -> Foo + child FLeaf = FLeaf + child (a :+: _) = a + + (+) :: Nat -> Nat -> Nat + Zero + m = m + (Succ n) + m = Succ (n + m) + |])
tests/compile-and-dump/Singletons/OrdDeriving.golden view
@@ -1,1506 +1,1498 @@-Singletons/OrdDeriving.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| data Nat- = Zero | Succ Nat- deriving (Eq, Ord)- data Foo a b c d- = A a b c d |- B a b c d |- C a b c d |- D a b c d |- E a b c d |- F a b c d- deriving (Eq, Ord) |]- ======>- data Nat- = Zero | Succ Nat- deriving (Eq, Ord)- data Foo a b c d- = A a b c d |- B a b c d |- C a b c d |- D a b c d |- E a b c d |- F a b c d- deriving (Eq, Ord)- type ZeroSym0 :: Nat- type family ZeroSym0 :: Nat where- ZeroSym0 = Zero- type SuccSym0 :: (~>) Nat Nat- data SuccSym0 :: (~>) Nat Nat- where- SuccSym0KindInference :: SameKind (Apply SuccSym0 arg) (SuccSym1 arg) =>- SuccSym0 a0123456789876543210- type instance Apply SuccSym0 a0123456789876543210 = Succ a0123456789876543210- instance SuppressUnusedWarnings SuccSym0 where- suppressUnusedWarnings = snd (((,) SuccSym0KindInference) ())- type SuccSym1 :: Nat -> Nat- type family SuccSym1 (a0123456789876543210 :: Nat) :: Nat where- SuccSym1 a0123456789876543210 = Succ a0123456789876543210- type ASym0 :: forall a- b- c- d. (~>) a ((~>) b ((~>) c ((~>) d (Foo a b c d))))- data ASym0 :: (~>) a ((~>) b ((~>) c ((~>) d (Foo a b c d))))- where- ASym0KindInference :: SameKind (Apply ASym0 arg) (ASym1 arg) =>- ASym0 a0123456789876543210- type instance Apply ASym0 a0123456789876543210 = ASym1 a0123456789876543210- instance SuppressUnusedWarnings ASym0 where- suppressUnusedWarnings = snd (((,) ASym0KindInference) ())- type ASym1 :: forall a b c d. a- -> (~>) b ((~>) c ((~>) d (Foo a b c d)))- data ASym1 (a0123456789876543210 :: a) :: (~>) b ((~>) c ((~>) d (Foo a b c d)))- where- ASym1KindInference :: SameKind (Apply (ASym1 a0123456789876543210) arg) (ASym2 a0123456789876543210 arg) =>- ASym1 a0123456789876543210 a0123456789876543210- type instance Apply (ASym1 a0123456789876543210) a0123456789876543210 = ASym2 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ASym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) ASym1KindInference) ())- type ASym2 :: forall a b c d. a- -> b -> (~>) c ((~>) d (Foo a b c d))- data ASym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: (~>) c ((~>) d (Foo a b c d))- where- ASym2KindInference :: SameKind (Apply (ASym2 a0123456789876543210 a0123456789876543210) arg) (ASym3 a0123456789876543210 a0123456789876543210 arg) =>- ASym2 a0123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply (ASym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = ASym3 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ASym2 a0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) ASym2KindInference) ())- type ASym3 :: forall a b c d. a -> b -> c -> (~>) d (Foo a b c d)- data ASym3 (a0123456789876543210 :: a) (a0123456789876543210 :: b) (a0123456789876543210 :: c) :: (~>) d (Foo a b c d)- where- ASym3KindInference :: SameKind (Apply (ASym3 a0123456789876543210 a0123456789876543210 a0123456789876543210) arg) (ASym4 a0123456789876543210 a0123456789876543210 a0123456789876543210 arg) =>- ASym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply (ASym3 a0123456789876543210 a0123456789876543210 a0123456789876543210) a0123456789876543210 = A a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ASym3 a0123456789876543210 a0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) ASym3KindInference) ())- type ASym4 :: forall a b c d. a -> b -> c -> d -> Foo a b c d- type family ASym4 (a0123456789876543210 :: a) (a0123456789876543210 :: b) (a0123456789876543210 :: c) (a0123456789876543210 :: d) :: Foo a b c d where- ASym4 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 = A a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- type BSym0 :: forall a- b- c- d. (~>) a ((~>) b ((~>) c ((~>) d (Foo a b c d))))- data BSym0 :: (~>) a ((~>) b ((~>) c ((~>) d (Foo a b c d))))- where- BSym0KindInference :: SameKind (Apply BSym0 arg) (BSym1 arg) =>- BSym0 a0123456789876543210- type instance Apply BSym0 a0123456789876543210 = BSym1 a0123456789876543210- instance SuppressUnusedWarnings BSym0 where- suppressUnusedWarnings = snd (((,) BSym0KindInference) ())- type BSym1 :: forall a b c d. a- -> (~>) b ((~>) c ((~>) d (Foo a b c d)))- data BSym1 (a0123456789876543210 :: a) :: (~>) b ((~>) c ((~>) d (Foo a b c d)))- where- BSym1KindInference :: SameKind (Apply (BSym1 a0123456789876543210) arg) (BSym2 a0123456789876543210 arg) =>- BSym1 a0123456789876543210 a0123456789876543210- type instance Apply (BSym1 a0123456789876543210) a0123456789876543210 = BSym2 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (BSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) BSym1KindInference) ())- type BSym2 :: forall a b c d. a- -> b -> (~>) c ((~>) d (Foo a b c d))- data BSym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: (~>) c ((~>) d (Foo a b c d))- where- BSym2KindInference :: SameKind (Apply (BSym2 a0123456789876543210 a0123456789876543210) arg) (BSym3 a0123456789876543210 a0123456789876543210 arg) =>- BSym2 a0123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply (BSym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = BSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (BSym2 a0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) BSym2KindInference) ())- type BSym3 :: forall a b c d. a -> b -> c -> (~>) d (Foo a b c d)- data BSym3 (a0123456789876543210 :: a) (a0123456789876543210 :: b) (a0123456789876543210 :: c) :: (~>) d (Foo a b c d)- where- BSym3KindInference :: SameKind (Apply (BSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210) arg) (BSym4 a0123456789876543210 a0123456789876543210 a0123456789876543210 arg) =>- BSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply (BSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210) a0123456789876543210 = B a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (BSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) BSym3KindInference) ())- type BSym4 :: forall a b c d. a -> b -> c -> d -> Foo a b c d- type family BSym4 (a0123456789876543210 :: a) (a0123456789876543210 :: b) (a0123456789876543210 :: c) (a0123456789876543210 :: d) :: Foo a b c d where- BSym4 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 = B a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- type CSym0 :: forall a- b- c- d. (~>) a ((~>) b ((~>) c ((~>) d (Foo a b c d))))- data CSym0 :: (~>) a ((~>) b ((~>) c ((~>) d (Foo a b c d))))- where- CSym0KindInference :: SameKind (Apply CSym0 arg) (CSym1 arg) =>- CSym0 a0123456789876543210- type instance Apply CSym0 a0123456789876543210 = CSym1 a0123456789876543210- instance SuppressUnusedWarnings CSym0 where- suppressUnusedWarnings = snd (((,) CSym0KindInference) ())- type CSym1 :: forall a b c d. a- -> (~>) b ((~>) c ((~>) d (Foo a b c d)))- data CSym1 (a0123456789876543210 :: a) :: (~>) b ((~>) c ((~>) d (Foo a b c d)))- where- CSym1KindInference :: SameKind (Apply (CSym1 a0123456789876543210) arg) (CSym2 a0123456789876543210 arg) =>- CSym1 a0123456789876543210 a0123456789876543210- type instance Apply (CSym1 a0123456789876543210) a0123456789876543210 = CSym2 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (CSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) CSym1KindInference) ())- type CSym2 :: forall a b c d. a- -> b -> (~>) c ((~>) d (Foo a b c d))- data CSym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: (~>) c ((~>) d (Foo a b c d))- where- CSym2KindInference :: SameKind (Apply (CSym2 a0123456789876543210 a0123456789876543210) arg) (CSym3 a0123456789876543210 a0123456789876543210 arg) =>- CSym2 a0123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply (CSym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = CSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (CSym2 a0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) CSym2KindInference) ())- type CSym3 :: forall a b c d. a -> b -> c -> (~>) d (Foo a b c d)- data CSym3 (a0123456789876543210 :: a) (a0123456789876543210 :: b) (a0123456789876543210 :: c) :: (~>) d (Foo a b c d)- where- CSym3KindInference :: SameKind (Apply (CSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210) arg) (CSym4 a0123456789876543210 a0123456789876543210 a0123456789876543210 arg) =>- CSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply (CSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210) a0123456789876543210 = C a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (CSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) CSym3KindInference) ())- type CSym4 :: forall a b c d. a -> b -> c -> d -> Foo a b c d- type family CSym4 (a0123456789876543210 :: a) (a0123456789876543210 :: b) (a0123456789876543210 :: c) (a0123456789876543210 :: d) :: Foo a b c d where- CSym4 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 = C a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- type DSym0 :: forall a- b- c- d. (~>) a ((~>) b ((~>) c ((~>) d (Foo a b c d))))- data DSym0 :: (~>) a ((~>) b ((~>) c ((~>) d (Foo a b c d))))- where- DSym0KindInference :: SameKind (Apply DSym0 arg) (DSym1 arg) =>- DSym0 a0123456789876543210- type instance Apply DSym0 a0123456789876543210 = DSym1 a0123456789876543210- instance SuppressUnusedWarnings DSym0 where- suppressUnusedWarnings = snd (((,) DSym0KindInference) ())- type DSym1 :: forall a b c d. a- -> (~>) b ((~>) c ((~>) d (Foo a b c d)))- data DSym1 (a0123456789876543210 :: a) :: (~>) b ((~>) c ((~>) d (Foo a b c d)))- where- DSym1KindInference :: SameKind (Apply (DSym1 a0123456789876543210) arg) (DSym2 a0123456789876543210 arg) =>- DSym1 a0123456789876543210 a0123456789876543210- type instance Apply (DSym1 a0123456789876543210) a0123456789876543210 = DSym2 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (DSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) DSym1KindInference) ())- type DSym2 :: forall a b c d. a- -> b -> (~>) c ((~>) d (Foo a b c d))- data DSym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: (~>) c ((~>) d (Foo a b c d))- where- DSym2KindInference :: SameKind (Apply (DSym2 a0123456789876543210 a0123456789876543210) arg) (DSym3 a0123456789876543210 a0123456789876543210 arg) =>- DSym2 a0123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply (DSym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = DSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (DSym2 a0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) DSym2KindInference) ())- type DSym3 :: forall a b c d. a -> b -> c -> (~>) d (Foo a b c d)- data DSym3 (a0123456789876543210 :: a) (a0123456789876543210 :: b) (a0123456789876543210 :: c) :: (~>) d (Foo a b c d)- where- DSym3KindInference :: SameKind (Apply (DSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210) arg) (DSym4 a0123456789876543210 a0123456789876543210 a0123456789876543210 arg) =>- DSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply (DSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210) a0123456789876543210 = D a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (DSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) DSym3KindInference) ())- type DSym4 :: forall a b c d. a -> b -> c -> d -> Foo a b c d- type family DSym4 (a0123456789876543210 :: a) (a0123456789876543210 :: b) (a0123456789876543210 :: c) (a0123456789876543210 :: d) :: Foo a b c d where- DSym4 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 = D a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- type ESym0 :: forall a- b- c- d. (~>) a ((~>) b ((~>) c ((~>) d (Foo a b c d))))- data ESym0 :: (~>) a ((~>) b ((~>) c ((~>) d (Foo a b c d))))- where- ESym0KindInference :: SameKind (Apply ESym0 arg) (ESym1 arg) =>- ESym0 a0123456789876543210- type instance Apply ESym0 a0123456789876543210 = ESym1 a0123456789876543210- instance SuppressUnusedWarnings ESym0 where- suppressUnusedWarnings = snd (((,) ESym0KindInference) ())- type ESym1 :: forall a b c d. a- -> (~>) b ((~>) c ((~>) d (Foo a b c d)))- data ESym1 (a0123456789876543210 :: a) :: (~>) b ((~>) c ((~>) d (Foo a b c d)))- where- ESym1KindInference :: SameKind (Apply (ESym1 a0123456789876543210) arg) (ESym2 a0123456789876543210 arg) =>- ESym1 a0123456789876543210 a0123456789876543210- type instance Apply (ESym1 a0123456789876543210) a0123456789876543210 = ESym2 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ESym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) ESym1KindInference) ())- type ESym2 :: forall a b c d. a- -> b -> (~>) c ((~>) d (Foo a b c d))- data ESym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: (~>) c ((~>) d (Foo a b c d))- where- ESym2KindInference :: SameKind (Apply (ESym2 a0123456789876543210 a0123456789876543210) arg) (ESym3 a0123456789876543210 a0123456789876543210 arg) =>- ESym2 a0123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply (ESym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = ESym3 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ESym2 a0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) ESym2KindInference) ())- type ESym3 :: forall a b c d. a -> b -> c -> (~>) d (Foo a b c d)- data ESym3 (a0123456789876543210 :: a) (a0123456789876543210 :: b) (a0123456789876543210 :: c) :: (~>) d (Foo a b c d)- where- ESym3KindInference :: SameKind (Apply (ESym3 a0123456789876543210 a0123456789876543210 a0123456789876543210) arg) (ESym4 a0123456789876543210 a0123456789876543210 a0123456789876543210 arg) =>- ESym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply (ESym3 a0123456789876543210 a0123456789876543210 a0123456789876543210) a0123456789876543210 = E a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ESym3 a0123456789876543210 a0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) ESym3KindInference) ())- type ESym4 :: forall a b c d. a -> b -> c -> d -> Foo a b c d- type family ESym4 (a0123456789876543210 :: a) (a0123456789876543210 :: b) (a0123456789876543210 :: c) (a0123456789876543210 :: d) :: Foo a b c d where- ESym4 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 = E a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- type FSym0 :: forall a- b- c- d. (~>) a ((~>) b ((~>) c ((~>) d (Foo a b c d))))- data FSym0 :: (~>) a ((~>) b ((~>) c ((~>) d (Foo a b c d))))- where- FSym0KindInference :: SameKind (Apply FSym0 arg) (FSym1 arg) =>- FSym0 a0123456789876543210- type instance Apply FSym0 a0123456789876543210 = FSym1 a0123456789876543210- instance SuppressUnusedWarnings FSym0 where- suppressUnusedWarnings = snd (((,) FSym0KindInference) ())- type FSym1 :: forall a b c d. a- -> (~>) b ((~>) c ((~>) d (Foo a b c d)))- data FSym1 (a0123456789876543210 :: a) :: (~>) b ((~>) c ((~>) d (Foo a b c d)))- where- FSym1KindInference :: SameKind (Apply (FSym1 a0123456789876543210) arg) (FSym2 a0123456789876543210 arg) =>- FSym1 a0123456789876543210 a0123456789876543210- type instance Apply (FSym1 a0123456789876543210) a0123456789876543210 = FSym2 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (FSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) FSym1KindInference) ())- type FSym2 :: forall a b c d. a- -> b -> (~>) c ((~>) d (Foo a b c d))- data FSym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: (~>) c ((~>) d (Foo a b c d))- where- FSym2KindInference :: SameKind (Apply (FSym2 a0123456789876543210 a0123456789876543210) arg) (FSym3 a0123456789876543210 a0123456789876543210 arg) =>- FSym2 a0123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply (FSym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = FSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (FSym2 a0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) FSym2KindInference) ())- type FSym3 :: forall a b c d. a -> b -> c -> (~>) d (Foo a b c d)- data FSym3 (a0123456789876543210 :: a) (a0123456789876543210 :: b) (a0123456789876543210 :: c) :: (~>) d (Foo a b c d)- where- FSym3KindInference :: SameKind (Apply (FSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210) arg) (FSym4 a0123456789876543210 a0123456789876543210 a0123456789876543210 arg) =>- FSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply (FSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210) a0123456789876543210 = F a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (FSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) FSym3KindInference) ())- type FSym4 :: forall a b c d. a -> b -> c -> d -> Foo a b c d- type family FSym4 (a0123456789876543210 :: a) (a0123456789876543210 :: b) (a0123456789876543210 :: c) (a0123456789876543210 :: d) :: Foo a b c d where- FSym4 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 = F a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- type TFHelper_0123456789876543210 :: Nat -> Nat -> Bool- type family TFHelper_0123456789876543210 (a :: Nat) (a :: Nat) :: Bool where- TFHelper_0123456789876543210 Zero Zero = TrueSym0- TFHelper_0123456789876543210 Zero (Succ _) = FalseSym0- TFHelper_0123456789876543210 (Succ _) Zero = FalseSym0- TFHelper_0123456789876543210 (Succ a_0123456789876543210) (Succ b_0123456789876543210) = Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210- type TFHelper_0123456789876543210Sym0 :: (~>) Nat ((~>) Nat Bool)- data TFHelper_0123456789876543210Sym0 :: (~>) Nat ((~>) Nat Bool)- where- TFHelper_0123456789876543210Sym0KindInference :: SameKind (Apply TFHelper_0123456789876543210Sym0 arg) (TFHelper_0123456789876543210Sym1 arg) =>- TFHelper_0123456789876543210Sym0 a0123456789876543210- type instance Apply TFHelper_0123456789876543210Sym0 a0123456789876543210 = TFHelper_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings TFHelper_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) TFHelper_0123456789876543210Sym0KindInference) ())- type TFHelper_0123456789876543210Sym1 :: Nat -> (~>) Nat Bool- data TFHelper_0123456789876543210Sym1 (a0123456789876543210 :: Nat) :: (~>) Nat Bool- where- TFHelper_0123456789876543210Sym1KindInference :: SameKind (Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) arg) (TFHelper_0123456789876543210Sym2 a0123456789876543210 arg) =>- TFHelper_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (TFHelper_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) TFHelper_0123456789876543210Sym1KindInference) ())- type TFHelper_0123456789876543210Sym2 :: Nat -> Nat -> Bool- type family TFHelper_0123456789876543210Sym2 (a0123456789876543210 :: Nat) (a0123456789876543210 :: Nat) :: Bool where- TFHelper_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210- instance PEq Nat where- type (==) a a = Apply (Apply TFHelper_0123456789876543210Sym0 a) a- type Compare_0123456789876543210 :: Nat -> Nat -> Ordering- type family Compare_0123456789876543210 (a :: Nat) (a :: Nat) :: Ordering where- Compare_0123456789876543210 Zero Zero = Apply (Apply (Apply FoldlSym0 ThenCmpSym0) EQSym0) NilSym0- Compare_0123456789876543210 (Succ a_0123456789876543210) (Succ b_0123456789876543210) = Apply (Apply (Apply FoldlSym0 ThenCmpSym0) EQSym0) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) NilSym0)- Compare_0123456789876543210 Zero (Succ _) = LTSym0- Compare_0123456789876543210 (Succ _) Zero = GTSym0- type Compare_0123456789876543210Sym0 :: (~>) Nat ((~>) Nat Ordering)- data Compare_0123456789876543210Sym0 :: (~>) Nat ((~>) Nat Ordering)- where- Compare_0123456789876543210Sym0KindInference :: SameKind (Apply Compare_0123456789876543210Sym0 arg) (Compare_0123456789876543210Sym1 arg) =>- Compare_0123456789876543210Sym0 a0123456789876543210- type instance Apply Compare_0123456789876543210Sym0 a0123456789876543210 = Compare_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings Compare_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Compare_0123456789876543210Sym0KindInference) ())- type Compare_0123456789876543210Sym1 :: Nat -> (~>) Nat Ordering- data Compare_0123456789876543210Sym1 (a0123456789876543210 :: Nat) :: (~>) Nat Ordering- where- Compare_0123456789876543210Sym1KindInference :: SameKind (Apply (Compare_0123456789876543210Sym1 a0123456789876543210) arg) (Compare_0123456789876543210Sym2 a0123456789876543210 arg) =>- Compare_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (Compare_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Compare_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Compare_0123456789876543210Sym1KindInference) ())- type Compare_0123456789876543210Sym2 :: Nat -> Nat -> Ordering- type family Compare_0123456789876543210Sym2 (a0123456789876543210 :: Nat) (a0123456789876543210 :: Nat) :: Ordering where- Compare_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210- instance POrd Nat where- type Compare a a = Apply (Apply Compare_0123456789876543210Sym0 a) a- type TFHelper_0123456789876543210 :: Foo a b c d- -> Foo a b c d -> Bool- type family TFHelper_0123456789876543210 (a :: Foo a b c d) (a :: Foo a b c d) :: Bool where- TFHelper_0123456789876543210 (A a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210) (A b_0123456789876543210 b_0123456789876543210 b_0123456789876543210 b_0123456789876543210) = Apply (Apply (&&@#@$) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (&&@#@$) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (&&@#@$) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)))- TFHelper_0123456789876543210 (A _ _ _ _) (B _ _ _ _) = FalseSym0- TFHelper_0123456789876543210 (A _ _ _ _) (C _ _ _ _) = FalseSym0- TFHelper_0123456789876543210 (A _ _ _ _) (D _ _ _ _) = FalseSym0- TFHelper_0123456789876543210 (A _ _ _ _) (E _ _ _ _) = FalseSym0- TFHelper_0123456789876543210 (A _ _ _ _) (F _ _ _ _) = FalseSym0- TFHelper_0123456789876543210 (B _ _ _ _) (A _ _ _ _) = FalseSym0- TFHelper_0123456789876543210 (B a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210) (B b_0123456789876543210 b_0123456789876543210 b_0123456789876543210 b_0123456789876543210) = Apply (Apply (&&@#@$) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (&&@#@$) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (&&@#@$) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)))- TFHelper_0123456789876543210 (B _ _ _ _) (C _ _ _ _) = FalseSym0- TFHelper_0123456789876543210 (B _ _ _ _) (D _ _ _ _) = FalseSym0- TFHelper_0123456789876543210 (B _ _ _ _) (E _ _ _ _) = FalseSym0- TFHelper_0123456789876543210 (B _ _ _ _) (F _ _ _ _) = FalseSym0- TFHelper_0123456789876543210 (C _ _ _ _) (A _ _ _ _) = FalseSym0- TFHelper_0123456789876543210 (C _ _ _ _) (B _ _ _ _) = FalseSym0- TFHelper_0123456789876543210 (C a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210) (C b_0123456789876543210 b_0123456789876543210 b_0123456789876543210 b_0123456789876543210) = Apply (Apply (&&@#@$) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (&&@#@$) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (&&@#@$) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)))- TFHelper_0123456789876543210 (C _ _ _ _) (D _ _ _ _) = FalseSym0- TFHelper_0123456789876543210 (C _ _ _ _) (E _ _ _ _) = FalseSym0- TFHelper_0123456789876543210 (C _ _ _ _) (F _ _ _ _) = FalseSym0- TFHelper_0123456789876543210 (D _ _ _ _) (A _ _ _ _) = FalseSym0- TFHelper_0123456789876543210 (D _ _ _ _) (B _ _ _ _) = FalseSym0- TFHelper_0123456789876543210 (D _ _ _ _) (C _ _ _ _) = FalseSym0- TFHelper_0123456789876543210 (D a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210) (D b_0123456789876543210 b_0123456789876543210 b_0123456789876543210 b_0123456789876543210) = Apply (Apply (&&@#@$) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (&&@#@$) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (&&@#@$) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)))- TFHelper_0123456789876543210 (D _ _ _ _) (E _ _ _ _) = FalseSym0- TFHelper_0123456789876543210 (D _ _ _ _) (F _ _ _ _) = FalseSym0- TFHelper_0123456789876543210 (E _ _ _ _) (A _ _ _ _) = FalseSym0- TFHelper_0123456789876543210 (E _ _ _ _) (B _ _ _ _) = FalseSym0- TFHelper_0123456789876543210 (E _ _ _ _) (C _ _ _ _) = FalseSym0- TFHelper_0123456789876543210 (E _ _ _ _) (D _ _ _ _) = FalseSym0- TFHelper_0123456789876543210 (E a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210) (E b_0123456789876543210 b_0123456789876543210 b_0123456789876543210 b_0123456789876543210) = Apply (Apply (&&@#@$) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (&&@#@$) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (&&@#@$) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)))- TFHelper_0123456789876543210 (E _ _ _ _) (F _ _ _ _) = FalseSym0- TFHelper_0123456789876543210 (F _ _ _ _) (A _ _ _ _) = FalseSym0- TFHelper_0123456789876543210 (F _ _ _ _) (B _ _ _ _) = FalseSym0- TFHelper_0123456789876543210 (F _ _ _ _) (C _ _ _ _) = FalseSym0- TFHelper_0123456789876543210 (F _ _ _ _) (D _ _ _ _) = FalseSym0- TFHelper_0123456789876543210 (F _ _ _ _) (E _ _ _ _) = FalseSym0- TFHelper_0123456789876543210 (F a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210) (F b_0123456789876543210 b_0123456789876543210 b_0123456789876543210 b_0123456789876543210) = Apply (Apply (&&@#@$) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (&&@#@$) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (&&@#@$) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)))- type TFHelper_0123456789876543210Sym0 :: (~>) (Foo a b c d) ((~>) (Foo a b c d) Bool)- data TFHelper_0123456789876543210Sym0 :: (~>) (Foo a b c d) ((~>) (Foo a b c d) Bool)- where- TFHelper_0123456789876543210Sym0KindInference :: SameKind (Apply TFHelper_0123456789876543210Sym0 arg) (TFHelper_0123456789876543210Sym1 arg) =>- TFHelper_0123456789876543210Sym0 a0123456789876543210- type instance Apply TFHelper_0123456789876543210Sym0 a0123456789876543210 = TFHelper_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings TFHelper_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) TFHelper_0123456789876543210Sym0KindInference) ())- type TFHelper_0123456789876543210Sym1 :: Foo a b c d- -> (~>) (Foo a b c d) Bool- data TFHelper_0123456789876543210Sym1 (a0123456789876543210 :: Foo a b c d) :: (~>) (Foo a b c d) Bool- where- TFHelper_0123456789876543210Sym1KindInference :: SameKind (Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) arg) (TFHelper_0123456789876543210Sym2 a0123456789876543210 arg) =>- TFHelper_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (TFHelper_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) TFHelper_0123456789876543210Sym1KindInference) ())- type TFHelper_0123456789876543210Sym2 :: Foo a b c d- -> Foo a b c d -> Bool- type family TFHelper_0123456789876543210Sym2 (a0123456789876543210 :: Foo a b c d) (a0123456789876543210 :: Foo a b c d) :: Bool where- TFHelper_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210- instance PEq (Foo a b c d) where- type (==) a a = Apply (Apply TFHelper_0123456789876543210Sym0 a) a- type Compare_0123456789876543210 :: Foo a b c d- -> Foo a b c d -> Ordering- type family Compare_0123456789876543210 (a :: Foo a b c d) (a :: Foo a b c d) :: Ordering where- Compare_0123456789876543210 (A a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210) (A b_0123456789876543210 b_0123456789876543210 b_0123456789876543210 b_0123456789876543210) = Apply (Apply (Apply FoldlSym0 ThenCmpSym0) EQSym0) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) NilSym0))))- Compare_0123456789876543210 (B a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210) (B b_0123456789876543210 b_0123456789876543210 b_0123456789876543210 b_0123456789876543210) = Apply (Apply (Apply FoldlSym0 ThenCmpSym0) EQSym0) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) NilSym0))))- Compare_0123456789876543210 (C a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210) (C b_0123456789876543210 b_0123456789876543210 b_0123456789876543210 b_0123456789876543210) = Apply (Apply (Apply FoldlSym0 ThenCmpSym0) EQSym0) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) NilSym0))))- Compare_0123456789876543210 (D a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210) (D b_0123456789876543210 b_0123456789876543210 b_0123456789876543210 b_0123456789876543210) = Apply (Apply (Apply FoldlSym0 ThenCmpSym0) EQSym0) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) NilSym0))))- Compare_0123456789876543210 (E a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210) (E b_0123456789876543210 b_0123456789876543210 b_0123456789876543210 b_0123456789876543210) = Apply (Apply (Apply FoldlSym0 ThenCmpSym0) EQSym0) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) NilSym0))))- Compare_0123456789876543210 (F a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210) (F b_0123456789876543210 b_0123456789876543210 b_0123456789876543210 b_0123456789876543210) = Apply (Apply (Apply FoldlSym0 ThenCmpSym0) EQSym0) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) NilSym0))))- Compare_0123456789876543210 (A _ _ _ _) (B _ _ _ _) = LTSym0- Compare_0123456789876543210 (A _ _ _ _) (C _ _ _ _) = LTSym0- Compare_0123456789876543210 (A _ _ _ _) (D _ _ _ _) = LTSym0- Compare_0123456789876543210 (A _ _ _ _) (E _ _ _ _) = LTSym0- Compare_0123456789876543210 (A _ _ _ _) (F _ _ _ _) = LTSym0- Compare_0123456789876543210 (B _ _ _ _) (A _ _ _ _) = GTSym0- Compare_0123456789876543210 (B _ _ _ _) (C _ _ _ _) = LTSym0- Compare_0123456789876543210 (B _ _ _ _) (D _ _ _ _) = LTSym0- Compare_0123456789876543210 (B _ _ _ _) (E _ _ _ _) = LTSym0- Compare_0123456789876543210 (B _ _ _ _) (F _ _ _ _) = LTSym0- Compare_0123456789876543210 (C _ _ _ _) (A _ _ _ _) = GTSym0- Compare_0123456789876543210 (C _ _ _ _) (B _ _ _ _) = GTSym0- Compare_0123456789876543210 (C _ _ _ _) (D _ _ _ _) = LTSym0- Compare_0123456789876543210 (C _ _ _ _) (E _ _ _ _) = LTSym0- Compare_0123456789876543210 (C _ _ _ _) (F _ _ _ _) = LTSym0- Compare_0123456789876543210 (D _ _ _ _) (A _ _ _ _) = GTSym0- Compare_0123456789876543210 (D _ _ _ _) (B _ _ _ _) = GTSym0- Compare_0123456789876543210 (D _ _ _ _) (C _ _ _ _) = GTSym0- Compare_0123456789876543210 (D _ _ _ _) (E _ _ _ _) = LTSym0- Compare_0123456789876543210 (D _ _ _ _) (F _ _ _ _) = LTSym0- Compare_0123456789876543210 (E _ _ _ _) (A _ _ _ _) = GTSym0- Compare_0123456789876543210 (E _ _ _ _) (B _ _ _ _) = GTSym0- Compare_0123456789876543210 (E _ _ _ _) (C _ _ _ _) = GTSym0- Compare_0123456789876543210 (E _ _ _ _) (D _ _ _ _) = GTSym0- Compare_0123456789876543210 (E _ _ _ _) (F _ _ _ _) = LTSym0- Compare_0123456789876543210 (F _ _ _ _) (A _ _ _ _) = GTSym0- Compare_0123456789876543210 (F _ _ _ _) (B _ _ _ _) = GTSym0- Compare_0123456789876543210 (F _ _ _ _) (C _ _ _ _) = GTSym0- Compare_0123456789876543210 (F _ _ _ _) (D _ _ _ _) = GTSym0- Compare_0123456789876543210 (F _ _ _ _) (E _ _ _ _) = GTSym0- type Compare_0123456789876543210Sym0 :: (~>) (Foo a b c d) ((~>) (Foo a b c d) Ordering)- data Compare_0123456789876543210Sym0 :: (~>) (Foo a b c d) ((~>) (Foo a b c d) Ordering)- where- Compare_0123456789876543210Sym0KindInference :: SameKind (Apply Compare_0123456789876543210Sym0 arg) (Compare_0123456789876543210Sym1 arg) =>- Compare_0123456789876543210Sym0 a0123456789876543210- type instance Apply Compare_0123456789876543210Sym0 a0123456789876543210 = Compare_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings Compare_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Compare_0123456789876543210Sym0KindInference) ())- type Compare_0123456789876543210Sym1 :: Foo a b c d- -> (~>) (Foo a b c d) Ordering- data Compare_0123456789876543210Sym1 (a0123456789876543210 :: Foo a b c d) :: (~>) (Foo a b c d) Ordering- where- Compare_0123456789876543210Sym1KindInference :: SameKind (Apply (Compare_0123456789876543210Sym1 a0123456789876543210) arg) (Compare_0123456789876543210Sym2 a0123456789876543210 arg) =>- Compare_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (Compare_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Compare_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Compare_0123456789876543210Sym1KindInference) ())- type Compare_0123456789876543210Sym2 :: Foo a b c d- -> Foo a b c d -> Ordering- type family Compare_0123456789876543210Sym2 (a0123456789876543210 :: Foo a b c d) (a0123456789876543210 :: Foo a b c d) :: Ordering where- Compare_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210- instance POrd (Foo a b c d) where- type Compare a a = Apply (Apply Compare_0123456789876543210Sym0 a) a- data SNat :: Nat -> Type- where- SZero :: SNat (Zero :: Nat)- SSucc :: forall (n :: Nat). (Sing n) -> SNat (Succ n :: Nat)- type instance Sing @Nat = SNat- instance SingKind Nat where- type Demote Nat = Nat- fromSing SZero = Zero- fromSing (SSucc b) = Succ (fromSing b)- toSing Zero = SomeSing SZero- toSing (Succ (b :: Demote Nat))- = case toSing b :: SomeSing Nat of SomeSing c -> SomeSing (SSucc c)- data SFoo :: forall a b c d. Foo a b c d -> Type- where- SA :: forall a b c d (n :: a) (n :: b) (n :: c) (n :: d).- (Sing n) ->- (Sing n) ->- (Sing n) ->- (Sing n) ->- SFoo (A n n n n :: Foo a b c d)- SB :: forall a b c d (n :: a) (n :: b) (n :: c) (n :: d).- (Sing n) ->- (Sing n) ->- (Sing n) ->- (Sing n) ->- SFoo (B n n n n :: Foo a b c d)- SC :: forall a b c d (n :: a) (n :: b) (n :: c) (n :: d).- (Sing n) ->- (Sing n) ->- (Sing n) ->- (Sing n) ->- SFoo (C n n n n :: Foo a b c d)- SD :: forall a b c d (n :: a) (n :: b) (n :: c) (n :: d).- (Sing n) ->- (Sing n) ->- (Sing n) ->- (Sing n) ->- SFoo (D n n n n :: Foo a b c d)- SE :: forall a b c d (n :: a) (n :: b) (n :: c) (n :: d).- (Sing n) ->- (Sing n) ->- (Sing n) ->- (Sing n) ->- SFoo (E n n n n :: Foo a b c d)- SF :: forall a b c d (n :: a) (n :: b) (n :: c) (n :: d).- (Sing n) ->- (Sing n) ->- (Sing n) ->- (Sing n) ->- SFoo (F n n n n :: Foo a b c d)- type instance Sing @(Foo a b c d) = SFoo- instance (SingKind a, SingKind b, SingKind c, SingKind d) =>- SingKind (Foo a b c d) where- type Demote (Foo a b c d) = Foo (Demote a) (Demote b) (Demote c) (Demote d)- fromSing (SA b b b b)- = (((A (fromSing b)) (fromSing b)) (fromSing b)) (fromSing b)- fromSing (SB b b b b)- = (((B (fromSing b)) (fromSing b)) (fromSing b)) (fromSing b)- fromSing (SC b b b b)- = (((C (fromSing b)) (fromSing b)) (fromSing b)) (fromSing b)- fromSing (SD b b b b)- = (((D (fromSing b)) (fromSing b)) (fromSing b)) (fromSing b)- fromSing (SE b b b b)- = (((E (fromSing b)) (fromSing b)) (fromSing b)) (fromSing b)- fromSing (SF b b b b)- = (((F (fromSing b)) (fromSing b)) (fromSing b)) (fromSing b)- toSing- (A (b :: Demote a) (b :: Demote b) (b :: Demote c) (b :: Demote d))- = case- ((((,,,) (toSing b :: SomeSing a)) (toSing b :: SomeSing b))- (toSing b :: SomeSing c))- (toSing b :: SomeSing d)- of- (,,,) (SomeSing c) (SomeSing c) (SomeSing c) (SomeSing c)- -> SomeSing ((((SA c) c) c) c)- toSing- (B (b :: Demote a) (b :: Demote b) (b :: Demote c) (b :: Demote d))- = case- ((((,,,) (toSing b :: SomeSing a)) (toSing b :: SomeSing b))- (toSing b :: SomeSing c))- (toSing b :: SomeSing d)- of- (,,,) (SomeSing c) (SomeSing c) (SomeSing c) (SomeSing c)- -> SomeSing ((((SB c) c) c) c)- toSing- (C (b :: Demote a) (b :: Demote b) (b :: Demote c) (b :: Demote d))- = case- ((((,,,) (toSing b :: SomeSing a)) (toSing b :: SomeSing b))- (toSing b :: SomeSing c))- (toSing b :: SomeSing d)- of- (,,,) (SomeSing c) (SomeSing c) (SomeSing c) (SomeSing c)- -> SomeSing ((((SC c) c) c) c)- toSing- (D (b :: Demote a) (b :: Demote b) (b :: Demote c) (b :: Demote d))- = case- ((((,,,) (toSing b :: SomeSing a)) (toSing b :: SomeSing b))- (toSing b :: SomeSing c))- (toSing b :: SomeSing d)- of- (,,,) (SomeSing c) (SomeSing c) (SomeSing c) (SomeSing c)- -> SomeSing ((((SD c) c) c) c)- toSing- (E (b :: Demote a) (b :: Demote b) (b :: Demote c) (b :: Demote d))- = case- ((((,,,) (toSing b :: SomeSing a)) (toSing b :: SomeSing b))- (toSing b :: SomeSing c))- (toSing b :: SomeSing d)- of- (,,,) (SomeSing c) (SomeSing c) (SomeSing c) (SomeSing c)- -> SomeSing ((((SE c) c) c) c)- toSing- (F (b :: Demote a) (b :: Demote b) (b :: Demote c) (b :: Demote d))- = case- ((((,,,) (toSing b :: SomeSing a)) (toSing b :: SomeSing b))- (toSing b :: SomeSing c))- (toSing b :: SomeSing d)- of- (,,,) (SomeSing c) (SomeSing c) (SomeSing c) (SomeSing c)- -> SomeSing ((((SF c) c) c) c)- instance SEq Nat => SEq Nat where- (%==) ::- forall (t1 :: Nat) (t2 :: Nat). Sing t1- -> Sing t2- -> Sing (Apply (Apply ((==@#@$) :: TyFun Nat ((~>) Nat Bool)- -> Type) t1) t2)- (%==) SZero SZero = STrue- (%==) SZero (SSucc _) = SFalse- (%==) (SSucc _) SZero = SFalse- (%==)- (SSucc (sA_0123456789876543210 :: Sing a_0123456789876543210))- (SSucc (sB_0123456789876543210 :: Sing b_0123456789876543210))- = (applySing- ((applySing ((singFun2 @(==@#@$)) (%==))) sA_0123456789876543210))- sB_0123456789876543210- instance SOrd Nat => SOrd Nat where- sCompare ::- forall (t1 :: Nat) (t2 :: Nat). Sing t1- -> Sing t2- -> Sing (Apply (Apply (CompareSym0 :: TyFun Nat ((~>) Nat Ordering)- -> Type) t1) t2)- sCompare SZero SZero- = (applySing- ((applySing- ((applySing ((singFun3 @FoldlSym0) sFoldl))- ((singFun2 @ThenCmpSym0) sThenCmp)))- SEQ))- SNil- sCompare- (SSucc (sA_0123456789876543210 :: Sing a_0123456789876543210))- (SSucc (sB_0123456789876543210 :: Sing b_0123456789876543210))- = (applySing- ((applySing- ((applySing ((singFun3 @FoldlSym0) sFoldl))- ((singFun2 @ThenCmpSym0) sThenCmp)))- SEQ))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing- ((applySing ((singFun2 @CompareSym0) sCompare))- sA_0123456789876543210))- sB_0123456789876543210)))- SNil)- sCompare SZero (SSucc _) = SLT- sCompare (SSucc _) SZero = SGT- instance (SEq a, SEq b, SEq c, SEq d) => SEq (Foo a b c d) where- (%==) ::- forall (t1 :: Foo a b c d) (t2 :: Foo a b c d). Sing t1- -> Sing t2- -> Sing (Apply (Apply ((==@#@$) :: TyFun (Foo a b c d) ((~>) (Foo a b c d) Bool)- -> Type) t1) t2)- (%==)- (SA (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210))- (SA (sB_0123456789876543210 :: Sing b_0123456789876543210)- (sB_0123456789876543210 :: Sing b_0123456789876543210)- (sB_0123456789876543210 :: Sing b_0123456789876543210)- (sB_0123456789876543210 :: Sing b_0123456789876543210))- = (applySing- ((applySing ((singFun2 @(&&@#@$)) (%&&)))- ((applySing- ((applySing ((singFun2 @(==@#@$)) (%==))) sA_0123456789876543210))- sB_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @(&&@#@$)) (%&&)))- ((applySing- ((applySing ((singFun2 @(==@#@$)) (%==))) sA_0123456789876543210))- sB_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @(&&@#@$)) (%&&)))- ((applySing- ((applySing ((singFun2 @(==@#@$)) (%==))) sA_0123456789876543210))- sB_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @(==@#@$)) (%==))) sA_0123456789876543210))- sB_0123456789876543210)))- (%==) (SA _ _ _ _) (SB _ _ _ _) = SFalse- (%==) (SA _ _ _ _) (SC _ _ _ _) = SFalse- (%==) (SA _ _ _ _) (SD _ _ _ _) = SFalse- (%==) (SA _ _ _ _) (SE _ _ _ _) = SFalse- (%==) (SA _ _ _ _) (SF _ _ _ _) = SFalse- (%==) (SB _ _ _ _) (SA _ _ _ _) = SFalse- (%==)- (SB (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210))- (SB (sB_0123456789876543210 :: Sing b_0123456789876543210)- (sB_0123456789876543210 :: Sing b_0123456789876543210)- (sB_0123456789876543210 :: Sing b_0123456789876543210)- (sB_0123456789876543210 :: Sing b_0123456789876543210))- = (applySing- ((applySing ((singFun2 @(&&@#@$)) (%&&)))- ((applySing- ((applySing ((singFun2 @(==@#@$)) (%==))) sA_0123456789876543210))- sB_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @(&&@#@$)) (%&&)))- ((applySing- ((applySing ((singFun2 @(==@#@$)) (%==))) sA_0123456789876543210))- sB_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @(&&@#@$)) (%&&)))- ((applySing- ((applySing ((singFun2 @(==@#@$)) (%==))) sA_0123456789876543210))- sB_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @(==@#@$)) (%==))) sA_0123456789876543210))- sB_0123456789876543210)))- (%==) (SB _ _ _ _) (SC _ _ _ _) = SFalse- (%==) (SB _ _ _ _) (SD _ _ _ _) = SFalse- (%==) (SB _ _ _ _) (SE _ _ _ _) = SFalse- (%==) (SB _ _ _ _) (SF _ _ _ _) = SFalse- (%==) (SC _ _ _ _) (SA _ _ _ _) = SFalse- (%==) (SC _ _ _ _) (SB _ _ _ _) = SFalse- (%==)- (SC (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210))- (SC (sB_0123456789876543210 :: Sing b_0123456789876543210)- (sB_0123456789876543210 :: Sing b_0123456789876543210)- (sB_0123456789876543210 :: Sing b_0123456789876543210)- (sB_0123456789876543210 :: Sing b_0123456789876543210))- = (applySing- ((applySing ((singFun2 @(&&@#@$)) (%&&)))- ((applySing- ((applySing ((singFun2 @(==@#@$)) (%==))) sA_0123456789876543210))- sB_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @(&&@#@$)) (%&&)))- ((applySing- ((applySing ((singFun2 @(==@#@$)) (%==))) sA_0123456789876543210))- sB_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @(&&@#@$)) (%&&)))- ((applySing- ((applySing ((singFun2 @(==@#@$)) (%==))) sA_0123456789876543210))- sB_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @(==@#@$)) (%==))) sA_0123456789876543210))- sB_0123456789876543210)))- (%==) (SC _ _ _ _) (SD _ _ _ _) = SFalse- (%==) (SC _ _ _ _) (SE _ _ _ _) = SFalse- (%==) (SC _ _ _ _) (SF _ _ _ _) = SFalse- (%==) (SD _ _ _ _) (SA _ _ _ _) = SFalse- (%==) (SD _ _ _ _) (SB _ _ _ _) = SFalse- (%==) (SD _ _ _ _) (SC _ _ _ _) = SFalse- (%==)- (SD (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210))- (SD (sB_0123456789876543210 :: Sing b_0123456789876543210)- (sB_0123456789876543210 :: Sing b_0123456789876543210)- (sB_0123456789876543210 :: Sing b_0123456789876543210)- (sB_0123456789876543210 :: Sing b_0123456789876543210))- = (applySing- ((applySing ((singFun2 @(&&@#@$)) (%&&)))- ((applySing- ((applySing ((singFun2 @(==@#@$)) (%==))) sA_0123456789876543210))- sB_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @(&&@#@$)) (%&&)))- ((applySing- ((applySing ((singFun2 @(==@#@$)) (%==))) sA_0123456789876543210))- sB_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @(&&@#@$)) (%&&)))- ((applySing- ((applySing ((singFun2 @(==@#@$)) (%==))) sA_0123456789876543210))- sB_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @(==@#@$)) (%==))) sA_0123456789876543210))- sB_0123456789876543210)))- (%==) (SD _ _ _ _) (SE _ _ _ _) = SFalse- (%==) (SD _ _ _ _) (SF _ _ _ _) = SFalse- (%==) (SE _ _ _ _) (SA _ _ _ _) = SFalse- (%==) (SE _ _ _ _) (SB _ _ _ _) = SFalse- (%==) (SE _ _ _ _) (SC _ _ _ _) = SFalse- (%==) (SE _ _ _ _) (SD _ _ _ _) = SFalse- (%==)- (SE (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210))- (SE (sB_0123456789876543210 :: Sing b_0123456789876543210)- (sB_0123456789876543210 :: Sing b_0123456789876543210)- (sB_0123456789876543210 :: Sing b_0123456789876543210)- (sB_0123456789876543210 :: Sing b_0123456789876543210))- = (applySing- ((applySing ((singFun2 @(&&@#@$)) (%&&)))- ((applySing- ((applySing ((singFun2 @(==@#@$)) (%==))) sA_0123456789876543210))- sB_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @(&&@#@$)) (%&&)))- ((applySing- ((applySing ((singFun2 @(==@#@$)) (%==))) sA_0123456789876543210))- sB_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @(&&@#@$)) (%&&)))- ((applySing- ((applySing ((singFun2 @(==@#@$)) (%==))) sA_0123456789876543210))- sB_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @(==@#@$)) (%==))) sA_0123456789876543210))- sB_0123456789876543210)))- (%==) (SE _ _ _ _) (SF _ _ _ _) = SFalse- (%==) (SF _ _ _ _) (SA _ _ _ _) = SFalse- (%==) (SF _ _ _ _) (SB _ _ _ _) = SFalse- (%==) (SF _ _ _ _) (SC _ _ _ _) = SFalse- (%==) (SF _ _ _ _) (SD _ _ _ _) = SFalse- (%==) (SF _ _ _ _) (SE _ _ _ _) = SFalse- (%==)- (SF (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210))- (SF (sB_0123456789876543210 :: Sing b_0123456789876543210)- (sB_0123456789876543210 :: Sing b_0123456789876543210)- (sB_0123456789876543210 :: Sing b_0123456789876543210)- (sB_0123456789876543210 :: Sing b_0123456789876543210))- = (applySing- ((applySing ((singFun2 @(&&@#@$)) (%&&)))- ((applySing- ((applySing ((singFun2 @(==@#@$)) (%==))) sA_0123456789876543210))- sB_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @(&&@#@$)) (%&&)))- ((applySing- ((applySing ((singFun2 @(==@#@$)) (%==))) sA_0123456789876543210))- sB_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @(&&@#@$)) (%&&)))- ((applySing- ((applySing ((singFun2 @(==@#@$)) (%==))) sA_0123456789876543210))- sB_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @(==@#@$)) (%==))) sA_0123456789876543210))- sB_0123456789876543210)))- instance (SOrd a, SOrd b, SOrd c, SOrd d) =>- SOrd (Foo a b c d) where- sCompare ::- forall (t1 :: Foo a b c d) (t2 :: Foo a b c d). Sing t1- -> Sing t2- -> Sing (Apply (Apply (CompareSym0 :: TyFun (Foo a b c d) ((~>) (Foo a b c d) Ordering)- -> Type) t1) t2)- sCompare- (SA (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210))- (SA (sB_0123456789876543210 :: Sing b_0123456789876543210)- (sB_0123456789876543210 :: Sing b_0123456789876543210)- (sB_0123456789876543210 :: Sing b_0123456789876543210)- (sB_0123456789876543210 :: Sing b_0123456789876543210))- = (applySing- ((applySing- ((applySing ((singFun3 @FoldlSym0) sFoldl))- ((singFun2 @ThenCmpSym0) sThenCmp)))- SEQ))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing- ((applySing ((singFun2 @CompareSym0) sCompare))- sA_0123456789876543210))- sB_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing- ((applySing ((singFun2 @CompareSym0) sCompare))- sA_0123456789876543210))- sB_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing- ((applySing ((singFun2 @CompareSym0) sCompare))- sA_0123456789876543210))- sB_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing- ((applySing ((singFun2 @CompareSym0) sCompare))- sA_0123456789876543210))- sB_0123456789876543210)))- SNil))))- sCompare- (SB (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210))- (SB (sB_0123456789876543210 :: Sing b_0123456789876543210)- (sB_0123456789876543210 :: Sing b_0123456789876543210)- (sB_0123456789876543210 :: Sing b_0123456789876543210)- (sB_0123456789876543210 :: Sing b_0123456789876543210))- = (applySing- ((applySing- ((applySing ((singFun3 @FoldlSym0) sFoldl))- ((singFun2 @ThenCmpSym0) sThenCmp)))- SEQ))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing- ((applySing ((singFun2 @CompareSym0) sCompare))- sA_0123456789876543210))- sB_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing- ((applySing ((singFun2 @CompareSym0) sCompare))- sA_0123456789876543210))- sB_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing- ((applySing ((singFun2 @CompareSym0) sCompare))- sA_0123456789876543210))- sB_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing- ((applySing ((singFun2 @CompareSym0) sCompare))- sA_0123456789876543210))- sB_0123456789876543210)))- SNil))))- sCompare- (SC (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210))- (SC (sB_0123456789876543210 :: Sing b_0123456789876543210)- (sB_0123456789876543210 :: Sing b_0123456789876543210)- (sB_0123456789876543210 :: Sing b_0123456789876543210)- (sB_0123456789876543210 :: Sing b_0123456789876543210))- = (applySing- ((applySing- ((applySing ((singFun3 @FoldlSym0) sFoldl))- ((singFun2 @ThenCmpSym0) sThenCmp)))- SEQ))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing- ((applySing ((singFun2 @CompareSym0) sCompare))- sA_0123456789876543210))- sB_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing- ((applySing ((singFun2 @CompareSym0) sCompare))- sA_0123456789876543210))- sB_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing- ((applySing ((singFun2 @CompareSym0) sCompare))- sA_0123456789876543210))- sB_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing- ((applySing ((singFun2 @CompareSym0) sCompare))- sA_0123456789876543210))- sB_0123456789876543210)))- SNil))))- sCompare- (SD (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210))- (SD (sB_0123456789876543210 :: Sing b_0123456789876543210)- (sB_0123456789876543210 :: Sing b_0123456789876543210)- (sB_0123456789876543210 :: Sing b_0123456789876543210)- (sB_0123456789876543210 :: Sing b_0123456789876543210))- = (applySing- ((applySing- ((applySing ((singFun3 @FoldlSym0) sFoldl))- ((singFun2 @ThenCmpSym0) sThenCmp)))- SEQ))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing- ((applySing ((singFun2 @CompareSym0) sCompare))- sA_0123456789876543210))- sB_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing- ((applySing ((singFun2 @CompareSym0) sCompare))- sA_0123456789876543210))- sB_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing- ((applySing ((singFun2 @CompareSym0) sCompare))- sA_0123456789876543210))- sB_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing- ((applySing ((singFun2 @CompareSym0) sCompare))- sA_0123456789876543210))- sB_0123456789876543210)))- SNil))))- sCompare- (SE (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210))- (SE (sB_0123456789876543210 :: Sing b_0123456789876543210)- (sB_0123456789876543210 :: Sing b_0123456789876543210)- (sB_0123456789876543210 :: Sing b_0123456789876543210)- (sB_0123456789876543210 :: Sing b_0123456789876543210))- = (applySing- ((applySing- ((applySing ((singFun3 @FoldlSym0) sFoldl))- ((singFun2 @ThenCmpSym0) sThenCmp)))- SEQ))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing- ((applySing ((singFun2 @CompareSym0) sCompare))- sA_0123456789876543210))- sB_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing- ((applySing ((singFun2 @CompareSym0) sCompare))- sA_0123456789876543210))- sB_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing- ((applySing ((singFun2 @CompareSym0) sCompare))- sA_0123456789876543210))- sB_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing- ((applySing ((singFun2 @CompareSym0) sCompare))- sA_0123456789876543210))- sB_0123456789876543210)))- SNil))))- sCompare- (SF (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210))- (SF (sB_0123456789876543210 :: Sing b_0123456789876543210)- (sB_0123456789876543210 :: Sing b_0123456789876543210)- (sB_0123456789876543210 :: Sing b_0123456789876543210)- (sB_0123456789876543210 :: Sing b_0123456789876543210))- = (applySing- ((applySing- ((applySing ((singFun3 @FoldlSym0) sFoldl))- ((singFun2 @ThenCmpSym0) sThenCmp)))- SEQ))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing- ((applySing ((singFun2 @CompareSym0) sCompare))- sA_0123456789876543210))- sB_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing- ((applySing ((singFun2 @CompareSym0) sCompare))- sA_0123456789876543210))- sB_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing- ((applySing ((singFun2 @CompareSym0) sCompare))- sA_0123456789876543210))- sB_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing- ((applySing ((singFun2 @CompareSym0) sCompare))- sA_0123456789876543210))- sB_0123456789876543210)))- SNil))))- sCompare (SA _ _ _ _) (SB _ _ _ _) = SLT- sCompare (SA _ _ _ _) (SC _ _ _ _) = SLT- sCompare (SA _ _ _ _) (SD _ _ _ _) = SLT- sCompare (SA _ _ _ _) (SE _ _ _ _) = SLT- sCompare (SA _ _ _ _) (SF _ _ _ _) = SLT- sCompare (SB _ _ _ _) (SA _ _ _ _) = SGT- sCompare (SB _ _ _ _) (SC _ _ _ _) = SLT- sCompare (SB _ _ _ _) (SD _ _ _ _) = SLT- sCompare (SB _ _ _ _) (SE _ _ _ _) = SLT- sCompare (SB _ _ _ _) (SF _ _ _ _) = SLT- sCompare (SC _ _ _ _) (SA _ _ _ _) = SGT- sCompare (SC _ _ _ _) (SB _ _ _ _) = SGT- sCompare (SC _ _ _ _) (SD _ _ _ _) = SLT- sCompare (SC _ _ _ _) (SE _ _ _ _) = SLT- sCompare (SC _ _ _ _) (SF _ _ _ _) = SLT- sCompare (SD _ _ _ _) (SA _ _ _ _) = SGT- sCompare (SD _ _ _ _) (SB _ _ _ _) = SGT- sCompare (SD _ _ _ _) (SC _ _ _ _) = SGT- sCompare (SD _ _ _ _) (SE _ _ _ _) = SLT- sCompare (SD _ _ _ _) (SF _ _ _ _) = SLT- sCompare (SE _ _ _ _) (SA _ _ _ _) = SGT- sCompare (SE _ _ _ _) (SB _ _ _ _) = SGT- sCompare (SE _ _ _ _) (SC _ _ _ _) = SGT- sCompare (SE _ _ _ _) (SD _ _ _ _) = SGT- sCompare (SE _ _ _ _) (SF _ _ _ _) = SLT- sCompare (SF _ _ _ _) (SA _ _ _ _) = SGT- sCompare (SF _ _ _ _) (SB _ _ _ _) = SGT- sCompare (SF _ _ _ _) (SC _ _ _ _) = SGT- sCompare (SF _ _ _ _) (SD _ _ _ _) = SGT- sCompare (SF _ _ _ _) (SE _ _ _ _) = SGT- instance SDecide Nat => SDecide Nat where- (%~) SZero SZero = Proved Refl- (%~) SZero (SSucc _) = Disproved (\ x -> case x of {})- (%~) (SSucc _) SZero = Disproved (\ x -> case x of {})- (%~) (SSucc a) (SSucc b)- = case ((%~) a) b of- Proved Refl -> Proved Refl- Disproved contra- -> Disproved (\ refl -> case refl of Refl -> contra Refl)- instance SDecide Nat =>- Data.Type.Equality.TestEquality (SNat :: Nat -> Type) where- Data.Type.Equality.testEquality- = Data.Singletons.Decide.decideEquality- instance SDecide Nat =>- Data.Type.Coercion.TestCoercion (SNat :: Nat -> Type) where- Data.Type.Coercion.testCoercion- = Data.Singletons.Decide.decideCoercion- instance (SDecide a, SDecide b, SDecide c, SDecide d) =>- SDecide (Foo a b c d) where- (%~) (SA a a a a) (SA b b b b)- = case- ((((,,,) (((%~) a) b)) (((%~) a) b)) (((%~) a) b)) (((%~) a) b)- of- (,,,) (Proved Refl) (Proved Refl) (Proved Refl) (Proved Refl)- -> Proved Refl- (,,,) (Disproved contra) _ _ _- -> Disproved (\ refl -> case refl of Refl -> contra Refl)- (,,,) _ (Disproved contra) _ _- -> Disproved (\ refl -> case refl of Refl -> contra Refl)- (,,,) _ _ (Disproved contra) _- -> Disproved (\ refl -> case refl of Refl -> contra Refl)- (,,,) _ _ _ (Disproved contra)- -> Disproved (\ refl -> case refl of Refl -> contra Refl)- (%~) (SA _ _ _ _) (SB _ _ _ _) = Disproved (\ x -> case x of {})- (%~) (SA _ _ _ _) (SC _ _ _ _) = Disproved (\ x -> case x of {})- (%~) (SA _ _ _ _) (SD _ _ _ _) = Disproved (\ x -> case x of {})- (%~) (SA _ _ _ _) (SE _ _ _ _) = Disproved (\ x -> case x of {})- (%~) (SA _ _ _ _) (SF _ _ _ _) = Disproved (\ x -> case x of {})- (%~) (SB _ _ _ _) (SA _ _ _ _) = Disproved (\ x -> case x of {})- (%~) (SB a a a a) (SB b b b b)- = case- ((((,,,) (((%~) a) b)) (((%~) a) b)) (((%~) a) b)) (((%~) a) b)- of- (,,,) (Proved Refl) (Proved Refl) (Proved Refl) (Proved Refl)- -> Proved Refl- (,,,) (Disproved contra) _ _ _- -> Disproved (\ refl -> case refl of Refl -> contra Refl)- (,,,) _ (Disproved contra) _ _- -> Disproved (\ refl -> case refl of Refl -> contra Refl)- (,,,) _ _ (Disproved contra) _- -> Disproved (\ refl -> case refl of Refl -> contra Refl)- (,,,) _ _ _ (Disproved contra)- -> Disproved (\ refl -> case refl of Refl -> contra Refl)- (%~) (SB _ _ _ _) (SC _ _ _ _) = Disproved (\ x -> case x of {})- (%~) (SB _ _ _ _) (SD _ _ _ _) = Disproved (\ x -> case x of {})- (%~) (SB _ _ _ _) (SE _ _ _ _) = Disproved (\ x -> case x of {})- (%~) (SB _ _ _ _) (SF _ _ _ _) = Disproved (\ x -> case x of {})- (%~) (SC _ _ _ _) (SA _ _ _ _) = Disproved (\ x -> case x of {})- (%~) (SC _ _ _ _) (SB _ _ _ _) = Disproved (\ x -> case x of {})- (%~) (SC a a a a) (SC b b b b)- = case- ((((,,,) (((%~) a) b)) (((%~) a) b)) (((%~) a) b)) (((%~) a) b)- of- (,,,) (Proved Refl) (Proved Refl) (Proved Refl) (Proved Refl)- -> Proved Refl- (,,,) (Disproved contra) _ _ _- -> Disproved (\ refl -> case refl of Refl -> contra Refl)- (,,,) _ (Disproved contra) _ _- -> Disproved (\ refl -> case refl of Refl -> contra Refl)- (,,,) _ _ (Disproved contra) _- -> Disproved (\ refl -> case refl of Refl -> contra Refl)- (,,,) _ _ _ (Disproved contra)- -> Disproved (\ refl -> case refl of Refl -> contra Refl)- (%~) (SC _ _ _ _) (SD _ _ _ _) = Disproved (\ x -> case x of {})- (%~) (SC _ _ _ _) (SE _ _ _ _) = Disproved (\ x -> case x of {})- (%~) (SC _ _ _ _) (SF _ _ _ _) = Disproved (\ x -> case x of {})- (%~) (SD _ _ _ _) (SA _ _ _ _) = Disproved (\ x -> case x of {})- (%~) (SD _ _ _ _) (SB _ _ _ _) = Disproved (\ x -> case x of {})- (%~) (SD _ _ _ _) (SC _ _ _ _) = Disproved (\ x -> case x of {})- (%~) (SD a a a a) (SD b b b b)- = case- ((((,,,) (((%~) a) b)) (((%~) a) b)) (((%~) a) b)) (((%~) a) b)- of- (,,,) (Proved Refl) (Proved Refl) (Proved Refl) (Proved Refl)- -> Proved Refl- (,,,) (Disproved contra) _ _ _- -> Disproved (\ refl -> case refl of Refl -> contra Refl)- (,,,) _ (Disproved contra) _ _- -> Disproved (\ refl -> case refl of Refl -> contra Refl)- (,,,) _ _ (Disproved contra) _- -> Disproved (\ refl -> case refl of Refl -> contra Refl)- (,,,) _ _ _ (Disproved contra)- -> Disproved (\ refl -> case refl of Refl -> contra Refl)- (%~) (SD _ _ _ _) (SE _ _ _ _) = Disproved (\ x -> case x of {})- (%~) (SD _ _ _ _) (SF _ _ _ _) = Disproved (\ x -> case x of {})- (%~) (SE _ _ _ _) (SA _ _ _ _) = Disproved (\ x -> case x of {})- (%~) (SE _ _ _ _) (SB _ _ _ _) = Disproved (\ x -> case x of {})- (%~) (SE _ _ _ _) (SC _ _ _ _) = Disproved (\ x -> case x of {})- (%~) (SE _ _ _ _) (SD _ _ _ _) = Disproved (\ x -> case x of {})- (%~) (SE a a a a) (SE b b b b)- = case- ((((,,,) (((%~) a) b)) (((%~) a) b)) (((%~) a) b)) (((%~) a) b)- of- (,,,) (Proved Refl) (Proved Refl) (Proved Refl) (Proved Refl)- -> Proved Refl- (,,,) (Disproved contra) _ _ _- -> Disproved (\ refl -> case refl of Refl -> contra Refl)- (,,,) _ (Disproved contra) _ _- -> Disproved (\ refl -> case refl of Refl -> contra Refl)- (,,,) _ _ (Disproved contra) _- -> Disproved (\ refl -> case refl of Refl -> contra Refl)- (,,,) _ _ _ (Disproved contra)- -> Disproved (\ refl -> case refl of Refl -> contra Refl)- (%~) (SE _ _ _ _) (SF _ _ _ _) = Disproved (\ x -> case x of {})- (%~) (SF _ _ _ _) (SA _ _ _ _) = Disproved (\ x -> case x of {})- (%~) (SF _ _ _ _) (SB _ _ _ _) = Disproved (\ x -> case x of {})- (%~) (SF _ _ _ _) (SC _ _ _ _) = Disproved (\ x -> case x of {})- (%~) (SF _ _ _ _) (SD _ _ _ _) = Disproved (\ x -> case x of {})- (%~) (SF _ _ _ _) (SE _ _ _ _) = Disproved (\ x -> case x of {})- (%~) (SF a a a a) (SF b b b b)- = case- ((((,,,) (((%~) a) b)) (((%~) a) b)) (((%~) a) b)) (((%~) a) b)- of- (,,,) (Proved Refl) (Proved Refl) (Proved Refl) (Proved Refl)- -> Proved Refl- (,,,) (Disproved contra) _ _ _- -> Disproved (\ refl -> case refl of Refl -> contra Refl)- (,,,) _ (Disproved contra) _ _- -> Disproved (\ refl -> case refl of Refl -> contra Refl)- (,,,) _ _ (Disproved contra) _- -> Disproved (\ refl -> case refl of Refl -> contra Refl)- (,,,) _ _ _ (Disproved contra)- -> Disproved (\ refl -> case refl of Refl -> contra Refl)- instance (SDecide a, SDecide b, SDecide c, SDecide d) =>- Data.Type.Equality.TestEquality (SFoo :: Foo a b c d -> Type) where- Data.Type.Equality.testEquality- = Data.Singletons.Decide.decideEquality- instance (SDecide a, SDecide b, SDecide c, SDecide d) =>- Data.Type.Coercion.TestCoercion (SFoo :: Foo a b c d -> Type) where- Data.Type.Coercion.testCoercion- = Data.Singletons.Decide.decideCoercion- instance SingI Zero where- sing = SZero- instance SingI n => SingI (Succ (n :: Nat)) where- sing = SSucc sing- instance SingI1 Succ where- liftSing = SSucc- instance SingI (SuccSym0 :: (~>) Nat Nat) where- sing = (singFun1 @SuccSym0) SSucc- instance (SingI n, SingI n, SingI n, SingI n) =>- SingI (A (n :: a) (n :: b) (n :: c) (n :: d)) where- sing = (((SA sing) sing) sing) sing- instance (SingI n, SingI n, SingI n) =>- SingI1 (A (n :: a) (n :: b) (n :: c)) where- liftSing = ((SA sing) sing) sing- instance (SingI n, SingI n) => SingI2 (A (n :: a) (n :: b)) where- liftSing2 = (SA sing) sing- instance SingI (ASym0 :: (~>) a ((~>) b ((~>) c ((~>) d (Foo a b c d))))) where- sing = (singFun4 @ASym0) SA- instance SingI d =>- SingI (ASym1 (d :: a) :: (~>) b ((~>) c ((~>) d (Foo a b c d)))) where- sing = (singFun3 @(ASym1 (d :: a))) (SA (sing @d))- instance SingI1 (ASym1 :: a- -> (~>) b ((~>) c ((~>) d (Foo a b c d)))) where- liftSing (s :: Sing (d :: a)) = (singFun3 @(ASym1 (d :: a))) (SA s)- instance (SingI d, SingI d) =>- SingI (ASym2 (d :: a) (d :: b) :: (~>) c ((~>) d (Foo a b c d))) where- sing- = (singFun2 @(ASym2 (d :: a) (d :: b))) ((SA (sing @d)) (sing @d))- instance SingI d =>- SingI1 (ASym2 (d :: a) :: b -> (~>) c ((~>) d (Foo a b c d))) where- liftSing (s :: Sing (d :: b))- = (singFun2 @(ASym2 (d :: a) (d :: b))) ((SA (sing @d)) s)- instance SingI2 (ASym2 :: a- -> b -> (~>) c ((~>) d (Foo a b c d))) where- liftSing2 (s :: Sing (d :: a)) (s :: Sing (d :: b))- = (singFun2 @(ASym2 (d :: a) (d :: b))) ((SA s) s)- instance (SingI d, SingI d, SingI d) =>- SingI (ASym3 (d :: a) (d :: b) (d :: c) :: (~>) d (Foo a b c d)) where- sing- = (singFun1 @(ASym3 (d :: a) (d :: b) (d :: c)))- (((SA (sing @d)) (sing @d)) (sing @d))- instance (SingI d, SingI d) =>- SingI1 (ASym3 (d :: a) (d :: b) :: c -> (~>) d (Foo a b c d)) where- liftSing (s :: Sing (d :: c))- = (singFun1 @(ASym3 (d :: a) (d :: b) (d :: c)))- (((SA (sing @d)) (sing @d)) s)- instance SingI d =>- SingI2 (ASym3 (d :: a) :: b -> c -> (~>) d (Foo a b c d)) where- liftSing2 (s :: Sing (d :: b)) (s :: Sing (d :: c))- = (singFun1 @(ASym3 (d :: a) (d :: b) (d :: c)))- (((SA (sing @d)) s) s)- instance (SingI n, SingI n, SingI n, SingI n) =>- SingI (B (n :: a) (n :: b) (n :: c) (n :: d)) where- sing = (((SB sing) sing) sing) sing- instance (SingI n, SingI n, SingI n) =>- SingI1 (B (n :: a) (n :: b) (n :: c)) where- liftSing = ((SB sing) sing) sing- instance (SingI n, SingI n) => SingI2 (B (n :: a) (n :: b)) where- liftSing2 = (SB sing) sing- instance SingI (BSym0 :: (~>) a ((~>) b ((~>) c ((~>) d (Foo a b c d))))) where- sing = (singFun4 @BSym0) SB- instance SingI d =>- SingI (BSym1 (d :: a) :: (~>) b ((~>) c ((~>) d (Foo a b c d)))) where- sing = (singFun3 @(BSym1 (d :: a))) (SB (sing @d))- instance SingI1 (BSym1 :: a- -> (~>) b ((~>) c ((~>) d (Foo a b c d)))) where- liftSing (s :: Sing (d :: a)) = (singFun3 @(BSym1 (d :: a))) (SB s)- instance (SingI d, SingI d) =>- SingI (BSym2 (d :: a) (d :: b) :: (~>) c ((~>) d (Foo a b c d))) where- sing- = (singFun2 @(BSym2 (d :: a) (d :: b))) ((SB (sing @d)) (sing @d))- instance SingI d =>- SingI1 (BSym2 (d :: a) :: b -> (~>) c ((~>) d (Foo a b c d))) where- liftSing (s :: Sing (d :: b))- = (singFun2 @(BSym2 (d :: a) (d :: b))) ((SB (sing @d)) s)- instance SingI2 (BSym2 :: a- -> b -> (~>) c ((~>) d (Foo a b c d))) where- liftSing2 (s :: Sing (d :: a)) (s :: Sing (d :: b))- = (singFun2 @(BSym2 (d :: a) (d :: b))) ((SB s) s)- instance (SingI d, SingI d, SingI d) =>- SingI (BSym3 (d :: a) (d :: b) (d :: c) :: (~>) d (Foo a b c d)) where- sing- = (singFun1 @(BSym3 (d :: a) (d :: b) (d :: c)))- (((SB (sing @d)) (sing @d)) (sing @d))- instance (SingI d, SingI d) =>- SingI1 (BSym3 (d :: a) (d :: b) :: c -> (~>) d (Foo a b c d)) where- liftSing (s :: Sing (d :: c))- = (singFun1 @(BSym3 (d :: a) (d :: b) (d :: c)))- (((SB (sing @d)) (sing @d)) s)- instance SingI d =>- SingI2 (BSym3 (d :: a) :: b -> c -> (~>) d (Foo a b c d)) where- liftSing2 (s :: Sing (d :: b)) (s :: Sing (d :: c))- = (singFun1 @(BSym3 (d :: a) (d :: b) (d :: c)))- (((SB (sing @d)) s) s)- instance (SingI n, SingI n, SingI n, SingI n) =>- SingI (C (n :: a) (n :: b) (n :: c) (n :: d)) where- sing = (((SC sing) sing) sing) sing- instance (SingI n, SingI n, SingI n) =>- SingI1 (C (n :: a) (n :: b) (n :: c)) where- liftSing = ((SC sing) sing) sing- instance (SingI n, SingI n) => SingI2 (C (n :: a) (n :: b)) where- liftSing2 = (SC sing) sing- instance SingI (CSym0 :: (~>) a ((~>) b ((~>) c ((~>) d (Foo a b c d))))) where- sing = (singFun4 @CSym0) SC- instance SingI d =>- SingI (CSym1 (d :: a) :: (~>) b ((~>) c ((~>) d (Foo a b c d)))) where- sing = (singFun3 @(CSym1 (d :: a))) (SC (sing @d))- instance SingI1 (CSym1 :: a- -> (~>) b ((~>) c ((~>) d (Foo a b c d)))) where- liftSing (s :: Sing (d :: a)) = (singFun3 @(CSym1 (d :: a))) (SC s)- instance (SingI d, SingI d) =>- SingI (CSym2 (d :: a) (d :: b) :: (~>) c ((~>) d (Foo a b c d))) where- sing- = (singFun2 @(CSym2 (d :: a) (d :: b))) ((SC (sing @d)) (sing @d))- instance SingI d =>- SingI1 (CSym2 (d :: a) :: b -> (~>) c ((~>) d (Foo a b c d))) where- liftSing (s :: Sing (d :: b))- = (singFun2 @(CSym2 (d :: a) (d :: b))) ((SC (sing @d)) s)- instance SingI2 (CSym2 :: a- -> b -> (~>) c ((~>) d (Foo a b c d))) where- liftSing2 (s :: Sing (d :: a)) (s :: Sing (d :: b))- = (singFun2 @(CSym2 (d :: a) (d :: b))) ((SC s) s)- instance (SingI d, SingI d, SingI d) =>- SingI (CSym3 (d :: a) (d :: b) (d :: c) :: (~>) d (Foo a b c d)) where- sing- = (singFun1 @(CSym3 (d :: a) (d :: b) (d :: c)))- (((SC (sing @d)) (sing @d)) (sing @d))- instance (SingI d, SingI d) =>- SingI1 (CSym3 (d :: a) (d :: b) :: c -> (~>) d (Foo a b c d)) where- liftSing (s :: Sing (d :: c))- = (singFun1 @(CSym3 (d :: a) (d :: b) (d :: c)))- (((SC (sing @d)) (sing @d)) s)- instance SingI d =>- SingI2 (CSym3 (d :: a) :: b -> c -> (~>) d (Foo a b c d)) where- liftSing2 (s :: Sing (d :: b)) (s :: Sing (d :: c))- = (singFun1 @(CSym3 (d :: a) (d :: b) (d :: c)))- (((SC (sing @d)) s) s)- instance (SingI n, SingI n, SingI n, SingI n) =>- SingI (D (n :: a) (n :: b) (n :: c) (n :: d)) where- sing = (((SD sing) sing) sing) sing- instance (SingI n, SingI n, SingI n) =>- SingI1 (D (n :: a) (n :: b) (n :: c)) where- liftSing = ((SD sing) sing) sing- instance (SingI n, SingI n) => SingI2 (D (n :: a) (n :: b)) where- liftSing2 = (SD sing) sing- instance SingI (DSym0 :: (~>) a ((~>) b ((~>) c ((~>) d (Foo a b c d))))) where- sing = (singFun4 @DSym0) SD- instance SingI d =>- SingI (DSym1 (d :: a) :: (~>) b ((~>) c ((~>) d (Foo a b c d)))) where- sing = (singFun3 @(DSym1 (d :: a))) (SD (sing @d))- instance SingI1 (DSym1 :: a- -> (~>) b ((~>) c ((~>) d (Foo a b c d)))) where- liftSing (s :: Sing (d :: a)) = (singFun3 @(DSym1 (d :: a))) (SD s)- instance (SingI d, SingI d) =>- SingI (DSym2 (d :: a) (d :: b) :: (~>) c ((~>) d (Foo a b c d))) where- sing- = (singFun2 @(DSym2 (d :: a) (d :: b))) ((SD (sing @d)) (sing @d))- instance SingI d =>- SingI1 (DSym2 (d :: a) :: b -> (~>) c ((~>) d (Foo a b c d))) where- liftSing (s :: Sing (d :: b))- = (singFun2 @(DSym2 (d :: a) (d :: b))) ((SD (sing @d)) s)- instance SingI2 (DSym2 :: a- -> b -> (~>) c ((~>) d (Foo a b c d))) where- liftSing2 (s :: Sing (d :: a)) (s :: Sing (d :: b))- = (singFun2 @(DSym2 (d :: a) (d :: b))) ((SD s) s)- instance (SingI d, SingI d, SingI d) =>- SingI (DSym3 (d :: a) (d :: b) (d :: c) :: (~>) d (Foo a b c d)) where- sing- = (singFun1 @(DSym3 (d :: a) (d :: b) (d :: c)))- (((SD (sing @d)) (sing @d)) (sing @d))- instance (SingI d, SingI d) =>- SingI1 (DSym3 (d :: a) (d :: b) :: c -> (~>) d (Foo a b c d)) where- liftSing (s :: Sing (d :: c))- = (singFun1 @(DSym3 (d :: a) (d :: b) (d :: c)))- (((SD (sing @d)) (sing @d)) s)- instance SingI d =>- SingI2 (DSym3 (d :: a) :: b -> c -> (~>) d (Foo a b c d)) where- liftSing2 (s :: Sing (d :: b)) (s :: Sing (d :: c))- = (singFun1 @(DSym3 (d :: a) (d :: b) (d :: c)))- (((SD (sing @d)) s) s)- instance (SingI n, SingI n, SingI n, SingI n) =>- SingI (E (n :: a) (n :: b) (n :: c) (n :: d)) where- sing = (((SE sing) sing) sing) sing- instance (SingI n, SingI n, SingI n) =>- SingI1 (E (n :: a) (n :: b) (n :: c)) where- liftSing = ((SE sing) sing) sing- instance (SingI n, SingI n) => SingI2 (E (n :: a) (n :: b)) where- liftSing2 = (SE sing) sing- instance SingI (ESym0 :: (~>) a ((~>) b ((~>) c ((~>) d (Foo a b c d))))) where- sing = (singFun4 @ESym0) SE- instance SingI d =>- SingI (ESym1 (d :: a) :: (~>) b ((~>) c ((~>) d (Foo a b c d)))) where- sing = (singFun3 @(ESym1 (d :: a))) (SE (sing @d))- instance SingI1 (ESym1 :: a- -> (~>) b ((~>) c ((~>) d (Foo a b c d)))) where- liftSing (s :: Sing (d :: a)) = (singFun3 @(ESym1 (d :: a))) (SE s)- instance (SingI d, SingI d) =>- SingI (ESym2 (d :: a) (d :: b) :: (~>) c ((~>) d (Foo a b c d))) where- sing- = (singFun2 @(ESym2 (d :: a) (d :: b))) ((SE (sing @d)) (sing @d))- instance SingI d =>- SingI1 (ESym2 (d :: a) :: b -> (~>) c ((~>) d (Foo a b c d))) where- liftSing (s :: Sing (d :: b))- = (singFun2 @(ESym2 (d :: a) (d :: b))) ((SE (sing @d)) s)- instance SingI2 (ESym2 :: a- -> b -> (~>) c ((~>) d (Foo a b c d))) where- liftSing2 (s :: Sing (d :: a)) (s :: Sing (d :: b))- = (singFun2 @(ESym2 (d :: a) (d :: b))) ((SE s) s)- instance (SingI d, SingI d, SingI d) =>- SingI (ESym3 (d :: a) (d :: b) (d :: c) :: (~>) d (Foo a b c d)) where- sing- = (singFun1 @(ESym3 (d :: a) (d :: b) (d :: c)))- (((SE (sing @d)) (sing @d)) (sing @d))- instance (SingI d, SingI d) =>- SingI1 (ESym3 (d :: a) (d :: b) :: c -> (~>) d (Foo a b c d)) where- liftSing (s :: Sing (d :: c))- = (singFun1 @(ESym3 (d :: a) (d :: b) (d :: c)))- (((SE (sing @d)) (sing @d)) s)- instance SingI d =>- SingI2 (ESym3 (d :: a) :: b -> c -> (~>) d (Foo a b c d)) where- liftSing2 (s :: Sing (d :: b)) (s :: Sing (d :: c))- = (singFun1 @(ESym3 (d :: a) (d :: b) (d :: c)))- (((SE (sing @d)) s) s)- instance (SingI n, SingI n, SingI n, SingI n) =>- SingI (F (n :: a) (n :: b) (n :: c) (n :: d)) where- sing = (((SF sing) sing) sing) sing- instance (SingI n, SingI n, SingI n) =>- SingI1 (F (n :: a) (n :: b) (n :: c)) where- liftSing = ((SF sing) sing) sing- instance (SingI n, SingI n) => SingI2 (F (n :: a) (n :: b)) where- liftSing2 = (SF sing) sing- instance SingI (FSym0 :: (~>) a ((~>) b ((~>) c ((~>) d (Foo a b c d))))) where- sing = (singFun4 @FSym0) SF- instance SingI d =>- SingI (FSym1 (d :: a) :: (~>) b ((~>) c ((~>) d (Foo a b c d)))) where- sing = (singFun3 @(FSym1 (d :: a))) (SF (sing @d))- instance SingI1 (FSym1 :: a- -> (~>) b ((~>) c ((~>) d (Foo a b c d)))) where- liftSing (s :: Sing (d :: a)) = (singFun3 @(FSym1 (d :: a))) (SF s)- instance (SingI d, SingI d) =>- SingI (FSym2 (d :: a) (d :: b) :: (~>) c ((~>) d (Foo a b c d))) where- sing- = (singFun2 @(FSym2 (d :: a) (d :: b))) ((SF (sing @d)) (sing @d))- instance SingI d =>- SingI1 (FSym2 (d :: a) :: b -> (~>) c ((~>) d (Foo a b c d))) where- liftSing (s :: Sing (d :: b))- = (singFun2 @(FSym2 (d :: a) (d :: b))) ((SF (sing @d)) s)- instance SingI2 (FSym2 :: a- -> b -> (~>) c ((~>) d (Foo a b c d))) where- liftSing2 (s :: Sing (d :: a)) (s :: Sing (d :: b))- = (singFun2 @(FSym2 (d :: a) (d :: b))) ((SF s) s)- instance (SingI d, SingI d, SingI d) =>- SingI (FSym3 (d :: a) (d :: b) (d :: c) :: (~>) d (Foo a b c d)) where- sing- = (singFun1 @(FSym3 (d :: a) (d :: b) (d :: c)))- (((SF (sing @d)) (sing @d)) (sing @d))- instance (SingI d, SingI d) =>- SingI1 (FSym3 (d :: a) (d :: b) :: c -> (~>) d (Foo a b c d)) where- liftSing (s :: Sing (d :: c))- = (singFun1 @(FSym3 (d :: a) (d :: b) (d :: c)))- (((SF (sing @d)) (sing @d)) s)- instance SingI d =>- SingI2 (FSym3 (d :: a) :: b -> c -> (~>) d (Foo a b c d)) where- liftSing2 (s :: Sing (d :: b)) (s :: Sing (d :: c))- = (singFun1 @(FSym3 (d :: a) (d :: b) (d :: c)))- (((SF (sing @d)) s) s)+Singletons/OrdDeriving.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| data Nat + = Zero | Succ Nat + deriving (Eq, Ord) + data Foo a b c d + = A a b c d | + B a b c d | + C a b c d | + D a b c d | + E a b c d | + F a b c d + deriving (Eq, Ord) |] + ======> + data Nat + = Zero | Succ Nat + deriving (Eq, Ord) + data Foo a b c d + = A a b c d | + B a b c d | + C a b c d | + D a b c d | + E a b c d | + F a b c d + deriving (Eq, Ord) + type ZeroSym0 :: Nat + type family ZeroSym0 :: Nat where + ZeroSym0 = Zero + type SuccSym0 :: (~>) Nat Nat + data SuccSym0 :: (~>) Nat Nat + where + SuccSym0KindInference :: SameKind (Apply SuccSym0 arg) (SuccSym1 arg) => + SuccSym0 a0123456789876543210 + type instance Apply SuccSym0 a0123456789876543210 = Succ a0123456789876543210 + instance SuppressUnusedWarnings SuccSym0 where + suppressUnusedWarnings = snd ((,) SuccSym0KindInference ()) + type SuccSym1 :: Nat -> Nat + type family SuccSym1 (a0123456789876543210 :: Nat) :: Nat where + SuccSym1 a0123456789876543210 = Succ a0123456789876543210 + type ASym0 :: forall a + b + c + d. (~>) a ((~>) b ((~>) c ((~>) d (Foo a b c d)))) + data ASym0 :: (~>) a ((~>) b ((~>) c ((~>) d (Foo a b c d)))) + where + ASym0KindInference :: SameKind (Apply ASym0 arg) (ASym1 arg) => + ASym0 a0123456789876543210 + type instance Apply ASym0 a0123456789876543210 = ASym1 a0123456789876543210 + instance SuppressUnusedWarnings ASym0 where + suppressUnusedWarnings = snd ((,) ASym0KindInference ()) + type ASym1 :: forall a b c d. a + -> (~>) b ((~>) c ((~>) d (Foo a b c d))) + data ASym1 (a0123456789876543210 :: a) :: (~>) b ((~>) c ((~>) d (Foo a b c d))) + where + ASym1KindInference :: SameKind (Apply (ASym1 a0123456789876543210) arg) (ASym2 a0123456789876543210 arg) => + ASym1 a0123456789876543210 a0123456789876543210 + type instance Apply (ASym1 a0123456789876543210) a0123456789876543210 = ASym2 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ASym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) ASym1KindInference ()) + type ASym2 :: forall a b c d. a + -> b -> (~>) c ((~>) d (Foo a b c d)) + data ASym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: (~>) c ((~>) d (Foo a b c d)) + where + ASym2KindInference :: SameKind (Apply (ASym2 a0123456789876543210 a0123456789876543210) arg) (ASym3 a0123456789876543210 a0123456789876543210 arg) => + ASym2 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply (ASym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = ASym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ASym2 a0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) ASym2KindInference ()) + type ASym3 :: forall a b c d. a -> b -> c -> (~>) d (Foo a b c d) + data ASym3 (a0123456789876543210 :: a) (a0123456789876543210 :: b) (a0123456789876543210 :: c) :: (~>) d (Foo a b c d) + where + ASym3KindInference :: SameKind (Apply (ASym3 a0123456789876543210 a0123456789876543210 a0123456789876543210) arg) (ASym4 a0123456789876543210 a0123456789876543210 a0123456789876543210 arg) => + ASym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply (ASym3 a0123456789876543210 a0123456789876543210 a0123456789876543210) a0123456789876543210 = A a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ASym3 a0123456789876543210 a0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) ASym3KindInference ()) + type ASym4 :: forall a b c d. a -> b -> c -> d -> Foo a b c d + type family ASym4 (a0123456789876543210 :: a) (a0123456789876543210 :: b) (a0123456789876543210 :: c) (a0123456789876543210 :: d) :: Foo a b c d where + ASym4 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 = A a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type BSym0 :: forall a + b + c + d. (~>) a ((~>) b ((~>) c ((~>) d (Foo a b c d)))) + data BSym0 :: (~>) a ((~>) b ((~>) c ((~>) d (Foo a b c d)))) + where + BSym0KindInference :: SameKind (Apply BSym0 arg) (BSym1 arg) => + BSym0 a0123456789876543210 + type instance Apply BSym0 a0123456789876543210 = BSym1 a0123456789876543210 + instance SuppressUnusedWarnings BSym0 where + suppressUnusedWarnings = snd ((,) BSym0KindInference ()) + type BSym1 :: forall a b c d. a + -> (~>) b ((~>) c ((~>) d (Foo a b c d))) + data BSym1 (a0123456789876543210 :: a) :: (~>) b ((~>) c ((~>) d (Foo a b c d))) + where + BSym1KindInference :: SameKind (Apply (BSym1 a0123456789876543210) arg) (BSym2 a0123456789876543210 arg) => + BSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (BSym1 a0123456789876543210) a0123456789876543210 = BSym2 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (BSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) BSym1KindInference ()) + type BSym2 :: forall a b c d. a + -> b -> (~>) c ((~>) d (Foo a b c d)) + data BSym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: (~>) c ((~>) d (Foo a b c d)) + where + BSym2KindInference :: SameKind (Apply (BSym2 a0123456789876543210 a0123456789876543210) arg) (BSym3 a0123456789876543210 a0123456789876543210 arg) => + BSym2 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply (BSym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = BSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (BSym2 a0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) BSym2KindInference ()) + type BSym3 :: forall a b c d. a -> b -> c -> (~>) d (Foo a b c d) + data BSym3 (a0123456789876543210 :: a) (a0123456789876543210 :: b) (a0123456789876543210 :: c) :: (~>) d (Foo a b c d) + where + BSym3KindInference :: SameKind (Apply (BSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210) arg) (BSym4 a0123456789876543210 a0123456789876543210 a0123456789876543210 arg) => + BSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply (BSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210) a0123456789876543210 = B a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (BSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) BSym3KindInference ()) + type BSym4 :: forall a b c d. a -> b -> c -> d -> Foo a b c d + type family BSym4 (a0123456789876543210 :: a) (a0123456789876543210 :: b) (a0123456789876543210 :: c) (a0123456789876543210 :: d) :: Foo a b c d where + BSym4 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 = B a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type CSym0 :: forall a + b + c + d. (~>) a ((~>) b ((~>) c ((~>) d (Foo a b c d)))) + data CSym0 :: (~>) a ((~>) b ((~>) c ((~>) d (Foo a b c d)))) + where + CSym0KindInference :: SameKind (Apply CSym0 arg) (CSym1 arg) => + CSym0 a0123456789876543210 + type instance Apply CSym0 a0123456789876543210 = CSym1 a0123456789876543210 + instance SuppressUnusedWarnings CSym0 where + suppressUnusedWarnings = snd ((,) CSym0KindInference ()) + type CSym1 :: forall a b c d. a + -> (~>) b ((~>) c ((~>) d (Foo a b c d))) + data CSym1 (a0123456789876543210 :: a) :: (~>) b ((~>) c ((~>) d (Foo a b c d))) + where + CSym1KindInference :: SameKind (Apply (CSym1 a0123456789876543210) arg) (CSym2 a0123456789876543210 arg) => + CSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (CSym1 a0123456789876543210) a0123456789876543210 = CSym2 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (CSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) CSym1KindInference ()) + type CSym2 :: forall a b c d. a + -> b -> (~>) c ((~>) d (Foo a b c d)) + data CSym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: (~>) c ((~>) d (Foo a b c d)) + where + CSym2KindInference :: SameKind (Apply (CSym2 a0123456789876543210 a0123456789876543210) arg) (CSym3 a0123456789876543210 a0123456789876543210 arg) => + CSym2 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply (CSym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = CSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (CSym2 a0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) CSym2KindInference ()) + type CSym3 :: forall a b c d. a -> b -> c -> (~>) d (Foo a b c d) + data CSym3 (a0123456789876543210 :: a) (a0123456789876543210 :: b) (a0123456789876543210 :: c) :: (~>) d (Foo a b c d) + where + CSym3KindInference :: SameKind (Apply (CSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210) arg) (CSym4 a0123456789876543210 a0123456789876543210 a0123456789876543210 arg) => + CSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply (CSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210) a0123456789876543210 = C a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (CSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) CSym3KindInference ()) + type CSym4 :: forall a b c d. a -> b -> c -> d -> Foo a b c d + type family CSym4 (a0123456789876543210 :: a) (a0123456789876543210 :: b) (a0123456789876543210 :: c) (a0123456789876543210 :: d) :: Foo a b c d where + CSym4 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 = C a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type DSym0 :: forall a + b + c + d. (~>) a ((~>) b ((~>) c ((~>) d (Foo a b c d)))) + data DSym0 :: (~>) a ((~>) b ((~>) c ((~>) d (Foo a b c d)))) + where + DSym0KindInference :: SameKind (Apply DSym0 arg) (DSym1 arg) => + DSym0 a0123456789876543210 + type instance Apply DSym0 a0123456789876543210 = DSym1 a0123456789876543210 + instance SuppressUnusedWarnings DSym0 where + suppressUnusedWarnings = snd ((,) DSym0KindInference ()) + type DSym1 :: forall a b c d. a + -> (~>) b ((~>) c ((~>) d (Foo a b c d))) + data DSym1 (a0123456789876543210 :: a) :: (~>) b ((~>) c ((~>) d (Foo a b c d))) + where + DSym1KindInference :: SameKind (Apply (DSym1 a0123456789876543210) arg) (DSym2 a0123456789876543210 arg) => + DSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (DSym1 a0123456789876543210) a0123456789876543210 = DSym2 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (DSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) DSym1KindInference ()) + type DSym2 :: forall a b c d. a + -> b -> (~>) c ((~>) d (Foo a b c d)) + data DSym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: (~>) c ((~>) d (Foo a b c d)) + where + DSym2KindInference :: SameKind (Apply (DSym2 a0123456789876543210 a0123456789876543210) arg) (DSym3 a0123456789876543210 a0123456789876543210 arg) => + DSym2 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply (DSym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = DSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (DSym2 a0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) DSym2KindInference ()) + type DSym3 :: forall a b c d. a -> b -> c -> (~>) d (Foo a b c d) + data DSym3 (a0123456789876543210 :: a) (a0123456789876543210 :: b) (a0123456789876543210 :: c) :: (~>) d (Foo a b c d) + where + DSym3KindInference :: SameKind (Apply (DSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210) arg) (DSym4 a0123456789876543210 a0123456789876543210 a0123456789876543210 arg) => + DSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply (DSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210) a0123456789876543210 = D a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (DSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) DSym3KindInference ()) + type DSym4 :: forall a b c d. a -> b -> c -> d -> Foo a b c d + type family DSym4 (a0123456789876543210 :: a) (a0123456789876543210 :: b) (a0123456789876543210 :: c) (a0123456789876543210 :: d) :: Foo a b c d where + DSym4 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 = D a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type ESym0 :: forall a + b + c + d. (~>) a ((~>) b ((~>) c ((~>) d (Foo a b c d)))) + data ESym0 :: (~>) a ((~>) b ((~>) c ((~>) d (Foo a b c d)))) + where + ESym0KindInference :: SameKind (Apply ESym0 arg) (ESym1 arg) => + ESym0 a0123456789876543210 + type instance Apply ESym0 a0123456789876543210 = ESym1 a0123456789876543210 + instance SuppressUnusedWarnings ESym0 where + suppressUnusedWarnings = snd ((,) ESym0KindInference ()) + type ESym1 :: forall a b c d. a + -> (~>) b ((~>) c ((~>) d (Foo a b c d))) + data ESym1 (a0123456789876543210 :: a) :: (~>) b ((~>) c ((~>) d (Foo a b c d))) + where + ESym1KindInference :: SameKind (Apply (ESym1 a0123456789876543210) arg) (ESym2 a0123456789876543210 arg) => + ESym1 a0123456789876543210 a0123456789876543210 + type instance Apply (ESym1 a0123456789876543210) a0123456789876543210 = ESym2 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ESym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) ESym1KindInference ()) + type ESym2 :: forall a b c d. a + -> b -> (~>) c ((~>) d (Foo a b c d)) + data ESym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: (~>) c ((~>) d (Foo a b c d)) + where + ESym2KindInference :: SameKind (Apply (ESym2 a0123456789876543210 a0123456789876543210) arg) (ESym3 a0123456789876543210 a0123456789876543210 arg) => + ESym2 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply (ESym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = ESym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ESym2 a0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) ESym2KindInference ()) + type ESym3 :: forall a b c d. a -> b -> c -> (~>) d (Foo a b c d) + data ESym3 (a0123456789876543210 :: a) (a0123456789876543210 :: b) (a0123456789876543210 :: c) :: (~>) d (Foo a b c d) + where + ESym3KindInference :: SameKind (Apply (ESym3 a0123456789876543210 a0123456789876543210 a0123456789876543210) arg) (ESym4 a0123456789876543210 a0123456789876543210 a0123456789876543210 arg) => + ESym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply (ESym3 a0123456789876543210 a0123456789876543210 a0123456789876543210) a0123456789876543210 = E a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ESym3 a0123456789876543210 a0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) ESym3KindInference ()) + type ESym4 :: forall a b c d. a -> b -> c -> d -> Foo a b c d + type family ESym4 (a0123456789876543210 :: a) (a0123456789876543210 :: b) (a0123456789876543210 :: c) (a0123456789876543210 :: d) :: Foo a b c d where + ESym4 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 = E a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type FSym0 :: forall a + b + c + d. (~>) a ((~>) b ((~>) c ((~>) d (Foo a b c d)))) + data FSym0 :: (~>) a ((~>) b ((~>) c ((~>) d (Foo a b c d)))) + where + FSym0KindInference :: SameKind (Apply FSym0 arg) (FSym1 arg) => + FSym0 a0123456789876543210 + type instance Apply FSym0 a0123456789876543210 = FSym1 a0123456789876543210 + instance SuppressUnusedWarnings FSym0 where + suppressUnusedWarnings = snd ((,) FSym0KindInference ()) + type FSym1 :: forall a b c d. a + -> (~>) b ((~>) c ((~>) d (Foo a b c d))) + data FSym1 (a0123456789876543210 :: a) :: (~>) b ((~>) c ((~>) d (Foo a b c d))) + where + FSym1KindInference :: SameKind (Apply (FSym1 a0123456789876543210) arg) (FSym2 a0123456789876543210 arg) => + FSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (FSym1 a0123456789876543210) a0123456789876543210 = FSym2 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (FSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) FSym1KindInference ()) + type FSym2 :: forall a b c d. a + -> b -> (~>) c ((~>) d (Foo a b c d)) + data FSym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: (~>) c ((~>) d (Foo a b c d)) + where + FSym2KindInference :: SameKind (Apply (FSym2 a0123456789876543210 a0123456789876543210) arg) (FSym3 a0123456789876543210 a0123456789876543210 arg) => + FSym2 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply (FSym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = FSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (FSym2 a0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) FSym2KindInference ()) + type FSym3 :: forall a b c d. a -> b -> c -> (~>) d (Foo a b c d) + data FSym3 (a0123456789876543210 :: a) (a0123456789876543210 :: b) (a0123456789876543210 :: c) :: (~>) d (Foo a b c d) + where + FSym3KindInference :: SameKind (Apply (FSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210) arg) (FSym4 a0123456789876543210 a0123456789876543210 a0123456789876543210 arg) => + FSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply (FSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210) a0123456789876543210 = F a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (FSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) FSym3KindInference ()) + type FSym4 :: forall a b c d. a -> b -> c -> d -> Foo a b c d + type family FSym4 (a0123456789876543210 :: a) (a0123456789876543210 :: b) (a0123456789876543210 :: c) (a0123456789876543210 :: d) :: Foo a b c d where + FSym4 a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 = F a0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type TFHelper_0123456789876543210 :: Nat -> Nat -> Bool + type family TFHelper_0123456789876543210 (a :: Nat) (a :: Nat) :: Bool where + TFHelper_0123456789876543210 Zero Zero = TrueSym0 + TFHelper_0123456789876543210 Zero (Succ _) = FalseSym0 + TFHelper_0123456789876543210 (Succ _) Zero = FalseSym0 + TFHelper_0123456789876543210 (Succ a_0123456789876543210) (Succ b_0123456789876543210) = Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210 + type TFHelper_0123456789876543210Sym0 :: (~>) Nat ((~>) Nat Bool) + data TFHelper_0123456789876543210Sym0 :: (~>) Nat ((~>) Nat Bool) + where + TFHelper_0123456789876543210Sym0KindInference :: SameKind (Apply TFHelper_0123456789876543210Sym0 arg) (TFHelper_0123456789876543210Sym1 arg) => + TFHelper_0123456789876543210Sym0 a0123456789876543210 + type instance Apply TFHelper_0123456789876543210Sym0 a0123456789876543210 = TFHelper_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings TFHelper_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) TFHelper_0123456789876543210Sym0KindInference ()) + type TFHelper_0123456789876543210Sym1 :: Nat -> (~>) Nat Bool + data TFHelper_0123456789876543210Sym1 (a0123456789876543210 :: Nat) :: (~>) Nat Bool + where + TFHelper_0123456789876543210Sym1KindInference :: SameKind (Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) arg) (TFHelper_0123456789876543210Sym2 a0123456789876543210 arg) => + TFHelper_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (TFHelper_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) TFHelper_0123456789876543210Sym1KindInference ()) + type TFHelper_0123456789876543210Sym2 :: Nat -> Nat -> Bool + type family TFHelper_0123456789876543210Sym2 (a0123456789876543210 :: Nat) (a0123456789876543210 :: Nat) :: Bool where + TFHelper_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PEq Nat where + type (==) a a = Apply (Apply TFHelper_0123456789876543210Sym0 a) a + type Compare_0123456789876543210 :: Nat -> Nat -> Ordering + type family Compare_0123456789876543210 (a :: Nat) (a :: Nat) :: Ordering where + Compare_0123456789876543210 Zero Zero = Apply (Apply (Apply FoldlSym0 (<>@#@$)) EQSym0) NilSym0 + Compare_0123456789876543210 (Succ a_0123456789876543210) (Succ b_0123456789876543210) = Apply (Apply (Apply FoldlSym0 (<>@#@$)) EQSym0) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) NilSym0) + Compare_0123456789876543210 Zero (Succ _) = LTSym0 + Compare_0123456789876543210 (Succ _) Zero = GTSym0 + type Compare_0123456789876543210Sym0 :: (~>) Nat ((~>) Nat Ordering) + data Compare_0123456789876543210Sym0 :: (~>) Nat ((~>) Nat Ordering) + where + Compare_0123456789876543210Sym0KindInference :: SameKind (Apply Compare_0123456789876543210Sym0 arg) (Compare_0123456789876543210Sym1 arg) => + Compare_0123456789876543210Sym0 a0123456789876543210 + type instance Apply Compare_0123456789876543210Sym0 a0123456789876543210 = Compare_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Compare_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Compare_0123456789876543210Sym0KindInference ()) + type Compare_0123456789876543210Sym1 :: Nat -> (~>) Nat Ordering + data Compare_0123456789876543210Sym1 (a0123456789876543210 :: Nat) :: (~>) Nat Ordering + where + Compare_0123456789876543210Sym1KindInference :: SameKind (Apply (Compare_0123456789876543210Sym1 a0123456789876543210) arg) (Compare_0123456789876543210Sym2 a0123456789876543210 arg) => + Compare_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (Compare_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Compare_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Compare_0123456789876543210Sym1KindInference ()) + type Compare_0123456789876543210Sym2 :: Nat -> Nat -> Ordering + type family Compare_0123456789876543210Sym2 (a0123456789876543210 :: Nat) (a0123456789876543210 :: Nat) :: Ordering where + Compare_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance POrd Nat where + type Compare a a = Apply (Apply Compare_0123456789876543210Sym0 a) a + type TFHelper_0123456789876543210 :: Foo a b c d + -> Foo a b c d -> Bool + type family TFHelper_0123456789876543210 (a :: Foo a b c d) (a :: Foo a b c d) :: Bool where + TFHelper_0123456789876543210 (A a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210) (A b_0123456789876543210 b_0123456789876543210 b_0123456789876543210 b_0123456789876543210) = Apply (Apply (&&@#@$) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (&&@#@$) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (&&@#@$) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210))) + TFHelper_0123456789876543210 (A _ _ _ _) (B _ _ _ _) = FalseSym0 + TFHelper_0123456789876543210 (A _ _ _ _) (C _ _ _ _) = FalseSym0 + TFHelper_0123456789876543210 (A _ _ _ _) (D _ _ _ _) = FalseSym0 + TFHelper_0123456789876543210 (A _ _ _ _) (E _ _ _ _) = FalseSym0 + TFHelper_0123456789876543210 (A _ _ _ _) (F _ _ _ _) = FalseSym0 + TFHelper_0123456789876543210 (B _ _ _ _) (A _ _ _ _) = FalseSym0 + TFHelper_0123456789876543210 (B a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210) (B b_0123456789876543210 b_0123456789876543210 b_0123456789876543210 b_0123456789876543210) = Apply (Apply (&&@#@$) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (&&@#@$) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (&&@#@$) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210))) + TFHelper_0123456789876543210 (B _ _ _ _) (C _ _ _ _) = FalseSym0 + TFHelper_0123456789876543210 (B _ _ _ _) (D _ _ _ _) = FalseSym0 + TFHelper_0123456789876543210 (B _ _ _ _) (E _ _ _ _) = FalseSym0 + TFHelper_0123456789876543210 (B _ _ _ _) (F _ _ _ _) = FalseSym0 + TFHelper_0123456789876543210 (C _ _ _ _) (A _ _ _ _) = FalseSym0 + TFHelper_0123456789876543210 (C _ _ _ _) (B _ _ _ _) = FalseSym0 + TFHelper_0123456789876543210 (C a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210) (C b_0123456789876543210 b_0123456789876543210 b_0123456789876543210 b_0123456789876543210) = Apply (Apply (&&@#@$) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (&&@#@$) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (&&@#@$) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210))) + TFHelper_0123456789876543210 (C _ _ _ _) (D _ _ _ _) = FalseSym0 + TFHelper_0123456789876543210 (C _ _ _ _) (E _ _ _ _) = FalseSym0 + TFHelper_0123456789876543210 (C _ _ _ _) (F _ _ _ _) = FalseSym0 + TFHelper_0123456789876543210 (D _ _ _ _) (A _ _ _ _) = FalseSym0 + TFHelper_0123456789876543210 (D _ _ _ _) (B _ _ _ _) = FalseSym0 + TFHelper_0123456789876543210 (D _ _ _ _) (C _ _ _ _) = FalseSym0 + TFHelper_0123456789876543210 (D a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210) (D b_0123456789876543210 b_0123456789876543210 b_0123456789876543210 b_0123456789876543210) = Apply (Apply (&&@#@$) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (&&@#@$) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (&&@#@$) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210))) + TFHelper_0123456789876543210 (D _ _ _ _) (E _ _ _ _) = FalseSym0 + TFHelper_0123456789876543210 (D _ _ _ _) (F _ _ _ _) = FalseSym0 + TFHelper_0123456789876543210 (E _ _ _ _) (A _ _ _ _) = FalseSym0 + TFHelper_0123456789876543210 (E _ _ _ _) (B _ _ _ _) = FalseSym0 + TFHelper_0123456789876543210 (E _ _ _ _) (C _ _ _ _) = FalseSym0 + TFHelper_0123456789876543210 (E _ _ _ _) (D _ _ _ _) = FalseSym0 + TFHelper_0123456789876543210 (E a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210) (E b_0123456789876543210 b_0123456789876543210 b_0123456789876543210 b_0123456789876543210) = Apply (Apply (&&@#@$) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (&&@#@$) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (&&@#@$) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210))) + TFHelper_0123456789876543210 (E _ _ _ _) (F _ _ _ _) = FalseSym0 + TFHelper_0123456789876543210 (F _ _ _ _) (A _ _ _ _) = FalseSym0 + TFHelper_0123456789876543210 (F _ _ _ _) (B _ _ _ _) = FalseSym0 + TFHelper_0123456789876543210 (F _ _ _ _) (C _ _ _ _) = FalseSym0 + TFHelper_0123456789876543210 (F _ _ _ _) (D _ _ _ _) = FalseSym0 + TFHelper_0123456789876543210 (F _ _ _ _) (E _ _ _ _) = FalseSym0 + TFHelper_0123456789876543210 (F a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210) (F b_0123456789876543210 b_0123456789876543210 b_0123456789876543210 b_0123456789876543210) = Apply (Apply (&&@#@$) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (&&@#@$) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (&&@#@$) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210))) + type TFHelper_0123456789876543210Sym0 :: (~>) (Foo a b c d) ((~>) (Foo a b c d) Bool) + data TFHelper_0123456789876543210Sym0 :: (~>) (Foo a b c d) ((~>) (Foo a b c d) Bool) + where + TFHelper_0123456789876543210Sym0KindInference :: SameKind (Apply TFHelper_0123456789876543210Sym0 arg) (TFHelper_0123456789876543210Sym1 arg) => + TFHelper_0123456789876543210Sym0 a0123456789876543210 + type instance Apply TFHelper_0123456789876543210Sym0 a0123456789876543210 = TFHelper_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings TFHelper_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) TFHelper_0123456789876543210Sym0KindInference ()) + type TFHelper_0123456789876543210Sym1 :: Foo a b c d + -> (~>) (Foo a b c d) Bool + data TFHelper_0123456789876543210Sym1 (a0123456789876543210 :: Foo a b c d) :: (~>) (Foo a b c d) Bool + where + TFHelper_0123456789876543210Sym1KindInference :: SameKind (Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) arg) (TFHelper_0123456789876543210Sym2 a0123456789876543210 arg) => + TFHelper_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (TFHelper_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) TFHelper_0123456789876543210Sym1KindInference ()) + type TFHelper_0123456789876543210Sym2 :: Foo a b c d + -> Foo a b c d -> Bool + type family TFHelper_0123456789876543210Sym2 (a0123456789876543210 :: Foo a b c d) (a0123456789876543210 :: Foo a b c d) :: Bool where + TFHelper_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PEq (Foo a b c d) where + type (==) a a = Apply (Apply TFHelper_0123456789876543210Sym0 a) a + type Compare_0123456789876543210 :: Foo a b c d + -> Foo a b c d -> Ordering + type family Compare_0123456789876543210 (a :: Foo a b c d) (a :: Foo a b c d) :: Ordering where + Compare_0123456789876543210 (A a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210) (A b_0123456789876543210 b_0123456789876543210 b_0123456789876543210 b_0123456789876543210) = Apply (Apply (Apply FoldlSym0 (<>@#@$)) EQSym0) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) NilSym0)))) + Compare_0123456789876543210 (B a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210) (B b_0123456789876543210 b_0123456789876543210 b_0123456789876543210 b_0123456789876543210) = Apply (Apply (Apply FoldlSym0 (<>@#@$)) EQSym0) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) NilSym0)))) + Compare_0123456789876543210 (C a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210) (C b_0123456789876543210 b_0123456789876543210 b_0123456789876543210 b_0123456789876543210) = Apply (Apply (Apply FoldlSym0 (<>@#@$)) EQSym0) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) NilSym0)))) + Compare_0123456789876543210 (D a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210) (D b_0123456789876543210 b_0123456789876543210 b_0123456789876543210 b_0123456789876543210) = Apply (Apply (Apply FoldlSym0 (<>@#@$)) EQSym0) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) NilSym0)))) + Compare_0123456789876543210 (E a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210) (E b_0123456789876543210 b_0123456789876543210 b_0123456789876543210 b_0123456789876543210) = Apply (Apply (Apply FoldlSym0 (<>@#@$)) EQSym0) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) NilSym0)))) + Compare_0123456789876543210 (F a_0123456789876543210 a_0123456789876543210 a_0123456789876543210 a_0123456789876543210) (F b_0123456789876543210 b_0123456789876543210 b_0123456789876543210 b_0123456789876543210) = Apply (Apply (Apply FoldlSym0 (<>@#@$)) EQSym0) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) NilSym0)))) + Compare_0123456789876543210 (A _ _ _ _) (B _ _ _ _) = LTSym0 + Compare_0123456789876543210 (A _ _ _ _) (C _ _ _ _) = LTSym0 + Compare_0123456789876543210 (A _ _ _ _) (D _ _ _ _) = LTSym0 + Compare_0123456789876543210 (A _ _ _ _) (E _ _ _ _) = LTSym0 + Compare_0123456789876543210 (A _ _ _ _) (F _ _ _ _) = LTSym0 + Compare_0123456789876543210 (B _ _ _ _) (A _ _ _ _) = GTSym0 + Compare_0123456789876543210 (B _ _ _ _) (C _ _ _ _) = LTSym0 + Compare_0123456789876543210 (B _ _ _ _) (D _ _ _ _) = LTSym0 + Compare_0123456789876543210 (B _ _ _ _) (E _ _ _ _) = LTSym0 + Compare_0123456789876543210 (B _ _ _ _) (F _ _ _ _) = LTSym0 + Compare_0123456789876543210 (C _ _ _ _) (A _ _ _ _) = GTSym0 + Compare_0123456789876543210 (C _ _ _ _) (B _ _ _ _) = GTSym0 + Compare_0123456789876543210 (C _ _ _ _) (D _ _ _ _) = LTSym0 + Compare_0123456789876543210 (C _ _ _ _) (E _ _ _ _) = LTSym0 + Compare_0123456789876543210 (C _ _ _ _) (F _ _ _ _) = LTSym0 + Compare_0123456789876543210 (D _ _ _ _) (A _ _ _ _) = GTSym0 + Compare_0123456789876543210 (D _ _ _ _) (B _ _ _ _) = GTSym0 + Compare_0123456789876543210 (D _ _ _ _) (C _ _ _ _) = GTSym0 + Compare_0123456789876543210 (D _ _ _ _) (E _ _ _ _) = LTSym0 + Compare_0123456789876543210 (D _ _ _ _) (F _ _ _ _) = LTSym0 + Compare_0123456789876543210 (E _ _ _ _) (A _ _ _ _) = GTSym0 + Compare_0123456789876543210 (E _ _ _ _) (B _ _ _ _) = GTSym0 + Compare_0123456789876543210 (E _ _ _ _) (C _ _ _ _) = GTSym0 + Compare_0123456789876543210 (E _ _ _ _) (D _ _ _ _) = GTSym0 + Compare_0123456789876543210 (E _ _ _ _) (F _ _ _ _) = LTSym0 + Compare_0123456789876543210 (F _ _ _ _) (A _ _ _ _) = GTSym0 + Compare_0123456789876543210 (F _ _ _ _) (B _ _ _ _) = GTSym0 + Compare_0123456789876543210 (F _ _ _ _) (C _ _ _ _) = GTSym0 + Compare_0123456789876543210 (F _ _ _ _) (D _ _ _ _) = GTSym0 + Compare_0123456789876543210 (F _ _ _ _) (E _ _ _ _) = GTSym0 + type Compare_0123456789876543210Sym0 :: (~>) (Foo a b c d) ((~>) (Foo a b c d) Ordering) + data Compare_0123456789876543210Sym0 :: (~>) (Foo a b c d) ((~>) (Foo a b c d) Ordering) + where + Compare_0123456789876543210Sym0KindInference :: SameKind (Apply Compare_0123456789876543210Sym0 arg) (Compare_0123456789876543210Sym1 arg) => + Compare_0123456789876543210Sym0 a0123456789876543210 + type instance Apply Compare_0123456789876543210Sym0 a0123456789876543210 = Compare_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Compare_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Compare_0123456789876543210Sym0KindInference ()) + type Compare_0123456789876543210Sym1 :: Foo a b c d + -> (~>) (Foo a b c d) Ordering + data Compare_0123456789876543210Sym1 (a0123456789876543210 :: Foo a b c d) :: (~>) (Foo a b c d) Ordering + where + Compare_0123456789876543210Sym1KindInference :: SameKind (Apply (Compare_0123456789876543210Sym1 a0123456789876543210) arg) (Compare_0123456789876543210Sym2 a0123456789876543210 arg) => + Compare_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (Compare_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Compare_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Compare_0123456789876543210Sym1KindInference ()) + type Compare_0123456789876543210Sym2 :: Foo a b c d + -> Foo a b c d -> Ordering + type family Compare_0123456789876543210Sym2 (a0123456789876543210 :: Foo a b c d) (a0123456789876543210 :: Foo a b c d) :: Ordering where + Compare_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance POrd (Foo a b c d) where + type Compare a a = Apply (Apply Compare_0123456789876543210Sym0 a) a + data SNat :: Nat -> Type + where + SZero :: SNat (Zero :: Nat) + SSucc :: forall (n :: Nat). (Sing n) -> SNat (Succ n :: Nat) + type instance Sing @Nat = SNat + instance SingKind Nat where + type Demote Nat = Nat + fromSing SZero = Zero + fromSing (SSucc b) = Succ (fromSing b) + toSing Zero = SomeSing SZero + toSing (Succ (b :: Demote Nat)) + = case toSing b :: SomeSing Nat of SomeSing c -> SomeSing (SSucc c) + data SFoo :: forall a b c d. Foo a b c d -> Type + where + SA :: forall a b c d (n :: a) (n :: b) (n :: c) (n :: d). + (Sing n) -> + (Sing n) -> + (Sing n) -> + (Sing n) -> + SFoo (A n n n n :: Foo a b c d) + SB :: forall a b c d (n :: a) (n :: b) (n :: c) (n :: d). + (Sing n) -> + (Sing n) -> + (Sing n) -> + (Sing n) -> + SFoo (B n n n n :: Foo a b c d) + SC :: forall a b c d (n :: a) (n :: b) (n :: c) (n :: d). + (Sing n) -> + (Sing n) -> + (Sing n) -> + (Sing n) -> + SFoo (C n n n n :: Foo a b c d) + SD :: forall a b c d (n :: a) (n :: b) (n :: c) (n :: d). + (Sing n) -> + (Sing n) -> + (Sing n) -> + (Sing n) -> + SFoo (D n n n n :: Foo a b c d) + SE :: forall a b c d (n :: a) (n :: b) (n :: c) (n :: d). + (Sing n) -> + (Sing n) -> + (Sing n) -> + (Sing n) -> + SFoo (E n n n n :: Foo a b c d) + SF :: forall a b c d (n :: a) (n :: b) (n :: c) (n :: d). + (Sing n) -> + (Sing n) -> + (Sing n) -> + (Sing n) -> + SFoo (F n n n n :: Foo a b c d) + type instance Sing @(Foo a b c d) = SFoo + instance (SingKind a, SingKind b, SingKind c, SingKind d) => + SingKind (Foo a b c d) where + type Demote (Foo a b c d) = Foo (Demote a) (Demote b) (Demote c) (Demote d) + fromSing (SA b b b b) + = A (fromSing b) (fromSing b) (fromSing b) (fromSing b) + fromSing (SB b b b b) + = B (fromSing b) (fromSing b) (fromSing b) (fromSing b) + fromSing (SC b b b b) + = C (fromSing b) (fromSing b) (fromSing b) (fromSing b) + fromSing (SD b b b b) + = D (fromSing b) (fromSing b) (fromSing b) (fromSing b) + fromSing (SE b b b b) + = E (fromSing b) (fromSing b) (fromSing b) (fromSing b) + fromSing (SF b b b b) + = F (fromSing b) (fromSing b) (fromSing b) (fromSing b) + toSing + (A (b :: Demote a) (b :: Demote b) (b :: Demote c) (b :: Demote d)) + = case + (,,,) + (toSing b :: SomeSing a) (toSing b :: SomeSing b) + (toSing b :: SomeSing c) (toSing b :: SomeSing d) + of + (,,,) (SomeSing c) (SomeSing c) (SomeSing c) (SomeSing c) + -> SomeSing (SA c c c c) + toSing + (B (b :: Demote a) (b :: Demote b) (b :: Demote c) (b :: Demote d)) + = case + (,,,) + (toSing b :: SomeSing a) (toSing b :: SomeSing b) + (toSing b :: SomeSing c) (toSing b :: SomeSing d) + of + (,,,) (SomeSing c) (SomeSing c) (SomeSing c) (SomeSing c) + -> SomeSing (SB c c c c) + toSing + (C (b :: Demote a) (b :: Demote b) (b :: Demote c) (b :: Demote d)) + = case + (,,,) + (toSing b :: SomeSing a) (toSing b :: SomeSing b) + (toSing b :: SomeSing c) (toSing b :: SomeSing d) + of + (,,,) (SomeSing c) (SomeSing c) (SomeSing c) (SomeSing c) + -> SomeSing (SC c c c c) + toSing + (D (b :: Demote a) (b :: Demote b) (b :: Demote c) (b :: Demote d)) + = case + (,,,) + (toSing b :: SomeSing a) (toSing b :: SomeSing b) + (toSing b :: SomeSing c) (toSing b :: SomeSing d) + of + (,,,) (SomeSing c) (SomeSing c) (SomeSing c) (SomeSing c) + -> SomeSing (SD c c c c) + toSing + (E (b :: Demote a) (b :: Demote b) (b :: Demote c) (b :: Demote d)) + = case + (,,,) + (toSing b :: SomeSing a) (toSing b :: SomeSing b) + (toSing b :: SomeSing c) (toSing b :: SomeSing d) + of + (,,,) (SomeSing c) (SomeSing c) (SomeSing c) (SomeSing c) + -> SomeSing (SE c c c c) + toSing + (F (b :: Demote a) (b :: Demote b) (b :: Demote c) (b :: Demote d)) + = case + (,,,) + (toSing b :: SomeSing a) (toSing b :: SomeSing b) + (toSing b :: SomeSing c) (toSing b :: SomeSing d) + of + (,,,) (SomeSing c) (SomeSing c) (SomeSing c) (SomeSing c) + -> SomeSing (SF c c c c) + instance SEq Nat => SEq Nat where + (%==) :: + forall (t1 :: Nat) (t2 :: Nat). Sing t1 + -> Sing t2 + -> Sing (Apply (Apply ((==@#@$) :: TyFun Nat ((~>) Nat Bool) + -> Type) t1) t2) + (%==) SZero SZero = STrue + (%==) SZero (SSucc _) = SFalse + (%==) (SSucc _) SZero = SFalse + (%==) + (SSucc (sA_0123456789876543210 :: Sing a_0123456789876543210)) + (SSucc (sB_0123456789876543210 :: Sing b_0123456789876543210)) + = applySing + (applySing (singFun2 @(==@#@$) (%==)) sA_0123456789876543210) + sB_0123456789876543210 + instance SOrd Nat => SOrd Nat where + sCompare :: + forall (t1 :: Nat) (t2 :: Nat). Sing t1 + -> Sing t2 + -> Sing (Apply (Apply (CompareSym0 :: TyFun Nat ((~>) Nat Ordering) + -> Type) t1) t2) + sCompare SZero SZero + = applySing + (applySing + (applySing (singFun3 @FoldlSym0 sFoldl) (singFun2 @(<>@#@$) (%<>))) + SEQ) + SNil + sCompare + (SSucc (sA_0123456789876543210 :: Sing a_0123456789876543210)) + (SSucc (sB_0123456789876543210 :: Sing b_0123456789876543210)) + = applySing + (applySing + (applySing (singFun3 @FoldlSym0 sFoldl) (singFun2 @(<>@#@$) (%<>))) + SEQ) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing + (applySing (singFun2 @CompareSym0 sCompare) sA_0123456789876543210) + sB_0123456789876543210)) + SNil) + sCompare SZero (SSucc _) = SLT + sCompare (SSucc _) SZero = SGT + instance (SEq a, SEq b, SEq c, SEq d) => SEq (Foo a b c d) where + (%==) :: + forall (t1 :: Foo a b c d) (t2 :: Foo a b c d). Sing t1 + -> Sing t2 + -> Sing (Apply (Apply ((==@#@$) :: TyFun (Foo a b c d) ((~>) (Foo a b c d) Bool) + -> Type) t1) t2) + (%==) + (SA (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210)) + (SA (sB_0123456789876543210 :: Sing b_0123456789876543210) + (sB_0123456789876543210 :: Sing b_0123456789876543210) + (sB_0123456789876543210 :: Sing b_0123456789876543210) + (sB_0123456789876543210 :: Sing b_0123456789876543210)) + = applySing + (applySing + (singFun2 @(&&@#@$) (%&&)) + (applySing + (applySing (singFun2 @(==@#@$) (%==)) sA_0123456789876543210) + sB_0123456789876543210)) + (applySing + (applySing + (singFun2 @(&&@#@$) (%&&)) + (applySing + (applySing (singFun2 @(==@#@$) (%==)) sA_0123456789876543210) + sB_0123456789876543210)) + (applySing + (applySing + (singFun2 @(&&@#@$) (%&&)) + (applySing + (applySing (singFun2 @(==@#@$) (%==)) sA_0123456789876543210) + sB_0123456789876543210)) + (applySing + (applySing (singFun2 @(==@#@$) (%==)) sA_0123456789876543210) + sB_0123456789876543210))) + (%==) (SA _ _ _ _) (SB _ _ _ _) = SFalse + (%==) (SA _ _ _ _) (SC _ _ _ _) = SFalse + (%==) (SA _ _ _ _) (SD _ _ _ _) = SFalse + (%==) (SA _ _ _ _) (SE _ _ _ _) = SFalse + (%==) (SA _ _ _ _) (SF _ _ _ _) = SFalse + (%==) (SB _ _ _ _) (SA _ _ _ _) = SFalse + (%==) + (SB (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210)) + (SB (sB_0123456789876543210 :: Sing b_0123456789876543210) + (sB_0123456789876543210 :: Sing b_0123456789876543210) + (sB_0123456789876543210 :: Sing b_0123456789876543210) + (sB_0123456789876543210 :: Sing b_0123456789876543210)) + = applySing + (applySing + (singFun2 @(&&@#@$) (%&&)) + (applySing + (applySing (singFun2 @(==@#@$) (%==)) sA_0123456789876543210) + sB_0123456789876543210)) + (applySing + (applySing + (singFun2 @(&&@#@$) (%&&)) + (applySing + (applySing (singFun2 @(==@#@$) (%==)) sA_0123456789876543210) + sB_0123456789876543210)) + (applySing + (applySing + (singFun2 @(&&@#@$) (%&&)) + (applySing + (applySing (singFun2 @(==@#@$) (%==)) sA_0123456789876543210) + sB_0123456789876543210)) + (applySing + (applySing (singFun2 @(==@#@$) (%==)) sA_0123456789876543210) + sB_0123456789876543210))) + (%==) (SB _ _ _ _) (SC _ _ _ _) = SFalse + (%==) (SB _ _ _ _) (SD _ _ _ _) = SFalse + (%==) (SB _ _ _ _) (SE _ _ _ _) = SFalse + (%==) (SB _ _ _ _) (SF _ _ _ _) = SFalse + (%==) (SC _ _ _ _) (SA _ _ _ _) = SFalse + (%==) (SC _ _ _ _) (SB _ _ _ _) = SFalse + (%==) + (SC (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210)) + (SC (sB_0123456789876543210 :: Sing b_0123456789876543210) + (sB_0123456789876543210 :: Sing b_0123456789876543210) + (sB_0123456789876543210 :: Sing b_0123456789876543210) + (sB_0123456789876543210 :: Sing b_0123456789876543210)) + = applySing + (applySing + (singFun2 @(&&@#@$) (%&&)) + (applySing + (applySing (singFun2 @(==@#@$) (%==)) sA_0123456789876543210) + sB_0123456789876543210)) + (applySing + (applySing + (singFun2 @(&&@#@$) (%&&)) + (applySing + (applySing (singFun2 @(==@#@$) (%==)) sA_0123456789876543210) + sB_0123456789876543210)) + (applySing + (applySing + (singFun2 @(&&@#@$) (%&&)) + (applySing + (applySing (singFun2 @(==@#@$) (%==)) sA_0123456789876543210) + sB_0123456789876543210)) + (applySing + (applySing (singFun2 @(==@#@$) (%==)) sA_0123456789876543210) + sB_0123456789876543210))) + (%==) (SC _ _ _ _) (SD _ _ _ _) = SFalse + (%==) (SC _ _ _ _) (SE _ _ _ _) = SFalse + (%==) (SC _ _ _ _) (SF _ _ _ _) = SFalse + (%==) (SD _ _ _ _) (SA _ _ _ _) = SFalse + (%==) (SD _ _ _ _) (SB _ _ _ _) = SFalse + (%==) (SD _ _ _ _) (SC _ _ _ _) = SFalse + (%==) + (SD (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210)) + (SD (sB_0123456789876543210 :: Sing b_0123456789876543210) + (sB_0123456789876543210 :: Sing b_0123456789876543210) + (sB_0123456789876543210 :: Sing b_0123456789876543210) + (sB_0123456789876543210 :: Sing b_0123456789876543210)) + = applySing + (applySing + (singFun2 @(&&@#@$) (%&&)) + (applySing + (applySing (singFun2 @(==@#@$) (%==)) sA_0123456789876543210) + sB_0123456789876543210)) + (applySing + (applySing + (singFun2 @(&&@#@$) (%&&)) + (applySing + (applySing (singFun2 @(==@#@$) (%==)) sA_0123456789876543210) + sB_0123456789876543210)) + (applySing + (applySing + (singFun2 @(&&@#@$) (%&&)) + (applySing + (applySing (singFun2 @(==@#@$) (%==)) sA_0123456789876543210) + sB_0123456789876543210)) + (applySing + (applySing (singFun2 @(==@#@$) (%==)) sA_0123456789876543210) + sB_0123456789876543210))) + (%==) (SD _ _ _ _) (SE _ _ _ _) = SFalse + (%==) (SD _ _ _ _) (SF _ _ _ _) = SFalse + (%==) (SE _ _ _ _) (SA _ _ _ _) = SFalse + (%==) (SE _ _ _ _) (SB _ _ _ _) = SFalse + (%==) (SE _ _ _ _) (SC _ _ _ _) = SFalse + (%==) (SE _ _ _ _) (SD _ _ _ _) = SFalse + (%==) + (SE (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210)) + (SE (sB_0123456789876543210 :: Sing b_0123456789876543210) + (sB_0123456789876543210 :: Sing b_0123456789876543210) + (sB_0123456789876543210 :: Sing b_0123456789876543210) + (sB_0123456789876543210 :: Sing b_0123456789876543210)) + = applySing + (applySing + (singFun2 @(&&@#@$) (%&&)) + (applySing + (applySing (singFun2 @(==@#@$) (%==)) sA_0123456789876543210) + sB_0123456789876543210)) + (applySing + (applySing + (singFun2 @(&&@#@$) (%&&)) + (applySing + (applySing (singFun2 @(==@#@$) (%==)) sA_0123456789876543210) + sB_0123456789876543210)) + (applySing + (applySing + (singFun2 @(&&@#@$) (%&&)) + (applySing + (applySing (singFun2 @(==@#@$) (%==)) sA_0123456789876543210) + sB_0123456789876543210)) + (applySing + (applySing (singFun2 @(==@#@$) (%==)) sA_0123456789876543210) + sB_0123456789876543210))) + (%==) (SE _ _ _ _) (SF _ _ _ _) = SFalse + (%==) (SF _ _ _ _) (SA _ _ _ _) = SFalse + (%==) (SF _ _ _ _) (SB _ _ _ _) = SFalse + (%==) (SF _ _ _ _) (SC _ _ _ _) = SFalse + (%==) (SF _ _ _ _) (SD _ _ _ _) = SFalse + (%==) (SF _ _ _ _) (SE _ _ _ _) = SFalse + (%==) + (SF (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210)) + (SF (sB_0123456789876543210 :: Sing b_0123456789876543210) + (sB_0123456789876543210 :: Sing b_0123456789876543210) + (sB_0123456789876543210 :: Sing b_0123456789876543210) + (sB_0123456789876543210 :: Sing b_0123456789876543210)) + = applySing + (applySing + (singFun2 @(&&@#@$) (%&&)) + (applySing + (applySing (singFun2 @(==@#@$) (%==)) sA_0123456789876543210) + sB_0123456789876543210)) + (applySing + (applySing + (singFun2 @(&&@#@$) (%&&)) + (applySing + (applySing (singFun2 @(==@#@$) (%==)) sA_0123456789876543210) + sB_0123456789876543210)) + (applySing + (applySing + (singFun2 @(&&@#@$) (%&&)) + (applySing + (applySing (singFun2 @(==@#@$) (%==)) sA_0123456789876543210) + sB_0123456789876543210)) + (applySing + (applySing (singFun2 @(==@#@$) (%==)) sA_0123456789876543210) + sB_0123456789876543210))) + instance (SOrd a, SOrd b, SOrd c, SOrd d) => + SOrd (Foo a b c d) where + sCompare :: + forall (t1 :: Foo a b c d) (t2 :: Foo a b c d). Sing t1 + -> Sing t2 + -> Sing (Apply (Apply (CompareSym0 :: TyFun (Foo a b c d) ((~>) (Foo a b c d) Ordering) + -> Type) t1) t2) + sCompare + (SA (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210)) + (SA (sB_0123456789876543210 :: Sing b_0123456789876543210) + (sB_0123456789876543210 :: Sing b_0123456789876543210) + (sB_0123456789876543210 :: Sing b_0123456789876543210) + (sB_0123456789876543210 :: Sing b_0123456789876543210)) + = applySing + (applySing + (applySing (singFun3 @FoldlSym0 sFoldl) (singFun2 @(<>@#@$) (%<>))) + SEQ) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing + (applySing (singFun2 @CompareSym0 sCompare) sA_0123456789876543210) + sB_0123456789876543210)) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing + (applySing (singFun2 @CompareSym0 sCompare) sA_0123456789876543210) + sB_0123456789876543210)) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing + (applySing (singFun2 @CompareSym0 sCompare) sA_0123456789876543210) + sB_0123456789876543210)) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing + (applySing (singFun2 @CompareSym0 sCompare) sA_0123456789876543210) + sB_0123456789876543210)) + SNil)))) + sCompare + (SB (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210)) + (SB (sB_0123456789876543210 :: Sing b_0123456789876543210) + (sB_0123456789876543210 :: Sing b_0123456789876543210) + (sB_0123456789876543210 :: Sing b_0123456789876543210) + (sB_0123456789876543210 :: Sing b_0123456789876543210)) + = applySing + (applySing + (applySing (singFun3 @FoldlSym0 sFoldl) (singFun2 @(<>@#@$) (%<>))) + SEQ) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing + (applySing (singFun2 @CompareSym0 sCompare) sA_0123456789876543210) + sB_0123456789876543210)) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing + (applySing (singFun2 @CompareSym0 sCompare) sA_0123456789876543210) + sB_0123456789876543210)) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing + (applySing (singFun2 @CompareSym0 sCompare) sA_0123456789876543210) + sB_0123456789876543210)) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing + (applySing (singFun2 @CompareSym0 sCompare) sA_0123456789876543210) + sB_0123456789876543210)) + SNil)))) + sCompare + (SC (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210)) + (SC (sB_0123456789876543210 :: Sing b_0123456789876543210) + (sB_0123456789876543210 :: Sing b_0123456789876543210) + (sB_0123456789876543210 :: Sing b_0123456789876543210) + (sB_0123456789876543210 :: Sing b_0123456789876543210)) + = applySing + (applySing + (applySing (singFun3 @FoldlSym0 sFoldl) (singFun2 @(<>@#@$) (%<>))) + SEQ) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing + (applySing (singFun2 @CompareSym0 sCompare) sA_0123456789876543210) + sB_0123456789876543210)) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing + (applySing (singFun2 @CompareSym0 sCompare) sA_0123456789876543210) + sB_0123456789876543210)) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing + (applySing (singFun2 @CompareSym0 sCompare) sA_0123456789876543210) + sB_0123456789876543210)) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing + (applySing (singFun2 @CompareSym0 sCompare) sA_0123456789876543210) + sB_0123456789876543210)) + SNil)))) + sCompare + (SD (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210)) + (SD (sB_0123456789876543210 :: Sing b_0123456789876543210) + (sB_0123456789876543210 :: Sing b_0123456789876543210) + (sB_0123456789876543210 :: Sing b_0123456789876543210) + (sB_0123456789876543210 :: Sing b_0123456789876543210)) + = applySing + (applySing + (applySing (singFun3 @FoldlSym0 sFoldl) (singFun2 @(<>@#@$) (%<>))) + SEQ) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing + (applySing (singFun2 @CompareSym0 sCompare) sA_0123456789876543210) + sB_0123456789876543210)) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing + (applySing (singFun2 @CompareSym0 sCompare) sA_0123456789876543210) + sB_0123456789876543210)) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing + (applySing (singFun2 @CompareSym0 sCompare) sA_0123456789876543210) + sB_0123456789876543210)) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing + (applySing (singFun2 @CompareSym0 sCompare) sA_0123456789876543210) + sB_0123456789876543210)) + SNil)))) + sCompare + (SE (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210)) + (SE (sB_0123456789876543210 :: Sing b_0123456789876543210) + (sB_0123456789876543210 :: Sing b_0123456789876543210) + (sB_0123456789876543210 :: Sing b_0123456789876543210) + (sB_0123456789876543210 :: Sing b_0123456789876543210)) + = applySing + (applySing + (applySing (singFun3 @FoldlSym0 sFoldl) (singFun2 @(<>@#@$) (%<>))) + SEQ) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing + (applySing (singFun2 @CompareSym0 sCompare) sA_0123456789876543210) + sB_0123456789876543210)) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing + (applySing (singFun2 @CompareSym0 sCompare) sA_0123456789876543210) + sB_0123456789876543210)) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing + (applySing (singFun2 @CompareSym0 sCompare) sA_0123456789876543210) + sB_0123456789876543210)) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing + (applySing (singFun2 @CompareSym0 sCompare) sA_0123456789876543210) + sB_0123456789876543210)) + SNil)))) + sCompare + (SF (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210)) + (SF (sB_0123456789876543210 :: Sing b_0123456789876543210) + (sB_0123456789876543210 :: Sing b_0123456789876543210) + (sB_0123456789876543210 :: Sing b_0123456789876543210) + (sB_0123456789876543210 :: Sing b_0123456789876543210)) + = applySing + (applySing + (applySing (singFun3 @FoldlSym0 sFoldl) (singFun2 @(<>@#@$) (%<>))) + SEQ) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing + (applySing (singFun2 @CompareSym0 sCompare) sA_0123456789876543210) + sB_0123456789876543210)) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing + (applySing (singFun2 @CompareSym0 sCompare) sA_0123456789876543210) + sB_0123456789876543210)) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing + (applySing (singFun2 @CompareSym0 sCompare) sA_0123456789876543210) + sB_0123456789876543210)) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing + (applySing (singFun2 @CompareSym0 sCompare) sA_0123456789876543210) + sB_0123456789876543210)) + SNil)))) + sCompare (SA _ _ _ _) (SB _ _ _ _) = SLT + sCompare (SA _ _ _ _) (SC _ _ _ _) = SLT + sCompare (SA _ _ _ _) (SD _ _ _ _) = SLT + sCompare (SA _ _ _ _) (SE _ _ _ _) = SLT + sCompare (SA _ _ _ _) (SF _ _ _ _) = SLT + sCompare (SB _ _ _ _) (SA _ _ _ _) = SGT + sCompare (SB _ _ _ _) (SC _ _ _ _) = SLT + sCompare (SB _ _ _ _) (SD _ _ _ _) = SLT + sCompare (SB _ _ _ _) (SE _ _ _ _) = SLT + sCompare (SB _ _ _ _) (SF _ _ _ _) = SLT + sCompare (SC _ _ _ _) (SA _ _ _ _) = SGT + sCompare (SC _ _ _ _) (SB _ _ _ _) = SGT + sCompare (SC _ _ _ _) (SD _ _ _ _) = SLT + sCompare (SC _ _ _ _) (SE _ _ _ _) = SLT + sCompare (SC _ _ _ _) (SF _ _ _ _) = SLT + sCompare (SD _ _ _ _) (SA _ _ _ _) = SGT + sCompare (SD _ _ _ _) (SB _ _ _ _) = SGT + sCompare (SD _ _ _ _) (SC _ _ _ _) = SGT + sCompare (SD _ _ _ _) (SE _ _ _ _) = SLT + sCompare (SD _ _ _ _) (SF _ _ _ _) = SLT + sCompare (SE _ _ _ _) (SA _ _ _ _) = SGT + sCompare (SE _ _ _ _) (SB _ _ _ _) = SGT + sCompare (SE _ _ _ _) (SC _ _ _ _) = SGT + sCompare (SE _ _ _ _) (SD _ _ _ _) = SGT + sCompare (SE _ _ _ _) (SF _ _ _ _) = SLT + sCompare (SF _ _ _ _) (SA _ _ _ _) = SGT + sCompare (SF _ _ _ _) (SB _ _ _ _) = SGT + sCompare (SF _ _ _ _) (SC _ _ _ _) = SGT + sCompare (SF _ _ _ _) (SD _ _ _ _) = SGT + sCompare (SF _ _ _ _) (SE _ _ _ _) = SGT + instance SDecide Nat => SDecide Nat where + (%~) SZero SZero = Proved Refl + (%~) SZero (SSucc _) = Disproved (\ x -> case x of {}) + (%~) (SSucc _) SZero = Disproved (\ x -> case x of {}) + (%~) (SSucc a) (SSucc b) + = case (%~) a b of + Proved Refl -> Proved Refl + Disproved contra + -> Disproved (\ refl -> case refl of Refl -> contra Refl) + instance SDecide Nat => + Data.Type.Equality.TestEquality (SNat :: Nat -> Type) where + Data.Type.Equality.testEquality + = Data.Singletons.Decide.decideEquality + instance SDecide Nat => + Data.Type.Coercion.TestCoercion (SNat :: Nat -> Type) where + Data.Type.Coercion.testCoercion + = Data.Singletons.Decide.decideCoercion + instance (SDecide a, SDecide b, SDecide c, SDecide d) => + SDecide (Foo a b c d) where + (%~) (SA a a a a) (SA b b b b) + = case (,,,) ((%~) a b) ((%~) a b) ((%~) a b) ((%~) a b) of + (,,,) (Proved Refl) (Proved Refl) (Proved Refl) (Proved Refl) + -> Proved Refl + (,,,) (Disproved contra) _ _ _ + -> Disproved (\ refl -> case refl of Refl -> contra Refl) + (,,,) _ (Disproved contra) _ _ + -> Disproved (\ refl -> case refl of Refl -> contra Refl) + (,,,) _ _ (Disproved contra) _ + -> Disproved (\ refl -> case refl of Refl -> contra Refl) + (,,,) _ _ _ (Disproved contra) + -> Disproved (\ refl -> case refl of Refl -> contra Refl) + (%~) (SA _ _ _ _) (SB _ _ _ _) = Disproved (\ x -> case x of {}) + (%~) (SA _ _ _ _) (SC _ _ _ _) = Disproved (\ x -> case x of {}) + (%~) (SA _ _ _ _) (SD _ _ _ _) = Disproved (\ x -> case x of {}) + (%~) (SA _ _ _ _) (SE _ _ _ _) = Disproved (\ x -> case x of {}) + (%~) (SA _ _ _ _) (SF _ _ _ _) = Disproved (\ x -> case x of {}) + (%~) (SB _ _ _ _) (SA _ _ _ _) = Disproved (\ x -> case x of {}) + (%~) (SB a a a a) (SB b b b b) + = case (,,,) ((%~) a b) ((%~) a b) ((%~) a b) ((%~) a b) of + (,,,) (Proved Refl) (Proved Refl) (Proved Refl) (Proved Refl) + -> Proved Refl + (,,,) (Disproved contra) _ _ _ + -> Disproved (\ refl -> case refl of Refl -> contra Refl) + (,,,) _ (Disproved contra) _ _ + -> Disproved (\ refl -> case refl of Refl -> contra Refl) + (,,,) _ _ (Disproved contra) _ + -> Disproved (\ refl -> case refl of Refl -> contra Refl) + (,,,) _ _ _ (Disproved contra) + -> Disproved (\ refl -> case refl of Refl -> contra Refl) + (%~) (SB _ _ _ _) (SC _ _ _ _) = Disproved (\ x -> case x of {}) + (%~) (SB _ _ _ _) (SD _ _ _ _) = Disproved (\ x -> case x of {}) + (%~) (SB _ _ _ _) (SE _ _ _ _) = Disproved (\ x -> case x of {}) + (%~) (SB _ _ _ _) (SF _ _ _ _) = Disproved (\ x -> case x of {}) + (%~) (SC _ _ _ _) (SA _ _ _ _) = Disproved (\ x -> case x of {}) + (%~) (SC _ _ _ _) (SB _ _ _ _) = Disproved (\ x -> case x of {}) + (%~) (SC a a a a) (SC b b b b) + = case (,,,) ((%~) a b) ((%~) a b) ((%~) a b) ((%~) a b) of + (,,,) (Proved Refl) (Proved Refl) (Proved Refl) (Proved Refl) + -> Proved Refl + (,,,) (Disproved contra) _ _ _ + -> Disproved (\ refl -> case refl of Refl -> contra Refl) + (,,,) _ (Disproved contra) _ _ + -> Disproved (\ refl -> case refl of Refl -> contra Refl) + (,,,) _ _ (Disproved contra) _ + -> Disproved (\ refl -> case refl of Refl -> contra Refl) + (,,,) _ _ _ (Disproved contra) + -> Disproved (\ refl -> case refl of Refl -> contra Refl) + (%~) (SC _ _ _ _) (SD _ _ _ _) = Disproved (\ x -> case x of {}) + (%~) (SC _ _ _ _) (SE _ _ _ _) = Disproved (\ x -> case x of {}) + (%~) (SC _ _ _ _) (SF _ _ _ _) = Disproved (\ x -> case x of {}) + (%~) (SD _ _ _ _) (SA _ _ _ _) = Disproved (\ x -> case x of {}) + (%~) (SD _ _ _ _) (SB _ _ _ _) = Disproved (\ x -> case x of {}) + (%~) (SD _ _ _ _) (SC _ _ _ _) = Disproved (\ x -> case x of {}) + (%~) (SD a a a a) (SD b b b b) + = case (,,,) ((%~) a b) ((%~) a b) ((%~) a b) ((%~) a b) of + (,,,) (Proved Refl) (Proved Refl) (Proved Refl) (Proved Refl) + -> Proved Refl + (,,,) (Disproved contra) _ _ _ + -> Disproved (\ refl -> case refl of Refl -> contra Refl) + (,,,) _ (Disproved contra) _ _ + -> Disproved (\ refl -> case refl of Refl -> contra Refl) + (,,,) _ _ (Disproved contra) _ + -> Disproved (\ refl -> case refl of Refl -> contra Refl) + (,,,) _ _ _ (Disproved contra) + -> Disproved (\ refl -> case refl of Refl -> contra Refl) + (%~) (SD _ _ _ _) (SE _ _ _ _) = Disproved (\ x -> case x of {}) + (%~) (SD _ _ _ _) (SF _ _ _ _) = Disproved (\ x -> case x of {}) + (%~) (SE _ _ _ _) (SA _ _ _ _) = Disproved (\ x -> case x of {}) + (%~) (SE _ _ _ _) (SB _ _ _ _) = Disproved (\ x -> case x of {}) + (%~) (SE _ _ _ _) (SC _ _ _ _) = Disproved (\ x -> case x of {}) + (%~) (SE _ _ _ _) (SD _ _ _ _) = Disproved (\ x -> case x of {}) + (%~) (SE a a a a) (SE b b b b) + = case (,,,) ((%~) a b) ((%~) a b) ((%~) a b) ((%~) a b) of + (,,,) (Proved Refl) (Proved Refl) (Proved Refl) (Proved Refl) + -> Proved Refl + (,,,) (Disproved contra) _ _ _ + -> Disproved (\ refl -> case refl of Refl -> contra Refl) + (,,,) _ (Disproved contra) _ _ + -> Disproved (\ refl -> case refl of Refl -> contra Refl) + (,,,) _ _ (Disproved contra) _ + -> Disproved (\ refl -> case refl of Refl -> contra Refl) + (,,,) _ _ _ (Disproved contra) + -> Disproved (\ refl -> case refl of Refl -> contra Refl) + (%~) (SE _ _ _ _) (SF _ _ _ _) = Disproved (\ x -> case x of {}) + (%~) (SF _ _ _ _) (SA _ _ _ _) = Disproved (\ x -> case x of {}) + (%~) (SF _ _ _ _) (SB _ _ _ _) = Disproved (\ x -> case x of {}) + (%~) (SF _ _ _ _) (SC _ _ _ _) = Disproved (\ x -> case x of {}) + (%~) (SF _ _ _ _) (SD _ _ _ _) = Disproved (\ x -> case x of {}) + (%~) (SF _ _ _ _) (SE _ _ _ _) = Disproved (\ x -> case x of {}) + (%~) (SF a a a a) (SF b b b b) + = case (,,,) ((%~) a b) ((%~) a b) ((%~) a b) ((%~) a b) of + (,,,) (Proved Refl) (Proved Refl) (Proved Refl) (Proved Refl) + -> Proved Refl + (,,,) (Disproved contra) _ _ _ + -> Disproved (\ refl -> case refl of Refl -> contra Refl) + (,,,) _ (Disproved contra) _ _ + -> Disproved (\ refl -> case refl of Refl -> contra Refl) + (,,,) _ _ (Disproved contra) _ + -> Disproved (\ refl -> case refl of Refl -> contra Refl) + (,,,) _ _ _ (Disproved contra) + -> Disproved (\ refl -> case refl of Refl -> contra Refl) + instance (SDecide a, SDecide b, SDecide c, SDecide d) => + Data.Type.Equality.TestEquality (SFoo :: Foo a b c d -> Type) where + Data.Type.Equality.testEquality + = Data.Singletons.Decide.decideEquality + instance (SDecide a, SDecide b, SDecide c, SDecide d) => + Data.Type.Coercion.TestCoercion (SFoo :: Foo a b c d -> Type) where + Data.Type.Coercion.testCoercion + = Data.Singletons.Decide.decideCoercion + instance SingI Zero where + sing = SZero + instance SingI n => SingI (Succ (n :: Nat)) where + sing = SSucc sing + instance SingI1 Succ where + liftSing = SSucc + instance SingI (SuccSym0 :: (~>) Nat Nat) where + sing = singFun1 @SuccSym0 SSucc + instance (SingI n, SingI n, SingI n, SingI n) => + SingI (A (n :: a) (n :: b) (n :: c) (n :: d)) where + sing = SA sing sing sing sing + instance (SingI n, SingI n, SingI n) => + SingI1 (A (n :: a) (n :: b) (n :: c)) where + liftSing = SA sing sing sing + instance (SingI n, SingI n) => SingI2 (A (n :: a) (n :: b)) where + liftSing2 = SA sing sing + instance SingI (ASym0 :: (~>) a ((~>) b ((~>) c ((~>) d (Foo a b c d))))) where + sing = singFun4 @ASym0 SA + instance SingI d => + SingI (ASym1 (d :: a) :: (~>) b ((~>) c ((~>) d (Foo a b c d)))) where + sing = singFun3 @(ASym1 (d :: a)) (SA (sing @d)) + instance SingI1 (ASym1 :: a + -> (~>) b ((~>) c ((~>) d (Foo a b c d)))) where + liftSing (s :: Sing (d :: a)) = singFun3 @(ASym1 (d :: a)) (SA s) + instance (SingI d, SingI d) => + SingI (ASym2 (d :: a) (d :: b) :: (~>) c ((~>) d (Foo a b c d))) where + sing = singFun2 @(ASym2 (d :: a) (d :: b)) (SA (sing @d) (sing @d)) + instance SingI d => + SingI1 (ASym2 (d :: a) :: b -> (~>) c ((~>) d (Foo a b c d))) where + liftSing (s :: Sing (d :: b)) + = singFun2 @(ASym2 (d :: a) (d :: b)) (SA (sing @d) s) + instance SingI2 (ASym2 :: a + -> b -> (~>) c ((~>) d (Foo a b c d))) where + liftSing2 (s :: Sing (d :: a)) (s :: Sing (d :: b)) + = singFun2 @(ASym2 (d :: a) (d :: b)) (SA s s) + instance (SingI d, SingI d, SingI d) => + SingI (ASym3 (d :: a) (d :: b) (d :: c) :: (~>) d (Foo a b c d)) where + sing + = singFun1 + @(ASym3 (d :: a) (d :: b) (d :: c)) + (SA (sing @d) (sing @d) (sing @d)) + instance (SingI d, SingI d) => + SingI1 (ASym3 (d :: a) (d :: b) :: c -> (~>) d (Foo a b c d)) where + liftSing (s :: Sing (d :: c)) + = singFun1 + @(ASym3 (d :: a) (d :: b) (d :: c)) (SA (sing @d) (sing @d) s) + instance SingI d => + SingI2 (ASym3 (d :: a) :: b -> c -> (~>) d (Foo a b c d)) where + liftSing2 (s :: Sing (d :: b)) (s :: Sing (d :: c)) + = singFun1 @(ASym3 (d :: a) (d :: b) (d :: c)) (SA (sing @d) s s) + instance (SingI n, SingI n, SingI n, SingI n) => + SingI (B (n :: a) (n :: b) (n :: c) (n :: d)) where + sing = SB sing sing sing sing + instance (SingI n, SingI n, SingI n) => + SingI1 (B (n :: a) (n :: b) (n :: c)) where + liftSing = SB sing sing sing + instance (SingI n, SingI n) => SingI2 (B (n :: a) (n :: b)) where + liftSing2 = SB sing sing + instance SingI (BSym0 :: (~>) a ((~>) b ((~>) c ((~>) d (Foo a b c d))))) where + sing = singFun4 @BSym0 SB + instance SingI d => + SingI (BSym1 (d :: a) :: (~>) b ((~>) c ((~>) d (Foo a b c d)))) where + sing = singFun3 @(BSym1 (d :: a)) (SB (sing @d)) + instance SingI1 (BSym1 :: a + -> (~>) b ((~>) c ((~>) d (Foo a b c d)))) where + liftSing (s :: Sing (d :: a)) = singFun3 @(BSym1 (d :: a)) (SB s) + instance (SingI d, SingI d) => + SingI (BSym2 (d :: a) (d :: b) :: (~>) c ((~>) d (Foo a b c d))) where + sing = singFun2 @(BSym2 (d :: a) (d :: b)) (SB (sing @d) (sing @d)) + instance SingI d => + SingI1 (BSym2 (d :: a) :: b -> (~>) c ((~>) d (Foo a b c d))) where + liftSing (s :: Sing (d :: b)) + = singFun2 @(BSym2 (d :: a) (d :: b)) (SB (sing @d) s) + instance SingI2 (BSym2 :: a + -> b -> (~>) c ((~>) d (Foo a b c d))) where + liftSing2 (s :: Sing (d :: a)) (s :: Sing (d :: b)) + = singFun2 @(BSym2 (d :: a) (d :: b)) (SB s s) + instance (SingI d, SingI d, SingI d) => + SingI (BSym3 (d :: a) (d :: b) (d :: c) :: (~>) d (Foo a b c d)) where + sing + = singFun1 + @(BSym3 (d :: a) (d :: b) (d :: c)) + (SB (sing @d) (sing @d) (sing @d)) + instance (SingI d, SingI d) => + SingI1 (BSym3 (d :: a) (d :: b) :: c -> (~>) d (Foo a b c d)) where + liftSing (s :: Sing (d :: c)) + = singFun1 + @(BSym3 (d :: a) (d :: b) (d :: c)) (SB (sing @d) (sing @d) s) + instance SingI d => + SingI2 (BSym3 (d :: a) :: b -> c -> (~>) d (Foo a b c d)) where + liftSing2 (s :: Sing (d :: b)) (s :: Sing (d :: c)) + = singFun1 @(BSym3 (d :: a) (d :: b) (d :: c)) (SB (sing @d) s s) + instance (SingI n, SingI n, SingI n, SingI n) => + SingI (C (n :: a) (n :: b) (n :: c) (n :: d)) where + sing = SC sing sing sing sing + instance (SingI n, SingI n, SingI n) => + SingI1 (C (n :: a) (n :: b) (n :: c)) where + liftSing = SC sing sing sing + instance (SingI n, SingI n) => SingI2 (C (n :: a) (n :: b)) where + liftSing2 = SC sing sing + instance SingI (CSym0 :: (~>) a ((~>) b ((~>) c ((~>) d (Foo a b c d))))) where + sing = singFun4 @CSym0 SC + instance SingI d => + SingI (CSym1 (d :: a) :: (~>) b ((~>) c ((~>) d (Foo a b c d)))) where + sing = singFun3 @(CSym1 (d :: a)) (SC (sing @d)) + instance SingI1 (CSym1 :: a + -> (~>) b ((~>) c ((~>) d (Foo a b c d)))) where + liftSing (s :: Sing (d :: a)) = singFun3 @(CSym1 (d :: a)) (SC s) + instance (SingI d, SingI d) => + SingI (CSym2 (d :: a) (d :: b) :: (~>) c ((~>) d (Foo a b c d))) where + sing = singFun2 @(CSym2 (d :: a) (d :: b)) (SC (sing @d) (sing @d)) + instance SingI d => + SingI1 (CSym2 (d :: a) :: b -> (~>) c ((~>) d (Foo a b c d))) where + liftSing (s :: Sing (d :: b)) + = singFun2 @(CSym2 (d :: a) (d :: b)) (SC (sing @d) s) + instance SingI2 (CSym2 :: a + -> b -> (~>) c ((~>) d (Foo a b c d))) where + liftSing2 (s :: Sing (d :: a)) (s :: Sing (d :: b)) + = singFun2 @(CSym2 (d :: a) (d :: b)) (SC s s) + instance (SingI d, SingI d, SingI d) => + SingI (CSym3 (d :: a) (d :: b) (d :: c) :: (~>) d (Foo a b c d)) where + sing + = singFun1 + @(CSym3 (d :: a) (d :: b) (d :: c)) + (SC (sing @d) (sing @d) (sing @d)) + instance (SingI d, SingI d) => + SingI1 (CSym3 (d :: a) (d :: b) :: c -> (~>) d (Foo a b c d)) where + liftSing (s :: Sing (d :: c)) + = singFun1 + @(CSym3 (d :: a) (d :: b) (d :: c)) (SC (sing @d) (sing @d) s) + instance SingI d => + SingI2 (CSym3 (d :: a) :: b -> c -> (~>) d (Foo a b c d)) where + liftSing2 (s :: Sing (d :: b)) (s :: Sing (d :: c)) + = singFun1 @(CSym3 (d :: a) (d :: b) (d :: c)) (SC (sing @d) s s) + instance (SingI n, SingI n, SingI n, SingI n) => + SingI (D (n :: a) (n :: b) (n :: c) (n :: d)) where + sing = SD sing sing sing sing + instance (SingI n, SingI n, SingI n) => + SingI1 (D (n :: a) (n :: b) (n :: c)) where + liftSing = SD sing sing sing + instance (SingI n, SingI n) => SingI2 (D (n :: a) (n :: b)) where + liftSing2 = SD sing sing + instance SingI (DSym0 :: (~>) a ((~>) b ((~>) c ((~>) d (Foo a b c d))))) where + sing = singFun4 @DSym0 SD + instance SingI d => + SingI (DSym1 (d :: a) :: (~>) b ((~>) c ((~>) d (Foo a b c d)))) where + sing = singFun3 @(DSym1 (d :: a)) (SD (sing @d)) + instance SingI1 (DSym1 :: a + -> (~>) b ((~>) c ((~>) d (Foo a b c d)))) where + liftSing (s :: Sing (d :: a)) = singFun3 @(DSym1 (d :: a)) (SD s) + instance (SingI d, SingI d) => + SingI (DSym2 (d :: a) (d :: b) :: (~>) c ((~>) d (Foo a b c d))) where + sing = singFun2 @(DSym2 (d :: a) (d :: b)) (SD (sing @d) (sing @d)) + instance SingI d => + SingI1 (DSym2 (d :: a) :: b -> (~>) c ((~>) d (Foo a b c d))) where + liftSing (s :: Sing (d :: b)) + = singFun2 @(DSym2 (d :: a) (d :: b)) (SD (sing @d) s) + instance SingI2 (DSym2 :: a + -> b -> (~>) c ((~>) d (Foo a b c d))) where + liftSing2 (s :: Sing (d :: a)) (s :: Sing (d :: b)) + = singFun2 @(DSym2 (d :: a) (d :: b)) (SD s s) + instance (SingI d, SingI d, SingI d) => + SingI (DSym3 (d :: a) (d :: b) (d :: c) :: (~>) d (Foo a b c d)) where + sing + = singFun1 + @(DSym3 (d :: a) (d :: b) (d :: c)) + (SD (sing @d) (sing @d) (sing @d)) + instance (SingI d, SingI d) => + SingI1 (DSym3 (d :: a) (d :: b) :: c -> (~>) d (Foo a b c d)) where + liftSing (s :: Sing (d :: c)) + = singFun1 + @(DSym3 (d :: a) (d :: b) (d :: c)) (SD (sing @d) (sing @d) s) + instance SingI d => + SingI2 (DSym3 (d :: a) :: b -> c -> (~>) d (Foo a b c d)) where + liftSing2 (s :: Sing (d :: b)) (s :: Sing (d :: c)) + = singFun1 @(DSym3 (d :: a) (d :: b) (d :: c)) (SD (sing @d) s s) + instance (SingI n, SingI n, SingI n, SingI n) => + SingI (E (n :: a) (n :: b) (n :: c) (n :: d)) where + sing = SE sing sing sing sing + instance (SingI n, SingI n, SingI n) => + SingI1 (E (n :: a) (n :: b) (n :: c)) where + liftSing = SE sing sing sing + instance (SingI n, SingI n) => SingI2 (E (n :: a) (n :: b)) where + liftSing2 = SE sing sing + instance SingI (ESym0 :: (~>) a ((~>) b ((~>) c ((~>) d (Foo a b c d))))) where + sing = singFun4 @ESym0 SE + instance SingI d => + SingI (ESym1 (d :: a) :: (~>) b ((~>) c ((~>) d (Foo a b c d)))) where + sing = singFun3 @(ESym1 (d :: a)) (SE (sing @d)) + instance SingI1 (ESym1 :: a + -> (~>) b ((~>) c ((~>) d (Foo a b c d)))) where + liftSing (s :: Sing (d :: a)) = singFun3 @(ESym1 (d :: a)) (SE s) + instance (SingI d, SingI d) => + SingI (ESym2 (d :: a) (d :: b) :: (~>) c ((~>) d (Foo a b c d))) where + sing = singFun2 @(ESym2 (d :: a) (d :: b)) (SE (sing @d) (sing @d)) + instance SingI d => + SingI1 (ESym2 (d :: a) :: b -> (~>) c ((~>) d (Foo a b c d))) where + liftSing (s :: Sing (d :: b)) + = singFun2 @(ESym2 (d :: a) (d :: b)) (SE (sing @d) s) + instance SingI2 (ESym2 :: a + -> b -> (~>) c ((~>) d (Foo a b c d))) where + liftSing2 (s :: Sing (d :: a)) (s :: Sing (d :: b)) + = singFun2 @(ESym2 (d :: a) (d :: b)) (SE s s) + instance (SingI d, SingI d, SingI d) => + SingI (ESym3 (d :: a) (d :: b) (d :: c) :: (~>) d (Foo a b c d)) where + sing + = singFun1 + @(ESym3 (d :: a) (d :: b) (d :: c)) + (SE (sing @d) (sing @d) (sing @d)) + instance (SingI d, SingI d) => + SingI1 (ESym3 (d :: a) (d :: b) :: c -> (~>) d (Foo a b c d)) where + liftSing (s :: Sing (d :: c)) + = singFun1 + @(ESym3 (d :: a) (d :: b) (d :: c)) (SE (sing @d) (sing @d) s) + instance SingI d => + SingI2 (ESym3 (d :: a) :: b -> c -> (~>) d (Foo a b c d)) where + liftSing2 (s :: Sing (d :: b)) (s :: Sing (d :: c)) + = singFun1 @(ESym3 (d :: a) (d :: b) (d :: c)) (SE (sing @d) s s) + instance (SingI n, SingI n, SingI n, SingI n) => + SingI (F (n :: a) (n :: b) (n :: c) (n :: d)) where + sing = SF sing sing sing sing + instance (SingI n, SingI n, SingI n) => + SingI1 (F (n :: a) (n :: b) (n :: c)) where + liftSing = SF sing sing sing + instance (SingI n, SingI n) => SingI2 (F (n :: a) (n :: b)) where + liftSing2 = SF sing sing + instance SingI (FSym0 :: (~>) a ((~>) b ((~>) c ((~>) d (Foo a b c d))))) where + sing = singFun4 @FSym0 SF + instance SingI d => + SingI (FSym1 (d :: a) :: (~>) b ((~>) c ((~>) d (Foo a b c d)))) where + sing = singFun3 @(FSym1 (d :: a)) (SF (sing @d)) + instance SingI1 (FSym1 :: a + -> (~>) b ((~>) c ((~>) d (Foo a b c d)))) where + liftSing (s :: Sing (d :: a)) = singFun3 @(FSym1 (d :: a)) (SF s) + instance (SingI d, SingI d) => + SingI (FSym2 (d :: a) (d :: b) :: (~>) c ((~>) d (Foo a b c d))) where + sing = singFun2 @(FSym2 (d :: a) (d :: b)) (SF (sing @d) (sing @d)) + instance SingI d => + SingI1 (FSym2 (d :: a) :: b -> (~>) c ((~>) d (Foo a b c d))) where + liftSing (s :: Sing (d :: b)) + = singFun2 @(FSym2 (d :: a) (d :: b)) (SF (sing @d) s) + instance SingI2 (FSym2 :: a + -> b -> (~>) c ((~>) d (Foo a b c d))) where + liftSing2 (s :: Sing (d :: a)) (s :: Sing (d :: b)) + = singFun2 @(FSym2 (d :: a) (d :: b)) (SF s s) + instance (SingI d, SingI d, SingI d) => + SingI (FSym3 (d :: a) (d :: b) (d :: c) :: (~>) d (Foo a b c d)) where + sing + = singFun1 + @(FSym3 (d :: a) (d :: b) (d :: c)) + (SF (sing @d) (sing @d) (sing @d)) + instance (SingI d, SingI d) => + SingI1 (FSym3 (d :: a) (d :: b) :: c -> (~>) d (Foo a b c d)) where + liftSing (s :: Sing (d :: c)) + = singFun1 + @(FSym3 (d :: a) (d :: b) (d :: c)) (SF (sing @d) (sing @d) s) + instance SingI d => + SingI2 (FSym3 (d :: a) :: b -> c -> (~>) d (Foo a b c d)) where + liftSing2 (s :: Sing (d :: b)) (s :: Sing (d :: c)) + = singFun1 @(FSym3 (d :: a) (d :: b) (d :: c)) (SF (sing @d) s s)
tests/compile-and-dump/Singletons/OrdDeriving.hs view
@@ -1,57 +1,57 @@-module Singletons.OrdDeriving where--import Data.Singletons.Base.TH--$(singletons [d|- data Nat = Zero | Succ Nat- deriving (Eq, Ord)-- data Foo a b c d = A a b c d- | B a b c d- | C a b c d- | D a b c d- | E a b c d- | F a b c d deriving (Eq,Ord)- |])--foo1a :: Proxy (Zero < Succ Zero)-foo1a = Proxy--foo1b :: Proxy True-foo1b = foo1a--foo2a :: Proxy (Succ (Succ Zero) `Compare` Zero)-foo2a = Proxy--foo2b :: Proxy GT-foo2b = foo2a--foo3a :: Proxy (A 1 2 3 4 `Compare` A 1 2 3 4)-foo3a = Proxy--foo3b :: Proxy EQ-foo3b = foo3a--foo4a :: Proxy (A 1 2 3 4 `Compare` A 1 2 3 5)-foo4a = Proxy--foo4b :: Proxy LT-foo4b = foo4a--foo5a :: Proxy (A 1 2 3 4 `Compare` A 1 2 3 3)-foo5a = Proxy--foo5b :: Proxy GT-foo5b = foo5a--foo6a :: Proxy (A 1 2 3 4 `Compare` B 1 2 3 4)-foo6a = Proxy--foo6b :: Proxy LT-foo6b = foo6a--foo7a :: Proxy (B 1 2 3 4 `Compare` A 1 2 3 4)-foo7a = Proxy--foo7b :: Proxy GT-foo7b = foo7a+module Singletons.OrdDeriving where + +import Data.Singletons.Base.TH + +$(singletons [d| + data Nat = Zero | Succ Nat + deriving (Eq, Ord) + + data Foo a b c d = A a b c d + | B a b c d + | C a b c d + | D a b c d + | E a b c d + | F a b c d deriving (Eq,Ord) + |]) + +foo1a :: Proxy (Zero < Succ Zero) +foo1a = Proxy + +foo1b :: Proxy True +foo1b = foo1a + +foo2a :: Proxy (Succ (Succ Zero) `Compare` Zero) +foo2a = Proxy + +foo2b :: Proxy GT +foo2b = foo2a + +foo3a :: Proxy (A 1 2 3 4 `Compare` A 1 2 3 4) +foo3a = Proxy + +foo3b :: Proxy EQ +foo3b = foo3a + +foo4a :: Proxy (A 1 2 3 4 `Compare` A 1 2 3 5) +foo4a = Proxy + +foo4b :: Proxy LT +foo4b = foo4a + +foo5a :: Proxy (A 1 2 3 4 `Compare` A 1 2 3 3) +foo5a = Proxy + +foo5b :: Proxy GT +foo5b = foo5a + +foo6a :: Proxy (A 1 2 3 4 `Compare` B 1 2 3 4) +foo6a = Proxy + +foo6b :: Proxy LT +foo6b = foo6a + +foo7a :: Proxy (B 1 2 3 4 `Compare` A 1 2 3 4) +foo7a = Proxy + +foo7b :: Proxy GT +foo7b = foo7a
tests/compile-and-dump/Singletons/OverloadedStrings.golden view
@@ -1,40 +1,41 @@-Singletons/OverloadedStrings.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| symId :: Symbol -> Symbol- symId x = x- foo :: Symbol- foo = symId "foo" |]- ======>- symId :: Symbol -> Symbol- symId x = x- foo :: Symbol- foo = symId "foo"- type FooSym0 :: Symbol- type family FooSym0 :: Symbol where- FooSym0 = Foo- type SymIdSym0 :: (~>) Symbol Symbol- data SymIdSym0 :: (~>) Symbol Symbol- where- SymIdSym0KindInference :: SameKind (Apply SymIdSym0 arg) (SymIdSym1 arg) =>- SymIdSym0 a0123456789876543210- type instance Apply SymIdSym0 a0123456789876543210 = SymId a0123456789876543210- instance SuppressUnusedWarnings SymIdSym0 where- suppressUnusedWarnings = snd (((,) SymIdSym0KindInference) ())- type SymIdSym1 :: Symbol -> Symbol- type family SymIdSym1 (a0123456789876543210 :: Symbol) :: Symbol where- SymIdSym1 a0123456789876543210 = SymId a0123456789876543210- type Foo :: Symbol- type family Foo :: Symbol where- Foo = Apply SymIdSym0 (FromString "foo")- type SymId :: Symbol -> Symbol- type family SymId (a :: Symbol) :: Symbol where- SymId x = x- sFoo :: Sing (FooSym0 :: Symbol)- sSymId ::- forall (t :: Symbol). Sing t -> Sing (Apply SymIdSym0 t :: Symbol)- sFoo- = (applySing ((singFun1 @SymIdSym0) sSymId))- (sFromString (sing :: Sing "foo"))- sSymId (sX :: Sing x) = sX- instance SingI (SymIdSym0 :: (~>) Symbol Symbol) where- sing = (singFun1 @SymIdSym0) sSymId+Singletons/OverloadedStrings.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| symId :: Symbol -> Symbol + symId x = x + foo :: Symbol + foo = symId "foo" |] + ======> + symId :: Symbol -> Symbol + symId x = x + foo :: Symbol + foo = symId "foo" + type FooSym0 :: Symbol + type family FooSym0 :: Symbol where + FooSym0 = Foo + type SymIdSym0 :: (~>) Symbol Symbol + data SymIdSym0 :: (~>) Symbol Symbol + where + SymIdSym0KindInference :: SameKind (Apply SymIdSym0 arg) (SymIdSym1 arg) => + SymIdSym0 a0123456789876543210 + type instance Apply SymIdSym0 a0123456789876543210 = SymId a0123456789876543210 + instance SuppressUnusedWarnings SymIdSym0 where + suppressUnusedWarnings = snd ((,) SymIdSym0KindInference ()) + type SymIdSym1 :: Symbol -> Symbol + type family SymIdSym1 (a0123456789876543210 :: Symbol) :: Symbol where + SymIdSym1 a0123456789876543210 = SymId a0123456789876543210 + type Foo :: Symbol + type family Foo :: Symbol where + Foo = Apply SymIdSym0 (FromString "foo") + type SymId :: Symbol -> Symbol + type family SymId (a :: Symbol) :: Symbol where + SymId x = x + sFoo :: (Sing (FooSym0 :: Symbol) :: Type) + sSymId :: + (forall (t :: Symbol). + Sing t -> Sing (Apply SymIdSym0 t :: Symbol) :: Type) + sFoo + = applySing + (singFun1 @SymIdSym0 sSymId) (sFromString (sing :: Sing "foo")) + sSymId (sX :: Sing x) = sX + instance SingI (SymIdSym0 :: (~>) Symbol Symbol) where + sing = singFun1 @SymIdSym0 sSymId
tests/compile-and-dump/Singletons/OverloadedStrings.hs view
@@ -1,14 +1,14 @@-{-# LANGUAGE OverloadedStrings #-}--module OverloadedStrings where--import Data.Singletons.Base.TH-import GHC.TypeLits.Singletons--$(singletons- [d| symId :: Symbol -> Symbol- symId x = x-- foo :: Symbol- foo = symId "foo"- |])+{-# LANGUAGE OverloadedStrings #-} + +module OverloadedStrings where + +import Data.Singletons.Base.TH +import GHC.TypeLits.Singletons + +$(singletons + [d| symId :: Symbol -> Symbol + symId x = x + + foo :: Symbol + foo = symId "foo" + |])
tests/compile-and-dump/Singletons/PatternMatching.golden view
@@ -1,577 +1,600 @@-Singletons/PatternMatching.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| pr = Pair (Succ Zero) ([Zero])- complex = Pair (Pair (Just Zero) Zero) False- tuple = (False, Just Zero, True)- aList = [Zero, Succ Zero, Succ (Succ Zero)]- - data Pair a b- = Pair a b- deriving Show |]- ======>- data Pair a b- = Pair a b- deriving Show- pr = (Pair (Succ Zero)) [Zero]- complex = (Pair ((Pair (Just Zero)) Zero)) False- tuple = (False, Just Zero, True)- aList = [Zero, Succ Zero, Succ (Succ Zero)]- type PairSym0 :: forall a b. (~>) a ((~>) b (Pair a b))- data PairSym0 :: (~>) a ((~>) b (Pair a b))- where- PairSym0KindInference :: SameKind (Apply PairSym0 arg) (PairSym1 arg) =>- PairSym0 a0123456789876543210- type instance Apply PairSym0 a0123456789876543210 = PairSym1 a0123456789876543210- instance SuppressUnusedWarnings PairSym0 where- suppressUnusedWarnings = snd (((,) PairSym0KindInference) ())- type PairSym1 :: forall a b. a -> (~>) b (Pair a b)- data PairSym1 (a0123456789876543210 :: a) :: (~>) b (Pair a b)- where- PairSym1KindInference :: SameKind (Apply (PairSym1 a0123456789876543210) arg) (PairSym2 a0123456789876543210 arg) =>- PairSym1 a0123456789876543210 a0123456789876543210- type instance Apply (PairSym1 a0123456789876543210) a0123456789876543210 = Pair a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (PairSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) PairSym1KindInference) ())- type PairSym2 :: forall a b. a -> b -> Pair a b- type family PairSym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: Pair a b where- PairSym2 a0123456789876543210 a0123456789876543210 = Pair a0123456789876543210 a0123456789876543210- type family AListSym0 where- AListSym0 = AList- type family TupleSym0 where- TupleSym0 = Tuple- type family ComplexSym0 where- ComplexSym0 = Complex- type family PrSym0 where- PrSym0 = Pr- type family AList where- AList = Apply (Apply (:@#@$) ZeroSym0) (Apply (Apply (:@#@$) (Apply SuccSym0 ZeroSym0)) (Apply (Apply (:@#@$) (Apply SuccSym0 (Apply SuccSym0 ZeroSym0))) NilSym0))- type family Tuple where- Tuple = Apply (Apply (Apply Tuple3Sym0 FalseSym0) (Apply JustSym0 ZeroSym0)) TrueSym0- type family Complex where- Complex = Apply (Apply PairSym0 (Apply (Apply PairSym0 (Apply JustSym0 ZeroSym0)) ZeroSym0)) FalseSym0- type family Pr where- Pr = Apply (Apply PairSym0 (Apply SuccSym0 ZeroSym0)) (Apply (Apply (:@#@$) ZeroSym0) NilSym0)- type ShowsPrec_0123456789876543210 :: GHC.Num.Natural.Natural- -> Pair a b -> Symbol -> Symbol- type family ShowsPrec_0123456789876543210 (a :: GHC.Num.Natural.Natural) (a :: Pair a b) (a :: Symbol) :: Symbol where- ShowsPrec_0123456789876543210 p_0123456789876543210 (Pair arg_0123456789876543210 arg_0123456789876543210) a_0123456789876543210 = Apply (Apply (Apply ShowParenSym0 (Apply (Apply (>@#@$) p_0123456789876543210) (FromInteger 10))) (Apply (Apply (.@#@$) (Apply ShowStringSym0 "Pair ")) (Apply (Apply (.@#@$) (Apply (Apply ShowsPrecSym0 (FromInteger 11)) arg_0123456789876543210)) (Apply (Apply (.@#@$) ShowSpaceSym0) (Apply (Apply ShowsPrecSym0 (FromInteger 11)) arg_0123456789876543210))))) a_0123456789876543210- type ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) (Pair a b) ((~>) Symbol Symbol))- data ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) (Pair a b) ((~>) Symbol Symbol))- where- ShowsPrec_0123456789876543210Sym0KindInference :: SameKind (Apply ShowsPrec_0123456789876543210Sym0 arg) (ShowsPrec_0123456789876543210Sym1 arg) =>- ShowsPrec_0123456789876543210Sym0 a0123456789876543210- type instance Apply ShowsPrec_0123456789876543210Sym0 a0123456789876543210 = ShowsPrec_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings ShowsPrec_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym0KindInference) ())- type ShowsPrec_0123456789876543210Sym1 :: GHC.Num.Natural.Natural- -> (~>) (Pair a b) ((~>) Symbol Symbol)- data ShowsPrec_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Num.Natural.Natural) :: (~>) (Pair a b) ((~>) Symbol Symbol)- where- ShowsPrec_0123456789876543210Sym1KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 arg) =>- ShowsPrec_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym1KindInference) ())- type ShowsPrec_0123456789876543210Sym2 :: GHC.Num.Natural.Natural- -> Pair a b -> (~>) Symbol Symbol- data ShowsPrec_0123456789876543210Sym2 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: Pair a b) :: (~>) Symbol Symbol- where- ShowsPrec_0123456789876543210Sym2KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 arg) =>- ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym2KindInference) ())- type ShowsPrec_0123456789876543210Sym3 :: GHC.Num.Natural.Natural- -> Pair a b -> Symbol -> Symbol- type family ShowsPrec_0123456789876543210Sym3 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: Pair a b) (a0123456789876543210 :: Symbol) :: Symbol where- ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance PShow (Pair a b) where- type ShowsPrec a a a = Apply (Apply (Apply ShowsPrec_0123456789876543210Sym0 a) a) a- sAList :: Sing @_ AListSym0- sTuple :: Sing @_ TupleSym0- sComplex :: Sing @_ ComplexSym0- sPr :: Sing @_ PrSym0- sAList- = (applySing ((applySing ((singFun2 @(:@#@$)) SCons)) SZero))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing ((singFun1 @SuccSym0) SSucc)) SZero)))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing ((singFun1 @SuccSym0) SSucc))- ((applySing ((singFun1 @SuccSym0) SSucc)) SZero))))- SNil))- sTuple- = (applySing- ((applySing ((applySing ((singFun3 @Tuple3Sym0) STuple3)) SFalse))- ((applySing ((singFun1 @JustSym0) SJust)) SZero)))- STrue- sComplex- = (applySing- ((applySing ((singFun2 @PairSym0) SPair))- ((applySing- ((applySing ((singFun2 @PairSym0) SPair))- ((applySing ((singFun1 @JustSym0) SJust)) SZero)))- SZero)))- SFalse- sPr- = (applySing- ((applySing ((singFun2 @PairSym0) SPair))- ((applySing ((singFun1 @SuccSym0) SSucc)) SZero)))- ((applySing ((applySing ((singFun2 @(:@#@$)) SCons)) SZero)) SNil)- data SPair :: forall a b. Pair a b -> Type- where- SPair :: forall a b (n :: a) (n :: b).- (Sing n) -> (Sing n) -> SPair (Pair n n :: Pair a b)- type instance Sing @(Pair a b) = SPair- instance (SingKind a, SingKind b) => SingKind (Pair a b) where- type Demote (Pair a b) = Pair (Demote a) (Demote b)- fromSing (SPair b b) = (Pair (fromSing b)) (fromSing b)- toSing (Pair (b :: Demote a) (b :: Demote b))- = case ((,) (toSing b :: SomeSing a)) (toSing b :: SomeSing b) of- (,) (SomeSing c) (SomeSing c) -> SomeSing ((SPair c) c)- instance (SShow a, SShow b) => SShow (Pair a b) where- sShowsPrec ::- forall (t1 :: GHC.Num.Natural.Natural)- (t2 :: Pair a b)- (t3 :: Symbol). Sing t1- -> Sing t2- -> Sing t3- -> Sing (Apply (Apply (Apply (ShowsPrecSym0 :: TyFun GHC.Num.Natural.Natural ((~>) (Pair a b) ((~>) Symbol Symbol))- -> Type) t1) t2) t3)- sShowsPrec- (sP_0123456789876543210 :: Sing p_0123456789876543210)- (SPair (sArg_0123456789876543210 :: Sing arg_0123456789876543210)- (sArg_0123456789876543210 :: Sing arg_0123456789876543210))- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing- ((applySing ((singFun3 @ShowParenSym0) sShowParen))- ((applySing- ((applySing ((singFun2 @(>@#@$)) (%>))) sP_0123456789876543210))- (sFromInteger (sing :: Sing 10)))))- ((applySing- ((applySing ((singFun3 @(.@#@$)) (%.)))- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "Pair "))))- ((applySing- ((applySing ((singFun3 @(.@#@$)) (%.)))- ((applySing- ((applySing ((singFun3 @ShowsPrecSym0) sShowsPrec))- (sFromInteger (sing :: Sing 11))))- sArg_0123456789876543210)))- ((applySing- ((applySing ((singFun3 @(.@#@$)) (%.)))- ((singFun1 @ShowSpaceSym0) sShowSpace)))- ((applySing- ((applySing ((singFun3 @ShowsPrecSym0) sShowsPrec))- (sFromInteger (sing :: Sing 11))))- sArg_0123456789876543210))))))- sA_0123456789876543210- deriving instance (Data.Singletons.ShowSing.ShowSing a,- Data.Singletons.ShowSing.ShowSing b) =>- Show (SPair (z :: Pair a b))- instance (SingI n, SingI n) => SingI (Pair (n :: a) (n :: b)) where- sing = (SPair sing) sing- instance SingI n => SingI1 (Pair (n :: a)) where- liftSing = SPair sing- instance SingI2 Pair where- liftSing2 = SPair- instance SingI (PairSym0 :: (~>) a ((~>) b (Pair a b))) where- sing = (singFun2 @PairSym0) SPair- instance SingI d =>- SingI (PairSym1 (d :: a) :: (~>) b (Pair a b)) where- sing = (singFun1 @(PairSym1 (d :: a))) (SPair (sing @d))- instance SingI1 (PairSym1 :: a -> (~>) b (Pair a b)) where- liftSing (s :: Sing (d :: a))- = (singFun1 @(PairSym1 (d :: a))) (SPair s)-Singletons/PatternMatching.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| Pair sz lz = pr- Pair (Pair jz zz) fls = complex- (tf, tjz, tt) = tuple- [_, lsz, (Succ blimy)] = aList- lsz :: Nat- fls :: Bool- foo1 :: (a, b) -> a- foo1 (x, y) = (\ _ -> x) y- foo2 :: (# a, b #) -> a- foo2 t@(# x, y #) = case t of (# a, b #) -> (\ _ -> a) b- silly :: a -> ()- silly x = case x of _ -> () |]- ======>- Pair sz lz = pr- Pair (Pair jz zz) fls = complex- (tf, tjz, tt) = tuple- [_, lsz, Succ blimy] = aList- lsz :: Nat- fls :: Bool- foo1 :: (a, b) -> a- foo1 (x, y) = (\ _ -> x) y- foo2 :: (# a, b #) -> a- foo2 t@(# x, y #) = case t of (# a, b #) -> (\ _ -> a) b- silly :: a -> ()- silly x = case x of _ -> ()- type family Case_0123456789876543210 x t where- Case_0123456789876543210 x _ = Tuple0Sym0- data Let0123456789876543210TSym0 x0123456789876543210- where- Let0123456789876543210TSym0KindInference :: SameKind (Apply Let0123456789876543210TSym0 arg) (Let0123456789876543210TSym1 arg) =>- Let0123456789876543210TSym0 x0123456789876543210- type instance Apply Let0123456789876543210TSym0 x0123456789876543210 = Let0123456789876543210TSym1 x0123456789876543210- instance SuppressUnusedWarnings Let0123456789876543210TSym0 where- suppressUnusedWarnings- = snd (((,) Let0123456789876543210TSym0KindInference) ())- data Let0123456789876543210TSym1 x0123456789876543210 y0123456789876543210- where- Let0123456789876543210TSym1KindInference :: SameKind (Apply (Let0123456789876543210TSym1 x0123456789876543210) arg) (Let0123456789876543210TSym2 x0123456789876543210 arg) =>- Let0123456789876543210TSym1 x0123456789876543210 y0123456789876543210- type instance Apply (Let0123456789876543210TSym1 x0123456789876543210) y0123456789876543210 = Let0123456789876543210T x0123456789876543210 y0123456789876543210- instance SuppressUnusedWarnings (Let0123456789876543210TSym1 x0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Let0123456789876543210TSym1KindInference) ())- type family Let0123456789876543210TSym2 x0123456789876543210 y0123456789876543210 where- Let0123456789876543210TSym2 x0123456789876543210 y0123456789876543210 = Let0123456789876543210T x0123456789876543210 y0123456789876543210- type family Let0123456789876543210T x y where- Let0123456789876543210T x y = Apply (Apply Tuple2Sym0 x) y- type family Case_0123456789876543210 arg_0123456789876543210 a b x y t where- Case_0123456789876543210 arg_0123456789876543210 a b x y _ = a- type family Lambda_0123456789876543210 a b x y arg_0123456789876543210 where- Lambda_0123456789876543210 a b x y arg_0123456789876543210 = Case_0123456789876543210 arg_0123456789876543210 a b x y arg_0123456789876543210- data Lambda_0123456789876543210Sym0 a0123456789876543210- where- Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) =>- Lambda_0123456789876543210Sym0 a0123456789876543210- type instance Apply Lambda_0123456789876543210Sym0 a0123456789876543210 = Lambda_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym0KindInference) ())- data Lambda_0123456789876543210Sym1 a0123456789876543210 b0123456789876543210- where- Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 a0123456789876543210) arg) (Lambda_0123456789876543210Sym2 a0123456789876543210 arg) =>- Lambda_0123456789876543210Sym1 a0123456789876543210 b0123456789876543210- type instance Apply (Lambda_0123456789876543210Sym1 a0123456789876543210) b0123456789876543210 = Lambda_0123456789876543210Sym2 a0123456789876543210 b0123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym1KindInference) ())- data Lambda_0123456789876543210Sym2 a0123456789876543210 b0123456789876543210 x0123456789876543210- where- Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 a0123456789876543210 b0123456789876543210) arg) (Lambda_0123456789876543210Sym3 a0123456789876543210 b0123456789876543210 arg) =>- Lambda_0123456789876543210Sym2 a0123456789876543210 b0123456789876543210 x0123456789876543210- type instance Apply (Lambda_0123456789876543210Sym2 a0123456789876543210 b0123456789876543210) x0123456789876543210 = Lambda_0123456789876543210Sym3 a0123456789876543210 b0123456789876543210 x0123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 a0123456789876543210 b0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym2KindInference) ())- data Lambda_0123456789876543210Sym3 a0123456789876543210 b0123456789876543210 x0123456789876543210 y0123456789876543210- where- Lambda_0123456789876543210Sym3KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym3 a0123456789876543210 b0123456789876543210 x0123456789876543210) arg) (Lambda_0123456789876543210Sym4 a0123456789876543210 b0123456789876543210 x0123456789876543210 arg) =>- Lambda_0123456789876543210Sym3 a0123456789876543210 b0123456789876543210 x0123456789876543210 y0123456789876543210- type instance Apply (Lambda_0123456789876543210Sym3 a0123456789876543210 b0123456789876543210 x0123456789876543210) y0123456789876543210 = Lambda_0123456789876543210Sym4 a0123456789876543210 b0123456789876543210 x0123456789876543210 y0123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym3 a0123456789876543210 b0123456789876543210 x0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym3KindInference) ())- data Lambda_0123456789876543210Sym4 a0123456789876543210 b0123456789876543210 x0123456789876543210 y0123456789876543210 arg_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym4KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym4 a0123456789876543210 b0123456789876543210 x0123456789876543210 y0123456789876543210) arg) (Lambda_0123456789876543210Sym5 a0123456789876543210 b0123456789876543210 x0123456789876543210 y0123456789876543210 arg) =>- Lambda_0123456789876543210Sym4 a0123456789876543210 b0123456789876543210 x0123456789876543210 y0123456789876543210 arg_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym4 a0123456789876543210 b0123456789876543210 x0123456789876543210 y0123456789876543210) arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210 a0123456789876543210 b0123456789876543210 x0123456789876543210 y0123456789876543210 arg_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym4 a0123456789876543210 b0123456789876543210 x0123456789876543210 y0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym4KindInference) ())- type family Lambda_0123456789876543210Sym5 a0123456789876543210 b0123456789876543210 x0123456789876543210 y0123456789876543210 arg_01234567898765432100123456789876543210 where- Lambda_0123456789876543210Sym5 a0123456789876543210 b0123456789876543210 x0123456789876543210 y0123456789876543210 arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210 a0123456789876543210 b0123456789876543210 x0123456789876543210 y0123456789876543210 arg_01234567898765432100123456789876543210- type family Case_0123456789876543210 x y t where- Case_0123456789876543210 x y '(a,- b) = Apply (Apply (Apply (Apply (Apply Lambda_0123456789876543210Sym0 a) b) x) y) b- type family Case_0123456789876543210 arg_0123456789876543210 x y t where- Case_0123456789876543210 arg_0123456789876543210 x y _ = x- type family Lambda_0123456789876543210 x y arg_0123456789876543210 where- Lambda_0123456789876543210 x y arg_0123456789876543210 = Case_0123456789876543210 arg_0123456789876543210 x y arg_0123456789876543210- data Lambda_0123456789876543210Sym0 x0123456789876543210- where- Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) =>- Lambda_0123456789876543210Sym0 x0123456789876543210- type instance Apply Lambda_0123456789876543210Sym0 x0123456789876543210 = Lambda_0123456789876543210Sym1 x0123456789876543210- instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym0KindInference) ())- data Lambda_0123456789876543210Sym1 x0123456789876543210 y0123456789876543210- where- Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) arg) (Lambda_0123456789876543210Sym2 x0123456789876543210 arg) =>- Lambda_0123456789876543210Sym1 x0123456789876543210 y0123456789876543210- type instance Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) y0123456789876543210 = Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 x0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym1KindInference) ())- data Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210 arg_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210) arg) (Lambda_0123456789876543210Sym3 x0123456789876543210 y0123456789876543210 arg) =>- Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210 arg_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210) arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 y0123456789876543210 arg_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym2KindInference) ())- type family Lambda_0123456789876543210Sym3 x0123456789876543210 y0123456789876543210 arg_01234567898765432100123456789876543210 where- Lambda_0123456789876543210Sym3 x0123456789876543210 y0123456789876543210 arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 y0123456789876543210 arg_01234567898765432100123456789876543210- type family Case_0123456789876543210 t where- Case_0123456789876543210 '[_,- _,- 'Succ y_0123456789876543210] = y_0123456789876543210- type family Case_0123456789876543210 t where- Case_0123456789876543210 '[_,- y_0123456789876543210,- 'Succ _] = y_0123456789876543210- type family Case_0123456789876543210 t where- Case_0123456789876543210 '(_,- _,- y_0123456789876543210) = y_0123456789876543210- type family Case_0123456789876543210 t where- Case_0123456789876543210 '(_,- y_0123456789876543210,- _) = y_0123456789876543210- type family Case_0123456789876543210 t where- Case_0123456789876543210 '(y_0123456789876543210,- _,- _) = y_0123456789876543210- type family Case_0123456789876543210 t where- Case_0123456789876543210 ('Pair ('Pair _ _) y_0123456789876543210) = y_0123456789876543210- type family Case_0123456789876543210 t where- Case_0123456789876543210 ('Pair ('Pair _ y_0123456789876543210) _) = y_0123456789876543210- type family Case_0123456789876543210 t where- Case_0123456789876543210 ('Pair ('Pair y_0123456789876543210 _) _) = y_0123456789876543210- type family Case_0123456789876543210 t where- Case_0123456789876543210 ('Pair _ y_0123456789876543210) = y_0123456789876543210- type family Case_0123456789876543210 t where- Case_0123456789876543210 ('Pair y_0123456789876543210 _) = y_0123456789876543210- type SillySym0 :: (~>) a ()- data SillySym0 :: (~>) a ()- where- SillySym0KindInference :: SameKind (Apply SillySym0 arg) (SillySym1 arg) =>- SillySym0 a0123456789876543210- type instance Apply SillySym0 a0123456789876543210 = Silly a0123456789876543210- instance SuppressUnusedWarnings SillySym0 where- suppressUnusedWarnings = snd (((,) SillySym0KindInference) ())- type SillySym1 :: a -> ()- type family SillySym1 (a0123456789876543210 :: a) :: () where- SillySym1 a0123456789876543210 = Silly a0123456789876543210- type Foo2Sym0 :: (~>) (a, b) a- data Foo2Sym0 :: (~>) (a, b) a- where- Foo2Sym0KindInference :: SameKind (Apply Foo2Sym0 arg) (Foo2Sym1 arg) =>- Foo2Sym0 a0123456789876543210- type instance Apply Foo2Sym0 a0123456789876543210 = Foo2 a0123456789876543210- instance SuppressUnusedWarnings Foo2Sym0 where- suppressUnusedWarnings = snd (((,) Foo2Sym0KindInference) ())- type Foo2Sym1 :: (a, b) -> a- type family Foo2Sym1 (a0123456789876543210 :: (a, b)) :: a where- Foo2Sym1 a0123456789876543210 = Foo2 a0123456789876543210- type Foo1Sym0 :: (~>) (a, b) a- data Foo1Sym0 :: (~>) (a, b) a- where- Foo1Sym0KindInference :: SameKind (Apply Foo1Sym0 arg) (Foo1Sym1 arg) =>- Foo1Sym0 a0123456789876543210- type instance Apply Foo1Sym0 a0123456789876543210 = Foo1 a0123456789876543210- instance SuppressUnusedWarnings Foo1Sym0 where- suppressUnusedWarnings = snd (((,) Foo1Sym0KindInference) ())- type Foo1Sym1 :: (a, b) -> a- type family Foo1Sym1 (a0123456789876543210 :: (a, b)) :: a where- Foo1Sym1 a0123456789876543210 = Foo1 a0123456789876543210- type family BlimySym0 where- BlimySym0 = Blimy- type LszSym0 :: Nat- type family LszSym0 :: Nat where- LszSym0 = Lsz- type family X_0123456789876543210Sym0 where- X_0123456789876543210Sym0 = X_0123456789876543210- type family TtSym0 where- TtSym0 = Tt- type family TjzSym0 where- TjzSym0 = Tjz- type family TfSym0 where- TfSym0 = Tf- type family X_0123456789876543210Sym0 where- X_0123456789876543210Sym0 = X_0123456789876543210- type FlsSym0 :: Bool- type family FlsSym0 :: Bool where- FlsSym0 = Fls- type family ZzSym0 where- ZzSym0 = Zz- type family JzSym0 where- JzSym0 = Jz- type family X_0123456789876543210Sym0 where- X_0123456789876543210Sym0 = X_0123456789876543210- type family LzSym0 where- LzSym0 = Lz- type family SzSym0 where- SzSym0 = Sz- type family X_0123456789876543210Sym0 where- X_0123456789876543210Sym0 = X_0123456789876543210- type Silly :: a -> ()- type family Silly (a :: a) :: () where- Silly x = Case_0123456789876543210 x x- type Foo2 :: (a, b) -> a- type family Foo2 (a :: (a, b)) :: a where- Foo2 '(x,- y) = Case_0123456789876543210 x y (Let0123456789876543210TSym2 x y)- type Foo1 :: (a, b) -> a- type family Foo1 (a :: (a, b)) :: a where- Foo1 '(x,- y) = Apply (Apply (Apply Lambda_0123456789876543210Sym0 x) y) y- type family Blimy where- Blimy = Case_0123456789876543210 X_0123456789876543210Sym0- type Lsz :: Nat- type family Lsz :: Nat where- Lsz = Case_0123456789876543210 X_0123456789876543210Sym0- type family X_0123456789876543210 where- X_0123456789876543210 = AListSym0- type family Tt where- Tt = Case_0123456789876543210 X_0123456789876543210Sym0- type family Tjz where- Tjz = Case_0123456789876543210 X_0123456789876543210Sym0- type family Tf where- Tf = Case_0123456789876543210 X_0123456789876543210Sym0- type family X_0123456789876543210 where- X_0123456789876543210 = TupleSym0- type Fls :: Bool- type family Fls :: Bool where- Fls = Case_0123456789876543210 X_0123456789876543210Sym0- type family Zz where- Zz = Case_0123456789876543210 X_0123456789876543210Sym0- type family Jz where- Jz = Case_0123456789876543210 X_0123456789876543210Sym0- type family X_0123456789876543210 where- X_0123456789876543210 = ComplexSym0- type family Lz where- Lz = Case_0123456789876543210 X_0123456789876543210Sym0- type family Sz where- Sz = Case_0123456789876543210 X_0123456789876543210Sym0- type family X_0123456789876543210 where- X_0123456789876543210 = PrSym0- sSilly ::- forall a (t :: a). Sing t -> Sing (Apply SillySym0 t :: ())- sFoo2 ::- forall a b (t :: (a, b)). Sing t -> Sing (Apply Foo2Sym0 t :: a)- sFoo1 ::- forall a b (t :: (a, b)). Sing t -> Sing (Apply Foo1Sym0 t :: a)- sBlimy :: Sing @_ BlimySym0- sLsz :: Sing (LszSym0 :: Nat)- sX_0123456789876543210 :: Sing @_ X_0123456789876543210Sym0- sTt :: Sing @_ TtSym0- sTjz :: Sing @_ TjzSym0- sTf :: Sing @_ TfSym0- sX_0123456789876543210 :: Sing @_ X_0123456789876543210Sym0- sFls :: Sing (FlsSym0 :: Bool)- sZz :: Sing @_ ZzSym0- sJz :: Sing @_ JzSym0- sX_0123456789876543210 :: Sing @_ X_0123456789876543210Sym0- sLz :: Sing @_ LzSym0- sSz :: Sing @_ SzSym0- sX_0123456789876543210 :: Sing @_ X_0123456789876543210Sym0- sSilly (sX :: Sing x)- = (id @(Sing (Case_0123456789876543210 x x :: ())))- (case sX of _ -> STuple0)- sFoo2 (STuple2 (sX :: Sing x) (sY :: Sing y))- = let- sT :: Sing @_ (Let0123456789876543210TSym2 x y)- sT- = (applySing ((applySing ((singFun2 @Tuple2Sym0) STuple2)) sX)) sY- in- (id- @(Sing (Case_0123456789876543210 x y (Let0123456789876543210TSym2 x y) :: a)))- (case sT of- STuple2 (sA :: Sing a) (sB :: Sing b)- -> (applySing- ((singFun1- @(Apply (Apply (Apply (Apply Lambda_0123456789876543210Sym0 a) b) x) y))- (\ sArg_0123456789876543210- -> case sArg_0123456789876543210 of- (_ :: Sing arg_0123456789876543210)- -> (id- @(Sing (Case_0123456789876543210 arg_0123456789876543210 a b x y arg_0123456789876543210)))- (case sArg_0123456789876543210 of _ -> sA))))- sB)- sFoo1 (STuple2 (sX :: Sing x) (sY :: Sing y))- = (applySing- ((singFun1 @(Apply (Apply Lambda_0123456789876543210Sym0 x) y))- (\ sArg_0123456789876543210- -> case sArg_0123456789876543210 of- (_ :: Sing arg_0123456789876543210)- -> (id- @(Sing (Case_0123456789876543210 arg_0123456789876543210 x y arg_0123456789876543210)))- (case sArg_0123456789876543210 of _ -> sX))))- sY- sBlimy- = (id @(Sing (Case_0123456789876543210 X_0123456789876543210Sym0)))- (case sX_0123456789876543210 of- SCons _- (SCons _- (SCons (SSucc (sY_0123456789876543210 :: Sing y_0123456789876543210))- SNil))- -> sY_0123456789876543210)- sLsz- = (id- @(Sing (Case_0123456789876543210 X_0123456789876543210Sym0 :: Nat)))- (case sX_0123456789876543210 of- SCons _- (SCons (sY_0123456789876543210 :: Sing y_0123456789876543210)- (SCons (SSucc _) SNil))- -> sY_0123456789876543210)- sX_0123456789876543210 = sAList- sTt- = (id @(Sing (Case_0123456789876543210 X_0123456789876543210Sym0)))- (case sX_0123456789876543210 of- STuple3 _ _ (sY_0123456789876543210 :: Sing y_0123456789876543210)- -> sY_0123456789876543210)- sTjz- = (id @(Sing (Case_0123456789876543210 X_0123456789876543210Sym0)))- (case sX_0123456789876543210 of- STuple3 _ (sY_0123456789876543210 :: Sing y_0123456789876543210) _- -> sY_0123456789876543210)- sTf- = (id @(Sing (Case_0123456789876543210 X_0123456789876543210Sym0)))- (case sX_0123456789876543210 of- STuple3 (sY_0123456789876543210 :: Sing y_0123456789876543210) _ _- -> sY_0123456789876543210)- sX_0123456789876543210 = sTuple- sFls- = (id- @(Sing (Case_0123456789876543210 X_0123456789876543210Sym0 :: Bool)))- (case sX_0123456789876543210 of- SPair (SPair _ _)- (sY_0123456789876543210 :: Sing y_0123456789876543210)- -> sY_0123456789876543210)- sZz- = (id @(Sing (Case_0123456789876543210 X_0123456789876543210Sym0)))- (case sX_0123456789876543210 of- SPair (SPair _- (sY_0123456789876543210 :: Sing y_0123456789876543210))- _- -> sY_0123456789876543210)- sJz- = (id @(Sing (Case_0123456789876543210 X_0123456789876543210Sym0)))- (case sX_0123456789876543210 of- SPair (SPair (sY_0123456789876543210 :: Sing y_0123456789876543210)- _)- _- -> sY_0123456789876543210)- sX_0123456789876543210 = sComplex- sLz- = (id @(Sing (Case_0123456789876543210 X_0123456789876543210Sym0)))- (case sX_0123456789876543210 of- SPair _ (sY_0123456789876543210 :: Sing y_0123456789876543210)- -> sY_0123456789876543210)- sSz- = (id @(Sing (Case_0123456789876543210 X_0123456789876543210Sym0)))- (case sX_0123456789876543210 of- SPair (sY_0123456789876543210 :: Sing y_0123456789876543210) _- -> sY_0123456789876543210)- sX_0123456789876543210 = sPr- instance SingI (SillySym0 :: (~>) a ()) where- sing = (singFun1 @SillySym0) sSilly- instance SingI (Foo2Sym0 :: (~>) (a, b) a) where- sing = (singFun1 @Foo2Sym0) sFoo2- instance SingI (Foo1Sym0 :: (~>) (a, b) a) where- sing = (singFun1 @Foo1Sym0) sFoo1+Singletons/PatternMatching.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| pr = Pair (Succ Zero) ([Zero]) + complex = Pair (Pair (Just Zero) Zero) False + tuple = (False, Just Zero, True) + aList = [Zero, Succ Zero, Succ (Succ Zero)] + + data Pair a b + = Pair a b + deriving Show |] + ======> + data Pair a b + = Pair a b + deriving Show + pr = Pair (Succ Zero) [Zero] + complex = Pair (Pair (Just Zero) Zero) False + tuple = (False, Just Zero, True) + aList = [Zero, Succ Zero, Succ (Succ Zero)] + type PairSym0 :: forall a b. (~>) a ((~>) b (Pair a b)) + data PairSym0 :: (~>) a ((~>) b (Pair a b)) + where + PairSym0KindInference :: SameKind (Apply PairSym0 arg) (PairSym1 arg) => + PairSym0 a0123456789876543210 + type instance Apply PairSym0 a0123456789876543210 = PairSym1 a0123456789876543210 + instance SuppressUnusedWarnings PairSym0 where + suppressUnusedWarnings = snd ((,) PairSym0KindInference ()) + type PairSym1 :: forall a b. a -> (~>) b (Pair a b) + data PairSym1 (a0123456789876543210 :: a) :: (~>) b (Pair a b) + where + PairSym1KindInference :: SameKind (Apply (PairSym1 a0123456789876543210) arg) (PairSym2 a0123456789876543210 arg) => + PairSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (PairSym1 a0123456789876543210) a0123456789876543210 = Pair a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (PairSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) PairSym1KindInference ()) + type PairSym2 :: forall a b. a -> b -> Pair a b + type family PairSym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: Pair a b where + PairSym2 a0123456789876543210 a0123456789876543210 = Pair a0123456789876543210 a0123456789876543210 + type family AListSym0 where + AListSym0 = AList + type family TupleSym0 where + TupleSym0 = Tuple + type family ComplexSym0 where + ComplexSym0 = Complex + type family PrSym0 where + PrSym0 = Pr + type family AList where + AList = Apply (Apply (:@#@$) ZeroSym0) (Apply (Apply (:@#@$) (Apply SuccSym0 ZeroSym0)) (Apply (Apply (:@#@$) (Apply SuccSym0 (Apply SuccSym0 ZeroSym0))) NilSym0)) + type family Tuple where + Tuple = Apply (Apply (Apply Tuple3Sym0 FalseSym0) (Apply JustSym0 ZeroSym0)) TrueSym0 + type family Complex where + Complex = Apply (Apply PairSym0 (Apply (Apply PairSym0 (Apply JustSym0 ZeroSym0)) ZeroSym0)) FalseSym0 + type family Pr where + Pr = Apply (Apply PairSym0 (Apply SuccSym0 ZeroSym0)) (Apply (Apply (:@#@$) ZeroSym0) NilSym0) + type ShowsPrec_0123456789876543210 :: GHC.Num.Natural.Natural + -> Pair a b -> Symbol -> Symbol + type family ShowsPrec_0123456789876543210 (a :: GHC.Num.Natural.Natural) (a :: Pair a b) (a :: Symbol) :: Symbol where + ShowsPrec_0123456789876543210 p_0123456789876543210 (Pair arg_0123456789876543210 arg_0123456789876543210) a_0123456789876543210 = Apply (Apply (Apply ShowParenSym0 (Apply (Apply (>@#@$) p_0123456789876543210) (FromInteger 10))) (Apply (Apply (.@#@$) (Apply ShowStringSym0 "Pair ")) (Apply (Apply (.@#@$) (Apply (Apply ShowsPrecSym0 (FromInteger 11)) arg_0123456789876543210)) (Apply (Apply (.@#@$) ShowSpaceSym0) (Apply (Apply ShowsPrecSym0 (FromInteger 11)) arg_0123456789876543210))))) a_0123456789876543210 + type ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) (Pair a b) ((~>) Symbol Symbol)) + data ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) (Pair a b) ((~>) Symbol Symbol)) + where + ShowsPrec_0123456789876543210Sym0KindInference :: SameKind (Apply ShowsPrec_0123456789876543210Sym0 arg) (ShowsPrec_0123456789876543210Sym1 arg) => + ShowsPrec_0123456789876543210Sym0 a0123456789876543210 + type instance Apply ShowsPrec_0123456789876543210Sym0 a0123456789876543210 = ShowsPrec_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings ShowsPrec_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym0KindInference ()) + type ShowsPrec_0123456789876543210Sym1 :: GHC.Num.Natural.Natural + -> (~>) (Pair a b) ((~>) Symbol Symbol) + data ShowsPrec_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Num.Natural.Natural) :: (~>) (Pair a b) ((~>) Symbol Symbol) + where + ShowsPrec_0123456789876543210Sym1KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 arg) => + ShowsPrec_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym1KindInference ()) + type ShowsPrec_0123456789876543210Sym2 :: GHC.Num.Natural.Natural + -> Pair a b -> (~>) Symbol Symbol + data ShowsPrec_0123456789876543210Sym2 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: Pair a b) :: (~>) Symbol Symbol + where + ShowsPrec_0123456789876543210Sym2KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 arg) => + ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym2KindInference ()) + type ShowsPrec_0123456789876543210Sym3 :: GHC.Num.Natural.Natural + -> Pair a b -> Symbol -> Symbol + type family ShowsPrec_0123456789876543210Sym3 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: Pair a b) (a0123456789876543210 :: Symbol) :: Symbol where + ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PShow (Pair a b) where + type ShowsPrec a a a = Apply (Apply (Apply ShowsPrec_0123456789876543210Sym0 a) a) a + sAList :: Sing @_ AListSym0 + sTuple :: Sing @_ TupleSym0 + sComplex :: Sing @_ ComplexSym0 + sPr :: Sing @_ PrSym0 + sAList + = applySing + (applySing (singFun2 @(:@#@$) SCons) SZero) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing (singFun1 @SuccSym0 SSucc) SZero)) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing + (singFun1 @SuccSym0 SSucc) + (applySing (singFun1 @SuccSym0 SSucc) SZero))) + SNil)) + sTuple + = applySing + (applySing + (applySing (singFun3 @Tuple3Sym0 STuple3) SFalse) + (applySing (singFun1 @JustSym0 SJust) SZero)) + STrue + sComplex + = applySing + (applySing + (singFun2 @PairSym0 SPair) + (applySing + (applySing + (singFun2 @PairSym0 SPair) + (applySing (singFun1 @JustSym0 SJust) SZero)) + SZero)) + SFalse + sPr + = applySing + (applySing + (singFun2 @PairSym0 SPair) + (applySing (singFun1 @SuccSym0 SSucc) SZero)) + (applySing (applySing (singFun2 @(:@#@$) SCons) SZero) SNil) + data SPair :: forall a b. Pair a b -> Type + where + SPair :: forall a b (n :: a) (n :: b). + (Sing n) -> (Sing n) -> SPair (Pair n n :: Pair a b) + type instance Sing @(Pair a b) = SPair + instance (SingKind a, SingKind b) => SingKind (Pair a b) where + type Demote (Pair a b) = Pair (Demote a) (Demote b) + fromSing (SPair b b) = Pair (fromSing b) (fromSing b) + toSing (Pair (b :: Demote a) (b :: Demote b)) + = case (,) (toSing b :: SomeSing a) (toSing b :: SomeSing b) of + (,) (SomeSing c) (SomeSing c) -> SomeSing (SPair c c) + instance (SShow a, SShow b) => SShow (Pair a b) where + sShowsPrec :: + forall (t1 :: GHC.Num.Natural.Natural) + (t2 :: Pair a b) + (t3 :: Symbol). Sing t1 + -> Sing t2 + -> Sing t3 + -> Sing (Apply (Apply (Apply (ShowsPrecSym0 :: TyFun GHC.Num.Natural.Natural ((~>) (Pair a b) ((~>) Symbol Symbol)) + -> Type) t1) t2) t3) + sShowsPrec + (sP_0123456789876543210 :: Sing p_0123456789876543210) + (SPair (sArg_0123456789876543210 :: Sing arg_0123456789876543210) + (sArg_0123456789876543210 :: Sing arg_0123456789876543210)) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (applySing + (singFun3 @ShowParenSym0 sShowParen) + (applySing + (applySing (singFun2 @(>@#@$) (%>)) sP_0123456789876543210) + (sFromInteger (sing :: Sing 10)))) + (applySing + (applySing + (singFun3 @(.@#@$) (%.)) + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "Pair "))) + (applySing + (applySing + (singFun3 @(.@#@$) (%.)) + (applySing + (applySing + (singFun3 @ShowsPrecSym0 sShowsPrec) + (sFromInteger (sing :: Sing 11))) + sArg_0123456789876543210)) + (applySing + (applySing + (singFun3 @(.@#@$) (%.)) (singFun1 @ShowSpaceSym0 sShowSpace)) + (applySing + (applySing + (singFun3 @ShowsPrecSym0 sShowsPrec) + (sFromInteger (sing :: Sing 11))) + sArg_0123456789876543210))))) + sA_0123456789876543210 + deriving instance (Data.Singletons.ShowSing.ShowSing a, + Data.Singletons.ShowSing.ShowSing b) => + Show (SPair (z :: Pair a b)) + instance (SingI n, SingI n) => SingI (Pair (n :: a) (n :: b)) where + sing = SPair sing sing + instance SingI n => SingI1 (Pair (n :: a)) where + liftSing = SPair sing + instance SingI2 Pair where + liftSing2 = SPair + instance SingI (PairSym0 :: (~>) a ((~>) b (Pair a b))) where + sing = singFun2 @PairSym0 SPair + instance SingI d => + SingI (PairSym1 (d :: a) :: (~>) b (Pair a b)) where + sing = singFun1 @(PairSym1 (d :: a)) (SPair (sing @d)) + instance SingI1 (PairSym1 :: a -> (~>) b (Pair a b)) where + liftSing (s :: Sing (d :: a)) + = singFun1 @(PairSym1 (d :: a)) (SPair s) +Singletons/PatternMatching.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| Pair sz lz = pr + Pair (Pair jz zz) fls = complex + (tf, tjz, tt) = tuple + [_, lsz, (Succ blimy)] = aList + lsz :: Nat + fls :: Bool + foo1 :: (a, b) -> a + foo1 (x, y) = (\ _ -> x) y + foo2 :: (# a, b #) -> a + foo2 t@(# x, y #) = case t of (# a, b #) -> (\ _ -> a) b + silly :: a -> () + silly x = case x of _ -> () |] + ======> + Pair sz lz = pr + Pair (Pair jz zz) fls = complex + (tf, tjz, tt) = tuple + [_, lsz, Succ blimy] = aList + lsz :: Nat + fls :: Bool + foo1 :: (a, b) -> a + foo1 (x, y) = (\ _ -> x) y + foo2 :: (# a, b #) -> a + foo2 t@(# x, y #) = case t of (# a, b #) -> (\ _ -> a) b + silly :: a -> () + silly x = case x of _ -> () + type family Case_0123456789876543210 x t where + Case_0123456789876543210 x _ = Tuple0Sym0 + data Let0123456789876543210TSym0 x0123456789876543210 + where + Let0123456789876543210TSym0KindInference :: SameKind (Apply Let0123456789876543210TSym0 arg) (Let0123456789876543210TSym1 arg) => + Let0123456789876543210TSym0 x0123456789876543210 + type instance Apply Let0123456789876543210TSym0 x0123456789876543210 = Let0123456789876543210TSym1 x0123456789876543210 + instance SuppressUnusedWarnings Let0123456789876543210TSym0 where + suppressUnusedWarnings + = snd ((,) Let0123456789876543210TSym0KindInference ()) + data Let0123456789876543210TSym1 x0123456789876543210 y0123456789876543210 + where + Let0123456789876543210TSym1KindInference :: SameKind (Apply (Let0123456789876543210TSym1 x0123456789876543210) arg) (Let0123456789876543210TSym2 x0123456789876543210 arg) => + Let0123456789876543210TSym1 x0123456789876543210 y0123456789876543210 + type instance Apply (Let0123456789876543210TSym1 x0123456789876543210) y0123456789876543210 = Let0123456789876543210T x0123456789876543210 y0123456789876543210 + instance SuppressUnusedWarnings (Let0123456789876543210TSym1 x0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Let0123456789876543210TSym1KindInference ()) + type family Let0123456789876543210TSym2 x0123456789876543210 y0123456789876543210 where + Let0123456789876543210TSym2 x0123456789876543210 y0123456789876543210 = Let0123456789876543210T x0123456789876543210 y0123456789876543210 + type family Let0123456789876543210T x y where + Let0123456789876543210T x y = Apply (Apply Tuple2Sym0 x) y + type family Case_0123456789876543210 arg_0123456789876543210 a b x y t where + Case_0123456789876543210 arg_0123456789876543210 a b x y _ = a + type family Lambda_0123456789876543210 a b x y arg_0123456789876543210 where + Lambda_0123456789876543210 a b x y arg_0123456789876543210 = Case_0123456789876543210 arg_0123456789876543210 a b x y arg_0123456789876543210 + data Lambda_0123456789876543210Sym0 a0123456789876543210 + where + Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) => + Lambda_0123456789876543210Sym0 a0123456789876543210 + type instance Apply Lambda_0123456789876543210Sym0 a0123456789876543210 = Lambda_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym0KindInference ()) + data Lambda_0123456789876543210Sym1 a0123456789876543210 b0123456789876543210 + where + Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 a0123456789876543210) arg) (Lambda_0123456789876543210Sym2 a0123456789876543210 arg) => + Lambda_0123456789876543210Sym1 a0123456789876543210 b0123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym1 a0123456789876543210) b0123456789876543210 = Lambda_0123456789876543210Sym2 a0123456789876543210 b0123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym1KindInference ()) + data Lambda_0123456789876543210Sym2 a0123456789876543210 b0123456789876543210 x0123456789876543210 + where + Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 a0123456789876543210 b0123456789876543210) arg) (Lambda_0123456789876543210Sym3 a0123456789876543210 b0123456789876543210 arg) => + Lambda_0123456789876543210Sym2 a0123456789876543210 b0123456789876543210 x0123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym2 a0123456789876543210 b0123456789876543210) x0123456789876543210 = Lambda_0123456789876543210Sym3 a0123456789876543210 b0123456789876543210 x0123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 a0123456789876543210 b0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym2KindInference ()) + data Lambda_0123456789876543210Sym3 a0123456789876543210 b0123456789876543210 x0123456789876543210 y0123456789876543210 + where + Lambda_0123456789876543210Sym3KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym3 a0123456789876543210 b0123456789876543210 x0123456789876543210) arg) (Lambda_0123456789876543210Sym4 a0123456789876543210 b0123456789876543210 x0123456789876543210 arg) => + Lambda_0123456789876543210Sym3 a0123456789876543210 b0123456789876543210 x0123456789876543210 y0123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym3 a0123456789876543210 b0123456789876543210 x0123456789876543210) y0123456789876543210 = Lambda_0123456789876543210Sym4 a0123456789876543210 b0123456789876543210 x0123456789876543210 y0123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym3 a0123456789876543210 b0123456789876543210 x0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym3KindInference ()) + data Lambda_0123456789876543210Sym4 a0123456789876543210 b0123456789876543210 x0123456789876543210 y0123456789876543210 arg_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym4KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym4 a0123456789876543210 b0123456789876543210 x0123456789876543210 y0123456789876543210) arg) (Lambda_0123456789876543210Sym5 a0123456789876543210 b0123456789876543210 x0123456789876543210 y0123456789876543210 arg) => + Lambda_0123456789876543210Sym4 a0123456789876543210 b0123456789876543210 x0123456789876543210 y0123456789876543210 arg_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym4 a0123456789876543210 b0123456789876543210 x0123456789876543210 y0123456789876543210) arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210 a0123456789876543210 b0123456789876543210 x0123456789876543210 y0123456789876543210 arg_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym4 a0123456789876543210 b0123456789876543210 x0123456789876543210 y0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym4KindInference ()) + type family Lambda_0123456789876543210Sym5 a0123456789876543210 b0123456789876543210 x0123456789876543210 y0123456789876543210 arg_01234567898765432100123456789876543210 where + Lambda_0123456789876543210Sym5 a0123456789876543210 b0123456789876543210 x0123456789876543210 y0123456789876543210 arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210 a0123456789876543210 b0123456789876543210 x0123456789876543210 y0123456789876543210 arg_01234567898765432100123456789876543210 + type family Case_0123456789876543210 x y t where + Case_0123456789876543210 x y '(a, + b) = Apply (Apply (Apply (Apply (Apply Lambda_0123456789876543210Sym0 a) b) x) y) b + type family Case_0123456789876543210 arg_0123456789876543210 x y t where + Case_0123456789876543210 arg_0123456789876543210 x y _ = x + type family Lambda_0123456789876543210 x y arg_0123456789876543210 where + Lambda_0123456789876543210 x y arg_0123456789876543210 = Case_0123456789876543210 arg_0123456789876543210 x y arg_0123456789876543210 + data Lambda_0123456789876543210Sym0 x0123456789876543210 + where + Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) => + Lambda_0123456789876543210Sym0 x0123456789876543210 + type instance Apply Lambda_0123456789876543210Sym0 x0123456789876543210 = Lambda_0123456789876543210Sym1 x0123456789876543210 + instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym0KindInference ()) + data Lambda_0123456789876543210Sym1 x0123456789876543210 y0123456789876543210 + where + Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) arg) (Lambda_0123456789876543210Sym2 x0123456789876543210 arg) => + Lambda_0123456789876543210Sym1 x0123456789876543210 y0123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) y0123456789876543210 = Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 x0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym1KindInference ()) + data Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210 arg_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210) arg) (Lambda_0123456789876543210Sym3 x0123456789876543210 y0123456789876543210 arg) => + Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210 arg_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210) arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 y0123456789876543210 arg_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 x0123456789876543210 y0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym2KindInference ()) + type family Lambda_0123456789876543210Sym3 x0123456789876543210 y0123456789876543210 arg_01234567898765432100123456789876543210 where + Lambda_0123456789876543210Sym3 x0123456789876543210 y0123456789876543210 arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 y0123456789876543210 arg_01234567898765432100123456789876543210 + type family Case_0123456789876543210 t where + Case_0123456789876543210 '[_, + _, + 'Succ y_0123456789876543210] = y_0123456789876543210 + type family Case_0123456789876543210 t where + Case_0123456789876543210 '[_, + y_0123456789876543210, + 'Succ _] = y_0123456789876543210 + type family Case_0123456789876543210 t where + Case_0123456789876543210 '(_, + _, + y_0123456789876543210) = y_0123456789876543210 + type family Case_0123456789876543210 t where + Case_0123456789876543210 '(_, + y_0123456789876543210, + _) = y_0123456789876543210 + type family Case_0123456789876543210 t where + Case_0123456789876543210 '(y_0123456789876543210, + _, + _) = y_0123456789876543210 + type family Case_0123456789876543210 t where + Case_0123456789876543210 ('Pair ('Pair _ _) y_0123456789876543210) = y_0123456789876543210 + type family Case_0123456789876543210 t where + Case_0123456789876543210 ('Pair ('Pair _ y_0123456789876543210) _) = y_0123456789876543210 + type family Case_0123456789876543210 t where + Case_0123456789876543210 ('Pair ('Pair y_0123456789876543210 _) _) = y_0123456789876543210 + type family Case_0123456789876543210 t where + Case_0123456789876543210 ('Pair _ y_0123456789876543210) = y_0123456789876543210 + type family Case_0123456789876543210 t where + Case_0123456789876543210 ('Pair y_0123456789876543210 _) = y_0123456789876543210 + type SillySym0 :: (~>) a () + data SillySym0 :: (~>) a () + where + SillySym0KindInference :: SameKind (Apply SillySym0 arg) (SillySym1 arg) => + SillySym0 a0123456789876543210 + type instance Apply SillySym0 a0123456789876543210 = Silly a0123456789876543210 + instance SuppressUnusedWarnings SillySym0 where + suppressUnusedWarnings = snd ((,) SillySym0KindInference ()) + type SillySym1 :: a -> () + type family SillySym1 (a0123456789876543210 :: a) :: () where + SillySym1 a0123456789876543210 = Silly a0123456789876543210 + type Foo2Sym0 :: (~>) (a, b) a + data Foo2Sym0 :: (~>) (a, b) a + where + Foo2Sym0KindInference :: SameKind (Apply Foo2Sym0 arg) (Foo2Sym1 arg) => + Foo2Sym0 a0123456789876543210 + type instance Apply Foo2Sym0 a0123456789876543210 = Foo2 a0123456789876543210 + instance SuppressUnusedWarnings Foo2Sym0 where + suppressUnusedWarnings = snd ((,) Foo2Sym0KindInference ()) + type Foo2Sym1 :: (a, b) -> a + type family Foo2Sym1 (a0123456789876543210 :: (a, b)) :: a where + Foo2Sym1 a0123456789876543210 = Foo2 a0123456789876543210 + type Foo1Sym0 :: (~>) (a, b) a + data Foo1Sym0 :: (~>) (a, b) a + where + Foo1Sym0KindInference :: SameKind (Apply Foo1Sym0 arg) (Foo1Sym1 arg) => + Foo1Sym0 a0123456789876543210 + type instance Apply Foo1Sym0 a0123456789876543210 = Foo1 a0123456789876543210 + instance SuppressUnusedWarnings Foo1Sym0 where + suppressUnusedWarnings = snd ((,) Foo1Sym0KindInference ()) + type Foo1Sym1 :: (a, b) -> a + type family Foo1Sym1 (a0123456789876543210 :: (a, b)) :: a where + Foo1Sym1 a0123456789876543210 = Foo1 a0123456789876543210 + type family BlimySym0 where + BlimySym0 = Blimy + type LszSym0 :: Nat + type family LszSym0 :: Nat where + LszSym0 = Lsz + type family X_0123456789876543210Sym0 where + X_0123456789876543210Sym0 = X_0123456789876543210 + type family TtSym0 where + TtSym0 = Tt + type family TjzSym0 where + TjzSym0 = Tjz + type family TfSym0 where + TfSym0 = Tf + type family X_0123456789876543210Sym0 where + X_0123456789876543210Sym0 = X_0123456789876543210 + type FlsSym0 :: Bool + type family FlsSym0 :: Bool where + FlsSym0 = Fls + type family ZzSym0 where + ZzSym0 = Zz + type family JzSym0 where + JzSym0 = Jz + type family X_0123456789876543210Sym0 where + X_0123456789876543210Sym0 = X_0123456789876543210 + type family LzSym0 where + LzSym0 = Lz + type family SzSym0 where + SzSym0 = Sz + type family X_0123456789876543210Sym0 where + X_0123456789876543210Sym0 = X_0123456789876543210 + type Silly :: a -> () + type family Silly (a :: a) :: () where + Silly x = Case_0123456789876543210 x x + type Foo2 :: (a, b) -> a + type family Foo2 (a :: (a, b)) :: a where + Foo2 '(x, + y) = Case_0123456789876543210 x y (Let0123456789876543210TSym2 x y) + type Foo1 :: (a, b) -> a + type family Foo1 (a :: (a, b)) :: a where + Foo1 '(x, + y) = Apply (Apply (Apply Lambda_0123456789876543210Sym0 x) y) y + type family Blimy where + Blimy = Case_0123456789876543210 X_0123456789876543210Sym0 + type Lsz :: Nat + type family Lsz :: Nat where + Lsz = Case_0123456789876543210 X_0123456789876543210Sym0 + type family X_0123456789876543210 where + X_0123456789876543210 = AListSym0 + type family Tt where + Tt = Case_0123456789876543210 X_0123456789876543210Sym0 + type family Tjz where + Tjz = Case_0123456789876543210 X_0123456789876543210Sym0 + type family Tf where + Tf = Case_0123456789876543210 X_0123456789876543210Sym0 + type family X_0123456789876543210 where + X_0123456789876543210 = TupleSym0 + type Fls :: Bool + type family Fls :: Bool where + Fls = Case_0123456789876543210 X_0123456789876543210Sym0 + type family Zz where + Zz = Case_0123456789876543210 X_0123456789876543210Sym0 + type family Jz where + Jz = Case_0123456789876543210 X_0123456789876543210Sym0 + type family X_0123456789876543210 where + X_0123456789876543210 = ComplexSym0 + type family Lz where + Lz = Case_0123456789876543210 X_0123456789876543210Sym0 + type family Sz where + Sz = Case_0123456789876543210 X_0123456789876543210Sym0 + type family X_0123456789876543210 where + X_0123456789876543210 = PrSym0 + sSilly :: + (forall (t :: a). Sing t -> Sing (Apply SillySym0 t :: ()) :: Type) + sFoo2 :: + (forall (t :: (a, b)). + Sing t -> Sing (Apply Foo2Sym0 t :: a) :: Type) + sFoo1 :: + (forall (t :: (a, b)). + Sing t -> Sing (Apply Foo1Sym0 t :: a) :: Type) + sBlimy :: Sing @_ BlimySym0 + sLsz :: (Sing (LszSym0 :: Nat) :: Type) + sX_0123456789876543210 :: Sing @_ X_0123456789876543210Sym0 + sTt :: Sing @_ TtSym0 + sTjz :: Sing @_ TjzSym0 + sTf :: Sing @_ TfSym0 + sX_0123456789876543210 :: Sing @_ X_0123456789876543210Sym0 + sFls :: (Sing (FlsSym0 :: Bool) :: Type) + sZz :: Sing @_ ZzSym0 + sJz :: Sing @_ JzSym0 + sX_0123456789876543210 :: Sing @_ X_0123456789876543210Sym0 + sLz :: Sing @_ LzSym0 + sSz :: Sing @_ SzSym0 + sX_0123456789876543210 :: Sing @_ X_0123456789876543210Sym0 + sSilly (sX :: Sing x) + = id + @(Sing (Case_0123456789876543210 x x)) (case sX of _ -> STuple0) + sFoo2 (STuple2 (sX :: Sing x) (sY :: Sing y)) + = let + sT :: Sing @_ (Let0123456789876543210TSym2 x y) + sT = applySing (applySing (singFun2 @Tuple2Sym0 STuple2) sX) sY + in + id + @(Sing (Case_0123456789876543210 x y (Let0123456789876543210TSym2 x y))) + (case sT of + STuple2 (sA :: Sing a) (sB :: Sing b) + -> applySing + (singFun1 + @(Apply (Apply (Apply (Apply Lambda_0123456789876543210Sym0 a) b) x) y) + (\ sArg_0123456789876543210 + -> case sArg_0123456789876543210 of + (_ :: Sing arg_0123456789876543210) + -> id + @(Sing (Case_0123456789876543210 arg_0123456789876543210 a b x y arg_0123456789876543210)) + (case sArg_0123456789876543210 of _ -> sA))) + sB) + sFoo1 (STuple2 (sX :: Sing x) (sY :: Sing y)) + = applySing + (singFun1 + @(Apply (Apply Lambda_0123456789876543210Sym0 x) y) + (\ sArg_0123456789876543210 + -> case sArg_0123456789876543210 of + (_ :: Sing arg_0123456789876543210) + -> id + @(Sing (Case_0123456789876543210 arg_0123456789876543210 x y arg_0123456789876543210)) + (case sArg_0123456789876543210 of _ -> sX))) + sY + sBlimy + = id + @(Sing (Case_0123456789876543210 X_0123456789876543210Sym0)) + (case sX_0123456789876543210 of + SCons _ + (SCons _ + (SCons (SSucc (sY_0123456789876543210 :: Sing y_0123456789876543210)) + SNil)) + -> sY_0123456789876543210) + sLsz + = id + @(Sing (Case_0123456789876543210 X_0123456789876543210Sym0)) + (case sX_0123456789876543210 of + SCons _ + (SCons (sY_0123456789876543210 :: Sing y_0123456789876543210) + (SCons (SSucc _) SNil)) + -> sY_0123456789876543210) + sX_0123456789876543210 = sAList + sTt + = id + @(Sing (Case_0123456789876543210 X_0123456789876543210Sym0)) + (case sX_0123456789876543210 of + STuple3 _ _ (sY_0123456789876543210 :: Sing y_0123456789876543210) + -> sY_0123456789876543210) + sTjz + = id + @(Sing (Case_0123456789876543210 X_0123456789876543210Sym0)) + (case sX_0123456789876543210 of + STuple3 _ (sY_0123456789876543210 :: Sing y_0123456789876543210) _ + -> sY_0123456789876543210) + sTf + = id + @(Sing (Case_0123456789876543210 X_0123456789876543210Sym0)) + (case sX_0123456789876543210 of + STuple3 (sY_0123456789876543210 :: Sing y_0123456789876543210) _ _ + -> sY_0123456789876543210) + sX_0123456789876543210 = sTuple + sFls + = id + @(Sing (Case_0123456789876543210 X_0123456789876543210Sym0)) + (case sX_0123456789876543210 of + SPair (SPair _ _) + (sY_0123456789876543210 :: Sing y_0123456789876543210) + -> sY_0123456789876543210) + sZz + = id + @(Sing (Case_0123456789876543210 X_0123456789876543210Sym0)) + (case sX_0123456789876543210 of + SPair (SPair _ + (sY_0123456789876543210 :: Sing y_0123456789876543210)) + _ + -> sY_0123456789876543210) + sJz + = id + @(Sing (Case_0123456789876543210 X_0123456789876543210Sym0)) + (case sX_0123456789876543210 of + SPair (SPair (sY_0123456789876543210 :: Sing y_0123456789876543210) + _) + _ + -> sY_0123456789876543210) + sX_0123456789876543210 = sComplex + sLz + = id + @(Sing (Case_0123456789876543210 X_0123456789876543210Sym0)) + (case sX_0123456789876543210 of + SPair _ (sY_0123456789876543210 :: Sing y_0123456789876543210) + -> sY_0123456789876543210) + sSz + = id + @(Sing (Case_0123456789876543210 X_0123456789876543210Sym0)) + (case sX_0123456789876543210 of + SPair (sY_0123456789876543210 :: Sing y_0123456789876543210) _ + -> sY_0123456789876543210) + sX_0123456789876543210 = sPr + instance SingI (SillySym0 :: (~>) a ()) where + sing = singFun1 @SillySym0 sSilly + instance SingI (Foo2Sym0 :: (~>) (a, b) a) where + sing = singFun1 @Foo2Sym0 sFoo2 + instance SingI (Foo1Sym0 :: (~>) (a, b) a) where + sing = singFun1 @Foo1Sym0 sFoo1
tests/compile-and-dump/Singletons/PatternMatching.hs view
@@ -1,51 +1,51 @@-{-# OPTIONS_GHC -Wno-unused-matches #-}-{-# OPTIONS_GHC -Wno-incomplete-patterns #-}--module Singletons.PatternMatching where--import Data.Singletons.TH-import Prelude.Singletons-import Singletons.Nat-import Text.Show.Singletons--$(singletons [d|- data Pair a b = Pair a b deriving Show- pr = Pair (Succ Zero) ([Zero])- complex = Pair (Pair (Just Zero) Zero) False- tuple = (False, Just Zero, True)- aList = [Zero, Succ Zero, Succ (Succ Zero)]- |])--$(singletons [d|- Pair sz lz = pr- Pair (Pair jz zz) fls = complex- (tf, tjz, tt) = tuple- [_, lsz, (Succ blimy)] = aList- lsz :: Nat- fls :: Bool-- foo1 :: (a, b) -> a- foo1 (x, y) = (\_ -> x) y-- foo2 :: (# a, b #) -> a- foo2 t@(# x, y #) = case t of- (# a, b #) -> (\_ -> a) b-- silly :: a -> ()- silly x = case x of _ -> ()- |])--test1 :: Proxy (Foo1 '(Int, Char)) -> Proxy Int-test1 = id--test2 :: Proxy (Foo2 '(Int, Char)) -> Proxy Int-test2 = id--test3 :: Proxy Lsz -> Proxy (Succ Zero)-test3 = id--test4 :: Proxy Blimy -> Proxy (Succ Zero)-test4 = id--test5 :: Proxy Fls -> Proxy False-test5 = id+{-# OPTIONS_GHC -Wno-unused-matches #-} +{-# OPTIONS_GHC -Wno-incomplete-patterns #-} + +module Singletons.PatternMatching where + +import Data.Singletons.TH +import Prelude.Singletons +import Singletons.Nat +import Text.Show.Singletons + +$(singletons [d| + data Pair a b = Pair a b deriving Show + pr = Pair (Succ Zero) ([Zero]) + complex = Pair (Pair (Just Zero) Zero) False + tuple = (False, Just Zero, True) + aList = [Zero, Succ Zero, Succ (Succ Zero)] + |]) + +$(singletons [d| + Pair sz lz = pr + Pair (Pair jz zz) fls = complex + (tf, tjz, tt) = tuple + [_, lsz, (Succ blimy)] = aList + lsz :: Nat + fls :: Bool + + foo1 :: (a, b) -> a + foo1 (x, y) = (\_ -> x) y + + foo2 :: (# a, b #) -> a + foo2 t@(# x, y #) = case t of + (# a, b #) -> (\_ -> a) b + + silly :: a -> () + silly x = case x of _ -> () + |]) + +test1 :: Proxy (Foo1 '(Int, Char)) -> Proxy Int +test1 = id + +test2 :: Proxy (Foo2 '(Int, Char)) -> Proxy Int +test2 = id + +test3 :: Proxy Lsz -> Proxy (Succ Zero) +test3 = id + +test4 :: Proxy Blimy -> Proxy (Succ Zero) +test4 = id + +test5 :: Proxy Fls -> Proxy False +test5 = id
tests/compile-and-dump/Singletons/PolyKinds.golden view
@@ -1,27 +1,27 @@-Singletons/PolyKinds.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| class Cls (a :: k) where- fff :: Proxy (a :: k) -> () |]- ======>- class Cls (a :: k) where- fff :: Proxy (a :: k) -> ()- type FffSym0 :: forall k (a :: k). (~>) (Proxy (a :: k)) ()- data FffSym0 :: (~>) (Proxy (a :: k)) ()- where- FffSym0KindInference :: SameKind (Apply FffSym0 arg) (FffSym1 arg) =>- FffSym0 a0123456789876543210- type instance Apply FffSym0 a0123456789876543210 = Fff a0123456789876543210- instance SuppressUnusedWarnings FffSym0 where- suppressUnusedWarnings = snd (((,) FffSym0KindInference) ())- type FffSym1 :: forall k (a :: k). Proxy (a :: k) -> ()- type family FffSym1 (a0123456789876543210 :: Proxy (a :: k)) :: () where- FffSym1 a0123456789876543210 = Fff a0123456789876543210- class PCls (a :: k) where- type family Fff (arg :: Proxy (a :: k)) :: ()- class SCls (a :: k) where- sFff ::- forall (t :: Proxy (a :: k)). Sing t- -> Sing (Apply FffSym0 t :: ())- instance SCls a =>- SingI (FffSym0 :: (~>) (Proxy (a :: k)) ()) where- sing = (singFun1 @FffSym0) sFff+Singletons/PolyKinds.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| class Cls (a :: k) where + fff :: Proxy (a :: k) -> () |] + ======> + class Cls (a :: k) where + fff :: Proxy (a :: k) -> () + type FffSym0 :: forall k (a :: k). (~>) (Proxy (a :: k)) () + data FffSym0 :: (~>) (Proxy (a :: k)) () + where + FffSym0KindInference :: SameKind (Apply FffSym0 arg) (FffSym1 arg) => + FffSym0 a0123456789876543210 + type instance Apply FffSym0 a0123456789876543210 = Fff a0123456789876543210 + instance SuppressUnusedWarnings FffSym0 where + suppressUnusedWarnings = snd ((,) FffSym0KindInference ()) + type FffSym1 :: forall k (a :: k). Proxy (a :: k) -> () + type family FffSym1 (a0123456789876543210 :: Proxy (a :: k)) :: () where + FffSym1 a0123456789876543210 = Fff a0123456789876543210 + class PCls (a :: k) where + type family Fff (arg :: Proxy (a :: k)) :: () + class SCls (a :: k) where + sFff :: + (forall (t :: Proxy (a :: k)). + Sing t -> Sing (Apply FffSym0 t :: ()) :: Type) + instance SCls a => + SingI (FffSym0 :: (~>) (Proxy (a :: k)) ()) where + sing = singFun1 @FffSym0 sFff
tests/compile-and-dump/Singletons/PolyKinds.hs view
@@ -1,8 +1,8 @@-module Singletons.PolyKinds where--import Data.Singletons.TH--$(singletons [d|- class Cls (a :: k) where- fff :: Proxy (a :: k) -> ()- |])+module Singletons.PolyKinds where + +import Data.Singletons.TH + +$(singletons [d| + class Cls (a :: k) where + fff :: Proxy (a :: k) -> () + |])
tests/compile-and-dump/Singletons/PolyKindsApp.golden view
@@ -1,16 +1,15 @@-Singletons/PolyKindsApp.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| class Cls (a :: k -> Type) where- fff :: (a :: k -> Type) (b :: k) |]- ======>- class Cls (a :: k -> Type) where- fff :: (a :: k -> Type) (b :: k)- type FffSym0 :: forall k (a :: k -> Type) (b :: k). (a :: k- -> Type) (b :: k)- type family FffSym0 :: (a :: k -> Type) (b :: k) where- FffSym0 = Fff- class PCls (a :: k -> Type) where- type family Fff :: (a :: k -> Type) (b :: k)- class SCls (a :: k -> Type) where- sFff ::- forall (b :: k). Sing (FffSym0 :: (a :: k -> Type) (b :: k))+Singletons/PolyKindsApp.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| class Cls (a :: k -> Type) where + fff :: (a :: k -> Type) (b :: k) |] + ======> + class Cls (a :: k -> Type) where + fff :: (a :: k -> Type) (b :: k) + type FffSym0 :: forall k (a :: k -> Type) (b :: k). (a :: k + -> Type) (b :: k) + type family FffSym0 :: (a :: k -> Type) (b :: k) where + FffSym0 = Fff + class PCls (a :: k -> Type) where + type family Fff :: (a :: k -> Type) (b :: k) + class SCls (a :: k -> Type) where + sFff :: (Sing (FffSym0 :: (a :: k -> Type) (b :: k)) :: Type)
tests/compile-and-dump/Singletons/PolyKindsApp.hs view
@@ -1,12 +1,12 @@-module Singletons.PolyKindsApp where--import Data.Kind (Type)-import Data.Singletons.TH--$(singletons [d|- class Cls (a :: k -> Type) where- fff :: (a :: k -> Type) (b :: k)-- -- instance Cls Proxy where- -- fff = Proxy- |])+module Singletons.PolyKindsApp where + +import Data.Kind (Type) +import Data.Singletons.TH + +$(singletons [d| + class Cls (a :: k -> Type) where + fff :: (a :: k -> Type) (b :: k) + + -- instance Cls Proxy where + -- fff = Proxy + |])
tests/compile-and-dump/Singletons/Records.golden view
@@ -1,91 +1,89 @@-Singletons/Records.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| data Record a = MkRecord {field1 :: a, field2 :: Bool} |]- ======>- data Record a = MkRecord {field1 :: a, field2 :: Bool}- type MkRecordSym0 :: forall a. (~>) a ((~>) Bool (Record a))- data MkRecordSym0 :: (~>) a ((~>) Bool (Record a))- where- MkRecordSym0KindInference :: SameKind (Apply MkRecordSym0 arg) (MkRecordSym1 arg) =>- MkRecordSym0 a0123456789876543210- type instance Apply MkRecordSym0 a0123456789876543210 = MkRecordSym1 a0123456789876543210- instance SuppressUnusedWarnings MkRecordSym0 where- suppressUnusedWarnings = snd (((,) MkRecordSym0KindInference) ())- type MkRecordSym1 :: forall a. a -> (~>) Bool (Record a)- data MkRecordSym1 (a0123456789876543210 :: a) :: (~>) Bool (Record a)- where- MkRecordSym1KindInference :: SameKind (Apply (MkRecordSym1 a0123456789876543210) arg) (MkRecordSym2 a0123456789876543210 arg) =>- MkRecordSym1 a0123456789876543210 a0123456789876543210- type instance Apply (MkRecordSym1 a0123456789876543210) a0123456789876543210 = MkRecord a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (MkRecordSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) MkRecordSym1KindInference) ())- type MkRecordSym2 :: forall a. a -> Bool -> Record a- type family MkRecordSym2 (a0123456789876543210 :: a) (a0123456789876543210 :: Bool) :: Record a where- MkRecordSym2 a0123456789876543210 a0123456789876543210 = MkRecord a0123456789876543210 a0123456789876543210- type Field2Sym0 :: forall a. (~>) (Record a) Bool- data Field2Sym0 :: (~>) (Record a) Bool- where- Field2Sym0KindInference :: SameKind (Apply Field2Sym0 arg) (Field2Sym1 arg) =>- Field2Sym0 a0123456789876543210- type instance Apply Field2Sym0 a0123456789876543210 = Field2 a0123456789876543210- instance SuppressUnusedWarnings Field2Sym0 where- suppressUnusedWarnings = snd (((,) Field2Sym0KindInference) ())- type Field2Sym1 :: forall a. Record a -> Bool- type family Field2Sym1 (a0123456789876543210 :: Record a) :: Bool where- Field2Sym1 a0123456789876543210 = Field2 a0123456789876543210- type Field1Sym0 :: forall a. (~>) (Record a) a- data Field1Sym0 :: (~>) (Record a) a- where- Field1Sym0KindInference :: SameKind (Apply Field1Sym0 arg) (Field1Sym1 arg) =>- Field1Sym0 a0123456789876543210- type instance Apply Field1Sym0 a0123456789876543210 = Field1 a0123456789876543210- instance SuppressUnusedWarnings Field1Sym0 where- suppressUnusedWarnings = snd (((,) Field1Sym0KindInference) ())- type Field1Sym1 :: forall a. Record a -> a- type family Field1Sym1 (a0123456789876543210 :: Record a) :: a where- Field1Sym1 a0123456789876543210 = Field1 a0123456789876543210- type Field2 :: forall a. Record a -> Bool- type family Field2 (a :: Record a) :: Bool where- Field2 (MkRecord _ field) = field- type Field1 :: forall a. Record a -> a- type family Field1 (a :: Record a) :: a where- Field1 (MkRecord field _) = field- sField2 ::- forall a (t :: Record a). Sing t- -> Sing (Apply Field2Sym0 t :: Bool)- sField1 ::- forall a (t :: Record a). Sing t -> Sing (Apply Field1Sym0 t :: a)- sField2 (SMkRecord _ (sField :: Sing field)) = sField- sField1 (SMkRecord (sField :: Sing field) _) = sField- instance SingI (Field2Sym0 :: (~>) (Record a) Bool) where- sing = (singFun1 @Field2Sym0) sField2- instance SingI (Field1Sym0 :: (~>) (Record a) a) where- sing = (singFun1 @Field1Sym0) sField1- data SRecord :: forall a. Record a -> Type- where- SMkRecord :: forall a (n :: a) (n :: Bool).- (Sing n) -> (Sing n) -> SRecord (MkRecord n n :: Record a)- type instance Sing @(Record a) = SRecord- instance SingKind a => SingKind (Record a) where- type Demote (Record a) = Record (Demote a)- fromSing (SMkRecord b b) = (MkRecord (fromSing b)) (fromSing b)- toSing (MkRecord (b :: Demote a) (b :: Demote Bool))- = case- ((,) (toSing b :: SomeSing a)) (toSing b :: SomeSing Bool)- of- (,) (SomeSing c) (SomeSing c) -> SomeSing ((SMkRecord c) c)- instance (SingI n, SingI n) =>- SingI (MkRecord (n :: a) (n :: Bool)) where- sing = (SMkRecord sing) sing- instance SingI n => SingI1 (MkRecord (n :: a)) where- liftSing = SMkRecord sing- instance SingI2 MkRecord where- liftSing2 = SMkRecord- instance SingI (MkRecordSym0 :: (~>) a ((~>) Bool (Record a))) where- sing = (singFun2 @MkRecordSym0) SMkRecord- instance SingI d =>- SingI (MkRecordSym1 (d :: a) :: (~>) Bool (Record a)) where- sing = (singFun1 @(MkRecordSym1 (d :: a))) (SMkRecord (sing @d))- instance SingI1 (MkRecordSym1 :: a -> (~>) Bool (Record a)) where- liftSing (s :: Sing (d :: a))- = (singFun1 @(MkRecordSym1 (d :: a))) (SMkRecord s)+Singletons/Records.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| data Record a = MkRecord {field1 :: a, field2 :: Bool} |] + ======> + data Record a = MkRecord {field1 :: a, field2 :: Bool} + type MkRecordSym0 :: forall a. (~>) a ((~>) Bool (Record a)) + data MkRecordSym0 :: (~>) a ((~>) Bool (Record a)) + where + MkRecordSym0KindInference :: SameKind (Apply MkRecordSym0 arg) (MkRecordSym1 arg) => + MkRecordSym0 a0123456789876543210 + type instance Apply MkRecordSym0 a0123456789876543210 = MkRecordSym1 a0123456789876543210 + instance SuppressUnusedWarnings MkRecordSym0 where + suppressUnusedWarnings = snd ((,) MkRecordSym0KindInference ()) + type MkRecordSym1 :: forall a. a -> (~>) Bool (Record a) + data MkRecordSym1 (a0123456789876543210 :: a) :: (~>) Bool (Record a) + where + MkRecordSym1KindInference :: SameKind (Apply (MkRecordSym1 a0123456789876543210) arg) (MkRecordSym2 a0123456789876543210 arg) => + MkRecordSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (MkRecordSym1 a0123456789876543210) a0123456789876543210 = MkRecord a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (MkRecordSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) MkRecordSym1KindInference ()) + type MkRecordSym2 :: forall a. a -> Bool -> Record a + type family MkRecordSym2 (a0123456789876543210 :: a) (a0123456789876543210 :: Bool) :: Record a where + MkRecordSym2 a0123456789876543210 a0123456789876543210 = MkRecord a0123456789876543210 a0123456789876543210 + type Field2Sym0 :: forall a. (~>) (Record a) Bool + data Field2Sym0 :: (~>) (Record a) Bool + where + Field2Sym0KindInference :: SameKind (Apply Field2Sym0 arg) (Field2Sym1 arg) => + Field2Sym0 a0123456789876543210 + type instance Apply Field2Sym0 a0123456789876543210 = Field2 a0123456789876543210 + instance SuppressUnusedWarnings Field2Sym0 where + suppressUnusedWarnings = snd ((,) Field2Sym0KindInference ()) + type Field2Sym1 :: forall a. Record a -> Bool + type family Field2Sym1 (a0123456789876543210 :: Record a) :: Bool where + Field2Sym1 a0123456789876543210 = Field2 a0123456789876543210 + type Field1Sym0 :: forall a. (~>) (Record a) a + data Field1Sym0 :: (~>) (Record a) a + where + Field1Sym0KindInference :: SameKind (Apply Field1Sym0 arg) (Field1Sym1 arg) => + Field1Sym0 a0123456789876543210 + type instance Apply Field1Sym0 a0123456789876543210 = Field1 a0123456789876543210 + instance SuppressUnusedWarnings Field1Sym0 where + suppressUnusedWarnings = snd ((,) Field1Sym0KindInference ()) + type Field1Sym1 :: forall a. Record a -> a + type family Field1Sym1 (a0123456789876543210 :: Record a) :: a where + Field1Sym1 a0123456789876543210 = Field1 a0123456789876543210 + type Field2 :: forall a. Record a -> Bool + type family Field2 (a :: Record a) :: Bool where + Field2 (MkRecord _ field) = field + type Field1 :: forall a. Record a -> a + type family Field1 (a :: Record a) :: a where + Field1 (MkRecord field _) = field + sField2 :: + forall a (t :: Record a). Sing t + -> Sing (Apply Field2Sym0 t :: Bool) + sField1 :: + forall a (t :: Record a). Sing t -> Sing (Apply Field1Sym0 t :: a) + sField2 (SMkRecord _ (sField :: Sing field)) = sField + sField1 (SMkRecord (sField :: Sing field) _) = sField + instance SingI (Field2Sym0 :: (~>) (Record a) Bool) where + sing = singFun1 @Field2Sym0 sField2 + instance SingI (Field1Sym0 :: (~>) (Record a) a) where + sing = singFun1 @Field1Sym0 sField1 + data SRecord :: forall a. Record a -> Type + where + SMkRecord :: forall a (n :: a) (n :: Bool). + (Sing n) -> (Sing n) -> SRecord (MkRecord n n :: Record a) + type instance Sing @(Record a) = SRecord + instance SingKind a => SingKind (Record a) where + type Demote (Record a) = Record (Demote a) + fromSing (SMkRecord b b) = MkRecord (fromSing b) (fromSing b) + toSing (MkRecord (b :: Demote a) (b :: Demote Bool)) + = case (,) (toSing b :: SomeSing a) (toSing b :: SomeSing Bool) of + (,) (SomeSing c) (SomeSing c) -> SomeSing (SMkRecord c c) + instance (SingI n, SingI n) => + SingI (MkRecord (n :: a) (n :: Bool)) where + sing = SMkRecord sing sing + instance SingI n => SingI1 (MkRecord (n :: a)) where + liftSing = SMkRecord sing + instance SingI2 MkRecord where + liftSing2 = SMkRecord + instance SingI (MkRecordSym0 :: (~>) a ((~>) Bool (Record a))) where + sing = singFun2 @MkRecordSym0 SMkRecord + instance SingI d => + SingI (MkRecordSym1 (d :: a) :: (~>) Bool (Record a)) where + sing = singFun1 @(MkRecordSym1 (d :: a)) (SMkRecord (sing @d)) + instance SingI1 (MkRecordSym1 :: a -> (~>) Bool (Record a)) where + liftSing (s :: Sing (d :: a)) + = singFun1 @(MkRecordSym1 (d :: a)) (SMkRecord s)
tests/compile-and-dump/Singletons/Records.hs view
@@ -1,28 +1,28 @@-module Singletons.Records where--import Data.Singletons.TH-import Prelude.Singletons--$(singletons [d|- data Record a = MkRecord { field1 :: a- , field2 :: Bool }-- |])---- This fails - see #66--- $(singletons [d|--- neg :: Record a -> Record a--- neg rec@(MkRecord { field1 = _, field2 = b } ) = rec {field2 = not b}--- |])--foo1a :: Proxy (Field2 (MkRecord 5 True))-foo1a = Proxy--foo1b :: Proxy True-foo1b = foo1a--foo2a :: Proxy (Field1 (MkRecord 5 True))-foo2a = Proxy--foo2b :: Proxy 5-foo2b = foo2a+module Singletons.Records where + +import Data.Singletons.TH +import Prelude.Singletons + +$(singletons [d| + data Record a = MkRecord { field1 :: a + , field2 :: Bool } + + |]) + +-- This fails - see #66 +-- $(singletons [d| +-- neg :: Record a -> Record a +-- neg rec@(MkRecord { field1 = _, field2 = b } ) = rec {field2 = not b} +-- |]) + +foo1a :: Proxy (Field2 (MkRecord 5 True)) +foo1a = Proxy + +foo1b :: Proxy True +foo1b = foo1a + +foo2a :: Proxy (Field1 (MkRecord 5 True)) +foo2a = Proxy + +foo2b :: Proxy 5 +foo2b = foo2a
tests/compile-and-dump/Singletons/ReturnFunc.golden view
@@ -1,105 +1,109 @@-Singletons/ReturnFunc.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| returnFunc :: Nat -> Nat -> Nat- returnFunc _ = Succ- id :: a -> a- id x = x- idFoo :: c -> a -> a- idFoo _ = id |]- ======>- returnFunc :: Nat -> Nat -> Nat- returnFunc _ = Succ- id :: a -> a- id x = x- idFoo :: c -> a -> a- idFoo _ = id- type IdFooSym0 :: (~>) c ((~>) a a)- data IdFooSym0 :: (~>) c ((~>) a a)- where- IdFooSym0KindInference :: SameKind (Apply IdFooSym0 arg) (IdFooSym1 arg) =>- IdFooSym0 a0123456789876543210- type instance Apply IdFooSym0 a0123456789876543210 = IdFooSym1 a0123456789876543210- instance SuppressUnusedWarnings IdFooSym0 where- suppressUnusedWarnings = snd (((,) IdFooSym0KindInference) ())- type IdFooSym1 :: c -> (~>) a a- data IdFooSym1 (a0123456789876543210 :: c) :: (~>) a a- where- IdFooSym1KindInference :: SameKind (Apply (IdFooSym1 a0123456789876543210) arg) (IdFooSym2 a0123456789876543210 arg) =>- IdFooSym1 a0123456789876543210 a0123456789876543210- type instance Apply (IdFooSym1 a0123456789876543210) a0123456789876543210 = IdFoo a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (IdFooSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) IdFooSym1KindInference) ())- type IdFooSym2 :: c -> a -> a- type family IdFooSym2 (a0123456789876543210 :: c) (a0123456789876543210 :: a) :: a where- IdFooSym2 a0123456789876543210 a0123456789876543210 = IdFoo a0123456789876543210 a0123456789876543210- type IdSym0 :: (~>) a a- data IdSym0 :: (~>) a a- where- IdSym0KindInference :: SameKind (Apply IdSym0 arg) (IdSym1 arg) =>- IdSym0 a0123456789876543210- type instance Apply IdSym0 a0123456789876543210 = Id a0123456789876543210- instance SuppressUnusedWarnings IdSym0 where- suppressUnusedWarnings = snd (((,) IdSym0KindInference) ())- type IdSym1 :: a -> a- type family IdSym1 (a0123456789876543210 :: a) :: a where- IdSym1 a0123456789876543210 = Id a0123456789876543210- type ReturnFuncSym0 :: (~>) Nat ((~>) Nat Nat)- data ReturnFuncSym0 :: (~>) Nat ((~>) Nat Nat)- where- ReturnFuncSym0KindInference :: SameKind (Apply ReturnFuncSym0 arg) (ReturnFuncSym1 arg) =>- ReturnFuncSym0 a0123456789876543210- type instance Apply ReturnFuncSym0 a0123456789876543210 = ReturnFuncSym1 a0123456789876543210- instance SuppressUnusedWarnings ReturnFuncSym0 where- suppressUnusedWarnings = snd (((,) ReturnFuncSym0KindInference) ())- type ReturnFuncSym1 :: Nat -> (~>) Nat Nat- data ReturnFuncSym1 (a0123456789876543210 :: Nat) :: (~>) Nat Nat- where- ReturnFuncSym1KindInference :: SameKind (Apply (ReturnFuncSym1 a0123456789876543210) arg) (ReturnFuncSym2 a0123456789876543210 arg) =>- ReturnFuncSym1 a0123456789876543210 a0123456789876543210- type instance Apply (ReturnFuncSym1 a0123456789876543210) a0123456789876543210 = ReturnFunc a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ReturnFuncSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) ReturnFuncSym1KindInference) ())- type ReturnFuncSym2 :: Nat -> Nat -> Nat- type family ReturnFuncSym2 (a0123456789876543210 :: Nat) (a0123456789876543210 :: Nat) :: Nat where- ReturnFuncSym2 a0123456789876543210 a0123456789876543210 = ReturnFunc a0123456789876543210 a0123456789876543210- type IdFoo :: c -> a -> a- type family IdFoo (a :: c) (a :: a) :: a where- IdFoo _ a_0123456789876543210 = Apply IdSym0 a_0123456789876543210- type Id :: a -> a- type family Id (a :: a) :: a where- Id x = x- type ReturnFunc :: Nat -> Nat -> Nat- type family ReturnFunc (a :: Nat) (a :: Nat) :: Nat where- ReturnFunc _ a_0123456789876543210 = Apply SuccSym0 a_0123456789876543210- sIdFoo ::- forall c a (t :: c) (t :: a). Sing t- -> Sing t -> Sing (Apply (Apply IdFooSym0 t) t :: a)- sId :: forall a (t :: a). Sing t -> Sing (Apply IdSym0 t :: a)- sReturnFunc ::- forall (t :: Nat) (t :: Nat). Sing t- -> Sing t -> Sing (Apply (Apply ReturnFuncSym0 t) t :: Nat)- sIdFoo _ (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing ((singFun1 @IdSym0) sId)) sA_0123456789876543210- sId (sX :: Sing x) = sX- sReturnFunc- _- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing ((singFun1 @SuccSym0) SSucc)) sA_0123456789876543210- instance SingI (IdFooSym0 :: (~>) c ((~>) a a)) where- sing = (singFun2 @IdFooSym0) sIdFoo- instance SingI d => SingI (IdFooSym1 (d :: c) :: (~>) a a) where- sing = (singFun1 @(IdFooSym1 (d :: c))) (sIdFoo (sing @d))- instance SingI1 (IdFooSym1 :: c -> (~>) a a) where- liftSing (s :: Sing (d :: c))- = (singFun1 @(IdFooSym1 (d :: c))) (sIdFoo s)- instance SingI (IdSym0 :: (~>) a a) where- sing = (singFun1 @IdSym0) sId- instance SingI (ReturnFuncSym0 :: (~>) Nat ((~>) Nat Nat)) where- sing = (singFun2 @ReturnFuncSym0) sReturnFunc- instance SingI d =>- SingI (ReturnFuncSym1 (d :: Nat) :: (~>) Nat Nat) where- sing- = (singFun1 @(ReturnFuncSym1 (d :: Nat))) (sReturnFunc (sing @d))- instance SingI1 (ReturnFuncSym1 :: Nat -> (~>) Nat Nat) where- liftSing (s :: Sing (d :: Nat))- = (singFun1 @(ReturnFuncSym1 (d :: Nat))) (sReturnFunc s)+Singletons/ReturnFunc.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| returnFunc :: Nat -> Nat -> Nat + returnFunc _ = Succ + id :: a -> a + id x = x + idFoo :: c -> a -> a + idFoo _ = id |] + ======> + returnFunc :: Nat -> Nat -> Nat + returnFunc _ = Succ + id :: a -> a + id x = x + idFoo :: c -> a -> a + idFoo _ = id + type IdFooSym0 :: (~>) c ((~>) a a) + data IdFooSym0 :: (~>) c ((~>) a a) + where + IdFooSym0KindInference :: SameKind (Apply IdFooSym0 arg) (IdFooSym1 arg) => + IdFooSym0 a0123456789876543210 + type instance Apply IdFooSym0 a0123456789876543210 = IdFooSym1 a0123456789876543210 + instance SuppressUnusedWarnings IdFooSym0 where + suppressUnusedWarnings = snd ((,) IdFooSym0KindInference ()) + type IdFooSym1 :: c -> (~>) a a + data IdFooSym1 (a0123456789876543210 :: c) :: (~>) a a + where + IdFooSym1KindInference :: SameKind (Apply (IdFooSym1 a0123456789876543210) arg) (IdFooSym2 a0123456789876543210 arg) => + IdFooSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (IdFooSym1 a0123456789876543210) a0123456789876543210 = IdFoo a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (IdFooSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) IdFooSym1KindInference ()) + type IdFooSym2 :: c -> a -> a + type family IdFooSym2 (a0123456789876543210 :: c) (a0123456789876543210 :: a) :: a where + IdFooSym2 a0123456789876543210 a0123456789876543210 = IdFoo a0123456789876543210 a0123456789876543210 + type IdSym0 :: (~>) a a + data IdSym0 :: (~>) a a + where + IdSym0KindInference :: SameKind (Apply IdSym0 arg) (IdSym1 arg) => + IdSym0 a0123456789876543210 + type instance Apply IdSym0 a0123456789876543210 = Id a0123456789876543210 + instance SuppressUnusedWarnings IdSym0 where + suppressUnusedWarnings = snd ((,) IdSym0KindInference ()) + type IdSym1 :: a -> a + type family IdSym1 (a0123456789876543210 :: a) :: a where + IdSym1 a0123456789876543210 = Id a0123456789876543210 + type ReturnFuncSym0 :: (~>) Nat ((~>) Nat Nat) + data ReturnFuncSym0 :: (~>) Nat ((~>) Nat Nat) + where + ReturnFuncSym0KindInference :: SameKind (Apply ReturnFuncSym0 arg) (ReturnFuncSym1 arg) => + ReturnFuncSym0 a0123456789876543210 + type instance Apply ReturnFuncSym0 a0123456789876543210 = ReturnFuncSym1 a0123456789876543210 + instance SuppressUnusedWarnings ReturnFuncSym0 where + suppressUnusedWarnings = snd ((,) ReturnFuncSym0KindInference ()) + type ReturnFuncSym1 :: Nat -> (~>) Nat Nat + data ReturnFuncSym1 (a0123456789876543210 :: Nat) :: (~>) Nat Nat + where + ReturnFuncSym1KindInference :: SameKind (Apply (ReturnFuncSym1 a0123456789876543210) arg) (ReturnFuncSym2 a0123456789876543210 arg) => + ReturnFuncSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (ReturnFuncSym1 a0123456789876543210) a0123456789876543210 = ReturnFunc a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ReturnFuncSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) ReturnFuncSym1KindInference ()) + type ReturnFuncSym2 :: Nat -> Nat -> Nat + type family ReturnFuncSym2 (a0123456789876543210 :: Nat) (a0123456789876543210 :: Nat) :: Nat where + ReturnFuncSym2 a0123456789876543210 a0123456789876543210 = ReturnFunc a0123456789876543210 a0123456789876543210 + type IdFoo :: c -> a -> a + type family IdFoo (a :: c) (a :: a) :: a where + IdFoo _ a_0123456789876543210 = Apply IdSym0 a_0123456789876543210 + type Id :: a -> a + type family Id (a :: a) :: a where + Id x = x + type ReturnFunc :: Nat -> Nat -> Nat + type family ReturnFunc (a :: Nat) (a :: Nat) :: Nat where + ReturnFunc _ a_0123456789876543210 = Apply SuccSym0 a_0123456789876543210 + sIdFoo :: + (forall (t :: c) (t :: a). + Sing t + -> Sing t -> Sing (Apply (Apply IdFooSym0 t) t :: a) :: Type) + sId :: + (forall (t :: a). Sing t -> Sing (Apply IdSym0 t :: a) :: Type) + sReturnFunc :: + (forall (t :: Nat) (t :: Nat). + Sing t + -> Sing t + -> Sing (Apply (Apply ReturnFuncSym0 t) t :: Nat) :: Type) + sIdFoo _ (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing (singFun1 @IdSym0 sId) sA_0123456789876543210 + sId (sX :: Sing x) = sX + sReturnFunc + _ + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing (singFun1 @SuccSym0 SSucc) sA_0123456789876543210 + instance SingI (IdFooSym0 :: (~>) c ((~>) a a)) where + sing = singFun2 @IdFooSym0 sIdFoo + instance SingI d => SingI (IdFooSym1 (d :: c) :: (~>) a a) where + sing = singFun1 @(IdFooSym1 (d :: c)) (sIdFoo (sing @d)) + instance SingI1 (IdFooSym1 :: c -> (~>) a a) where + liftSing (s :: Sing (d :: c)) + = singFun1 @(IdFooSym1 (d :: c)) (sIdFoo s) + instance SingI (IdSym0 :: (~>) a a) where + sing = singFun1 @IdSym0 sId + instance SingI (ReturnFuncSym0 :: (~>) Nat ((~>) Nat Nat)) where + sing = singFun2 @ReturnFuncSym0 sReturnFunc + instance SingI d => + SingI (ReturnFuncSym1 (d :: Nat) :: (~>) Nat Nat) where + sing + = singFun1 @(ReturnFuncSym1 (d :: Nat)) (sReturnFunc (sing @d)) + instance SingI1 (ReturnFuncSym1 :: Nat -> (~>) Nat Nat) where + liftSing (s :: Sing (d :: Nat)) + = singFun1 @(ReturnFuncSym1 (d :: Nat)) (sReturnFunc s)
tests/compile-and-dump/Singletons/ReturnFunc.hs view
@@ -1,22 +1,22 @@-module Singletons.ReturnFunc where--import Data.Singletons-import Data.Singletons.TH-import Singletons.Nat---- tests the "num args" feature of promoteDec. The idea is that when clauses of--- a function have less patterns than required by the type signature the--- promoted type family should have this fact reflected in its return kind,--- which should be turned into a series of nested TyFuns (type level functions)--$(singletons [d|- returnFunc :: Nat -> Nat -> Nat- returnFunc _ = Succ-- -- promotion of two functions below also depends on "num args"- id :: a -> a- id x = x-- idFoo :: c -> a -> a- idFoo _ = id- |])+module Singletons.ReturnFunc where + +import Data.Singletons +import Data.Singletons.TH +import Singletons.Nat + +-- tests the "num args" feature of promoteDec. The idea is that when clauses of +-- a function have less patterns than required by the type signature the +-- promoted type family should have this fact reflected in its return kind, +-- which should be turned into a series of nested TyFuns (type level functions) + +$(singletons [d| + returnFunc :: Nat -> Nat -> Nat + returnFunc _ = Succ + + -- promotion of two functions below also depends on "num args" + id :: a -> a + id x = x + + idFoo :: c -> a -> a + idFoo _ = id + |])
tests/compile-and-dump/Singletons/Sections.golden view
@@ -1,134 +1,148 @@-Singletons/Sections.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| (+) :: Nat -> Nat -> Nat- Zero + m = m- (Succ n) + m = Succ (n + m)- foo1 :: [Nat]- foo1 = map ((Succ Zero) +) [Zero, Succ Zero]- foo2 :: [Nat]- foo2 = map (+ (Succ Zero)) [Zero, Succ Zero]- foo3 :: [Nat]- foo3 = zipWith (+) [Succ Zero, Succ Zero] [Zero, Succ Zero] |]- ======>- (+) :: Nat -> Nat -> Nat- (+) Zero m = m- (+) (Succ n) m = Succ (n + m)- foo1 :: [Nat]- foo1 = (map (Succ Zero +)) [Zero, Succ Zero]- foo2 :: [Nat]- foo2 = (map (+ Succ Zero)) [Zero, Succ Zero]- foo3 :: [Nat]- foo3 = ((zipWith (+)) [Succ Zero, Succ Zero]) [Zero, Succ Zero]- type family Lambda_0123456789876543210 lhs_0123456789876543210 where- Lambda_0123456789876543210 lhs_0123456789876543210 = Apply (Apply (+@#@$) lhs_0123456789876543210) (Apply SuccSym0 ZeroSym0)- data Lambda_0123456789876543210Sym0 lhs_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) =>- Lambda_0123456789876543210Sym0 lhs_01234567898765432100123456789876543210- type instance Apply Lambda_0123456789876543210Sym0 lhs_01234567898765432100123456789876543210 = Lambda_0123456789876543210 lhs_01234567898765432100123456789876543210- instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym0KindInference) ())- type family Lambda_0123456789876543210Sym1 lhs_01234567898765432100123456789876543210 where- Lambda_0123456789876543210Sym1 lhs_01234567898765432100123456789876543210 = Lambda_0123456789876543210 lhs_01234567898765432100123456789876543210- type Foo3Sym0 :: [Nat]- type family Foo3Sym0 :: [Nat] where- Foo3Sym0 = Foo3- type Foo2Sym0 :: [Nat]- type family Foo2Sym0 :: [Nat] where- Foo2Sym0 = Foo2- type Foo1Sym0 :: [Nat]- type family Foo1Sym0 :: [Nat] where- Foo1Sym0 = Foo1- type (+@#@$) :: (~>) Nat ((~>) Nat Nat)- data (+@#@$) :: (~>) Nat ((~>) Nat Nat)- where- (:+@#@$###) :: SameKind (Apply (+@#@$) arg) ((+@#@$$) arg) =>- (+@#@$) a0123456789876543210- type instance Apply (+@#@$) a0123456789876543210 = (+@#@$$) a0123456789876543210- instance SuppressUnusedWarnings (+@#@$) where- suppressUnusedWarnings = snd (((,) (:+@#@$###)) ())- type (+@#@$$) :: Nat -> (~>) Nat Nat- data (+@#@$$) (a0123456789876543210 :: Nat) :: (~>) Nat Nat- where- (:+@#@$$###) :: SameKind (Apply ((+@#@$$) a0123456789876543210) arg) ((+@#@$$$) a0123456789876543210 arg) =>- (+@#@$$) a0123456789876543210 a0123456789876543210- type instance Apply ((+@#@$$) a0123456789876543210) a0123456789876543210 = (+) a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings ((+@#@$$) a0123456789876543210) where- suppressUnusedWarnings = snd (((,) (:+@#@$$###)) ())- type (+@#@$$$) :: Nat -> Nat -> Nat- type family (+@#@$$$) (a0123456789876543210 :: Nat) (a0123456789876543210 :: Nat) :: Nat where- (+@#@$$$) a0123456789876543210 a0123456789876543210 = (+) a0123456789876543210 a0123456789876543210- type Foo3 :: [Nat]- type family Foo3 :: [Nat] where- Foo3 = Apply (Apply (Apply ZipWithSym0 (+@#@$)) (Apply (Apply (:@#@$) (Apply SuccSym0 ZeroSym0)) (Apply (Apply (:@#@$) (Apply SuccSym0 ZeroSym0)) NilSym0))) (Apply (Apply (:@#@$) ZeroSym0) (Apply (Apply (:@#@$) (Apply SuccSym0 ZeroSym0)) NilSym0))- type Foo2 :: [Nat]- type family Foo2 :: [Nat] where- Foo2 = Apply (Apply MapSym0 Lambda_0123456789876543210Sym0) (Apply (Apply (:@#@$) ZeroSym0) (Apply (Apply (:@#@$) (Apply SuccSym0 ZeroSym0)) NilSym0))- type Foo1 :: [Nat]- type family Foo1 :: [Nat] where- Foo1 = Apply (Apply MapSym0 (Apply (+@#@$) (Apply SuccSym0 ZeroSym0))) (Apply (Apply (:@#@$) ZeroSym0) (Apply (Apply (:@#@$) (Apply SuccSym0 ZeroSym0)) NilSym0))- type (+) :: Nat -> Nat -> Nat- type family (+) (a :: Nat) (a :: Nat) :: Nat where- (+) 'Zero m = m- (+) ('Succ n) m = Apply SuccSym0 (Apply (Apply (+@#@$) n) m)- sFoo3 :: Sing (Foo3Sym0 :: [Nat])- sFoo2 :: Sing (Foo2Sym0 :: [Nat])- sFoo1 :: Sing (Foo1Sym0 :: [Nat])- (%+) ::- forall (t :: Nat) (t :: Nat). Sing t- -> Sing t -> Sing (Apply (Apply (+@#@$) t) t :: Nat)- sFoo3- = (applySing- ((applySing- ((applySing ((singFun3 @ZipWithSym0) sZipWith))- ((singFun2 @(+@#@$)) (%+))))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing ((singFun1 @SuccSym0) SSucc)) SZero)))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing ((singFun1 @SuccSym0) SSucc)) SZero)))- SNil))))- ((applySing ((applySing ((singFun2 @(:@#@$)) SCons)) SZero))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing ((singFun1 @SuccSym0) SSucc)) SZero)))- SNil))- sFoo2- = (applySing- ((applySing ((singFun2 @MapSym0) sMap))- ((singFun1 @Lambda_0123456789876543210Sym0)- (\ sLhs_0123456789876543210- -> case sLhs_0123456789876543210 of- (_ :: Sing lhs_0123456789876543210)- -> (applySing- ((applySing ((singFun2 @(+@#@$)) (%+))) sLhs_0123456789876543210))- ((applySing ((singFun1 @SuccSym0) SSucc)) SZero)))))- ((applySing ((applySing ((singFun2 @(:@#@$)) SCons)) SZero))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing ((singFun1 @SuccSym0) SSucc)) SZero)))- SNil))- sFoo1- = (applySing- ((applySing ((singFun2 @MapSym0) sMap))- ((applySing ((singFun2 @(+@#@$)) (%+)))- ((applySing ((singFun1 @SuccSym0) SSucc)) SZero))))- ((applySing ((applySing ((singFun2 @(:@#@$)) SCons)) SZero))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing ((singFun1 @SuccSym0) SSucc)) SZero)))- SNil))- (%+) SZero (sM :: Sing m) = sM- (%+) (SSucc (sN :: Sing n)) (sM :: Sing m)- = (applySing ((singFun1 @SuccSym0) SSucc))- ((applySing ((applySing ((singFun2 @(+@#@$)) (%+))) sN)) sM)- instance SingI ((+@#@$) :: (~>) Nat ((~>) Nat Nat)) where- sing = (singFun2 @(+@#@$)) (%+)- instance SingI d =>- SingI ((+@#@$$) (d :: Nat) :: (~>) Nat Nat) where- sing = (singFun1 @((+@#@$$) (d :: Nat))) ((%+) (sing @d))- instance SingI1 ((+@#@$$) :: Nat -> (~>) Nat Nat) where- liftSing (s :: Sing (d :: Nat))- = (singFun1 @((+@#@$$) (d :: Nat))) ((%+) s)+Singletons/Sections.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| (+) :: Nat -> Nat -> Nat + Zero + m = m + (Succ n) + m = Succ (n + m) + foo1 :: [Nat] + foo1 = map ((Succ Zero) +) [Zero, Succ Zero] + foo2 :: [Nat] + foo2 = map (+ (Succ Zero)) [Zero, Succ Zero] + foo3 :: [Nat] + foo3 = zipWith (+) [Succ Zero, Succ Zero] [Zero, Succ Zero] |] + ======> + (+) :: Nat -> Nat -> Nat + (+) Zero m = m + (+) (Succ n) m = Succ (n + m) + foo1 :: [Nat] + foo1 = map (Succ Zero +) [Zero, Succ Zero] + foo2 :: [Nat] + foo2 = map (+ Succ Zero) [Zero, Succ Zero] + foo3 :: [Nat] + foo3 = zipWith (+) [Succ Zero, Succ Zero] [Zero, Succ Zero] + type family Lambda_0123456789876543210 lhs_0123456789876543210 where + Lambda_0123456789876543210 lhs_0123456789876543210 = Apply (Apply (+@#@$) lhs_0123456789876543210) (Apply SuccSym0 ZeroSym0) + data Lambda_0123456789876543210Sym0 lhs_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) => + Lambda_0123456789876543210Sym0 lhs_01234567898765432100123456789876543210 + type instance Apply Lambda_0123456789876543210Sym0 lhs_01234567898765432100123456789876543210 = Lambda_0123456789876543210 lhs_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym0KindInference ()) + type family Lambda_0123456789876543210Sym1 lhs_01234567898765432100123456789876543210 where + Lambda_0123456789876543210Sym1 lhs_01234567898765432100123456789876543210 = Lambda_0123456789876543210 lhs_01234567898765432100123456789876543210 + type Foo3Sym0 :: [Nat] + type family Foo3Sym0 :: [Nat] where + Foo3Sym0 = Foo3 + type Foo2Sym0 :: [Nat] + type family Foo2Sym0 :: [Nat] where + Foo2Sym0 = Foo2 + type Foo1Sym0 :: [Nat] + type family Foo1Sym0 :: [Nat] where + Foo1Sym0 = Foo1 + type (+@#@$) :: (~>) Nat ((~>) Nat Nat) + data (+@#@$) :: (~>) Nat ((~>) Nat Nat) + where + (:+@#@$###) :: SameKind (Apply (+@#@$) arg) ((+@#@$$) arg) => + (+@#@$) a0123456789876543210 + type instance Apply (+@#@$) a0123456789876543210 = (+@#@$$) a0123456789876543210 + instance SuppressUnusedWarnings (+@#@$) where + suppressUnusedWarnings = snd ((,) (:+@#@$###) ()) + type (+@#@$$) :: Nat -> (~>) Nat Nat + data (+@#@$$) (a0123456789876543210 :: Nat) :: (~>) Nat Nat + where + (:+@#@$$###) :: SameKind (Apply ((+@#@$$) a0123456789876543210) arg) ((+@#@$$$) a0123456789876543210 arg) => + (+@#@$$) a0123456789876543210 a0123456789876543210 + type instance Apply ((+@#@$$) a0123456789876543210) a0123456789876543210 = (+) a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings ((+@#@$$) a0123456789876543210) where + suppressUnusedWarnings = snd ((,) (:+@#@$$###) ()) + type (+@#@$$$) :: Nat -> Nat -> Nat + type family (+@#@$$$) (a0123456789876543210 :: Nat) (a0123456789876543210 :: Nat) :: Nat where + (+@#@$$$) a0123456789876543210 a0123456789876543210 = (+) a0123456789876543210 a0123456789876543210 + type Foo3 :: [Nat] + type family Foo3 :: [Nat] where + Foo3 = Apply (Apply (Apply ZipWithSym0 (+@#@$)) (Apply (Apply (:@#@$) (Apply SuccSym0 ZeroSym0)) (Apply (Apply (:@#@$) (Apply SuccSym0 ZeroSym0)) NilSym0))) (Apply (Apply (:@#@$) ZeroSym0) (Apply (Apply (:@#@$) (Apply SuccSym0 ZeroSym0)) NilSym0)) + type Foo2 :: [Nat] + type family Foo2 :: [Nat] where + Foo2 = Apply (Apply MapSym0 Lambda_0123456789876543210Sym0) (Apply (Apply (:@#@$) ZeroSym0) (Apply (Apply (:@#@$) (Apply SuccSym0 ZeroSym0)) NilSym0)) + type Foo1 :: [Nat] + type family Foo1 :: [Nat] where + Foo1 = Apply (Apply MapSym0 (Apply (+@#@$) (Apply SuccSym0 ZeroSym0))) (Apply (Apply (:@#@$) ZeroSym0) (Apply (Apply (:@#@$) (Apply SuccSym0 ZeroSym0)) NilSym0)) + type (+) :: Nat -> Nat -> Nat + type family (+) (a :: Nat) (a :: Nat) :: Nat where + (+) 'Zero m = m + (+) ('Succ n) m = Apply SuccSym0 (Apply (Apply (+@#@$) n) m) + sFoo3 :: (Sing (Foo3Sym0 :: [Nat]) :: Type) + sFoo2 :: (Sing (Foo2Sym0 :: [Nat]) :: Type) + sFoo1 :: (Sing (Foo1Sym0 :: [Nat]) :: Type) + (%+) :: + (forall (t :: Nat) (t :: Nat). + Sing t + -> Sing t -> Sing (Apply (Apply (+@#@$) t) t :: Nat) :: Type) + sFoo3 + = applySing + (applySing + (applySing + (singFun3 @ZipWithSym0 sZipWith) (singFun2 @(+@#@$) (%+))) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing (singFun1 @SuccSym0 SSucc) SZero)) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing (singFun1 @SuccSym0 SSucc) SZero)) + SNil))) + (applySing + (applySing (singFun2 @(:@#@$) SCons) SZero) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing (singFun1 @SuccSym0 SSucc) SZero)) + SNil)) + sFoo2 + = applySing + (applySing + (singFun2 @MapSym0 sMap) + (singFun1 + @Lambda_0123456789876543210Sym0 + (\ sLhs_0123456789876543210 + -> case sLhs_0123456789876543210 of + (_ :: Sing lhs_0123456789876543210) + -> applySing + (applySing (singFun2 @(+@#@$) (%+)) sLhs_0123456789876543210) + (applySing (singFun1 @SuccSym0 SSucc) SZero)))) + (applySing + (applySing (singFun2 @(:@#@$) SCons) SZero) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing (singFun1 @SuccSym0 SSucc) SZero)) + SNil)) + sFoo1 + = applySing + (applySing + (singFun2 @MapSym0 sMap) + (applySing + (singFun2 @(+@#@$) (%+)) + (applySing (singFun1 @SuccSym0 SSucc) SZero))) + (applySing + (applySing (singFun2 @(:@#@$) SCons) SZero) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing (singFun1 @SuccSym0 SSucc) SZero)) + SNil)) + (%+) SZero (sM :: Sing m) = sM + (%+) (SSucc (sN :: Sing n)) (sM :: Sing m) + = applySing + (singFun1 @SuccSym0 SSucc) + (applySing (applySing (singFun2 @(+@#@$) (%+)) sN) sM) + instance SingI ((+@#@$) :: (~>) Nat ((~>) Nat Nat)) where + sing = singFun2 @(+@#@$) (%+) + instance SingI d => + SingI ((+@#@$$) (d :: Nat) :: (~>) Nat Nat) where + sing = singFun1 @((+@#@$$) (d :: Nat)) ((%+) (sing @d)) + instance SingI1 ((+@#@$$) :: Nat -> (~>) Nat Nat) where + liftSing (s :: Sing (d :: Nat)) + = singFun1 @((+@#@$$) (d :: Nat)) ((%+) s)
tests/compile-and-dump/Singletons/Sections.hs view
@@ -1,39 +1,39 @@-module Singletons.Sections where--import Data.List.Singletons-import Data.Singletons-import Data.Singletons.TH-import Singletons.Nat--$(singletons [d|- (+) :: Nat -> Nat -> Nat- Zero + m = m- (Succ n) + m = Succ (n + m)-- foo1 :: [Nat]- foo1 = map ((Succ Zero)+) [Zero, Succ Zero]-- foo2 :: [Nat]- foo2 = map (+(Succ Zero)) [Zero, Succ Zero]-- foo3 :: [Nat]- foo3 = zipWith (+) [Succ Zero, Succ Zero] [Zero, Succ Zero]- |])--foo1a :: Proxy Foo1-foo1a = Proxy--foo1b :: Proxy [Succ Zero, Succ (Succ Zero)]-foo1b = foo1a--foo2a :: Proxy Foo2-foo2a = Proxy--foo2b :: Proxy [Succ Zero, Succ (Succ Zero)]-foo2b = foo2a--foo3a :: Proxy Foo3-foo3a = Proxy--foo3b :: Proxy [Succ Zero, Succ (Succ Zero)]-foo3b = foo3a+module Singletons.Sections where + +import Data.List.Singletons +import Data.Singletons +import Data.Singletons.TH +import Singletons.Nat + +$(singletons [d| + (+) :: Nat -> Nat -> Nat + Zero + m = m + (Succ n) + m = Succ (n + m) + + foo1 :: [Nat] + foo1 = map ((Succ Zero)+) [Zero, Succ Zero] + + foo2 :: [Nat] + foo2 = map (+(Succ Zero)) [Zero, Succ Zero] + + foo3 :: [Nat] + foo3 = zipWith (+) [Succ Zero, Succ Zero] [Zero, Succ Zero] + |]) + +foo1a :: Proxy Foo1 +foo1a = Proxy + +foo1b :: Proxy [Succ Zero, Succ (Succ Zero)] +foo1b = foo1a + +foo2a :: Proxy Foo2 +foo2a = Proxy + +foo2b :: Proxy [Succ Zero, Succ (Succ Zero)] +foo2b = foo2a + +foo3a :: Proxy Foo3 +foo3a = Proxy + +foo3b :: Proxy [Succ Zero, Succ (Succ Zero)] +foo3b = foo3a
tests/compile-and-dump/Singletons/ShowDeriving.golden view
@@ -1,614 +1,649 @@-Singletons/ShowDeriving.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| infixl 5 `MkFoo2b`, :*:, :&:- - data Foo1- = MkFoo1- deriving Show- data Foo2 a- = MkFoo2a a a | a `MkFoo2b` a | (:*:) a a | a :&: a- deriving Show- data Foo3- = MkFoo3 {getFoo3a :: Bool, (***) :: Bool}- deriving Show |]- ======>- data Foo1- = MkFoo1- deriving Show- infixl 5 `MkFoo2b`- infixl 5 :*:- infixl 5 :&:- data Foo2 a- = MkFoo2a a a | a `MkFoo2b` a | (:*:) a a | a :&: a- deriving Show- data Foo3- = MkFoo3 {getFoo3a :: Bool, (***) :: Bool}- deriving Show- type MkFoo1Sym0 :: Foo1- type family MkFoo1Sym0 :: Foo1 where- MkFoo1Sym0 = MkFoo1- type MkFoo2aSym0 :: forall a. (~>) a ((~>) a (Foo2 a))- data MkFoo2aSym0 :: (~>) a ((~>) a (Foo2 a))- where- MkFoo2aSym0KindInference :: SameKind (Apply MkFoo2aSym0 arg) (MkFoo2aSym1 arg) =>- MkFoo2aSym0 a0123456789876543210- type instance Apply MkFoo2aSym0 a0123456789876543210 = MkFoo2aSym1 a0123456789876543210- instance SuppressUnusedWarnings MkFoo2aSym0 where- suppressUnusedWarnings = snd (((,) MkFoo2aSym0KindInference) ())- type MkFoo2aSym1 :: forall a. a -> (~>) a (Foo2 a)- data MkFoo2aSym1 (a0123456789876543210 :: a) :: (~>) a (Foo2 a)- where- MkFoo2aSym1KindInference :: SameKind (Apply (MkFoo2aSym1 a0123456789876543210) arg) (MkFoo2aSym2 a0123456789876543210 arg) =>- MkFoo2aSym1 a0123456789876543210 a0123456789876543210- type instance Apply (MkFoo2aSym1 a0123456789876543210) a0123456789876543210 = MkFoo2a a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (MkFoo2aSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) MkFoo2aSym1KindInference) ())- type MkFoo2aSym2 :: forall a. a -> a -> Foo2 a- type family MkFoo2aSym2 (a0123456789876543210 :: a) (a0123456789876543210 :: a) :: Foo2 a where- MkFoo2aSym2 a0123456789876543210 a0123456789876543210 = MkFoo2a a0123456789876543210 a0123456789876543210- type MkFoo2bSym0 :: forall a. (~>) a ((~>) a (Foo2 a))- data MkFoo2bSym0 :: (~>) a ((~>) a (Foo2 a))- where- MkFoo2bSym0KindInference :: SameKind (Apply MkFoo2bSym0 arg) (MkFoo2bSym1 arg) =>- MkFoo2bSym0 a0123456789876543210- type instance Apply MkFoo2bSym0 a0123456789876543210 = MkFoo2bSym1 a0123456789876543210- instance SuppressUnusedWarnings MkFoo2bSym0 where- suppressUnusedWarnings = snd (((,) MkFoo2bSym0KindInference) ())- infixl 5 `MkFoo2bSym0`- type MkFoo2bSym1 :: forall a. a -> (~>) a (Foo2 a)- data MkFoo2bSym1 (a0123456789876543210 :: a) :: (~>) a (Foo2 a)- where- MkFoo2bSym1KindInference :: SameKind (Apply (MkFoo2bSym1 a0123456789876543210) arg) (MkFoo2bSym2 a0123456789876543210 arg) =>- MkFoo2bSym1 a0123456789876543210 a0123456789876543210- type instance Apply (MkFoo2bSym1 a0123456789876543210) a0123456789876543210 = MkFoo2b a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (MkFoo2bSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) MkFoo2bSym1KindInference) ())- infixl 5 `MkFoo2bSym1`- type MkFoo2bSym2 :: forall a. a -> a -> Foo2 a- type family MkFoo2bSym2 (a0123456789876543210 :: a) (a0123456789876543210 :: a) :: Foo2 a where- MkFoo2bSym2 a0123456789876543210 a0123456789876543210 = MkFoo2b a0123456789876543210 a0123456789876543210- infixl 5 `MkFoo2bSym2`- type (:*:@#@$) :: forall a. (~>) a ((~>) a (Foo2 a))- data (:*:@#@$) :: (~>) a ((~>) a (Foo2 a))- where- (::*:@#@$###) :: SameKind (Apply (:*:@#@$) arg) ((:*:@#@$$) arg) =>- (:*:@#@$) a0123456789876543210- type instance Apply (:*:@#@$) a0123456789876543210 = (:*:@#@$$) a0123456789876543210- instance SuppressUnusedWarnings (:*:@#@$) where- suppressUnusedWarnings = snd (((,) (::*:@#@$###)) ())- infixl 5 :*:@#@$- type (:*:@#@$$) :: forall a. a -> (~>) a (Foo2 a)- data (:*:@#@$$) (a0123456789876543210 :: a) :: (~>) a (Foo2 a)- where- (::*:@#@$$###) :: SameKind (Apply ((:*:@#@$$) a0123456789876543210) arg) ((:*:@#@$$$) a0123456789876543210 arg) =>- (:*:@#@$$) a0123456789876543210 a0123456789876543210- type instance Apply ((:*:@#@$$) a0123456789876543210) a0123456789876543210 = (:*:) a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings ((:*:@#@$$) a0123456789876543210) where- suppressUnusedWarnings = snd (((,) (::*:@#@$$###)) ())- infixl 5 :*:@#@$$- type (:*:@#@$$$) :: forall a. a -> a -> Foo2 a- type family (:*:@#@$$$) (a0123456789876543210 :: a) (a0123456789876543210 :: a) :: Foo2 a where- (:*:@#@$$$) a0123456789876543210 a0123456789876543210 = (:*:) a0123456789876543210 a0123456789876543210- infixl 5 :*:@#@$$$- type (:&:@#@$) :: forall a. (~>) a ((~>) a (Foo2 a))- data (:&:@#@$) :: (~>) a ((~>) a (Foo2 a))- where- (::&:@#@$###) :: SameKind (Apply (:&:@#@$) arg) ((:&:@#@$$) arg) =>- (:&:@#@$) a0123456789876543210- type instance Apply (:&:@#@$) a0123456789876543210 = (:&:@#@$$) a0123456789876543210- instance SuppressUnusedWarnings (:&:@#@$) where- suppressUnusedWarnings = snd (((,) (::&:@#@$###)) ())- infixl 5 :&:@#@$- type (:&:@#@$$) :: forall a. a -> (~>) a (Foo2 a)- data (:&:@#@$$) (a0123456789876543210 :: a) :: (~>) a (Foo2 a)- where- (::&:@#@$$###) :: SameKind (Apply ((:&:@#@$$) a0123456789876543210) arg) ((:&:@#@$$$) a0123456789876543210 arg) =>- (:&:@#@$$) a0123456789876543210 a0123456789876543210- type instance Apply ((:&:@#@$$) a0123456789876543210) a0123456789876543210 = (:&:) a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings ((:&:@#@$$) a0123456789876543210) where- suppressUnusedWarnings = snd (((,) (::&:@#@$$###)) ())- infixl 5 :&:@#@$$- type (:&:@#@$$$) :: forall a. a -> a -> Foo2 a- type family (:&:@#@$$$) (a0123456789876543210 :: a) (a0123456789876543210 :: a) :: Foo2 a where- (:&:@#@$$$) a0123456789876543210 a0123456789876543210 = (:&:) a0123456789876543210 a0123456789876543210- infixl 5 :&:@#@$$$- type MkFoo3Sym0 :: (~>) Bool ((~>) Bool Foo3)- data MkFoo3Sym0 :: (~>) Bool ((~>) Bool Foo3)- where- MkFoo3Sym0KindInference :: SameKind (Apply MkFoo3Sym0 arg) (MkFoo3Sym1 arg) =>- MkFoo3Sym0 a0123456789876543210- type instance Apply MkFoo3Sym0 a0123456789876543210 = MkFoo3Sym1 a0123456789876543210- instance SuppressUnusedWarnings MkFoo3Sym0 where- suppressUnusedWarnings = snd (((,) MkFoo3Sym0KindInference) ())- type MkFoo3Sym1 :: Bool -> (~>) Bool Foo3- data MkFoo3Sym1 (a0123456789876543210 :: Bool) :: (~>) Bool Foo3- where- MkFoo3Sym1KindInference :: SameKind (Apply (MkFoo3Sym1 a0123456789876543210) arg) (MkFoo3Sym2 a0123456789876543210 arg) =>- MkFoo3Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (MkFoo3Sym1 a0123456789876543210) a0123456789876543210 = MkFoo3 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (MkFoo3Sym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) MkFoo3Sym1KindInference) ())- type MkFoo3Sym2 :: Bool -> Bool -> Foo3- type family MkFoo3Sym2 (a0123456789876543210 :: Bool) (a0123456789876543210 :: Bool) :: Foo3 where- MkFoo3Sym2 a0123456789876543210 a0123456789876543210 = MkFoo3 a0123456789876543210 a0123456789876543210- type (***@#@$) :: (~>) Foo3 Bool- data (***@#@$) :: (~>) Foo3 Bool- where- (:***@#@$###) :: SameKind (Apply (***@#@$) arg) ((***@#@$$) arg) =>- (***@#@$) a0123456789876543210- type instance Apply (***@#@$) a0123456789876543210 = (***) a0123456789876543210- instance SuppressUnusedWarnings (***@#@$) where- suppressUnusedWarnings = snd (((,) (:***@#@$###)) ())- type (***@#@$$) :: Foo3 -> Bool- type family (***@#@$$) (a0123456789876543210 :: Foo3) :: Bool where- (***@#@$$) a0123456789876543210 = (***) a0123456789876543210- type GetFoo3aSym0 :: (~>) Foo3 Bool- data GetFoo3aSym0 :: (~>) Foo3 Bool- where- GetFoo3aSym0KindInference :: SameKind (Apply GetFoo3aSym0 arg) (GetFoo3aSym1 arg) =>- GetFoo3aSym0 a0123456789876543210- type instance Apply GetFoo3aSym0 a0123456789876543210 = GetFoo3a a0123456789876543210- instance SuppressUnusedWarnings GetFoo3aSym0 where- suppressUnusedWarnings = snd (((,) GetFoo3aSym0KindInference) ())- type GetFoo3aSym1 :: Foo3 -> Bool- type family GetFoo3aSym1 (a0123456789876543210 :: Foo3) :: Bool where- GetFoo3aSym1 a0123456789876543210 = GetFoo3a a0123456789876543210- type (***) :: Foo3 -> Bool- type family (***) (a :: Foo3) :: Bool where- (***) (MkFoo3 _ field) = field- type GetFoo3a :: Foo3 -> Bool- type family GetFoo3a (a :: Foo3) :: Bool where- GetFoo3a (MkFoo3 field _) = field- type ShowsPrec_0123456789876543210 :: GHC.Num.Natural.Natural- -> Foo1 -> Symbol -> Symbol- type family ShowsPrec_0123456789876543210 (a :: GHC.Num.Natural.Natural) (a :: Foo1) (a :: Symbol) :: Symbol where- ShowsPrec_0123456789876543210 _ MkFoo1 a_0123456789876543210 = Apply (Apply ShowStringSym0 "MkFoo1") a_0123456789876543210- type ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) Foo1 ((~>) Symbol Symbol))- data ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) Foo1 ((~>) Symbol Symbol))- where- ShowsPrec_0123456789876543210Sym0KindInference :: SameKind (Apply ShowsPrec_0123456789876543210Sym0 arg) (ShowsPrec_0123456789876543210Sym1 arg) =>- ShowsPrec_0123456789876543210Sym0 a0123456789876543210- type instance Apply ShowsPrec_0123456789876543210Sym0 a0123456789876543210 = ShowsPrec_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings ShowsPrec_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym0KindInference) ())- type ShowsPrec_0123456789876543210Sym1 :: GHC.Num.Natural.Natural- -> (~>) Foo1 ((~>) Symbol Symbol)- data ShowsPrec_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Num.Natural.Natural) :: (~>) Foo1 ((~>) Symbol Symbol)- where- ShowsPrec_0123456789876543210Sym1KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 arg) =>- ShowsPrec_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym1KindInference) ())- type ShowsPrec_0123456789876543210Sym2 :: GHC.Num.Natural.Natural- -> Foo1 -> (~>) Symbol Symbol- data ShowsPrec_0123456789876543210Sym2 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: Foo1) :: (~>) Symbol Symbol- where- ShowsPrec_0123456789876543210Sym2KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 arg) =>- ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym2KindInference) ())- type ShowsPrec_0123456789876543210Sym3 :: GHC.Num.Natural.Natural- -> Foo1 -> Symbol -> Symbol- type family ShowsPrec_0123456789876543210Sym3 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: Foo1) (a0123456789876543210 :: Symbol) :: Symbol where- ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance PShow Foo1 where- type ShowsPrec a a a = Apply (Apply (Apply ShowsPrec_0123456789876543210Sym0 a) a) a- type ShowsPrec_0123456789876543210 :: GHC.Num.Natural.Natural- -> Foo2 a -> Symbol -> Symbol- type family ShowsPrec_0123456789876543210 (a :: GHC.Num.Natural.Natural) (a :: Foo2 a) (a :: Symbol) :: Symbol where- ShowsPrec_0123456789876543210 p_0123456789876543210 (MkFoo2a arg_0123456789876543210 arg_0123456789876543210) a_0123456789876543210 = Apply (Apply (Apply ShowParenSym0 (Apply (Apply (>@#@$) p_0123456789876543210) (FromInteger 10))) (Apply (Apply (.@#@$) (Apply ShowStringSym0 "MkFoo2a ")) (Apply (Apply (.@#@$) (Apply (Apply ShowsPrecSym0 (FromInteger 11)) arg_0123456789876543210)) (Apply (Apply (.@#@$) ShowSpaceSym0) (Apply (Apply ShowsPrecSym0 (FromInteger 11)) arg_0123456789876543210))))) a_0123456789876543210- ShowsPrec_0123456789876543210 p_0123456789876543210 (MkFoo2b argL_0123456789876543210 argR_0123456789876543210) a_0123456789876543210 = Apply (Apply (Apply ShowParenSym0 (Apply (Apply (>@#@$) p_0123456789876543210) (FromInteger 5))) (Apply (Apply (.@#@$) (Apply (Apply ShowsPrecSym0 (FromInteger 6)) argL_0123456789876543210)) (Apply (Apply (.@#@$) (Apply ShowStringSym0 " `MkFoo2b` ")) (Apply (Apply ShowsPrecSym0 (FromInteger 6)) argR_0123456789876543210)))) a_0123456789876543210- ShowsPrec_0123456789876543210 p_0123456789876543210 ((:*:) arg_0123456789876543210 arg_0123456789876543210) a_0123456789876543210 = Apply (Apply (Apply ShowParenSym0 (Apply (Apply (>@#@$) p_0123456789876543210) (FromInteger 10))) (Apply (Apply (.@#@$) (Apply ShowStringSym0 "(:*:) ")) (Apply (Apply (.@#@$) (Apply (Apply ShowsPrecSym0 (FromInteger 11)) arg_0123456789876543210)) (Apply (Apply (.@#@$) ShowSpaceSym0) (Apply (Apply ShowsPrecSym0 (FromInteger 11)) arg_0123456789876543210))))) a_0123456789876543210- ShowsPrec_0123456789876543210 p_0123456789876543210 ((:&:) argL_0123456789876543210 argR_0123456789876543210) a_0123456789876543210 = Apply (Apply (Apply ShowParenSym0 (Apply (Apply (>@#@$) p_0123456789876543210) (FromInteger 5))) (Apply (Apply (.@#@$) (Apply (Apply ShowsPrecSym0 (FromInteger 6)) argL_0123456789876543210)) (Apply (Apply (.@#@$) (Apply ShowStringSym0 " :&: ")) (Apply (Apply ShowsPrecSym0 (FromInteger 6)) argR_0123456789876543210)))) a_0123456789876543210- type ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) (Foo2 a) ((~>) Symbol Symbol))- data ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) (Foo2 a) ((~>) Symbol Symbol))- where- ShowsPrec_0123456789876543210Sym0KindInference :: SameKind (Apply ShowsPrec_0123456789876543210Sym0 arg) (ShowsPrec_0123456789876543210Sym1 arg) =>- ShowsPrec_0123456789876543210Sym0 a0123456789876543210- type instance Apply ShowsPrec_0123456789876543210Sym0 a0123456789876543210 = ShowsPrec_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings ShowsPrec_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym0KindInference) ())- type ShowsPrec_0123456789876543210Sym1 :: GHC.Num.Natural.Natural- -> (~>) (Foo2 a) ((~>) Symbol Symbol)- data ShowsPrec_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Num.Natural.Natural) :: (~>) (Foo2 a) ((~>) Symbol Symbol)- where- ShowsPrec_0123456789876543210Sym1KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 arg) =>- ShowsPrec_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym1KindInference) ())- type ShowsPrec_0123456789876543210Sym2 :: GHC.Num.Natural.Natural- -> Foo2 a -> (~>) Symbol Symbol- data ShowsPrec_0123456789876543210Sym2 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: Foo2 a) :: (~>) Symbol Symbol- where- ShowsPrec_0123456789876543210Sym2KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 arg) =>- ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym2KindInference) ())- type ShowsPrec_0123456789876543210Sym3 :: GHC.Num.Natural.Natural- -> Foo2 a -> Symbol -> Symbol- type family ShowsPrec_0123456789876543210Sym3 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: Foo2 a) (a0123456789876543210 :: Symbol) :: Symbol where- ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance PShow (Foo2 a) where- type ShowsPrec a a a = Apply (Apply (Apply ShowsPrec_0123456789876543210Sym0 a) a) a- type ShowsPrec_0123456789876543210 :: GHC.Num.Natural.Natural- -> Foo3 -> Symbol -> Symbol- type family ShowsPrec_0123456789876543210 (a :: GHC.Num.Natural.Natural) (a :: Foo3) (a :: Symbol) :: Symbol where- ShowsPrec_0123456789876543210 p_0123456789876543210 (MkFoo3 arg_0123456789876543210 arg_0123456789876543210) a_0123456789876543210 = Apply (Apply (Apply ShowParenSym0 (Apply (Apply (>@#@$) p_0123456789876543210) (FromInteger 10))) (Apply (Apply (.@#@$) (Apply ShowStringSym0 "MkFoo3 ")) (Apply (Apply (.@#@$) (Apply ShowCharSym0 '{')) (Apply (Apply (.@#@$) (Apply ShowStringSym0 "getFoo3a = ")) (Apply (Apply (.@#@$) (Apply (Apply ShowsPrecSym0 (FromInteger 0)) arg_0123456789876543210)) (Apply (Apply (.@#@$) ShowCommaSpaceSym0) (Apply (Apply (.@#@$) (Apply ShowStringSym0 "(***) = ")) (Apply (Apply (.@#@$) (Apply (Apply ShowsPrecSym0 (FromInteger 0)) arg_0123456789876543210)) (Apply ShowCharSym0 '}'))))))))) a_0123456789876543210- type ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) Foo3 ((~>) Symbol Symbol))- data ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) Foo3 ((~>) Symbol Symbol))- where- ShowsPrec_0123456789876543210Sym0KindInference :: SameKind (Apply ShowsPrec_0123456789876543210Sym0 arg) (ShowsPrec_0123456789876543210Sym1 arg) =>- ShowsPrec_0123456789876543210Sym0 a0123456789876543210- type instance Apply ShowsPrec_0123456789876543210Sym0 a0123456789876543210 = ShowsPrec_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings ShowsPrec_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym0KindInference) ())- type ShowsPrec_0123456789876543210Sym1 :: GHC.Num.Natural.Natural- -> (~>) Foo3 ((~>) Symbol Symbol)- data ShowsPrec_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Num.Natural.Natural) :: (~>) Foo3 ((~>) Symbol Symbol)- where- ShowsPrec_0123456789876543210Sym1KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 arg) =>- ShowsPrec_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym1KindInference) ())- type ShowsPrec_0123456789876543210Sym2 :: GHC.Num.Natural.Natural- -> Foo3 -> (~>) Symbol Symbol- data ShowsPrec_0123456789876543210Sym2 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: Foo3) :: (~>) Symbol Symbol- where- ShowsPrec_0123456789876543210Sym2KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 arg) =>- ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym2KindInference) ())- type ShowsPrec_0123456789876543210Sym3 :: GHC.Num.Natural.Natural- -> Foo3 -> Symbol -> Symbol- type family ShowsPrec_0123456789876543210Sym3 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: Foo3) (a0123456789876543210 :: Symbol) :: Symbol where- ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance PShow Foo3 where- type ShowsPrec a a a = Apply (Apply (Apply ShowsPrec_0123456789876543210Sym0 a) a) a- infixl 5 :%&:- infixl 5 :%*:- infixl 5 `SMkFoo2b`- (%***) ::- forall (t :: Foo3). Sing t -> Sing (Apply (***@#@$) t :: Bool)- sGetFoo3a ::- forall (t :: Foo3). Sing t -> Sing (Apply GetFoo3aSym0 t :: Bool)- (%***) (SMkFoo3 _ (sField :: Sing field)) = sField- sGetFoo3a (SMkFoo3 (sField :: Sing field) _) = sField- instance SingI ((***@#@$) :: (~>) Foo3 Bool) where- sing = (singFun1 @(***@#@$)) (%***)- instance SingI (GetFoo3aSym0 :: (~>) Foo3 Bool) where- sing = (singFun1 @GetFoo3aSym0) sGetFoo3a- data SFoo1 :: Foo1 -> Type where SMkFoo1 :: SFoo1 (MkFoo1 :: Foo1)- type instance Sing @Foo1 = SFoo1- instance SingKind Foo1 where- type Demote Foo1 = Foo1- fromSing SMkFoo1 = MkFoo1- toSing MkFoo1 = SomeSing SMkFoo1- data SFoo2 :: forall a. Foo2 a -> Type- where- SMkFoo2a :: forall a (n :: a) (n :: a).- (Sing n) -> (Sing n) -> SFoo2 (MkFoo2a n n :: Foo2 a)- SMkFoo2b :: forall a (n :: a) (n :: a).- (Sing n) -> (Sing n) -> SFoo2 (MkFoo2b n n :: Foo2 a)- (:%*:) :: forall a (n :: a) (n :: a).- (Sing n) -> (Sing n) -> SFoo2 ((:*:) n n :: Foo2 a)- (:%&:) :: forall a (n :: a) (n :: a).- (Sing n) -> (Sing n) -> SFoo2 ((:&:) n n :: Foo2 a)- type instance Sing @(Foo2 a) = SFoo2- instance SingKind a => SingKind (Foo2 a) where- type Demote (Foo2 a) = Foo2 (Demote a)- fromSing (SMkFoo2a b b) = (MkFoo2a (fromSing b)) (fromSing b)- fromSing (SMkFoo2b b b) = (MkFoo2b (fromSing b)) (fromSing b)- fromSing ((:%*:) b b) = ((:*:) (fromSing b)) (fromSing b)- fromSing ((:%&:) b b) = ((:&:) (fromSing b)) (fromSing b)- toSing (MkFoo2a (b :: Demote a) (b :: Demote a))- = case ((,) (toSing b :: SomeSing a)) (toSing b :: SomeSing a) of- (,) (SomeSing c) (SomeSing c) -> SomeSing ((SMkFoo2a c) c)- toSing (MkFoo2b (b :: Demote a) (b :: Demote a))- = case ((,) (toSing b :: SomeSing a)) (toSing b :: SomeSing a) of- (,) (SomeSing c) (SomeSing c) -> SomeSing ((SMkFoo2b c) c)- toSing ((:*:) (b :: Demote a) (b :: Demote a))- = case ((,) (toSing b :: SomeSing a)) (toSing b :: SomeSing a) of- (,) (SomeSing c) (SomeSing c) -> SomeSing (((:%*:) c) c)- toSing ((:&:) (b :: Demote a) (b :: Demote a))- = case ((,) (toSing b :: SomeSing a)) (toSing b :: SomeSing a) of- (,) (SomeSing c) (SomeSing c) -> SomeSing (((:%&:) c) c)- data SFoo3 :: Foo3 -> Type- where- SMkFoo3 :: forall (n :: Bool) (n :: Bool).- (Sing n) -> (Sing n) -> SFoo3 (MkFoo3 n n :: Foo3)- type instance Sing @Foo3 = SFoo3- instance SingKind Foo3 where- type Demote Foo3 = Foo3- fromSing (SMkFoo3 b b) = (MkFoo3 (fromSing b)) (fromSing b)- toSing (MkFoo3 (b :: Demote Bool) (b :: Demote Bool))- = case- ((,) (toSing b :: SomeSing Bool)) (toSing b :: SomeSing Bool)- of- (,) (SomeSing c) (SomeSing c) -> SomeSing ((SMkFoo3 c) c)- instance SShow Foo1 where- sShowsPrec ::- forall (t1 :: GHC.Num.Natural.Natural)- (t2 :: Foo1)- (t3 :: Symbol). Sing t1- -> Sing t2- -> Sing t3- -> Sing (Apply (Apply (Apply (ShowsPrecSym0 :: TyFun GHC.Num.Natural.Natural ((~>) Foo1 ((~>) Symbol Symbol))- -> Type) t1) t2) t3)- sShowsPrec- _- SMkFoo1- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "MkFoo1")))- sA_0123456789876543210- instance SShow a => SShow (Foo2 a) where- sShowsPrec ::- forall (t1 :: GHC.Num.Natural.Natural)- (t2 :: Foo2 a)- (t3 :: Symbol). Sing t1- -> Sing t2- -> Sing t3- -> Sing (Apply (Apply (Apply (ShowsPrecSym0 :: TyFun GHC.Num.Natural.Natural ((~>) (Foo2 a) ((~>) Symbol Symbol))- -> Type) t1) t2) t3)- sShowsPrec- (sP_0123456789876543210 :: Sing p_0123456789876543210)- (SMkFoo2a (sArg_0123456789876543210 :: Sing arg_0123456789876543210)- (sArg_0123456789876543210 :: Sing arg_0123456789876543210))- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing- ((applySing ((singFun3 @ShowParenSym0) sShowParen))- ((applySing- ((applySing ((singFun2 @(>@#@$)) (%>))) sP_0123456789876543210))- (sFromInteger (sing :: Sing 10)))))- ((applySing- ((applySing ((singFun3 @(.@#@$)) (%.)))- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "MkFoo2a "))))- ((applySing- ((applySing ((singFun3 @(.@#@$)) (%.)))- ((applySing- ((applySing ((singFun3 @ShowsPrecSym0) sShowsPrec))- (sFromInteger (sing :: Sing 11))))- sArg_0123456789876543210)))- ((applySing- ((applySing ((singFun3 @(.@#@$)) (%.)))- ((singFun1 @ShowSpaceSym0) sShowSpace)))- ((applySing- ((applySing ((singFun3 @ShowsPrecSym0) sShowsPrec))- (sFromInteger (sing :: Sing 11))))- sArg_0123456789876543210))))))- sA_0123456789876543210- sShowsPrec- (sP_0123456789876543210 :: Sing p_0123456789876543210)- (SMkFoo2b (sArgL_0123456789876543210 :: Sing argL_0123456789876543210)- (sArgR_0123456789876543210 :: Sing argR_0123456789876543210))- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing- ((applySing ((singFun3 @ShowParenSym0) sShowParen))- ((applySing- ((applySing ((singFun2 @(>@#@$)) (%>))) sP_0123456789876543210))- (sFromInteger (sing :: Sing 5)))))- ((applySing- ((applySing ((singFun3 @(.@#@$)) (%.)))- ((applySing- ((applySing ((singFun3 @ShowsPrecSym0) sShowsPrec))- (sFromInteger (sing :: Sing 6))))- sArgL_0123456789876543210)))- ((applySing- ((applySing ((singFun3 @(.@#@$)) (%.)))- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing " `MkFoo2b` "))))- ((applySing- ((applySing ((singFun3 @ShowsPrecSym0) sShowsPrec))- (sFromInteger (sing :: Sing 6))))- sArgR_0123456789876543210)))))- sA_0123456789876543210- sShowsPrec- (sP_0123456789876543210 :: Sing p_0123456789876543210)- ((:%*:) (sArg_0123456789876543210 :: Sing arg_0123456789876543210)- (sArg_0123456789876543210 :: Sing arg_0123456789876543210))- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing- ((applySing ((singFun3 @ShowParenSym0) sShowParen))- ((applySing- ((applySing ((singFun2 @(>@#@$)) (%>))) sP_0123456789876543210))- (sFromInteger (sing :: Sing 10)))))- ((applySing- ((applySing ((singFun3 @(.@#@$)) (%.)))- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "(:*:) "))))- ((applySing- ((applySing ((singFun3 @(.@#@$)) (%.)))- ((applySing- ((applySing ((singFun3 @ShowsPrecSym0) sShowsPrec))- (sFromInteger (sing :: Sing 11))))- sArg_0123456789876543210)))- ((applySing- ((applySing ((singFun3 @(.@#@$)) (%.)))- ((singFun1 @ShowSpaceSym0) sShowSpace)))- ((applySing- ((applySing ((singFun3 @ShowsPrecSym0) sShowsPrec))- (sFromInteger (sing :: Sing 11))))- sArg_0123456789876543210))))))- sA_0123456789876543210- sShowsPrec- (sP_0123456789876543210 :: Sing p_0123456789876543210)- ((:%&:) (sArgL_0123456789876543210 :: Sing argL_0123456789876543210)- (sArgR_0123456789876543210 :: Sing argR_0123456789876543210))- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing- ((applySing ((singFun3 @ShowParenSym0) sShowParen))- ((applySing- ((applySing ((singFun2 @(>@#@$)) (%>))) sP_0123456789876543210))- (sFromInteger (sing :: Sing 5)))))- ((applySing- ((applySing ((singFun3 @(.@#@$)) (%.)))- ((applySing- ((applySing ((singFun3 @ShowsPrecSym0) sShowsPrec))- (sFromInteger (sing :: Sing 6))))- sArgL_0123456789876543210)))- ((applySing- ((applySing ((singFun3 @(.@#@$)) (%.)))- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing " :&: "))))- ((applySing- ((applySing ((singFun3 @ShowsPrecSym0) sShowsPrec))- (sFromInteger (sing :: Sing 6))))- sArgR_0123456789876543210)))))- sA_0123456789876543210- instance SShow Bool => SShow Foo3 where- sShowsPrec ::- forall (t1 :: GHC.Num.Natural.Natural)- (t2 :: Foo3)- (t3 :: Symbol). Sing t1- -> Sing t2- -> Sing t3- -> Sing (Apply (Apply (Apply (ShowsPrecSym0 :: TyFun GHC.Num.Natural.Natural ((~>) Foo3 ((~>) Symbol Symbol))- -> Type) t1) t2) t3)- sShowsPrec- (sP_0123456789876543210 :: Sing p_0123456789876543210)- (SMkFoo3 (sArg_0123456789876543210 :: Sing arg_0123456789876543210)- (sArg_0123456789876543210 :: Sing arg_0123456789876543210))- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing- ((applySing ((singFun3 @ShowParenSym0) sShowParen))- ((applySing- ((applySing ((singFun2 @(>@#@$)) (%>))) sP_0123456789876543210))- (sFromInteger (sing :: Sing 10)))))- ((applySing- ((applySing ((singFun3 @(.@#@$)) (%.)))- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "MkFoo3 "))))- ((applySing- ((applySing ((singFun3 @(.@#@$)) (%.)))- ((applySing ((singFun2 @ShowCharSym0) sShowChar))- (sing :: Sing '{'))))- ((applySing- ((applySing ((singFun3 @(.@#@$)) (%.)))- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "getFoo3a = "))))- ((applySing- ((applySing ((singFun3 @(.@#@$)) (%.)))- ((applySing- ((applySing ((singFun3 @ShowsPrecSym0) sShowsPrec))- (sFromInteger (sing :: Sing 0))))- sArg_0123456789876543210)))- ((applySing- ((applySing ((singFun3 @(.@#@$)) (%.)))- ((singFun1 @ShowCommaSpaceSym0) sShowCommaSpace)))- ((applySing- ((applySing ((singFun3 @(.@#@$)) (%.)))- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "(***) = "))))- ((applySing- ((applySing ((singFun3 @(.@#@$)) (%.)))- ((applySing- ((applySing ((singFun3 @ShowsPrecSym0) sShowsPrec))- (sFromInteger (sing :: Sing 0))))- sArg_0123456789876543210)))- ((applySing ((singFun2 @ShowCharSym0) sShowChar))- (sing :: Sing '}')))))))))))- sA_0123456789876543210- deriving instance Show (SFoo1 (z :: Foo1))- deriving instance Data.Singletons.ShowSing.ShowSing a =>- Show (SFoo2 (z :: Foo2 a))- deriving instance Data.Singletons.ShowSing.ShowSing Bool =>- Show (SFoo3 (z :: Foo3))- instance SingI MkFoo1 where- sing = SMkFoo1- instance (SingI n, SingI n) =>- SingI (MkFoo2a (n :: a) (n :: a)) where- sing = (SMkFoo2a sing) sing- instance SingI n => SingI1 (MkFoo2a (n :: a)) where- liftSing = SMkFoo2a sing- instance SingI2 MkFoo2a where- liftSing2 = SMkFoo2a- instance SingI (MkFoo2aSym0 :: (~>) a ((~>) a (Foo2 a))) where- sing = (singFun2 @MkFoo2aSym0) SMkFoo2a- instance SingI d =>- SingI (MkFoo2aSym1 (d :: a) :: (~>) a (Foo2 a)) where- sing = (singFun1 @(MkFoo2aSym1 (d :: a))) (SMkFoo2a (sing @d))- instance SingI1 (MkFoo2aSym1 :: a -> (~>) a (Foo2 a)) where- liftSing (s :: Sing (d :: a))- = (singFun1 @(MkFoo2aSym1 (d :: a))) (SMkFoo2a s)- instance (SingI n, SingI n) =>- SingI (MkFoo2b (n :: a) (n :: a)) where- sing = (SMkFoo2b sing) sing- instance SingI n => SingI1 (MkFoo2b (n :: a)) where- liftSing = SMkFoo2b sing- instance SingI2 MkFoo2b where- liftSing2 = SMkFoo2b- instance SingI (MkFoo2bSym0 :: (~>) a ((~>) a (Foo2 a))) where- sing = (singFun2 @MkFoo2bSym0) SMkFoo2b- instance SingI d =>- SingI (MkFoo2bSym1 (d :: a) :: (~>) a (Foo2 a)) where- sing = (singFun1 @(MkFoo2bSym1 (d :: a))) (SMkFoo2b (sing @d))- instance SingI1 (MkFoo2bSym1 :: a -> (~>) a (Foo2 a)) where- liftSing (s :: Sing (d :: a))- = (singFun1 @(MkFoo2bSym1 (d :: a))) (SMkFoo2b s)- instance (SingI n, SingI n) =>- SingI ((:*:) (n :: a) (n :: a)) where- sing = ((:%*:) sing) sing- instance SingI n => SingI1 ((:*:) (n :: a)) where- liftSing = (:%*:) sing- instance SingI2 (:*:) where- liftSing2 = (:%*:)- instance SingI ((:*:@#@$) :: (~>) a ((~>) a (Foo2 a))) where- sing = (singFun2 @(:*:@#@$)) (:%*:)- instance SingI d =>- SingI ((:*:@#@$$) (d :: a) :: (~>) a (Foo2 a)) where- sing = (singFun1 @((:*:@#@$$) (d :: a))) ((:%*:) (sing @d))- instance SingI1 ((:*:@#@$$) :: a -> (~>) a (Foo2 a)) where- liftSing (s :: Sing (d :: a))- = (singFun1 @((:*:@#@$$) (d :: a))) ((:%*:) s)- instance (SingI n, SingI n) =>- SingI ((:&:) (n :: a) (n :: a)) where- sing = ((:%&:) sing) sing- instance SingI n => SingI1 ((:&:) (n :: a)) where- liftSing = (:%&:) sing- instance SingI2 (:&:) where- liftSing2 = (:%&:)- instance SingI ((:&:@#@$) :: (~>) a ((~>) a (Foo2 a))) where- sing = (singFun2 @(:&:@#@$)) (:%&:)- instance SingI d =>- SingI ((:&:@#@$$) (d :: a) :: (~>) a (Foo2 a)) where- sing = (singFun1 @((:&:@#@$$) (d :: a))) ((:%&:) (sing @d))- instance SingI1 ((:&:@#@$$) :: a -> (~>) a (Foo2 a)) where- liftSing (s :: Sing (d :: a))- = (singFun1 @((:&:@#@$$) (d :: a))) ((:%&:) s)- instance (SingI n, SingI n) =>- SingI (MkFoo3 (n :: Bool) (n :: Bool)) where- sing = (SMkFoo3 sing) sing- instance SingI n => SingI1 (MkFoo3 (n :: Bool)) where- liftSing = SMkFoo3 sing- instance SingI2 MkFoo3 where- liftSing2 = SMkFoo3- instance SingI (MkFoo3Sym0 :: (~>) Bool ((~>) Bool Foo3)) where- sing = (singFun2 @MkFoo3Sym0) SMkFoo3- instance SingI d =>- SingI (MkFoo3Sym1 (d :: Bool) :: (~>) Bool Foo3) where- sing = (singFun1 @(MkFoo3Sym1 (d :: Bool))) (SMkFoo3 (sing @d))- instance SingI1 (MkFoo3Sym1 :: Bool -> (~>) Bool Foo3) where- liftSing (s :: Sing (d :: Bool))- = (singFun1 @(MkFoo3Sym1 (d :: Bool))) (SMkFoo3 s)+Singletons/ShowDeriving.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| infixl 5 `MkFoo2b`, :*:, :&: + + data Foo1 + = MkFoo1 + deriving Show + data Foo2 a + = MkFoo2a a a | a `MkFoo2b` a | (:*:) a a | a :&: a + deriving Show + data Foo3 + = MkFoo3 {getFoo3a :: Bool, (***) :: Bool} + deriving Show |] + ======> + data Foo1 + = MkFoo1 + deriving Show + infixl 5 `MkFoo2b` + infixl 5 :*: + infixl 5 :&: + data Foo2 a + = MkFoo2a a a | a `MkFoo2b` a | (:*:) a a | a :&: a + deriving Show + data Foo3 + = MkFoo3 {getFoo3a :: Bool, (***) :: Bool} + deriving Show + type MkFoo1Sym0 :: Foo1 + type family MkFoo1Sym0 :: Foo1 where + MkFoo1Sym0 = MkFoo1 + type MkFoo2aSym0 :: forall a. (~>) a ((~>) a (Foo2 a)) + data MkFoo2aSym0 :: (~>) a ((~>) a (Foo2 a)) + where + MkFoo2aSym0KindInference :: SameKind (Apply MkFoo2aSym0 arg) (MkFoo2aSym1 arg) => + MkFoo2aSym0 a0123456789876543210 + type instance Apply MkFoo2aSym0 a0123456789876543210 = MkFoo2aSym1 a0123456789876543210 + instance SuppressUnusedWarnings MkFoo2aSym0 where + suppressUnusedWarnings = snd ((,) MkFoo2aSym0KindInference ()) + type MkFoo2aSym1 :: forall a. a -> (~>) a (Foo2 a) + data MkFoo2aSym1 (a0123456789876543210 :: a) :: (~>) a (Foo2 a) + where + MkFoo2aSym1KindInference :: SameKind (Apply (MkFoo2aSym1 a0123456789876543210) arg) (MkFoo2aSym2 a0123456789876543210 arg) => + MkFoo2aSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (MkFoo2aSym1 a0123456789876543210) a0123456789876543210 = MkFoo2a a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (MkFoo2aSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) MkFoo2aSym1KindInference ()) + type MkFoo2aSym2 :: forall a. a -> a -> Foo2 a + type family MkFoo2aSym2 (a0123456789876543210 :: a) (a0123456789876543210 :: a) :: Foo2 a where + MkFoo2aSym2 a0123456789876543210 a0123456789876543210 = MkFoo2a a0123456789876543210 a0123456789876543210 + type MkFoo2bSym0 :: forall a. (~>) a ((~>) a (Foo2 a)) + data MkFoo2bSym0 :: (~>) a ((~>) a (Foo2 a)) + where + MkFoo2bSym0KindInference :: SameKind (Apply MkFoo2bSym0 arg) (MkFoo2bSym1 arg) => + MkFoo2bSym0 a0123456789876543210 + type instance Apply MkFoo2bSym0 a0123456789876543210 = MkFoo2bSym1 a0123456789876543210 + instance SuppressUnusedWarnings MkFoo2bSym0 where + suppressUnusedWarnings = snd ((,) MkFoo2bSym0KindInference ()) + infixl 5 `MkFoo2bSym0` + type MkFoo2bSym1 :: forall a. a -> (~>) a (Foo2 a) + data MkFoo2bSym1 (a0123456789876543210 :: a) :: (~>) a (Foo2 a) + where + MkFoo2bSym1KindInference :: SameKind (Apply (MkFoo2bSym1 a0123456789876543210) arg) (MkFoo2bSym2 a0123456789876543210 arg) => + MkFoo2bSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (MkFoo2bSym1 a0123456789876543210) a0123456789876543210 = MkFoo2b a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (MkFoo2bSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) MkFoo2bSym1KindInference ()) + infixl 5 `MkFoo2bSym1` + type MkFoo2bSym2 :: forall a. a -> a -> Foo2 a + type family MkFoo2bSym2 (a0123456789876543210 :: a) (a0123456789876543210 :: a) :: Foo2 a where + MkFoo2bSym2 a0123456789876543210 a0123456789876543210 = MkFoo2b a0123456789876543210 a0123456789876543210 + infixl 5 `MkFoo2bSym2` + type (:*:@#@$) :: forall a. (~>) a ((~>) a (Foo2 a)) + data (:*:@#@$) :: (~>) a ((~>) a (Foo2 a)) + where + (::*:@#@$###) :: SameKind (Apply (:*:@#@$) arg) ((:*:@#@$$) arg) => + (:*:@#@$) a0123456789876543210 + type instance Apply (:*:@#@$) a0123456789876543210 = (:*:@#@$$) a0123456789876543210 + instance SuppressUnusedWarnings (:*:@#@$) where + suppressUnusedWarnings = snd ((,) (::*:@#@$###) ()) + infixl 5 :*:@#@$ + type (:*:@#@$$) :: forall a. a -> (~>) a (Foo2 a) + data (:*:@#@$$) (a0123456789876543210 :: a) :: (~>) a (Foo2 a) + where + (::*:@#@$$###) :: SameKind (Apply ((:*:@#@$$) a0123456789876543210) arg) ((:*:@#@$$$) a0123456789876543210 arg) => + (:*:@#@$$) a0123456789876543210 a0123456789876543210 + type instance Apply ((:*:@#@$$) a0123456789876543210) a0123456789876543210 = (:*:) a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings ((:*:@#@$$) a0123456789876543210) where + suppressUnusedWarnings = snd ((,) (::*:@#@$$###) ()) + infixl 5 :*:@#@$$ + type (:*:@#@$$$) :: forall a. a -> a -> Foo2 a + type family (:*:@#@$$$) (a0123456789876543210 :: a) (a0123456789876543210 :: a) :: Foo2 a where + (:*:@#@$$$) a0123456789876543210 a0123456789876543210 = (:*:) a0123456789876543210 a0123456789876543210 + infixl 5 :*:@#@$$$ + type (:&:@#@$) :: forall a. (~>) a ((~>) a (Foo2 a)) + data (:&:@#@$) :: (~>) a ((~>) a (Foo2 a)) + where + (::&:@#@$###) :: SameKind (Apply (:&:@#@$) arg) ((:&:@#@$$) arg) => + (:&:@#@$) a0123456789876543210 + type instance Apply (:&:@#@$) a0123456789876543210 = (:&:@#@$$) a0123456789876543210 + instance SuppressUnusedWarnings (:&:@#@$) where + suppressUnusedWarnings = snd ((,) (::&:@#@$###) ()) + infixl 5 :&:@#@$ + type (:&:@#@$$) :: forall a. a -> (~>) a (Foo2 a) + data (:&:@#@$$) (a0123456789876543210 :: a) :: (~>) a (Foo2 a) + where + (::&:@#@$$###) :: SameKind (Apply ((:&:@#@$$) a0123456789876543210) arg) ((:&:@#@$$$) a0123456789876543210 arg) => + (:&:@#@$$) a0123456789876543210 a0123456789876543210 + type instance Apply ((:&:@#@$$) a0123456789876543210) a0123456789876543210 = (:&:) a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings ((:&:@#@$$) a0123456789876543210) where + suppressUnusedWarnings = snd ((,) (::&:@#@$$###) ()) + infixl 5 :&:@#@$$ + type (:&:@#@$$$) :: forall a. a -> a -> Foo2 a + type family (:&:@#@$$$) (a0123456789876543210 :: a) (a0123456789876543210 :: a) :: Foo2 a where + (:&:@#@$$$) a0123456789876543210 a0123456789876543210 = (:&:) a0123456789876543210 a0123456789876543210 + infixl 5 :&:@#@$$$ + type MkFoo3Sym0 :: (~>) Bool ((~>) Bool Foo3) + data MkFoo3Sym0 :: (~>) Bool ((~>) Bool Foo3) + where + MkFoo3Sym0KindInference :: SameKind (Apply MkFoo3Sym0 arg) (MkFoo3Sym1 arg) => + MkFoo3Sym0 a0123456789876543210 + type instance Apply MkFoo3Sym0 a0123456789876543210 = MkFoo3Sym1 a0123456789876543210 + instance SuppressUnusedWarnings MkFoo3Sym0 where + suppressUnusedWarnings = snd ((,) MkFoo3Sym0KindInference ()) + type MkFoo3Sym1 :: Bool -> (~>) Bool Foo3 + data MkFoo3Sym1 (a0123456789876543210 :: Bool) :: (~>) Bool Foo3 + where + MkFoo3Sym1KindInference :: SameKind (Apply (MkFoo3Sym1 a0123456789876543210) arg) (MkFoo3Sym2 a0123456789876543210 arg) => + MkFoo3Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (MkFoo3Sym1 a0123456789876543210) a0123456789876543210 = MkFoo3 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (MkFoo3Sym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) MkFoo3Sym1KindInference ()) + type MkFoo3Sym2 :: Bool -> Bool -> Foo3 + type family MkFoo3Sym2 (a0123456789876543210 :: Bool) (a0123456789876543210 :: Bool) :: Foo3 where + MkFoo3Sym2 a0123456789876543210 a0123456789876543210 = MkFoo3 a0123456789876543210 a0123456789876543210 + type (***@#@$) :: (~>) Foo3 Bool + data (***@#@$) :: (~>) Foo3 Bool + where + (:***@#@$###) :: SameKind (Apply (***@#@$) arg) ((***@#@$$) arg) => + (***@#@$) a0123456789876543210 + type instance Apply (***@#@$) a0123456789876543210 = (***) a0123456789876543210 + instance SuppressUnusedWarnings (***@#@$) where + suppressUnusedWarnings = snd ((,) (:***@#@$###) ()) + type (***@#@$$) :: Foo3 -> Bool + type family (***@#@$$) (a0123456789876543210 :: Foo3) :: Bool where + (***@#@$$) a0123456789876543210 = (***) a0123456789876543210 + type GetFoo3aSym0 :: (~>) Foo3 Bool + data GetFoo3aSym0 :: (~>) Foo3 Bool + where + GetFoo3aSym0KindInference :: SameKind (Apply GetFoo3aSym0 arg) (GetFoo3aSym1 arg) => + GetFoo3aSym0 a0123456789876543210 + type instance Apply GetFoo3aSym0 a0123456789876543210 = GetFoo3a a0123456789876543210 + instance SuppressUnusedWarnings GetFoo3aSym0 where + suppressUnusedWarnings = snd ((,) GetFoo3aSym0KindInference ()) + type GetFoo3aSym1 :: Foo3 -> Bool + type family GetFoo3aSym1 (a0123456789876543210 :: Foo3) :: Bool where + GetFoo3aSym1 a0123456789876543210 = GetFoo3a a0123456789876543210 + type (***) :: Foo3 -> Bool + type family (***) (a :: Foo3) :: Bool where + (***) (MkFoo3 _ field) = field + type GetFoo3a :: Foo3 -> Bool + type family GetFoo3a (a :: Foo3) :: Bool where + GetFoo3a (MkFoo3 field _) = field + type ShowsPrec_0123456789876543210 :: GHC.Num.Natural.Natural + -> Foo1 -> Symbol -> Symbol + type family ShowsPrec_0123456789876543210 (a :: GHC.Num.Natural.Natural) (a :: Foo1) (a :: Symbol) :: Symbol where + ShowsPrec_0123456789876543210 _ MkFoo1 a_0123456789876543210 = Apply (Apply ShowStringSym0 "MkFoo1") a_0123456789876543210 + type ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) Foo1 ((~>) Symbol Symbol)) + data ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) Foo1 ((~>) Symbol Symbol)) + where + ShowsPrec_0123456789876543210Sym0KindInference :: SameKind (Apply ShowsPrec_0123456789876543210Sym0 arg) (ShowsPrec_0123456789876543210Sym1 arg) => + ShowsPrec_0123456789876543210Sym0 a0123456789876543210 + type instance Apply ShowsPrec_0123456789876543210Sym0 a0123456789876543210 = ShowsPrec_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings ShowsPrec_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym0KindInference ()) + type ShowsPrec_0123456789876543210Sym1 :: GHC.Num.Natural.Natural + -> (~>) Foo1 ((~>) Symbol Symbol) + data ShowsPrec_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Num.Natural.Natural) :: (~>) Foo1 ((~>) Symbol Symbol) + where + ShowsPrec_0123456789876543210Sym1KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 arg) => + ShowsPrec_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym1KindInference ()) + type ShowsPrec_0123456789876543210Sym2 :: GHC.Num.Natural.Natural + -> Foo1 -> (~>) Symbol Symbol + data ShowsPrec_0123456789876543210Sym2 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: Foo1) :: (~>) Symbol Symbol + where + ShowsPrec_0123456789876543210Sym2KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 arg) => + ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym2KindInference ()) + type ShowsPrec_0123456789876543210Sym3 :: GHC.Num.Natural.Natural + -> Foo1 -> Symbol -> Symbol + type family ShowsPrec_0123456789876543210Sym3 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: Foo1) (a0123456789876543210 :: Symbol) :: Symbol where + ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PShow Foo1 where + type ShowsPrec a a a = Apply (Apply (Apply ShowsPrec_0123456789876543210Sym0 a) a) a + type ShowsPrec_0123456789876543210 :: GHC.Num.Natural.Natural + -> Foo2 a -> Symbol -> Symbol + type family ShowsPrec_0123456789876543210 (a :: GHC.Num.Natural.Natural) (a :: Foo2 a) (a :: Symbol) :: Symbol where + ShowsPrec_0123456789876543210 p_0123456789876543210 (MkFoo2a arg_0123456789876543210 arg_0123456789876543210) a_0123456789876543210 = Apply (Apply (Apply ShowParenSym0 (Apply (Apply (>@#@$) p_0123456789876543210) (FromInteger 10))) (Apply (Apply (.@#@$) (Apply ShowStringSym0 "MkFoo2a ")) (Apply (Apply (.@#@$) (Apply (Apply ShowsPrecSym0 (FromInteger 11)) arg_0123456789876543210)) (Apply (Apply (.@#@$) ShowSpaceSym0) (Apply (Apply ShowsPrecSym0 (FromInteger 11)) arg_0123456789876543210))))) a_0123456789876543210 + ShowsPrec_0123456789876543210 p_0123456789876543210 (MkFoo2b argL_0123456789876543210 argR_0123456789876543210) a_0123456789876543210 = Apply (Apply (Apply ShowParenSym0 (Apply (Apply (>@#@$) p_0123456789876543210) (FromInteger 5))) (Apply (Apply (.@#@$) (Apply (Apply ShowsPrecSym0 (FromInteger 6)) argL_0123456789876543210)) (Apply (Apply (.@#@$) (Apply ShowStringSym0 " `MkFoo2b` ")) (Apply (Apply ShowsPrecSym0 (FromInteger 6)) argR_0123456789876543210)))) a_0123456789876543210 + ShowsPrec_0123456789876543210 p_0123456789876543210 ((:*:) arg_0123456789876543210 arg_0123456789876543210) a_0123456789876543210 = Apply (Apply (Apply ShowParenSym0 (Apply (Apply (>@#@$) p_0123456789876543210) (FromInteger 10))) (Apply (Apply (.@#@$) (Apply ShowStringSym0 "(:*:) ")) (Apply (Apply (.@#@$) (Apply (Apply ShowsPrecSym0 (FromInteger 11)) arg_0123456789876543210)) (Apply (Apply (.@#@$) ShowSpaceSym0) (Apply (Apply ShowsPrecSym0 (FromInteger 11)) arg_0123456789876543210))))) a_0123456789876543210 + ShowsPrec_0123456789876543210 p_0123456789876543210 ((:&:) argL_0123456789876543210 argR_0123456789876543210) a_0123456789876543210 = Apply (Apply (Apply ShowParenSym0 (Apply (Apply (>@#@$) p_0123456789876543210) (FromInteger 5))) (Apply (Apply (.@#@$) (Apply (Apply ShowsPrecSym0 (FromInteger 6)) argL_0123456789876543210)) (Apply (Apply (.@#@$) (Apply ShowStringSym0 " :&: ")) (Apply (Apply ShowsPrecSym0 (FromInteger 6)) argR_0123456789876543210)))) a_0123456789876543210 + type ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) (Foo2 a) ((~>) Symbol Symbol)) + data ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) (Foo2 a) ((~>) Symbol Symbol)) + where + ShowsPrec_0123456789876543210Sym0KindInference :: SameKind (Apply ShowsPrec_0123456789876543210Sym0 arg) (ShowsPrec_0123456789876543210Sym1 arg) => + ShowsPrec_0123456789876543210Sym0 a0123456789876543210 + type instance Apply ShowsPrec_0123456789876543210Sym0 a0123456789876543210 = ShowsPrec_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings ShowsPrec_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym0KindInference ()) + type ShowsPrec_0123456789876543210Sym1 :: GHC.Num.Natural.Natural + -> (~>) (Foo2 a) ((~>) Symbol Symbol) + data ShowsPrec_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Num.Natural.Natural) :: (~>) (Foo2 a) ((~>) Symbol Symbol) + where + ShowsPrec_0123456789876543210Sym1KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 arg) => + ShowsPrec_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym1KindInference ()) + type ShowsPrec_0123456789876543210Sym2 :: GHC.Num.Natural.Natural + -> Foo2 a -> (~>) Symbol Symbol + data ShowsPrec_0123456789876543210Sym2 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: Foo2 a) :: (~>) Symbol Symbol + where + ShowsPrec_0123456789876543210Sym2KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 arg) => + ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym2KindInference ()) + type ShowsPrec_0123456789876543210Sym3 :: GHC.Num.Natural.Natural + -> Foo2 a -> Symbol -> Symbol + type family ShowsPrec_0123456789876543210Sym3 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: Foo2 a) (a0123456789876543210 :: Symbol) :: Symbol where + ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PShow (Foo2 a) where + type ShowsPrec a a a = Apply (Apply (Apply ShowsPrec_0123456789876543210Sym0 a) a) a + type ShowsPrec_0123456789876543210 :: GHC.Num.Natural.Natural + -> Foo3 -> Symbol -> Symbol + type family ShowsPrec_0123456789876543210 (a :: GHC.Num.Natural.Natural) (a :: Foo3) (a :: Symbol) :: Symbol where + ShowsPrec_0123456789876543210 p_0123456789876543210 (MkFoo3 arg_0123456789876543210 arg_0123456789876543210) a_0123456789876543210 = Apply (Apply (Apply ShowParenSym0 (Apply (Apply (>@#@$) p_0123456789876543210) (FromInteger 10))) (Apply (Apply (.@#@$) (Apply ShowStringSym0 "MkFoo3 ")) (Apply (Apply (.@#@$) (Apply ShowCharSym0 '{')) (Apply (Apply (.@#@$) (Apply ShowStringSym0 "getFoo3a = ")) (Apply (Apply (.@#@$) (Apply (Apply ShowsPrecSym0 (FromInteger 0)) arg_0123456789876543210)) (Apply (Apply (.@#@$) ShowCommaSpaceSym0) (Apply (Apply (.@#@$) (Apply ShowStringSym0 "(***) = ")) (Apply (Apply (.@#@$) (Apply (Apply ShowsPrecSym0 (FromInteger 0)) arg_0123456789876543210)) (Apply ShowCharSym0 '}'))))))))) a_0123456789876543210 + type ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) Foo3 ((~>) Symbol Symbol)) + data ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) Foo3 ((~>) Symbol Symbol)) + where + ShowsPrec_0123456789876543210Sym0KindInference :: SameKind (Apply ShowsPrec_0123456789876543210Sym0 arg) (ShowsPrec_0123456789876543210Sym1 arg) => + ShowsPrec_0123456789876543210Sym0 a0123456789876543210 + type instance Apply ShowsPrec_0123456789876543210Sym0 a0123456789876543210 = ShowsPrec_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings ShowsPrec_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym0KindInference ()) + type ShowsPrec_0123456789876543210Sym1 :: GHC.Num.Natural.Natural + -> (~>) Foo3 ((~>) Symbol Symbol) + data ShowsPrec_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Num.Natural.Natural) :: (~>) Foo3 ((~>) Symbol Symbol) + where + ShowsPrec_0123456789876543210Sym1KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 arg) => + ShowsPrec_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym1KindInference ()) + type ShowsPrec_0123456789876543210Sym2 :: GHC.Num.Natural.Natural + -> Foo3 -> (~>) Symbol Symbol + data ShowsPrec_0123456789876543210Sym2 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: Foo3) :: (~>) Symbol Symbol + where + ShowsPrec_0123456789876543210Sym2KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 arg) => + ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym2KindInference ()) + type ShowsPrec_0123456789876543210Sym3 :: GHC.Num.Natural.Natural + -> Foo3 -> Symbol -> Symbol + type family ShowsPrec_0123456789876543210Sym3 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: Foo3) (a0123456789876543210 :: Symbol) :: Symbol where + ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PShow Foo3 where + type ShowsPrec a a a = Apply (Apply (Apply ShowsPrec_0123456789876543210Sym0 a) a) a + infixl 5 :%&: + infixl 5 :%*: + infixl 5 `SMkFoo2b` + (%***) :: + (forall (t :: Foo3). + Sing t -> Sing (Apply (***@#@$) t :: Bool) :: Type) + sGetFoo3a :: + (forall (t :: Foo3). + Sing t -> Sing (Apply GetFoo3aSym0 t :: Bool) :: Type) + (%***) (SMkFoo3 _ (sField :: Sing field)) = sField + sGetFoo3a (SMkFoo3 (sField :: Sing field) _) = sField + instance SingI ((***@#@$) :: (~>) Foo3 Bool) where + sing = singFun1 @(***@#@$) (%***) + instance SingI (GetFoo3aSym0 :: (~>) Foo3 Bool) where + sing = singFun1 @GetFoo3aSym0 sGetFoo3a + data SFoo1 :: Foo1 -> Type where SMkFoo1 :: SFoo1 (MkFoo1 :: Foo1) + type instance Sing @Foo1 = SFoo1 + instance SingKind Foo1 where + type Demote Foo1 = Foo1 + fromSing SMkFoo1 = MkFoo1 + toSing MkFoo1 = SomeSing SMkFoo1 + data SFoo2 :: forall a. Foo2 a -> Type + where + SMkFoo2a :: forall a (n :: a) (n :: a). + (Sing n) -> (Sing n) -> SFoo2 (MkFoo2a n n :: Foo2 a) + SMkFoo2b :: forall a (n :: a) (n :: a). + (Sing n) -> (Sing n) -> SFoo2 (MkFoo2b n n :: Foo2 a) + (:%*:) :: forall a (n :: a) (n :: a). + (Sing n) -> (Sing n) -> SFoo2 ((:*:) n n :: Foo2 a) + (:%&:) :: forall a (n :: a) (n :: a). + (Sing n) -> (Sing n) -> SFoo2 ((:&:) n n :: Foo2 a) + type instance Sing @(Foo2 a) = SFoo2 + instance SingKind a => SingKind (Foo2 a) where + type Demote (Foo2 a) = Foo2 (Demote a) + fromSing (SMkFoo2a b b) = MkFoo2a (fromSing b) (fromSing b) + fromSing (SMkFoo2b b b) = MkFoo2b (fromSing b) (fromSing b) + fromSing ((:%*:) b b) = (:*:) (fromSing b) (fromSing b) + fromSing ((:%&:) b b) = (:&:) (fromSing b) (fromSing b) + toSing (MkFoo2a (b :: Demote a) (b :: Demote a)) + = case (,) (toSing b :: SomeSing a) (toSing b :: SomeSing a) of + (,) (SomeSing c) (SomeSing c) -> SomeSing (SMkFoo2a c c) + toSing (MkFoo2b (b :: Demote a) (b :: Demote a)) + = case (,) (toSing b :: SomeSing a) (toSing b :: SomeSing a) of + (,) (SomeSing c) (SomeSing c) -> SomeSing (SMkFoo2b c c) + toSing ((:*:) (b :: Demote a) (b :: Demote a)) + = case (,) (toSing b :: SomeSing a) (toSing b :: SomeSing a) of + (,) (SomeSing c) (SomeSing c) -> SomeSing ((:%*:) c c) + toSing ((:&:) (b :: Demote a) (b :: Demote a)) + = case (,) (toSing b :: SomeSing a) (toSing b :: SomeSing a) of + (,) (SomeSing c) (SomeSing c) -> SomeSing ((:%&:) c c) + data SFoo3 :: Foo3 -> Type + where + SMkFoo3 :: forall (n :: Bool) (n :: Bool). + (Sing n) -> (Sing n) -> SFoo3 (MkFoo3 n n :: Foo3) + type instance Sing @Foo3 = SFoo3 + instance SingKind Foo3 where + type Demote Foo3 = Foo3 + fromSing (SMkFoo3 b b) = MkFoo3 (fromSing b) (fromSing b) + toSing (MkFoo3 (b :: Demote Bool) (b :: Demote Bool)) + = case + (,) (toSing b :: SomeSing Bool) (toSing b :: SomeSing Bool) + of + (,) (SomeSing c) (SomeSing c) -> SomeSing (SMkFoo3 c c) + instance SShow Foo1 where + sShowsPrec :: + forall (t1 :: GHC.Num.Natural.Natural) + (t2 :: Foo1) + (t3 :: Symbol). Sing t1 + -> Sing t2 + -> Sing t3 + -> Sing (Apply (Apply (Apply (ShowsPrecSym0 :: TyFun GHC.Num.Natural.Natural ((~>) Foo1 ((~>) Symbol Symbol)) + -> Type) t1) t2) t3) + sShowsPrec + _ + SMkFoo1 + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "MkFoo1")) + sA_0123456789876543210 + instance SShow a => SShow (Foo2 a) where + sShowsPrec :: + forall (t1 :: GHC.Num.Natural.Natural) + (t2 :: Foo2 a) + (t3 :: Symbol). Sing t1 + -> Sing t2 + -> Sing t3 + -> Sing (Apply (Apply (Apply (ShowsPrecSym0 :: TyFun GHC.Num.Natural.Natural ((~>) (Foo2 a) ((~>) Symbol Symbol)) + -> Type) t1) t2) t3) + sShowsPrec + (sP_0123456789876543210 :: Sing p_0123456789876543210) + (SMkFoo2a (sArg_0123456789876543210 :: Sing arg_0123456789876543210) + (sArg_0123456789876543210 :: Sing arg_0123456789876543210)) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (applySing + (singFun3 @ShowParenSym0 sShowParen) + (applySing + (applySing (singFun2 @(>@#@$) (%>)) sP_0123456789876543210) + (sFromInteger (sing :: Sing 10)))) + (applySing + (applySing + (singFun3 @(.@#@$) (%.)) + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "MkFoo2a "))) + (applySing + (applySing + (singFun3 @(.@#@$) (%.)) + (applySing + (applySing + (singFun3 @ShowsPrecSym0 sShowsPrec) + (sFromInteger (sing :: Sing 11))) + sArg_0123456789876543210)) + (applySing + (applySing + (singFun3 @(.@#@$) (%.)) (singFun1 @ShowSpaceSym0 sShowSpace)) + (applySing + (applySing + (singFun3 @ShowsPrecSym0 sShowsPrec) + (sFromInteger (sing :: Sing 11))) + sArg_0123456789876543210))))) + sA_0123456789876543210 + sShowsPrec + (sP_0123456789876543210 :: Sing p_0123456789876543210) + (SMkFoo2b (sArgL_0123456789876543210 :: Sing argL_0123456789876543210) + (sArgR_0123456789876543210 :: Sing argR_0123456789876543210)) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (applySing + (singFun3 @ShowParenSym0 sShowParen) + (applySing + (applySing (singFun2 @(>@#@$) (%>)) sP_0123456789876543210) + (sFromInteger (sing :: Sing 5)))) + (applySing + (applySing + (singFun3 @(.@#@$) (%.)) + (applySing + (applySing + (singFun3 @ShowsPrecSym0 sShowsPrec) + (sFromInteger (sing :: Sing 6))) + sArgL_0123456789876543210)) + (applySing + (applySing + (singFun3 @(.@#@$) (%.)) + (applySing + (singFun2 @ShowStringSym0 sShowString) + (sing :: Sing " `MkFoo2b` "))) + (applySing + (applySing + (singFun3 @ShowsPrecSym0 sShowsPrec) + (sFromInteger (sing :: Sing 6))) + sArgR_0123456789876543210)))) + sA_0123456789876543210 + sShowsPrec + (sP_0123456789876543210 :: Sing p_0123456789876543210) + ((:%*:) (sArg_0123456789876543210 :: Sing arg_0123456789876543210) + (sArg_0123456789876543210 :: Sing arg_0123456789876543210)) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (applySing + (singFun3 @ShowParenSym0 sShowParen) + (applySing + (applySing (singFun2 @(>@#@$) (%>)) sP_0123456789876543210) + (sFromInteger (sing :: Sing 10)))) + (applySing + (applySing + (singFun3 @(.@#@$) (%.)) + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "(:*:) "))) + (applySing + (applySing + (singFun3 @(.@#@$) (%.)) + (applySing + (applySing + (singFun3 @ShowsPrecSym0 sShowsPrec) + (sFromInteger (sing :: Sing 11))) + sArg_0123456789876543210)) + (applySing + (applySing + (singFun3 @(.@#@$) (%.)) (singFun1 @ShowSpaceSym0 sShowSpace)) + (applySing + (applySing + (singFun3 @ShowsPrecSym0 sShowsPrec) + (sFromInteger (sing :: Sing 11))) + sArg_0123456789876543210))))) + sA_0123456789876543210 + sShowsPrec + (sP_0123456789876543210 :: Sing p_0123456789876543210) + ((:%&:) (sArgL_0123456789876543210 :: Sing argL_0123456789876543210) + (sArgR_0123456789876543210 :: Sing argR_0123456789876543210)) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (applySing + (singFun3 @ShowParenSym0 sShowParen) + (applySing + (applySing (singFun2 @(>@#@$) (%>)) sP_0123456789876543210) + (sFromInteger (sing :: Sing 5)))) + (applySing + (applySing + (singFun3 @(.@#@$) (%.)) + (applySing + (applySing + (singFun3 @ShowsPrecSym0 sShowsPrec) + (sFromInteger (sing :: Sing 6))) + sArgL_0123456789876543210)) + (applySing + (applySing + (singFun3 @(.@#@$) (%.)) + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing " :&: "))) + (applySing + (applySing + (singFun3 @ShowsPrecSym0 sShowsPrec) + (sFromInteger (sing :: Sing 6))) + sArgR_0123456789876543210)))) + sA_0123456789876543210 + instance SShow Bool => SShow Foo3 where + sShowsPrec :: + forall (t1 :: GHC.Num.Natural.Natural) + (t2 :: Foo3) + (t3 :: Symbol). Sing t1 + -> Sing t2 + -> Sing t3 + -> Sing (Apply (Apply (Apply (ShowsPrecSym0 :: TyFun GHC.Num.Natural.Natural ((~>) Foo3 ((~>) Symbol Symbol)) + -> Type) t1) t2) t3) + sShowsPrec + (sP_0123456789876543210 :: Sing p_0123456789876543210) + (SMkFoo3 (sArg_0123456789876543210 :: Sing arg_0123456789876543210) + (sArg_0123456789876543210 :: Sing arg_0123456789876543210)) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (applySing + (singFun3 @ShowParenSym0 sShowParen) + (applySing + (applySing (singFun2 @(>@#@$) (%>)) sP_0123456789876543210) + (sFromInteger (sing :: Sing 10)))) + (applySing + (applySing + (singFun3 @(.@#@$) (%.)) + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "MkFoo3 "))) + (applySing + (applySing + (singFun3 @(.@#@$) (%.)) + (applySing (singFun2 @ShowCharSym0 sShowChar) (sing :: Sing '{'))) + (applySing + (applySing + (singFun3 @(.@#@$) (%.)) + (applySing + (singFun2 @ShowStringSym0 sShowString) + (sing :: Sing "getFoo3a = "))) + (applySing + (applySing + (singFun3 @(.@#@$) (%.)) + (applySing + (applySing + (singFun3 @ShowsPrecSym0 sShowsPrec) + (sFromInteger (sing :: Sing 0))) + sArg_0123456789876543210)) + (applySing + (applySing + (singFun3 @(.@#@$) (%.)) + (singFun1 @ShowCommaSpaceSym0 sShowCommaSpace)) + (applySing + (applySing + (singFun3 @(.@#@$) (%.)) + (applySing + (singFun2 @ShowStringSym0 sShowString) + (sing :: Sing "(***) = "))) + (applySing + (applySing + (singFun3 @(.@#@$) (%.)) + (applySing + (applySing + (singFun3 @ShowsPrecSym0 sShowsPrec) + (sFromInteger (sing :: Sing 0))) + sArg_0123456789876543210)) + (applySing + (singFun2 @ShowCharSym0 sShowChar) + (sing :: Sing '}')))))))))) + sA_0123456789876543210 + deriving instance Show (SFoo1 (z :: Foo1)) + deriving instance Data.Singletons.ShowSing.ShowSing a => + Show (SFoo2 (z :: Foo2 a)) + deriving instance Data.Singletons.ShowSing.ShowSing Bool => + Show (SFoo3 (z :: Foo3)) + instance SingI MkFoo1 where + sing = SMkFoo1 + instance (SingI n, SingI n) => + SingI (MkFoo2a (n :: a) (n :: a)) where + sing = SMkFoo2a sing sing + instance SingI n => SingI1 (MkFoo2a (n :: a)) where + liftSing = SMkFoo2a sing + instance SingI2 MkFoo2a where + liftSing2 = SMkFoo2a + instance SingI (MkFoo2aSym0 :: (~>) a ((~>) a (Foo2 a))) where + sing = singFun2 @MkFoo2aSym0 SMkFoo2a + instance SingI d => + SingI (MkFoo2aSym1 (d :: a) :: (~>) a (Foo2 a)) where + sing = singFun1 @(MkFoo2aSym1 (d :: a)) (SMkFoo2a (sing @d)) + instance SingI1 (MkFoo2aSym1 :: a -> (~>) a (Foo2 a)) where + liftSing (s :: Sing (d :: a)) + = singFun1 @(MkFoo2aSym1 (d :: a)) (SMkFoo2a s) + instance (SingI n, SingI n) => + SingI (MkFoo2b (n :: a) (n :: a)) where + sing = SMkFoo2b sing sing + instance SingI n => SingI1 (MkFoo2b (n :: a)) where + liftSing = SMkFoo2b sing + instance SingI2 MkFoo2b where + liftSing2 = SMkFoo2b + instance SingI (MkFoo2bSym0 :: (~>) a ((~>) a (Foo2 a))) where + sing = singFun2 @MkFoo2bSym0 SMkFoo2b + instance SingI d => + SingI (MkFoo2bSym1 (d :: a) :: (~>) a (Foo2 a)) where + sing = singFun1 @(MkFoo2bSym1 (d :: a)) (SMkFoo2b (sing @d)) + instance SingI1 (MkFoo2bSym1 :: a -> (~>) a (Foo2 a)) where + liftSing (s :: Sing (d :: a)) + = singFun1 @(MkFoo2bSym1 (d :: a)) (SMkFoo2b s) + instance (SingI n, SingI n) => + SingI ((:*:) (n :: a) (n :: a)) where + sing = (:%*:) sing sing + instance SingI n => SingI1 ((:*:) (n :: a)) where + liftSing = (:%*:) sing + instance SingI2 (:*:) where + liftSing2 = (:%*:) + instance SingI ((:*:@#@$) :: (~>) a ((~>) a (Foo2 a))) where + sing = singFun2 @(:*:@#@$) (:%*:) + instance SingI d => + SingI ((:*:@#@$$) (d :: a) :: (~>) a (Foo2 a)) where + sing = singFun1 @((:*:@#@$$) (d :: a)) ((:%*:) (sing @d)) + instance SingI1 ((:*:@#@$$) :: a -> (~>) a (Foo2 a)) where + liftSing (s :: Sing (d :: a)) + = singFun1 @((:*:@#@$$) (d :: a)) ((:%*:) s) + instance (SingI n, SingI n) => + SingI ((:&:) (n :: a) (n :: a)) where + sing = (:%&:) sing sing + instance SingI n => SingI1 ((:&:) (n :: a)) where + liftSing = (:%&:) sing + instance SingI2 (:&:) where + liftSing2 = (:%&:) + instance SingI ((:&:@#@$) :: (~>) a ((~>) a (Foo2 a))) where + sing = singFun2 @(:&:@#@$) (:%&:) + instance SingI d => + SingI ((:&:@#@$$) (d :: a) :: (~>) a (Foo2 a)) where + sing = singFun1 @((:&:@#@$$) (d :: a)) ((:%&:) (sing @d)) + instance SingI1 ((:&:@#@$$) :: a -> (~>) a (Foo2 a)) where + liftSing (s :: Sing (d :: a)) + = singFun1 @((:&:@#@$$) (d :: a)) ((:%&:) s) + instance (SingI n, SingI n) => + SingI (MkFoo3 (n :: Bool) (n :: Bool)) where + sing = SMkFoo3 sing sing + instance SingI n => SingI1 (MkFoo3 (n :: Bool)) where + liftSing = SMkFoo3 sing + instance SingI2 MkFoo3 where + liftSing2 = SMkFoo3 + instance SingI (MkFoo3Sym0 :: (~>) Bool ((~>) Bool Foo3)) where + sing = singFun2 @MkFoo3Sym0 SMkFoo3 + instance SingI d => + SingI (MkFoo3Sym1 (d :: Bool) :: (~>) Bool Foo3) where + sing = singFun1 @(MkFoo3Sym1 (d :: Bool)) (SMkFoo3 (sing @d)) + instance SingI1 (MkFoo3Sym1 :: Bool -> (~>) Bool Foo3) where + liftSing (s :: Sing (d :: Bool)) + = singFun1 @(MkFoo3Sym1 (d :: Bool)) (SMkFoo3 s)
tests/compile-and-dump/Singletons/ShowDeriving.hs view
@@ -1,41 +1,41 @@-module Singletons.ShowDeriving where--import Data.Type.Equality-import Data.Singletons.TH-import Prelude.Singletons-import Text.Show.Singletons--$(singletons [d|- data Foo1 = MkFoo1 deriving Show-- infixl 5 `MkFoo2b`, :*:, :&:- data Foo2 a = MkFoo2a a a- | a `MkFoo2b` a- | (:*:) a a- | a :&: a- deriving Show-- data Foo3 = MkFoo3 { getFoo3a :: Bool, (***) :: Bool } deriving Show-- |])--foo1 :: "MkFoo1" :~: Show_ MkFoo1-foo1 = Refl--foo2a :: "(MkFoo2a LT GT)" :~: ShowsPrec 11 (MkFoo2a LT GT) ""-foo2a = Refl--foo2b :: "True `MkFoo2b` False" :~: Show_ (True `MkFoo2b` False)-foo2b = Refl--foo2c :: "(:*:) () ()" :~: Show_ ('() :*: '())-foo2c = Refl--foo2d' :: "False :&: True" :~: ShowsPrec 5 (False :&: True) ""-foo2d' = Refl--foo2d'' :: "(False :&: True)" :~: ShowsPrec 6 (False :&: True) ""-foo2d'' = Refl--foo3 :: "MkFoo3 {getFoo3a = True, (***) = False}" :~: Show_ (MkFoo3 True False)-foo3 = Refl+module Singletons.ShowDeriving where + +import Data.Type.Equality +import Data.Singletons.TH +import Prelude.Singletons +import Text.Show.Singletons + +$(singletons [d| + data Foo1 = MkFoo1 deriving Show + + infixl 5 `MkFoo2b`, :*:, :&: + data Foo2 a = MkFoo2a a a + | a `MkFoo2b` a + | (:*:) a a + | a :&: a + deriving Show + + data Foo3 = MkFoo3 { getFoo3a :: Bool, (***) :: Bool } deriving Show + + |]) + +foo1 :: "MkFoo1" :~: Show_ MkFoo1 +foo1 = Refl + +foo2a :: "(MkFoo2a LT GT)" :~: ShowsPrec 11 (MkFoo2a LT GT) "" +foo2a = Refl + +foo2b :: "True `MkFoo2b` False" :~: Show_ (True `MkFoo2b` False) +foo2b = Refl + +foo2c :: "(:*:) () ()" :~: Show_ ('() :*: '()) +foo2c = Refl + +foo2d' :: "False :&: True" :~: ShowsPrec 5 (False :&: True) "" +foo2d' = Refl + +foo2d'' :: "(False :&: True)" :~: ShowsPrec 6 (False :&: True) "" +foo2d'' = Refl + +foo3 :: "MkFoo3 {getFoo3a = True, (***) = False}" :~: Show_ (MkFoo3 True False) +foo3 = Refl
tests/compile-and-dump/Singletons/StandaloneDeriving.golden view
@@ -1,548 +1,553 @@-Singletons/StandaloneDeriving.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| infixl 6 :*:- - data T a b = a :*: b- data S = S1 | S2- - deriving instance Enum S- deriving instance Bounded S- deriving instance Show S- deriving instance Ord S- deriving instance Eq S- deriving instance Show a => Show (T a ())- deriving instance Ord a => Ord (T a ())- deriving instance Eq a => Eq (T a ()) |]- ======>- infixl 6 :*:- data T a b = a :*: b- data S = S1 | S2- deriving instance Eq a => Eq (T a ())- deriving instance Ord a => Ord (T a ())- deriving instance Show a => Show (T a ())- deriving instance Eq S- deriving instance Ord S- deriving instance Show S- deriving instance Bounded S- deriving instance Enum S- type (:*:@#@$) :: forall a b. (~>) a ((~>) b (T a b))- data (:*:@#@$) :: (~>) a ((~>) b (T a b))- where- (::*:@#@$###) :: SameKind (Apply (:*:@#@$) arg) ((:*:@#@$$) arg) =>- (:*:@#@$) a0123456789876543210- type instance Apply (:*:@#@$) a0123456789876543210 = (:*:@#@$$) a0123456789876543210- instance SuppressUnusedWarnings (:*:@#@$) where- suppressUnusedWarnings = snd (((,) (::*:@#@$###)) ())- infixl 6 :*:@#@$- type (:*:@#@$$) :: forall a b. a -> (~>) b (T a b)- data (:*:@#@$$) (a0123456789876543210 :: a) :: (~>) b (T a b)- where- (::*:@#@$$###) :: SameKind (Apply ((:*:@#@$$) a0123456789876543210) arg) ((:*:@#@$$$) a0123456789876543210 arg) =>- (:*:@#@$$) a0123456789876543210 a0123456789876543210- type instance Apply ((:*:@#@$$) a0123456789876543210) a0123456789876543210 = (:*:) a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings ((:*:@#@$$) a0123456789876543210) where- suppressUnusedWarnings = snd (((,) (::*:@#@$$###)) ())- infixl 6 :*:@#@$$- type (:*:@#@$$$) :: forall a b. a -> b -> T a b- type family (:*:@#@$$$) (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: T a b where- (:*:@#@$$$) a0123456789876543210 a0123456789876543210 = (:*:) a0123456789876543210 a0123456789876543210- infixl 6 :*:@#@$$$- type S1Sym0 :: S- type family S1Sym0 :: S where- S1Sym0 = S1- type S2Sym0 :: S- type family S2Sym0 :: S where- S2Sym0 = S2- type TFHelper_0123456789876543210 :: T a () -> T a () -> Bool- type family TFHelper_0123456789876543210 (a :: T a ()) (a :: T a ()) :: Bool where- TFHelper_0123456789876543210 ((:*:) a_0123456789876543210 a_0123456789876543210) ((:*:) b_0123456789876543210 b_0123456789876543210) = Apply (Apply (&&@#@$) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)- type TFHelper_0123456789876543210Sym0 :: (~>) (T a ()) ((~>) (T a ()) Bool)- data TFHelper_0123456789876543210Sym0 :: (~>) (T a ()) ((~>) (T a ()) Bool)- where- TFHelper_0123456789876543210Sym0KindInference :: SameKind (Apply TFHelper_0123456789876543210Sym0 arg) (TFHelper_0123456789876543210Sym1 arg) =>- TFHelper_0123456789876543210Sym0 a0123456789876543210- type instance Apply TFHelper_0123456789876543210Sym0 a0123456789876543210 = TFHelper_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings TFHelper_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) TFHelper_0123456789876543210Sym0KindInference) ())- type TFHelper_0123456789876543210Sym1 :: T a ()- -> (~>) (T a ()) Bool- data TFHelper_0123456789876543210Sym1 (a0123456789876543210 :: T a ()) :: (~>) (T a ()) Bool- where- TFHelper_0123456789876543210Sym1KindInference :: SameKind (Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) arg) (TFHelper_0123456789876543210Sym2 a0123456789876543210 arg) =>- TFHelper_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (TFHelper_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) TFHelper_0123456789876543210Sym1KindInference) ())- type TFHelper_0123456789876543210Sym2 :: T a () -> T a () -> Bool- type family TFHelper_0123456789876543210Sym2 (a0123456789876543210 :: T a ()) (a0123456789876543210 :: T a ()) :: Bool where- TFHelper_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210- instance PEq (T a ()) where- type (==) a a = Apply (Apply TFHelper_0123456789876543210Sym0 a) a- type Compare_0123456789876543210 :: T a () -> T a () -> Ordering- type family Compare_0123456789876543210 (a :: T a ()) (a :: T a ()) :: Ordering where- Compare_0123456789876543210 ((:*:) a_0123456789876543210 a_0123456789876543210) ((:*:) b_0123456789876543210 b_0123456789876543210) = Apply (Apply (Apply FoldlSym0 ThenCmpSym0) EQSym0) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) NilSym0))- type Compare_0123456789876543210Sym0 :: (~>) (T a ()) ((~>) (T a ()) Ordering)- data Compare_0123456789876543210Sym0 :: (~>) (T a ()) ((~>) (T a ()) Ordering)- where- Compare_0123456789876543210Sym0KindInference :: SameKind (Apply Compare_0123456789876543210Sym0 arg) (Compare_0123456789876543210Sym1 arg) =>- Compare_0123456789876543210Sym0 a0123456789876543210- type instance Apply Compare_0123456789876543210Sym0 a0123456789876543210 = Compare_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings Compare_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Compare_0123456789876543210Sym0KindInference) ())- type Compare_0123456789876543210Sym1 :: T a ()- -> (~>) (T a ()) Ordering- data Compare_0123456789876543210Sym1 (a0123456789876543210 :: T a ()) :: (~>) (T a ()) Ordering- where- Compare_0123456789876543210Sym1KindInference :: SameKind (Apply (Compare_0123456789876543210Sym1 a0123456789876543210) arg) (Compare_0123456789876543210Sym2 a0123456789876543210 arg) =>- Compare_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (Compare_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Compare_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Compare_0123456789876543210Sym1KindInference) ())- type Compare_0123456789876543210Sym2 :: T a ()- -> T a () -> Ordering- type family Compare_0123456789876543210Sym2 (a0123456789876543210 :: T a ()) (a0123456789876543210 :: T a ()) :: Ordering where- Compare_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210- instance POrd (T a ()) where- type Compare a a = Apply (Apply Compare_0123456789876543210Sym0 a) a- type ShowsPrec_0123456789876543210 :: GHC.Num.Natural.Natural- -> T a () -> Symbol -> Symbol- type family ShowsPrec_0123456789876543210 (a :: GHC.Num.Natural.Natural) (a :: T a ()) (a :: Symbol) :: Symbol where- ShowsPrec_0123456789876543210 p_0123456789876543210 ((:*:) argL_0123456789876543210 argR_0123456789876543210) a_0123456789876543210 = Apply (Apply (Apply ShowParenSym0 (Apply (Apply (>@#@$) p_0123456789876543210) (FromInteger 6))) (Apply (Apply (.@#@$) (Apply (Apply ShowsPrecSym0 (FromInteger 7)) argL_0123456789876543210)) (Apply (Apply (.@#@$) (Apply ShowStringSym0 " :*: ")) (Apply (Apply ShowsPrecSym0 (FromInteger 7)) argR_0123456789876543210)))) a_0123456789876543210- type ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) (T a ()) ((~>) Symbol Symbol))- data ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) (T a ()) ((~>) Symbol Symbol))- where- ShowsPrec_0123456789876543210Sym0KindInference :: SameKind (Apply ShowsPrec_0123456789876543210Sym0 arg) (ShowsPrec_0123456789876543210Sym1 arg) =>- ShowsPrec_0123456789876543210Sym0 a0123456789876543210- type instance Apply ShowsPrec_0123456789876543210Sym0 a0123456789876543210 = ShowsPrec_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings ShowsPrec_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym0KindInference) ())- type ShowsPrec_0123456789876543210Sym1 :: GHC.Num.Natural.Natural- -> (~>) (T a ()) ((~>) Symbol Symbol)- data ShowsPrec_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Num.Natural.Natural) :: (~>) (T a ()) ((~>) Symbol Symbol)- where- ShowsPrec_0123456789876543210Sym1KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 arg) =>- ShowsPrec_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym1KindInference) ())- type ShowsPrec_0123456789876543210Sym2 :: GHC.Num.Natural.Natural- -> T a () -> (~>) Symbol Symbol- data ShowsPrec_0123456789876543210Sym2 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: T a ()) :: (~>) Symbol Symbol- where- ShowsPrec_0123456789876543210Sym2KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 arg) =>- ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym2KindInference) ())- type ShowsPrec_0123456789876543210Sym3 :: GHC.Num.Natural.Natural- -> T a () -> Symbol -> Symbol- type family ShowsPrec_0123456789876543210Sym3 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: T a ()) (a0123456789876543210 :: Symbol) :: Symbol where- ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance PShow (T a ()) where- type ShowsPrec a a a = Apply (Apply (Apply ShowsPrec_0123456789876543210Sym0 a) a) a- type TFHelper_0123456789876543210 :: S -> S -> Bool- type family TFHelper_0123456789876543210 (a :: S) (a :: S) :: Bool where- TFHelper_0123456789876543210 S1 S1 = TrueSym0- TFHelper_0123456789876543210 S1 S2 = FalseSym0- TFHelper_0123456789876543210 S2 S1 = FalseSym0- TFHelper_0123456789876543210 S2 S2 = TrueSym0- type TFHelper_0123456789876543210Sym0 :: (~>) S ((~>) S Bool)- data TFHelper_0123456789876543210Sym0 :: (~>) S ((~>) S Bool)- where- TFHelper_0123456789876543210Sym0KindInference :: SameKind (Apply TFHelper_0123456789876543210Sym0 arg) (TFHelper_0123456789876543210Sym1 arg) =>- TFHelper_0123456789876543210Sym0 a0123456789876543210- type instance Apply TFHelper_0123456789876543210Sym0 a0123456789876543210 = TFHelper_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings TFHelper_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) TFHelper_0123456789876543210Sym0KindInference) ())- type TFHelper_0123456789876543210Sym1 :: S -> (~>) S Bool- data TFHelper_0123456789876543210Sym1 (a0123456789876543210 :: S) :: (~>) S Bool- where- TFHelper_0123456789876543210Sym1KindInference :: SameKind (Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) arg) (TFHelper_0123456789876543210Sym2 a0123456789876543210 arg) =>- TFHelper_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (TFHelper_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) TFHelper_0123456789876543210Sym1KindInference) ())- type TFHelper_0123456789876543210Sym2 :: S -> S -> Bool- type family TFHelper_0123456789876543210Sym2 (a0123456789876543210 :: S) (a0123456789876543210 :: S) :: Bool where- TFHelper_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210- instance PEq S where- type (==) a a = Apply (Apply TFHelper_0123456789876543210Sym0 a) a- type Compare_0123456789876543210 :: S -> S -> Ordering- type family Compare_0123456789876543210 (a :: S) (a :: S) :: Ordering where- Compare_0123456789876543210 S1 S1 = Apply (Apply (Apply FoldlSym0 ThenCmpSym0) EQSym0) NilSym0- Compare_0123456789876543210 S2 S2 = Apply (Apply (Apply FoldlSym0 ThenCmpSym0) EQSym0) NilSym0- Compare_0123456789876543210 S1 S2 = LTSym0- Compare_0123456789876543210 S2 S1 = GTSym0- type Compare_0123456789876543210Sym0 :: (~>) S ((~>) S Ordering)- data Compare_0123456789876543210Sym0 :: (~>) S ((~>) S Ordering)- where- Compare_0123456789876543210Sym0KindInference :: SameKind (Apply Compare_0123456789876543210Sym0 arg) (Compare_0123456789876543210Sym1 arg) =>- Compare_0123456789876543210Sym0 a0123456789876543210- type instance Apply Compare_0123456789876543210Sym0 a0123456789876543210 = Compare_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings Compare_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Compare_0123456789876543210Sym0KindInference) ())- type Compare_0123456789876543210Sym1 :: S -> (~>) S Ordering- data Compare_0123456789876543210Sym1 (a0123456789876543210 :: S) :: (~>) S Ordering- where- Compare_0123456789876543210Sym1KindInference :: SameKind (Apply (Compare_0123456789876543210Sym1 a0123456789876543210) arg) (Compare_0123456789876543210Sym2 a0123456789876543210 arg) =>- Compare_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (Compare_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Compare_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Compare_0123456789876543210Sym1KindInference) ())- type Compare_0123456789876543210Sym2 :: S -> S -> Ordering- type family Compare_0123456789876543210Sym2 (a0123456789876543210 :: S) (a0123456789876543210 :: S) :: Ordering where- Compare_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210- instance POrd S where- type Compare a a = Apply (Apply Compare_0123456789876543210Sym0 a) a- type ShowsPrec_0123456789876543210 :: GHC.Num.Natural.Natural- -> S -> Symbol -> Symbol- type family ShowsPrec_0123456789876543210 (a :: GHC.Num.Natural.Natural) (a :: S) (a :: Symbol) :: Symbol where- ShowsPrec_0123456789876543210 _ S1 a_0123456789876543210 = Apply (Apply ShowStringSym0 "S1") a_0123456789876543210- ShowsPrec_0123456789876543210 _ S2 a_0123456789876543210 = Apply (Apply ShowStringSym0 "S2") a_0123456789876543210- type ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) S ((~>) Symbol Symbol))- data ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) S ((~>) Symbol Symbol))- where- ShowsPrec_0123456789876543210Sym0KindInference :: SameKind (Apply ShowsPrec_0123456789876543210Sym0 arg) (ShowsPrec_0123456789876543210Sym1 arg) =>- ShowsPrec_0123456789876543210Sym0 a0123456789876543210- type instance Apply ShowsPrec_0123456789876543210Sym0 a0123456789876543210 = ShowsPrec_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings ShowsPrec_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym0KindInference) ())- type ShowsPrec_0123456789876543210Sym1 :: GHC.Num.Natural.Natural- -> (~>) S ((~>) Symbol Symbol)- data ShowsPrec_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Num.Natural.Natural) :: (~>) S ((~>) Symbol Symbol)- where- ShowsPrec_0123456789876543210Sym1KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 arg) =>- ShowsPrec_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym1KindInference) ())- type ShowsPrec_0123456789876543210Sym2 :: GHC.Num.Natural.Natural- -> S -> (~>) Symbol Symbol- data ShowsPrec_0123456789876543210Sym2 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: S) :: (~>) Symbol Symbol- where- ShowsPrec_0123456789876543210Sym2KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 arg) =>- ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym2KindInference) ())- type ShowsPrec_0123456789876543210Sym3 :: GHC.Num.Natural.Natural- -> S -> Symbol -> Symbol- type family ShowsPrec_0123456789876543210Sym3 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: S) (a0123456789876543210 :: Symbol) :: Symbol where- ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance PShow S where- type ShowsPrec a a a = Apply (Apply (Apply ShowsPrec_0123456789876543210Sym0 a) a) a- type MinBound_0123456789876543210 :: S- type family MinBound_0123456789876543210 :: S where- MinBound_0123456789876543210 = S1Sym0- type MinBound_0123456789876543210Sym0 :: S- type family MinBound_0123456789876543210Sym0 :: S where- MinBound_0123456789876543210Sym0 = MinBound_0123456789876543210- type MaxBound_0123456789876543210 :: S- type family MaxBound_0123456789876543210 :: S where- MaxBound_0123456789876543210 = S2Sym0- type MaxBound_0123456789876543210Sym0 :: S- type family MaxBound_0123456789876543210Sym0 :: S where- MaxBound_0123456789876543210Sym0 = MaxBound_0123456789876543210- instance PBounded S where- type MinBound = MinBound_0123456789876543210Sym0- type MaxBound = MaxBound_0123456789876543210Sym0- type family Case_0123456789876543210 n t where- Case_0123456789876543210 n 'True = S2Sym0- Case_0123456789876543210 n 'False = Apply ErrorSym0 "toEnum: bad argument"- type family Case_0123456789876543210 n t where- Case_0123456789876543210 n 'True = S1Sym0- Case_0123456789876543210 n 'False = Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (FromInteger 1))- type ToEnum_0123456789876543210 :: GHC.Num.Natural.Natural -> S- type family ToEnum_0123456789876543210 (a :: GHC.Num.Natural.Natural) :: S where- ToEnum_0123456789876543210 n = Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (FromInteger 0))- type ToEnum_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural S- data ToEnum_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural S- where- ToEnum_0123456789876543210Sym0KindInference :: SameKind (Apply ToEnum_0123456789876543210Sym0 arg) (ToEnum_0123456789876543210Sym1 arg) =>- ToEnum_0123456789876543210Sym0 a0123456789876543210- type instance Apply ToEnum_0123456789876543210Sym0 a0123456789876543210 = ToEnum_0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings ToEnum_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) ToEnum_0123456789876543210Sym0KindInference) ())- type ToEnum_0123456789876543210Sym1 :: GHC.Num.Natural.Natural -> S- type family ToEnum_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Num.Natural.Natural) :: S where- ToEnum_0123456789876543210Sym1 a0123456789876543210 = ToEnum_0123456789876543210 a0123456789876543210- type FromEnum_0123456789876543210 :: S -> GHC.Num.Natural.Natural- type family FromEnum_0123456789876543210 (a :: S) :: GHC.Num.Natural.Natural where- FromEnum_0123456789876543210 S1 = FromInteger 0- FromEnum_0123456789876543210 S2 = FromInteger 1- type FromEnum_0123456789876543210Sym0 :: (~>) S GHC.Num.Natural.Natural- data FromEnum_0123456789876543210Sym0 :: (~>) S GHC.Num.Natural.Natural- where- FromEnum_0123456789876543210Sym0KindInference :: SameKind (Apply FromEnum_0123456789876543210Sym0 arg) (FromEnum_0123456789876543210Sym1 arg) =>- FromEnum_0123456789876543210Sym0 a0123456789876543210- type instance Apply FromEnum_0123456789876543210Sym0 a0123456789876543210 = FromEnum_0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings FromEnum_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) FromEnum_0123456789876543210Sym0KindInference) ())- type FromEnum_0123456789876543210Sym1 :: S- -> GHC.Num.Natural.Natural- type family FromEnum_0123456789876543210Sym1 (a0123456789876543210 :: S) :: GHC.Num.Natural.Natural where- FromEnum_0123456789876543210Sym1 a0123456789876543210 = FromEnum_0123456789876543210 a0123456789876543210- instance PEnum S where- type ToEnum a = Apply ToEnum_0123456789876543210Sym0 a- type FromEnum a = Apply FromEnum_0123456789876543210Sym0 a- infixl 6 :%*:- data ST :: forall a b. T a b -> Type- where- (:%*:) :: forall a b (n :: a) (n :: b).- (Sing n) -> (Sing n) -> ST ((:*:) n n :: T a b)- type instance Sing @(T a b) = ST- instance (SingKind a, SingKind b) => SingKind (T a b) where- type Demote (T a b) = T (Demote a) (Demote b)- fromSing ((:%*:) b b) = ((:*:) (fromSing b)) (fromSing b)- toSing ((:*:) (b :: Demote a) (b :: Demote b))- = case ((,) (toSing b :: SomeSing a)) (toSing b :: SomeSing b) of- (,) (SomeSing c) (SomeSing c) -> SomeSing (((:%*:) c) c)- data SS :: S -> Type- where- SS1 :: SS (S1 :: S)- SS2 :: SS (S2 :: S)- type instance Sing @S = SS- instance SingKind S where- type Demote S = S- fromSing SS1 = S1- fromSing SS2 = S2- toSing S1 = SomeSing SS1- toSing S2 = SomeSing SS2- instance SEq a => SEq (T a ()) where- (%==) ::- forall (t1 :: T a ()) (t2 :: T a ()). Sing t1- -> Sing t2- -> Sing (Apply (Apply ((==@#@$) :: TyFun (T a ()) ((~>) (T a ()) Bool)- -> Type) t1) t2)- (%==)- ((:%*:) (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210))- ((:%*:) (sB_0123456789876543210 :: Sing b_0123456789876543210)- (sB_0123456789876543210 :: Sing b_0123456789876543210))- = (applySing- ((applySing ((singFun2 @(&&@#@$)) (%&&)))- ((applySing- ((applySing ((singFun2 @(==@#@$)) (%==))) sA_0123456789876543210))- sB_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @(==@#@$)) (%==))) sA_0123456789876543210))- sB_0123456789876543210)- instance SOrd a => SOrd (T a ()) where- sCompare ::- forall (t1 :: T a ()) (t2 :: T a ()). Sing t1- -> Sing t2- -> Sing (Apply (Apply (CompareSym0 :: TyFun (T a ()) ((~>) (T a ()) Ordering)- -> Type) t1) t2)- sCompare- ((:%*:) (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210))- ((:%*:) (sB_0123456789876543210 :: Sing b_0123456789876543210)- (sB_0123456789876543210 :: Sing b_0123456789876543210))- = (applySing- ((applySing- ((applySing ((singFun3 @FoldlSym0) sFoldl))- ((singFun2 @ThenCmpSym0) sThenCmp)))- SEQ))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing- ((applySing ((singFun2 @CompareSym0) sCompare))- sA_0123456789876543210))- sB_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing- ((applySing ((singFun2 @CompareSym0) sCompare))- sA_0123456789876543210))- sB_0123456789876543210)))- SNil))- instance SShow a => SShow (T a ()) where- sShowsPrec ::- forall (t1 :: GHC.Num.Natural.Natural)- (t2 :: T a ())- (t3 :: Symbol). Sing t1- -> Sing t2- -> Sing t3- -> Sing (Apply (Apply (Apply (ShowsPrecSym0 :: TyFun GHC.Num.Natural.Natural ((~>) (T a ()) ((~>) Symbol Symbol))- -> Type) t1) t2) t3)- sShowsPrec- (sP_0123456789876543210 :: Sing p_0123456789876543210)- ((:%*:) (sArgL_0123456789876543210 :: Sing argL_0123456789876543210)- (sArgR_0123456789876543210 :: Sing argR_0123456789876543210))- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing- ((applySing ((singFun3 @ShowParenSym0) sShowParen))- ((applySing- ((applySing ((singFun2 @(>@#@$)) (%>))) sP_0123456789876543210))- (sFromInteger (sing :: Sing 6)))))- ((applySing- ((applySing ((singFun3 @(.@#@$)) (%.)))- ((applySing- ((applySing ((singFun3 @ShowsPrecSym0) sShowsPrec))- (sFromInteger (sing :: Sing 7))))- sArgL_0123456789876543210)))- ((applySing- ((applySing ((singFun3 @(.@#@$)) (%.)))- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing " :*: "))))- ((applySing- ((applySing ((singFun3 @ShowsPrecSym0) sShowsPrec))- (sFromInteger (sing :: Sing 7))))- sArgR_0123456789876543210)))))- sA_0123456789876543210- instance SEq S where- (%==) ::- forall (t1 :: S) (t2 :: S). Sing t1- -> Sing t2- -> Sing (Apply (Apply ((==@#@$) :: TyFun S ((~>) S Bool)- -> Type) t1) t2)- (%==) SS1 SS1 = STrue- (%==) SS1 SS2 = SFalse- (%==) SS2 SS1 = SFalse- (%==) SS2 SS2 = STrue- instance SOrd S where- sCompare ::- forall (t1 :: S) (t2 :: S). Sing t1- -> Sing t2- -> Sing (Apply (Apply (CompareSym0 :: TyFun S ((~>) S Ordering)- -> Type) t1) t2)- sCompare SS1 SS1- = (applySing- ((applySing- ((applySing ((singFun3 @FoldlSym0) sFoldl))- ((singFun2 @ThenCmpSym0) sThenCmp)))- SEQ))- SNil- sCompare SS2 SS2- = (applySing- ((applySing- ((applySing ((singFun3 @FoldlSym0) sFoldl))- ((singFun2 @ThenCmpSym0) sThenCmp)))- SEQ))- SNil- sCompare SS1 SS2 = SLT- sCompare SS2 SS1 = SGT- instance SShow S where- sShowsPrec ::- forall (t1 :: GHC.Num.Natural.Natural)- (t2 :: S)- (t3 :: Symbol). Sing t1- -> Sing t2- -> Sing t3- -> Sing (Apply (Apply (Apply (ShowsPrecSym0 :: TyFun GHC.Num.Natural.Natural ((~>) S ((~>) Symbol Symbol))- -> Type) t1) t2) t3)- sShowsPrec- _- SS1- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "S1")))- sA_0123456789876543210- sShowsPrec- _- SS2- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "S2")))- sA_0123456789876543210- instance SBounded S where- sMinBound :: Sing (MinBoundSym0 :: S)- sMaxBound :: Sing (MaxBoundSym0 :: S)- sMinBound = SS1- sMaxBound = SS2- instance SEnum S where- sToEnum ::- forall (t :: GHC.Num.Natural.Natural). Sing t- -> Sing (Apply (ToEnumSym0 :: TyFun GHC.Num.Natural.Natural S- -> Type) t)- sFromEnum ::- forall (t :: S). Sing t- -> Sing (Apply (FromEnumSym0 :: TyFun S GHC.Num.Natural.Natural- -> Type) t)- sToEnum (sN :: Sing n)- = (id- @(Sing (Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (FromInteger 0)))))- (case- (applySing ((applySing ((singFun2 @(==@#@$)) (%==))) sN))- (sFromInteger (sing :: Sing 0))- of- STrue -> SS1- SFalse- -> (id- @(Sing (Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (FromInteger 1)))))- (case- (applySing ((applySing ((singFun2 @(==@#@$)) (%==))) sN))- (sFromInteger (sing :: Sing 1))- of- STrue -> SS2- SFalse -> sError (sing :: Sing "toEnum: bad argument")))- sFromEnum SS1 = sFromInteger (sing :: Sing 0)- sFromEnum SS2 = sFromInteger (sing :: Sing 1)- instance SDecide a => SDecide (T a ()) where- (%~) ((:%*:) a a) ((:%*:) b b)- = case ((,) (((%~) a) b)) (((%~) a) b) of- (,) (Proved Refl) (Proved Refl) -> Proved Refl- (,) (Disproved contra) _- -> Disproved (\ refl -> case refl of Refl -> contra Refl)- (,) _ (Disproved contra)- -> Disproved (\ refl -> case refl of Refl -> contra Refl)- instance SDecide a =>- Data.Type.Equality.TestEquality (ST :: T a () -> Type) where- Data.Type.Equality.testEquality- = Data.Singletons.Decide.decideEquality- instance SDecide a =>- Data.Type.Coercion.TestCoercion (ST :: T a () -> Type) where- Data.Type.Coercion.testCoercion- = Data.Singletons.Decide.decideCoercion- instance SDecide S where- (%~) SS1 SS1 = Proved Refl- (%~) SS1 SS2 = Disproved (\ x -> case x of {})- (%~) SS2 SS1 = Disproved (\ x -> case x of {})- (%~) SS2 SS2 = Proved Refl- instance Data.Type.Equality.TestEquality (SS :: S -> Type) where- Data.Type.Equality.testEquality- = Data.Singletons.Decide.decideEquality- instance Data.Type.Coercion.TestCoercion (SS :: S -> Type) where- Data.Type.Coercion.testCoercion- = Data.Singletons.Decide.decideCoercion- deriving instance Data.Singletons.ShowSing.ShowSing a =>- Show (ST (z :: T a ()))- deriving instance Show (SS (z :: S))- instance (SingI n, SingI n) =>- SingI ((:*:) (n :: a) (n :: b)) where- sing = ((:%*:) sing) sing- instance SingI n => SingI1 ((:*:) (n :: a)) where- liftSing = (:%*:) sing- instance SingI2 (:*:) where- liftSing2 = (:%*:)- instance SingI ((:*:@#@$) :: (~>) a ((~>) b (T a b))) where- sing = (singFun2 @(:*:@#@$)) (:%*:)- instance SingI d =>- SingI ((:*:@#@$$) (d :: a) :: (~>) b (T a b)) where- sing = (singFun1 @((:*:@#@$$) (d :: a))) ((:%*:) (sing @d))- instance SingI1 ((:*:@#@$$) :: a -> (~>) b (T a b)) where- liftSing (s :: Sing (d :: a))- = (singFun1 @((:*:@#@$$) (d :: a))) ((:%*:) s)- instance SingI S1 where- sing = SS1- instance SingI S2 where- sing = SS2+Singletons/StandaloneDeriving.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| infixl 6 :*: + + data T a b = a :*: b + data S = S1 | S2 + + deriving instance Enum S + deriving instance Bounded S + deriving instance Show S + deriving instance Ord S + deriving instance Eq S + deriving instance Show a => Show (T a ()) + deriving instance Ord a => Ord (T a ()) + deriving instance Eq a => Eq (T a ()) |] + ======> + infixl 6 :*: + data T a b = a :*: b + data S = S1 | S2 + deriving instance Eq a => Eq (T a ()) + deriving instance Ord a => Ord (T a ()) + deriving instance Show a => Show (T a ()) + deriving instance Eq S + deriving instance Ord S + deriving instance Show S + deriving instance Bounded S + deriving instance Enum S + type (:*:@#@$) :: forall a b. (~>) a ((~>) b (T a b)) + data (:*:@#@$) :: (~>) a ((~>) b (T a b)) + where + (::*:@#@$###) :: SameKind (Apply (:*:@#@$) arg) ((:*:@#@$$) arg) => + (:*:@#@$) a0123456789876543210 + type instance Apply (:*:@#@$) a0123456789876543210 = (:*:@#@$$) a0123456789876543210 + instance SuppressUnusedWarnings (:*:@#@$) where + suppressUnusedWarnings = snd ((,) (::*:@#@$###) ()) + infixl 6 :*:@#@$ + type (:*:@#@$$) :: forall a b. a -> (~>) b (T a b) + data (:*:@#@$$) (a0123456789876543210 :: a) :: (~>) b (T a b) + where + (::*:@#@$$###) :: SameKind (Apply ((:*:@#@$$) a0123456789876543210) arg) ((:*:@#@$$$) a0123456789876543210 arg) => + (:*:@#@$$) a0123456789876543210 a0123456789876543210 + type instance Apply ((:*:@#@$$) a0123456789876543210) a0123456789876543210 = (:*:) a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings ((:*:@#@$$) a0123456789876543210) where + suppressUnusedWarnings = snd ((,) (::*:@#@$$###) ()) + infixl 6 :*:@#@$$ + type (:*:@#@$$$) :: forall a b. a -> b -> T a b + type family (:*:@#@$$$) (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: T a b where + (:*:@#@$$$) a0123456789876543210 a0123456789876543210 = (:*:) a0123456789876543210 a0123456789876543210 + infixl 6 :*:@#@$$$ + type S1Sym0 :: S + type family S1Sym0 :: S where + S1Sym0 = S1 + type S2Sym0 :: S + type family S2Sym0 :: S where + S2Sym0 = S2 + type TFHelper_0123456789876543210 :: T a () -> T a () -> Bool + type family TFHelper_0123456789876543210 (a :: T a ()) (a :: T a ()) :: Bool where + TFHelper_0123456789876543210 ((:*:) a_0123456789876543210 a_0123456789876543210) ((:*:) b_0123456789876543210 b_0123456789876543210) = Apply (Apply (&&@#@$) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210) + type TFHelper_0123456789876543210Sym0 :: (~>) (T a ()) ((~>) (T a ()) Bool) + data TFHelper_0123456789876543210Sym0 :: (~>) (T a ()) ((~>) (T a ()) Bool) + where + TFHelper_0123456789876543210Sym0KindInference :: SameKind (Apply TFHelper_0123456789876543210Sym0 arg) (TFHelper_0123456789876543210Sym1 arg) => + TFHelper_0123456789876543210Sym0 a0123456789876543210 + type instance Apply TFHelper_0123456789876543210Sym0 a0123456789876543210 = TFHelper_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings TFHelper_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) TFHelper_0123456789876543210Sym0KindInference ()) + type TFHelper_0123456789876543210Sym1 :: T a () + -> (~>) (T a ()) Bool + data TFHelper_0123456789876543210Sym1 (a0123456789876543210 :: T a ()) :: (~>) (T a ()) Bool + where + TFHelper_0123456789876543210Sym1KindInference :: SameKind (Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) arg) (TFHelper_0123456789876543210Sym2 a0123456789876543210 arg) => + TFHelper_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (TFHelper_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) TFHelper_0123456789876543210Sym1KindInference ()) + type TFHelper_0123456789876543210Sym2 :: T a () -> T a () -> Bool + type family TFHelper_0123456789876543210Sym2 (a0123456789876543210 :: T a ()) (a0123456789876543210 :: T a ()) :: Bool where + TFHelper_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PEq (T a ()) where + type (==) a a = Apply (Apply TFHelper_0123456789876543210Sym0 a) a + type Compare_0123456789876543210 :: T a () -> T a () -> Ordering + type family Compare_0123456789876543210 (a :: T a ()) (a :: T a ()) :: Ordering where + Compare_0123456789876543210 ((:*:) a_0123456789876543210 a_0123456789876543210) ((:*:) b_0123456789876543210 b_0123456789876543210) = Apply (Apply (Apply FoldlSym0 (<>@#@$)) EQSym0) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) NilSym0)) + type Compare_0123456789876543210Sym0 :: (~>) (T a ()) ((~>) (T a ()) Ordering) + data Compare_0123456789876543210Sym0 :: (~>) (T a ()) ((~>) (T a ()) Ordering) + where + Compare_0123456789876543210Sym0KindInference :: SameKind (Apply Compare_0123456789876543210Sym0 arg) (Compare_0123456789876543210Sym1 arg) => + Compare_0123456789876543210Sym0 a0123456789876543210 + type instance Apply Compare_0123456789876543210Sym0 a0123456789876543210 = Compare_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Compare_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Compare_0123456789876543210Sym0KindInference ()) + type Compare_0123456789876543210Sym1 :: T a () + -> (~>) (T a ()) Ordering + data Compare_0123456789876543210Sym1 (a0123456789876543210 :: T a ()) :: (~>) (T a ()) Ordering + where + Compare_0123456789876543210Sym1KindInference :: SameKind (Apply (Compare_0123456789876543210Sym1 a0123456789876543210) arg) (Compare_0123456789876543210Sym2 a0123456789876543210 arg) => + Compare_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (Compare_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Compare_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Compare_0123456789876543210Sym1KindInference ()) + type Compare_0123456789876543210Sym2 :: T a () + -> T a () -> Ordering + type family Compare_0123456789876543210Sym2 (a0123456789876543210 :: T a ()) (a0123456789876543210 :: T a ()) :: Ordering where + Compare_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance POrd (T a ()) where + type Compare a a = Apply (Apply Compare_0123456789876543210Sym0 a) a + type ShowsPrec_0123456789876543210 :: GHC.Num.Natural.Natural + -> T a () -> Symbol -> Symbol + type family ShowsPrec_0123456789876543210 (a :: GHC.Num.Natural.Natural) (a :: T a ()) (a :: Symbol) :: Symbol where + ShowsPrec_0123456789876543210 p_0123456789876543210 ((:*:) argL_0123456789876543210 argR_0123456789876543210) a_0123456789876543210 = Apply (Apply (Apply ShowParenSym0 (Apply (Apply (>@#@$) p_0123456789876543210) (FromInteger 6))) (Apply (Apply (.@#@$) (Apply (Apply ShowsPrecSym0 (FromInteger 7)) argL_0123456789876543210)) (Apply (Apply (.@#@$) (Apply ShowStringSym0 " :*: ")) (Apply (Apply ShowsPrecSym0 (FromInteger 7)) argR_0123456789876543210)))) a_0123456789876543210 + type ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) (T a ()) ((~>) Symbol Symbol)) + data ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) (T a ()) ((~>) Symbol Symbol)) + where + ShowsPrec_0123456789876543210Sym0KindInference :: SameKind (Apply ShowsPrec_0123456789876543210Sym0 arg) (ShowsPrec_0123456789876543210Sym1 arg) => + ShowsPrec_0123456789876543210Sym0 a0123456789876543210 + type instance Apply ShowsPrec_0123456789876543210Sym0 a0123456789876543210 = ShowsPrec_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings ShowsPrec_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym0KindInference ()) + type ShowsPrec_0123456789876543210Sym1 :: GHC.Num.Natural.Natural + -> (~>) (T a ()) ((~>) Symbol Symbol) + data ShowsPrec_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Num.Natural.Natural) :: (~>) (T a ()) ((~>) Symbol Symbol) + where + ShowsPrec_0123456789876543210Sym1KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 arg) => + ShowsPrec_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym1KindInference ()) + type ShowsPrec_0123456789876543210Sym2 :: GHC.Num.Natural.Natural + -> T a () -> (~>) Symbol Symbol + data ShowsPrec_0123456789876543210Sym2 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: T a ()) :: (~>) Symbol Symbol + where + ShowsPrec_0123456789876543210Sym2KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 arg) => + ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym2KindInference ()) + type ShowsPrec_0123456789876543210Sym3 :: GHC.Num.Natural.Natural + -> T a () -> Symbol -> Symbol + type family ShowsPrec_0123456789876543210Sym3 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: T a ()) (a0123456789876543210 :: Symbol) :: Symbol where + ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PShow (T a ()) where + type ShowsPrec a a a = Apply (Apply (Apply ShowsPrec_0123456789876543210Sym0 a) a) a + type TFHelper_0123456789876543210 :: S -> S -> Bool + type family TFHelper_0123456789876543210 (a :: S) (a :: S) :: Bool where + TFHelper_0123456789876543210 S1 S1 = TrueSym0 + TFHelper_0123456789876543210 S1 S2 = FalseSym0 + TFHelper_0123456789876543210 S2 S1 = FalseSym0 + TFHelper_0123456789876543210 S2 S2 = TrueSym0 + type TFHelper_0123456789876543210Sym0 :: (~>) S ((~>) S Bool) + data TFHelper_0123456789876543210Sym0 :: (~>) S ((~>) S Bool) + where + TFHelper_0123456789876543210Sym0KindInference :: SameKind (Apply TFHelper_0123456789876543210Sym0 arg) (TFHelper_0123456789876543210Sym1 arg) => + TFHelper_0123456789876543210Sym0 a0123456789876543210 + type instance Apply TFHelper_0123456789876543210Sym0 a0123456789876543210 = TFHelper_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings TFHelper_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) TFHelper_0123456789876543210Sym0KindInference ()) + type TFHelper_0123456789876543210Sym1 :: S -> (~>) S Bool + data TFHelper_0123456789876543210Sym1 (a0123456789876543210 :: S) :: (~>) S Bool + where + TFHelper_0123456789876543210Sym1KindInference :: SameKind (Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) arg) (TFHelper_0123456789876543210Sym2 a0123456789876543210 arg) => + TFHelper_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (TFHelper_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) TFHelper_0123456789876543210Sym1KindInference ()) + type TFHelper_0123456789876543210Sym2 :: S -> S -> Bool + type family TFHelper_0123456789876543210Sym2 (a0123456789876543210 :: S) (a0123456789876543210 :: S) :: Bool where + TFHelper_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PEq S where + type (==) a a = Apply (Apply TFHelper_0123456789876543210Sym0 a) a + type Compare_0123456789876543210 :: S -> S -> Ordering + type family Compare_0123456789876543210 (a :: S) (a :: S) :: Ordering where + Compare_0123456789876543210 S1 S1 = Apply (Apply (Apply FoldlSym0 (<>@#@$)) EQSym0) NilSym0 + Compare_0123456789876543210 S2 S2 = Apply (Apply (Apply FoldlSym0 (<>@#@$)) EQSym0) NilSym0 + Compare_0123456789876543210 S1 S2 = LTSym0 + Compare_0123456789876543210 S2 S1 = GTSym0 + type Compare_0123456789876543210Sym0 :: (~>) S ((~>) S Ordering) + data Compare_0123456789876543210Sym0 :: (~>) S ((~>) S Ordering) + where + Compare_0123456789876543210Sym0KindInference :: SameKind (Apply Compare_0123456789876543210Sym0 arg) (Compare_0123456789876543210Sym1 arg) => + Compare_0123456789876543210Sym0 a0123456789876543210 + type instance Apply Compare_0123456789876543210Sym0 a0123456789876543210 = Compare_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Compare_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Compare_0123456789876543210Sym0KindInference ()) + type Compare_0123456789876543210Sym1 :: S -> (~>) S Ordering + data Compare_0123456789876543210Sym1 (a0123456789876543210 :: S) :: (~>) S Ordering + where + Compare_0123456789876543210Sym1KindInference :: SameKind (Apply (Compare_0123456789876543210Sym1 a0123456789876543210) arg) (Compare_0123456789876543210Sym2 a0123456789876543210 arg) => + Compare_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (Compare_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Compare_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Compare_0123456789876543210Sym1KindInference ()) + type Compare_0123456789876543210Sym2 :: S -> S -> Ordering + type family Compare_0123456789876543210Sym2 (a0123456789876543210 :: S) (a0123456789876543210 :: S) :: Ordering where + Compare_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance POrd S where + type Compare a a = Apply (Apply Compare_0123456789876543210Sym0 a) a + type ShowsPrec_0123456789876543210 :: GHC.Num.Natural.Natural + -> S -> Symbol -> Symbol + type family ShowsPrec_0123456789876543210 (a :: GHC.Num.Natural.Natural) (a :: S) (a :: Symbol) :: Symbol where + ShowsPrec_0123456789876543210 _ S1 a_0123456789876543210 = Apply (Apply ShowStringSym0 "S1") a_0123456789876543210 + ShowsPrec_0123456789876543210 _ S2 a_0123456789876543210 = Apply (Apply ShowStringSym0 "S2") a_0123456789876543210 + type ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) S ((~>) Symbol Symbol)) + data ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) S ((~>) Symbol Symbol)) + where + ShowsPrec_0123456789876543210Sym0KindInference :: SameKind (Apply ShowsPrec_0123456789876543210Sym0 arg) (ShowsPrec_0123456789876543210Sym1 arg) => + ShowsPrec_0123456789876543210Sym0 a0123456789876543210 + type instance Apply ShowsPrec_0123456789876543210Sym0 a0123456789876543210 = ShowsPrec_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings ShowsPrec_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym0KindInference ()) + type ShowsPrec_0123456789876543210Sym1 :: GHC.Num.Natural.Natural + -> (~>) S ((~>) Symbol Symbol) + data ShowsPrec_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Num.Natural.Natural) :: (~>) S ((~>) Symbol Symbol) + where + ShowsPrec_0123456789876543210Sym1KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 arg) => + ShowsPrec_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym1KindInference ()) + type ShowsPrec_0123456789876543210Sym2 :: GHC.Num.Natural.Natural + -> S -> (~>) Symbol Symbol + data ShowsPrec_0123456789876543210Sym2 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: S) :: (~>) Symbol Symbol + where + ShowsPrec_0123456789876543210Sym2KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 arg) => + ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym2KindInference ()) + type ShowsPrec_0123456789876543210Sym3 :: GHC.Num.Natural.Natural + -> S -> Symbol -> Symbol + type family ShowsPrec_0123456789876543210Sym3 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: S) (a0123456789876543210 :: Symbol) :: Symbol where + ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PShow S where + type ShowsPrec a a a = Apply (Apply (Apply ShowsPrec_0123456789876543210Sym0 a) a) a + type MinBound_0123456789876543210 :: S + type family MinBound_0123456789876543210 :: S where + MinBound_0123456789876543210 = S1Sym0 + type MinBound_0123456789876543210Sym0 :: S + type family MinBound_0123456789876543210Sym0 :: S where + MinBound_0123456789876543210Sym0 = MinBound_0123456789876543210 + type MaxBound_0123456789876543210 :: S + type family MaxBound_0123456789876543210 :: S where + MaxBound_0123456789876543210 = S2Sym0 + type MaxBound_0123456789876543210Sym0 :: S + type family MaxBound_0123456789876543210Sym0 :: S where + MaxBound_0123456789876543210Sym0 = MaxBound_0123456789876543210 + instance PBounded S where + type MinBound = MinBound_0123456789876543210Sym0 + type MaxBound = MaxBound_0123456789876543210Sym0 + type family Case_0123456789876543210 n t where + Case_0123456789876543210 n 'True = S2Sym0 + Case_0123456789876543210 n 'False = Apply ErrorSym0 "toEnum: bad argument" + type family Case_0123456789876543210 n t where + Case_0123456789876543210 n 'True = S1Sym0 + Case_0123456789876543210 n 'False = Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (FromInteger 1)) + type ToEnum_0123456789876543210 :: GHC.Num.Natural.Natural -> S + type family ToEnum_0123456789876543210 (a :: GHC.Num.Natural.Natural) :: S where + ToEnum_0123456789876543210 n = Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (FromInteger 0)) + type ToEnum_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural S + data ToEnum_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural S + where + ToEnum_0123456789876543210Sym0KindInference :: SameKind (Apply ToEnum_0123456789876543210Sym0 arg) (ToEnum_0123456789876543210Sym1 arg) => + ToEnum_0123456789876543210Sym0 a0123456789876543210 + type instance Apply ToEnum_0123456789876543210Sym0 a0123456789876543210 = ToEnum_0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings ToEnum_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) ToEnum_0123456789876543210Sym0KindInference ()) + type ToEnum_0123456789876543210Sym1 :: GHC.Num.Natural.Natural -> S + type family ToEnum_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Num.Natural.Natural) :: S where + ToEnum_0123456789876543210Sym1 a0123456789876543210 = ToEnum_0123456789876543210 a0123456789876543210 + type FromEnum_0123456789876543210 :: S -> GHC.Num.Natural.Natural + type family FromEnum_0123456789876543210 (a :: S) :: GHC.Num.Natural.Natural where + FromEnum_0123456789876543210 S1 = FromInteger 0 + FromEnum_0123456789876543210 S2 = FromInteger 1 + type FromEnum_0123456789876543210Sym0 :: (~>) S GHC.Num.Natural.Natural + data FromEnum_0123456789876543210Sym0 :: (~>) S GHC.Num.Natural.Natural + where + FromEnum_0123456789876543210Sym0KindInference :: SameKind (Apply FromEnum_0123456789876543210Sym0 arg) (FromEnum_0123456789876543210Sym1 arg) => + FromEnum_0123456789876543210Sym0 a0123456789876543210 + type instance Apply FromEnum_0123456789876543210Sym0 a0123456789876543210 = FromEnum_0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings FromEnum_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) FromEnum_0123456789876543210Sym0KindInference ()) + type FromEnum_0123456789876543210Sym1 :: S + -> GHC.Num.Natural.Natural + type family FromEnum_0123456789876543210Sym1 (a0123456789876543210 :: S) :: GHC.Num.Natural.Natural where + FromEnum_0123456789876543210Sym1 a0123456789876543210 = FromEnum_0123456789876543210 a0123456789876543210 + instance PEnum S where + type ToEnum a = Apply ToEnum_0123456789876543210Sym0 a + type FromEnum a = Apply FromEnum_0123456789876543210Sym0 a + infixl 6 :%*: + data ST :: forall a b. T a b -> Type + where + (:%*:) :: forall a b (n :: a) (n :: b). + (Sing n) -> (Sing n) -> ST ((:*:) n n :: T a b) + type instance Sing @(T a b) = ST + instance (SingKind a, SingKind b) => SingKind (T a b) where + type Demote (T a b) = T (Demote a) (Demote b) + fromSing ((:%*:) b b) = (:*:) (fromSing b) (fromSing b) + toSing ((:*:) (b :: Demote a) (b :: Demote b)) + = case (,) (toSing b :: SomeSing a) (toSing b :: SomeSing b) of + (,) (SomeSing c) (SomeSing c) -> SomeSing ((:%*:) c c) + data SS :: S -> Type + where + SS1 :: SS (S1 :: S) + SS2 :: SS (S2 :: S) + type instance Sing @S = SS + instance SingKind S where + type Demote S = S + fromSing SS1 = S1 + fromSing SS2 = S2 + toSing S1 = SomeSing SS1 + toSing S2 = SomeSing SS2 + instance SEq a => SEq (T a ()) where + (%==) :: + forall (t1 :: T a ()) (t2 :: T a ()). Sing t1 + -> Sing t2 + -> Sing (Apply (Apply ((==@#@$) :: TyFun (T a ()) ((~>) (T a ()) Bool) + -> Type) t1) t2) + (%==) + ((:%*:) (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210)) + ((:%*:) (sB_0123456789876543210 :: Sing b_0123456789876543210) + (sB_0123456789876543210 :: Sing b_0123456789876543210)) + = applySing + (applySing + (singFun2 @(&&@#@$) (%&&)) + (applySing + (applySing (singFun2 @(==@#@$) (%==)) sA_0123456789876543210) + sB_0123456789876543210)) + (applySing + (applySing (singFun2 @(==@#@$) (%==)) sA_0123456789876543210) + sB_0123456789876543210) + instance SOrd a => SOrd (T a ()) where + sCompare :: + forall (t1 :: T a ()) (t2 :: T a ()). Sing t1 + -> Sing t2 + -> Sing (Apply (Apply (CompareSym0 :: TyFun (T a ()) ((~>) (T a ()) Ordering) + -> Type) t1) t2) + sCompare + ((:%*:) (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210)) + ((:%*:) (sB_0123456789876543210 :: Sing b_0123456789876543210) + (sB_0123456789876543210 :: Sing b_0123456789876543210)) + = applySing + (applySing + (applySing (singFun3 @FoldlSym0 sFoldl) (singFun2 @(<>@#@$) (%<>))) + SEQ) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing + (applySing (singFun2 @CompareSym0 sCompare) sA_0123456789876543210) + sB_0123456789876543210)) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing + (applySing (singFun2 @CompareSym0 sCompare) sA_0123456789876543210) + sB_0123456789876543210)) + SNil)) + instance SShow a => SShow (T a ()) where + sShowsPrec :: + forall (t1 :: GHC.Num.Natural.Natural) + (t2 :: T a ()) + (t3 :: Symbol). Sing t1 + -> Sing t2 + -> Sing t3 + -> Sing (Apply (Apply (Apply (ShowsPrecSym0 :: TyFun GHC.Num.Natural.Natural ((~>) (T a ()) ((~>) Symbol Symbol)) + -> Type) t1) t2) t3) + sShowsPrec + (sP_0123456789876543210 :: Sing p_0123456789876543210) + ((:%*:) (sArgL_0123456789876543210 :: Sing argL_0123456789876543210) + (sArgR_0123456789876543210 :: Sing argR_0123456789876543210)) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (applySing + (singFun3 @ShowParenSym0 sShowParen) + (applySing + (applySing (singFun2 @(>@#@$) (%>)) sP_0123456789876543210) + (sFromInteger (sing :: Sing 6)))) + (applySing + (applySing + (singFun3 @(.@#@$) (%.)) + (applySing + (applySing + (singFun3 @ShowsPrecSym0 sShowsPrec) + (sFromInteger (sing :: Sing 7))) + sArgL_0123456789876543210)) + (applySing + (applySing + (singFun3 @(.@#@$) (%.)) + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing " :*: "))) + (applySing + (applySing + (singFun3 @ShowsPrecSym0 sShowsPrec) + (sFromInteger (sing :: Sing 7))) + sArgR_0123456789876543210)))) + sA_0123456789876543210 + instance SEq S where + (%==) :: + forall (t1 :: S) (t2 :: S). Sing t1 + -> Sing t2 + -> Sing (Apply (Apply ((==@#@$) :: TyFun S ((~>) S Bool) + -> Type) t1) t2) + (%==) SS1 SS1 = STrue + (%==) SS1 SS2 = SFalse + (%==) SS2 SS1 = SFalse + (%==) SS2 SS2 = STrue + instance SOrd S where + sCompare :: + forall (t1 :: S) (t2 :: S). Sing t1 + -> Sing t2 + -> Sing (Apply (Apply (CompareSym0 :: TyFun S ((~>) S Ordering) + -> Type) t1) t2) + sCompare SS1 SS1 + = applySing + (applySing + (applySing (singFun3 @FoldlSym0 sFoldl) (singFun2 @(<>@#@$) (%<>))) + SEQ) + SNil + sCompare SS2 SS2 + = applySing + (applySing + (applySing (singFun3 @FoldlSym0 sFoldl) (singFun2 @(<>@#@$) (%<>))) + SEQ) + SNil + sCompare SS1 SS2 = SLT + sCompare SS2 SS1 = SGT + instance SShow S where + sShowsPrec :: + forall (t1 :: GHC.Num.Natural.Natural) + (t2 :: S) + (t3 :: Symbol). Sing t1 + -> Sing t2 + -> Sing t3 + -> Sing (Apply (Apply (Apply (ShowsPrecSym0 :: TyFun GHC.Num.Natural.Natural ((~>) S ((~>) Symbol Symbol)) + -> Type) t1) t2) t3) + sShowsPrec + _ + SS1 + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "S1")) + sA_0123456789876543210 + sShowsPrec + _ + SS2 + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "S2")) + sA_0123456789876543210 + instance SBounded S where + sMinBound :: Sing (MinBoundSym0 :: S) + sMaxBound :: Sing (MaxBoundSym0 :: S) + sMinBound = SS1 + sMaxBound = SS2 + instance SEnum S where + sToEnum :: + forall (t :: GHC.Num.Natural.Natural). Sing t + -> Sing (Apply (ToEnumSym0 :: TyFun GHC.Num.Natural.Natural S + -> Type) t) + sFromEnum :: + forall (t :: S). Sing t + -> Sing (Apply (FromEnumSym0 :: TyFun S GHC.Num.Natural.Natural + -> Type) t) + sToEnum (sN :: Sing n) + = id + @(Sing (Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (FromInteger 0)))) + (case + applySing + (applySing (singFun2 @(==@#@$) (%==)) sN) + (sFromInteger (sing :: Sing 0)) + of + STrue -> SS1 + SFalse + -> id + @(Sing (Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (FromInteger 1)))) + (case + applySing + (applySing (singFun2 @(==@#@$) (%==)) sN) + (sFromInteger (sing :: Sing 1)) + of + STrue -> SS2 + SFalse -> sError (sing :: Sing "toEnum: bad argument"))) + sFromEnum SS1 = sFromInteger (sing :: Sing 0) + sFromEnum SS2 = sFromInteger (sing :: Sing 1) + instance SDecide a => SDecide (T a ()) where + (%~) ((:%*:) a a) ((:%*:) b b) + = case (,) ((%~) a b) ((%~) a b) of + (,) (Proved Refl) (Proved Refl) -> Proved Refl + (,) (Disproved contra) _ + -> Disproved (\ refl -> case refl of Refl -> contra Refl) + (,) _ (Disproved contra) + -> Disproved (\ refl -> case refl of Refl -> contra Refl) + instance SDecide a => + Data.Type.Equality.TestEquality (ST :: T a () -> Type) where + Data.Type.Equality.testEquality + = Data.Singletons.Decide.decideEquality + instance SDecide a => + Data.Type.Coercion.TestCoercion (ST :: T a () -> Type) where + Data.Type.Coercion.testCoercion + = Data.Singletons.Decide.decideCoercion + instance SDecide S where + (%~) SS1 SS1 = Proved Refl + (%~) SS1 SS2 = Disproved (\ x -> case x of {}) + (%~) SS2 SS1 = Disproved (\ x -> case x of {}) + (%~) SS2 SS2 = Proved Refl + instance Data.Type.Equality.TestEquality (SS :: S -> Type) where + Data.Type.Equality.testEquality + = Data.Singletons.Decide.decideEquality + instance Data.Type.Coercion.TestCoercion (SS :: S -> Type) where + Data.Type.Coercion.testCoercion + = Data.Singletons.Decide.decideCoercion + deriving instance Data.Singletons.ShowSing.ShowSing a => + Show (ST (z :: T a ())) + deriving instance Show (SS (z :: S)) + instance (SingI n, SingI n) => + SingI ((:*:) (n :: a) (n :: b)) where + sing = (:%*:) sing sing + instance SingI n => SingI1 ((:*:) (n :: a)) where + liftSing = (:%*:) sing + instance SingI2 (:*:) where + liftSing2 = (:%*:) + instance SingI ((:*:@#@$) :: (~>) a ((~>) b (T a b))) where + sing = singFun2 @(:*:@#@$) (:%*:) + instance SingI d => + SingI ((:*:@#@$$) (d :: a) :: (~>) b (T a b)) where + sing = singFun1 @((:*:@#@$$) (d :: a)) ((:%*:) (sing @d)) + instance SingI1 ((:*:@#@$$) :: a -> (~>) b (T a b)) where + liftSing (s :: Sing (d :: a)) + = singFun1 @((:*:@#@$$) (d :: a)) ((:%*:) s) + instance SingI S1 where + sing = SS1 + instance SingI S2 where + sing = SS2
tests/compile-and-dump/Singletons/StandaloneDeriving.hs view
@@ -1,30 +1,30 @@-module Singletons.StandaloneDeriving where--import Data.Singletons.Base.TH-import Prelude.Singletons-import Text.Show.Singletons--$(singletons [d|-- infixl 6 :*:- data T a b = a :*: b- data S = S1 | S2-- deriving instance Eq a => Eq (T a ())- deriving instance Ord a => Ord (T a ())- deriving instance Show a => Show (T a ())-- deriving instance Eq S- deriving instance Ord S- deriving instance Show S- deriving instance Bounded S- deriving instance Enum S-- |])---- Ensure that the fixity is discovered-test1 :: "() :*: ()" :~: ShowsPrec 6 ('() :*: '()) ""-test1 = Refl--test2 :: "(() :*: ())" :~: ShowsPrec 7 ('() :*: '()) ""-test2 = Refl+module Singletons.StandaloneDeriving where + +import Data.Singletons.Base.TH +import Prelude.Singletons +import Text.Show.Singletons + +$(singletons [d| + + infixl 6 :*: + data T a b = a :*: b + data S = S1 | S2 + + deriving instance Eq a => Eq (T a ()) + deriving instance Ord a => Ord (T a ()) + deriving instance Show a => Show (T a ()) + + deriving instance Eq S + deriving instance Ord S + deriving instance Show S + deriving instance Bounded S + deriving instance Enum S + + |]) + +-- Ensure that the fixity is discovered +test1 :: "() :*: ()" :~: ShowsPrec 6 ('() :*: '()) "" +test1 = Refl + +test2 :: "(() :*: ())" :~: ShowsPrec 7 ('() :*: '()) "" +test2 = Refl
tests/compile-and-dump/Singletons/Star.golden view
@@ -1,504 +1,507 @@-Singletons/Star.hs:0:0:: Splicing declarations- singletonStar [''Nat, ''Int, ''String, ''Maybe, ''Vec]- ======>- data Rep :: Type- where- Singletons.Star.Nat :: Rep- Singletons.Star.Int :: Rep- Singletons.Star.String :: Rep- Singletons.Star.Maybe :: Rep -> Rep- Singletons.Star.Vec :: Rep -> Nat -> Rep- deriving (Eq, Ord, Read, Show)- type NatSym0 :: Type- type family NatSym0 :: Type where- NatSym0 = Nat- type IntSym0 :: Type- type family IntSym0 :: Type where- IntSym0 = Int- type StringSym0 :: Type- type family StringSym0 :: Type where- StringSym0 = String- type MaybeSym0 :: (~>) Type Type- data MaybeSym0 :: (~>) Type Type- where- MaybeSym0KindInference :: SameKind (Apply MaybeSym0 arg) (MaybeSym1 arg) =>- MaybeSym0 a0123456789876543210- type instance Apply MaybeSym0 a0123456789876543210 = Maybe a0123456789876543210- instance SuppressUnusedWarnings MaybeSym0 where- suppressUnusedWarnings = snd (((,) MaybeSym0KindInference) ())- type MaybeSym1 :: Type -> Type- type family MaybeSym1 (a0123456789876543210 :: Type) :: Type where- MaybeSym1 a0123456789876543210 = Maybe a0123456789876543210- type VecSym0 :: (~>) Type ((~>) Nat Type)- data VecSym0 :: (~>) Type ((~>) Nat Type)- where- VecSym0KindInference :: SameKind (Apply VecSym0 arg) (VecSym1 arg) =>- VecSym0 a0123456789876543210- type instance Apply VecSym0 a0123456789876543210 = VecSym1 a0123456789876543210- instance SuppressUnusedWarnings VecSym0 where- suppressUnusedWarnings = snd (((,) VecSym0KindInference) ())- type VecSym1 :: Type -> (~>) Nat Type- data VecSym1 (a0123456789876543210 :: Type) :: (~>) Nat Type- where- VecSym1KindInference :: SameKind (Apply (VecSym1 a0123456789876543210) arg) (VecSym2 a0123456789876543210 arg) =>- VecSym1 a0123456789876543210 a0123456789876543210- type instance Apply (VecSym1 a0123456789876543210) a0123456789876543210 = Vec a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (VecSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) VecSym1KindInference) ())- type VecSym2 :: Type -> Nat -> Type- type family VecSym2 (a0123456789876543210 :: Type) (a0123456789876543210 :: Nat) :: Type where- VecSym2 a0123456789876543210 a0123456789876543210 = Vec a0123456789876543210 a0123456789876543210- type TFHelper_0123456789876543210 :: Type -> Type -> Bool- type family TFHelper_0123456789876543210 (a :: Type) (a :: Type) :: Bool where- TFHelper_0123456789876543210 Nat Nat = TrueSym0- TFHelper_0123456789876543210 Nat Int = FalseSym0- TFHelper_0123456789876543210 Nat String = FalseSym0- TFHelper_0123456789876543210 Nat (Maybe _) = FalseSym0- TFHelper_0123456789876543210 Nat (Vec _ _) = FalseSym0- TFHelper_0123456789876543210 Int Nat = FalseSym0- TFHelper_0123456789876543210 Int Int = TrueSym0- TFHelper_0123456789876543210 Int String = FalseSym0- TFHelper_0123456789876543210 Int (Maybe _) = FalseSym0- TFHelper_0123456789876543210 Int (Vec _ _) = FalseSym0- TFHelper_0123456789876543210 String Nat = FalseSym0- TFHelper_0123456789876543210 String Int = FalseSym0- TFHelper_0123456789876543210 String String = TrueSym0- TFHelper_0123456789876543210 String (Maybe _) = FalseSym0- TFHelper_0123456789876543210 String (Vec _ _) = FalseSym0- TFHelper_0123456789876543210 (Maybe _) Nat = FalseSym0- TFHelper_0123456789876543210 (Maybe _) Int = FalseSym0- TFHelper_0123456789876543210 (Maybe _) String = FalseSym0- TFHelper_0123456789876543210 (Maybe a_0123456789876543210) (Maybe b_0123456789876543210) = Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210- TFHelper_0123456789876543210 (Maybe _) (Vec _ _) = FalseSym0- TFHelper_0123456789876543210 (Vec _ _) Nat = FalseSym0- TFHelper_0123456789876543210 (Vec _ _) Int = FalseSym0- TFHelper_0123456789876543210 (Vec _ _) String = FalseSym0- TFHelper_0123456789876543210 (Vec _ _) (Maybe _) = FalseSym0- TFHelper_0123456789876543210 (Vec a_0123456789876543210 a_0123456789876543210) (Vec b_0123456789876543210 b_0123456789876543210) = Apply (Apply (&&@#@$) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)- type TFHelper_0123456789876543210Sym0 :: (~>) Type ((~>) Type Bool)- data TFHelper_0123456789876543210Sym0 :: (~>) Type ((~>) Type Bool)- where- TFHelper_0123456789876543210Sym0KindInference :: SameKind (Apply TFHelper_0123456789876543210Sym0 arg) (TFHelper_0123456789876543210Sym1 arg) =>- TFHelper_0123456789876543210Sym0 a0123456789876543210- type instance Apply TFHelper_0123456789876543210Sym0 a0123456789876543210 = TFHelper_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings TFHelper_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) TFHelper_0123456789876543210Sym0KindInference) ())- type TFHelper_0123456789876543210Sym1 :: Type -> (~>) Type Bool- data TFHelper_0123456789876543210Sym1 (a0123456789876543210 :: Type) :: (~>) Type Bool- where- TFHelper_0123456789876543210Sym1KindInference :: SameKind (Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) arg) (TFHelper_0123456789876543210Sym2 a0123456789876543210 arg) =>- TFHelper_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (TFHelper_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) TFHelper_0123456789876543210Sym1KindInference) ())- type TFHelper_0123456789876543210Sym2 :: Type -> Type -> Bool- type family TFHelper_0123456789876543210Sym2 (a0123456789876543210 :: Type) (a0123456789876543210 :: Type) :: Bool where- TFHelper_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210- instance PEq Type where- type (==) a a = Apply (Apply TFHelper_0123456789876543210Sym0 a) a- type Compare_0123456789876543210 :: Type -> Type -> Ordering- type family Compare_0123456789876543210 (a :: Type) (a :: Type) :: Ordering where- Compare_0123456789876543210 Nat Nat = Apply (Apply (Apply FoldlSym0 ThenCmpSym0) EQSym0) NilSym0- Compare_0123456789876543210 Int Int = Apply (Apply (Apply FoldlSym0 ThenCmpSym0) EQSym0) NilSym0- Compare_0123456789876543210 String String = Apply (Apply (Apply FoldlSym0 ThenCmpSym0) EQSym0) NilSym0- Compare_0123456789876543210 (Maybe a_0123456789876543210) (Maybe b_0123456789876543210) = Apply (Apply (Apply FoldlSym0 ThenCmpSym0) EQSym0) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) NilSym0)- Compare_0123456789876543210 (Vec a_0123456789876543210 a_0123456789876543210) (Vec b_0123456789876543210 b_0123456789876543210) = Apply (Apply (Apply FoldlSym0 ThenCmpSym0) EQSym0) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) NilSym0))- Compare_0123456789876543210 Nat Int = LTSym0- Compare_0123456789876543210 Nat String = LTSym0- Compare_0123456789876543210 Nat (Maybe _) = LTSym0- Compare_0123456789876543210 Nat (Vec _ _) = LTSym0- Compare_0123456789876543210 Int Nat = GTSym0- Compare_0123456789876543210 Int String = LTSym0- Compare_0123456789876543210 Int (Maybe _) = LTSym0- Compare_0123456789876543210 Int (Vec _ _) = LTSym0- Compare_0123456789876543210 String Nat = GTSym0- Compare_0123456789876543210 String Int = GTSym0- Compare_0123456789876543210 String (Maybe _) = LTSym0- Compare_0123456789876543210 String (Vec _ _) = LTSym0- Compare_0123456789876543210 (Maybe _) Nat = GTSym0- Compare_0123456789876543210 (Maybe _) Int = GTSym0- Compare_0123456789876543210 (Maybe _) String = GTSym0- Compare_0123456789876543210 (Maybe _) (Vec _ _) = LTSym0- Compare_0123456789876543210 (Vec _ _) Nat = GTSym0- Compare_0123456789876543210 (Vec _ _) Int = GTSym0- Compare_0123456789876543210 (Vec _ _) String = GTSym0- Compare_0123456789876543210 (Vec _ _) (Maybe _) = GTSym0- type Compare_0123456789876543210Sym0 :: (~>) Type ((~>) Type Ordering)- data Compare_0123456789876543210Sym0 :: (~>) Type ((~>) Type Ordering)- where- Compare_0123456789876543210Sym0KindInference :: SameKind (Apply Compare_0123456789876543210Sym0 arg) (Compare_0123456789876543210Sym1 arg) =>- Compare_0123456789876543210Sym0 a0123456789876543210- type instance Apply Compare_0123456789876543210Sym0 a0123456789876543210 = Compare_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings Compare_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Compare_0123456789876543210Sym0KindInference) ())- type Compare_0123456789876543210Sym1 :: Type -> (~>) Type Ordering- data Compare_0123456789876543210Sym1 (a0123456789876543210 :: Type) :: (~>) Type Ordering- where- Compare_0123456789876543210Sym1KindInference :: SameKind (Apply (Compare_0123456789876543210Sym1 a0123456789876543210) arg) (Compare_0123456789876543210Sym2 a0123456789876543210 arg) =>- Compare_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (Compare_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Compare_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Compare_0123456789876543210Sym1KindInference) ())- type Compare_0123456789876543210Sym2 :: Type -> Type -> Ordering- type family Compare_0123456789876543210Sym2 (a0123456789876543210 :: Type) (a0123456789876543210 :: Type) :: Ordering where- Compare_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210- instance POrd Type where- type Compare a a = Apply (Apply Compare_0123456789876543210Sym0 a) a- type ShowsPrec_0123456789876543210 :: GHC.Num.Natural.Natural- -> Type -> Symbol -> Symbol- type family ShowsPrec_0123456789876543210 (a :: GHC.Num.Natural.Natural) (a :: Type) (a :: Symbol) :: Symbol where- ShowsPrec_0123456789876543210 _ Nat a_0123456789876543210 = Apply (Apply ShowStringSym0 "Nat") a_0123456789876543210- ShowsPrec_0123456789876543210 _ Int a_0123456789876543210 = Apply (Apply ShowStringSym0 "Int") a_0123456789876543210- ShowsPrec_0123456789876543210 _ String a_0123456789876543210 = Apply (Apply ShowStringSym0 "String") a_0123456789876543210- ShowsPrec_0123456789876543210 p_0123456789876543210 (Maybe arg_0123456789876543210) a_0123456789876543210 = Apply (Apply (Apply ShowParenSym0 (Apply (Apply (>@#@$) p_0123456789876543210) (FromInteger 10))) (Apply (Apply (.@#@$) (Apply ShowStringSym0 "Maybe ")) (Apply (Apply ShowsPrecSym0 (FromInteger 11)) arg_0123456789876543210))) a_0123456789876543210- ShowsPrec_0123456789876543210 p_0123456789876543210 (Vec arg_0123456789876543210 arg_0123456789876543210) a_0123456789876543210 = Apply (Apply (Apply ShowParenSym0 (Apply (Apply (>@#@$) p_0123456789876543210) (FromInteger 10))) (Apply (Apply (.@#@$) (Apply ShowStringSym0 "Vec ")) (Apply (Apply (.@#@$) (Apply (Apply ShowsPrecSym0 (FromInteger 11)) arg_0123456789876543210)) (Apply (Apply (.@#@$) ShowSpaceSym0) (Apply (Apply ShowsPrecSym0 (FromInteger 11)) arg_0123456789876543210))))) a_0123456789876543210- type ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) Type ((~>) Symbol Symbol))- data ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) Type ((~>) Symbol Symbol))- where- ShowsPrec_0123456789876543210Sym0KindInference :: SameKind (Apply ShowsPrec_0123456789876543210Sym0 arg) (ShowsPrec_0123456789876543210Sym1 arg) =>- ShowsPrec_0123456789876543210Sym0 a0123456789876543210- type instance Apply ShowsPrec_0123456789876543210Sym0 a0123456789876543210 = ShowsPrec_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings ShowsPrec_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym0KindInference) ())- type ShowsPrec_0123456789876543210Sym1 :: GHC.Num.Natural.Natural- -> (~>) Type ((~>) Symbol Symbol)- data ShowsPrec_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Num.Natural.Natural) :: (~>) Type ((~>) Symbol Symbol)- where- ShowsPrec_0123456789876543210Sym1KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 arg) =>- ShowsPrec_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym1KindInference) ())- type ShowsPrec_0123456789876543210Sym2 :: GHC.Num.Natural.Natural- -> Type -> (~>) Symbol Symbol- data ShowsPrec_0123456789876543210Sym2 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: Type) :: (~>) Symbol Symbol- where- ShowsPrec_0123456789876543210Sym2KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 arg) =>- ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym2KindInference) ())- type ShowsPrec_0123456789876543210Sym3 :: GHC.Num.Natural.Natural- -> Type -> Symbol -> Symbol- type family ShowsPrec_0123456789876543210Sym3 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: Type) (a0123456789876543210 :: Symbol) :: Symbol where- ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance PShow Type where- type ShowsPrec a a a = Apply (Apply (Apply ShowsPrec_0123456789876543210Sym0 a) a) a- data SRep :: Type -> Type- where- SNat :: SRep (Nat :: Type)- SInt :: SRep (Int :: Type)- SString :: SRep (String :: Type)- SMaybe :: forall (n :: Type). (Sing n) -> SRep (Maybe n :: Type)- SVec :: forall (n :: Type) (n :: Nat).- (Sing n) -> (Sing n) -> SRep (Vec n n :: Type)- type instance Sing @Type = SRep- instance SingKind Type where- type Demote Type = Rep- fromSing SNat = Singletons.Star.Nat- fromSing SInt = Singletons.Star.Int- fromSing SString = Singletons.Star.String- fromSing (SMaybe b) = Singletons.Star.Maybe (fromSing b)- fromSing (SVec b b)- = (Singletons.Star.Vec (fromSing b)) (fromSing b)- toSing Singletons.Star.Nat = SomeSing SNat- toSing Singletons.Star.Int = SomeSing SInt- toSing Singletons.Star.String = SomeSing SString- toSing (Singletons.Star.Maybe (b :: Demote Type))- = case toSing b :: SomeSing Type of- SomeSing c -> SomeSing (SMaybe c)- toSing (Singletons.Star.Vec (b :: Demote Type) (b :: Demote Nat))- = case- ((,) (toSing b :: SomeSing Type)) (toSing b :: SomeSing Nat)- of- (,) (SomeSing c) (SomeSing c) -> SomeSing ((SVec c) c)- instance (SDecide Type, SDecide Nat) => SDecide Type where- (%~) SNat SNat = Proved Refl- (%~) SNat SInt = Disproved (\ x -> case x of {})- (%~) SNat SString = Disproved (\ x -> case x of {})- (%~) SNat (SMaybe _) = Disproved (\ x -> case x of {})- (%~) SNat (SVec _ _) = Disproved (\ x -> case x of {})- (%~) SInt SNat = Disproved (\ x -> case x of {})- (%~) SInt SInt = Proved Refl- (%~) SInt SString = Disproved (\ x -> case x of {})- (%~) SInt (SMaybe _) = Disproved (\ x -> case x of {})- (%~) SInt (SVec _ _) = Disproved (\ x -> case x of {})- (%~) SString SNat = Disproved (\ x -> case x of {})- (%~) SString SInt = Disproved (\ x -> case x of {})- (%~) SString SString = Proved Refl- (%~) SString (SMaybe _) = Disproved (\ x -> case x of {})- (%~) SString (SVec _ _) = Disproved (\ x -> case x of {})- (%~) (SMaybe _) SNat = Disproved (\ x -> case x of {})- (%~) (SMaybe _) SInt = Disproved (\ x -> case x of {})- (%~) (SMaybe _) SString = Disproved (\ x -> case x of {})- (%~) (SMaybe a) (SMaybe b)- = case ((%~) a) b of- Proved Refl -> Proved Refl- Disproved contra- -> Disproved (\ refl -> case refl of Refl -> contra Refl)- (%~) (SMaybe _) (SVec _ _) = Disproved (\ x -> case x of {})- (%~) (SVec _ _) SNat = Disproved (\ x -> case x of {})- (%~) (SVec _ _) SInt = Disproved (\ x -> case x of {})- (%~) (SVec _ _) SString = Disproved (\ x -> case x of {})- (%~) (SVec _ _) (SMaybe _) = Disproved (\ x -> case x of {})- (%~) (SVec a a) (SVec b b)- = case ((,) (((%~) a) b)) (((%~) a) b) of- (,) (Proved Refl) (Proved Refl) -> Proved Refl- (,) (Disproved contra) _- -> Disproved (\ refl -> case refl of Refl -> contra Refl)- (,) _ (Disproved contra)- -> Disproved (\ refl -> case refl of Refl -> contra Refl)- instance (SDecide Type, SDecide Nat) =>- Data.Type.Equality.TestEquality (SRep :: Type -> Type) where- Data.Type.Equality.testEquality = decideEquality- instance (SDecide Type, SDecide Nat) =>- Data.Type.Coercion.TestCoercion (SRep :: Type -> Type) where- Data.Type.Coercion.testCoercion = decideCoercion- instance (SEq Type, SEq Nat) => SEq Type where- (%==) ::- forall (t1 :: Type) (t2 :: Type). Sing t1- -> Sing t2- -> Sing (Apply (Apply ((==@#@$) :: TyFun Type ((~>) Type Bool)- -> Type) t1) t2)- (%==) SNat SNat = STrue- (%==) SNat SInt = SFalse- (%==) SNat SString = SFalse- (%==) SNat (SMaybe _) = SFalse- (%==) SNat (SVec _ _) = SFalse- (%==) SInt SNat = SFalse- (%==) SInt SInt = STrue- (%==) SInt SString = SFalse- (%==) SInt (SMaybe _) = SFalse- (%==) SInt (SVec _ _) = SFalse- (%==) SString SNat = SFalse- (%==) SString SInt = SFalse- (%==) SString SString = STrue- (%==) SString (SMaybe _) = SFalse- (%==) SString (SVec _ _) = SFalse- (%==) (SMaybe _) SNat = SFalse- (%==) (SMaybe _) SInt = SFalse- (%==) (SMaybe _) SString = SFalse- (%==)- (SMaybe (sA_0123456789876543210 :: Sing a_0123456789876543210))- (SMaybe (sB_0123456789876543210 :: Sing b_0123456789876543210))- = (applySing- ((applySing ((singFun2 @(==@#@$)) (%==))) sA_0123456789876543210))- sB_0123456789876543210- (%==) (SMaybe _) (SVec _ _) = SFalse- (%==) (SVec _ _) SNat = SFalse- (%==) (SVec _ _) SInt = SFalse- (%==) (SVec _ _) SString = SFalse- (%==) (SVec _ _) (SMaybe _) = SFalse- (%==)- (SVec (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210))- (SVec (sB_0123456789876543210 :: Sing b_0123456789876543210)- (sB_0123456789876543210 :: Sing b_0123456789876543210))- = (applySing- ((applySing ((singFun2 @(&&@#@$)) (%&&)))- ((applySing- ((applySing ((singFun2 @(==@#@$)) (%==))) sA_0123456789876543210))- sB_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @(==@#@$)) (%==))) sA_0123456789876543210))- sB_0123456789876543210)- instance (SOrd Type, SOrd Nat) => SOrd Type where- sCompare ::- forall (t1 :: Type) (t2 :: Type). Sing t1- -> Sing t2- -> Sing (Apply (Apply (CompareSym0 :: TyFun Type ((~>) Type Ordering)- -> Type) t1) t2)- sCompare SNat SNat- = (applySing- ((applySing- ((applySing ((singFun3 @FoldlSym0) sFoldl))- ((singFun2 @ThenCmpSym0) sThenCmp)))- SEQ))- SNil- sCompare SInt SInt- = (applySing- ((applySing- ((applySing ((singFun3 @FoldlSym0) sFoldl))- ((singFun2 @ThenCmpSym0) sThenCmp)))- SEQ))- SNil- sCompare SString SString- = (applySing- ((applySing- ((applySing ((singFun3 @FoldlSym0) sFoldl))- ((singFun2 @ThenCmpSym0) sThenCmp)))- SEQ))- SNil- sCompare- (SMaybe (sA_0123456789876543210 :: Sing a_0123456789876543210))- (SMaybe (sB_0123456789876543210 :: Sing b_0123456789876543210))- = (applySing- ((applySing- ((applySing ((singFun3 @FoldlSym0) sFoldl))- ((singFun2 @ThenCmpSym0) sThenCmp)))- SEQ))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing- ((applySing ((singFun2 @CompareSym0) sCompare))- sA_0123456789876543210))- sB_0123456789876543210)))- SNil)- sCompare- (SVec (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210))- (SVec (sB_0123456789876543210 :: Sing b_0123456789876543210)- (sB_0123456789876543210 :: Sing b_0123456789876543210))- = (applySing- ((applySing- ((applySing ((singFun3 @FoldlSym0) sFoldl))- ((singFun2 @ThenCmpSym0) sThenCmp)))- SEQ))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing- ((applySing ((singFun2 @CompareSym0) sCompare))- sA_0123456789876543210))- sB_0123456789876543210)))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing- ((applySing ((singFun2 @CompareSym0) sCompare))- sA_0123456789876543210))- sB_0123456789876543210)))- SNil))- sCompare SNat SInt = SLT- sCompare SNat SString = SLT- sCompare SNat (SMaybe _) = SLT- sCompare SNat (SVec _ _) = SLT- sCompare SInt SNat = SGT- sCompare SInt SString = SLT- sCompare SInt (SMaybe _) = SLT- sCompare SInt (SVec _ _) = SLT- sCompare SString SNat = SGT- sCompare SString SInt = SGT- sCompare SString (SMaybe _) = SLT- sCompare SString (SVec _ _) = SLT- sCompare (SMaybe _) SNat = SGT- sCompare (SMaybe _) SInt = SGT- sCompare (SMaybe _) SString = SGT- sCompare (SMaybe _) (SVec _ _) = SLT- sCompare (SVec _ _) SNat = SGT- sCompare (SVec _ _) SInt = SGT- sCompare (SVec _ _) SString = SGT- sCompare (SVec _ _) (SMaybe _) = SGT- instance (SShow Type, SShow Nat) => SShow Type where- sShowsPrec ::- forall (t1 :: GHC.Num.Natural.Natural)- (t2 :: Type)- (t3 :: Symbol). Sing t1- -> Sing t2- -> Sing t3- -> Sing (Apply (Apply (Apply (ShowsPrecSym0 :: TyFun GHC.Num.Natural.Natural ((~>) Type ((~>) Symbol Symbol))- -> Type) t1) t2) t3)- sShowsPrec- _- SNat- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "Nat")))- sA_0123456789876543210- sShowsPrec- _- SInt- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "Int")))- sA_0123456789876543210- sShowsPrec- _- SString- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "String")))- sA_0123456789876543210- sShowsPrec- (sP_0123456789876543210 :: Sing p_0123456789876543210)- (SMaybe (sArg_0123456789876543210 :: Sing arg_0123456789876543210))- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing- ((applySing ((singFun3 @ShowParenSym0) sShowParen))- ((applySing- ((applySing ((singFun2 @(>@#@$)) (%>))) sP_0123456789876543210))- (sFromInteger (sing :: Sing 10)))))- ((applySing- ((applySing ((singFun3 @(.@#@$)) (%.)))- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "Maybe "))))- ((applySing- ((applySing ((singFun3 @ShowsPrecSym0) sShowsPrec))- (sFromInteger (sing :: Sing 11))))- sArg_0123456789876543210))))- sA_0123456789876543210- sShowsPrec- (sP_0123456789876543210 :: Sing p_0123456789876543210)- (SVec (sArg_0123456789876543210 :: Sing arg_0123456789876543210)- (sArg_0123456789876543210 :: Sing arg_0123456789876543210))- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing- ((applySing ((singFun3 @ShowParenSym0) sShowParen))- ((applySing- ((applySing ((singFun2 @(>@#@$)) (%>))) sP_0123456789876543210))- (sFromInteger (sing :: Sing 10)))))- ((applySing- ((applySing ((singFun3 @(.@#@$)) (%.)))- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "Vec "))))- ((applySing- ((applySing ((singFun3 @(.@#@$)) (%.)))- ((applySing- ((applySing ((singFun3 @ShowsPrecSym0) sShowsPrec))- (sFromInteger (sing :: Sing 11))))- sArg_0123456789876543210)))- ((applySing- ((applySing ((singFun3 @(.@#@$)) (%.)))- ((singFun1 @ShowSpaceSym0) sShowSpace)))- ((applySing- ((applySing ((singFun3 @ShowsPrecSym0) sShowsPrec))- (sFromInteger (sing :: Sing 11))))- sArg_0123456789876543210))))))- sA_0123456789876543210- instance SingI Nat where- sing = SNat- instance SingI Int where- sing = SInt- instance SingI String where- sing = SString- instance SingI n => SingI (Maybe (n :: Type)) where- sing = SMaybe sing- instance SingI1 Maybe where- liftSing = SMaybe- instance SingI (MaybeSym0 :: (~>) Type Type) where- sing = (singFun1 @MaybeSym0) SMaybe- instance (SingI n, SingI n) =>- SingI (Vec (n :: Type) (n :: Nat)) where- sing = (SVec sing) sing- instance SingI n => SingI1 (Vec (n :: Type)) where- liftSing = SVec sing- instance SingI2 Vec where- liftSing2 = SVec- instance SingI (VecSym0 :: (~>) Type ((~>) Nat Type)) where- sing = (singFun2 @VecSym0) SVec- instance SingI d =>- SingI (VecSym1 (d :: Type) :: (~>) Nat Type) where- sing = (singFun1 @(VecSym1 (d :: Type))) (SVec (sing @d))- instance SingI1 (VecSym1 :: Type -> (~>) Nat Type) where- liftSing (s :: Sing (d :: Type))- = (singFun1 @(VecSym1 (d :: Type))) (SVec s)+Singletons/Star.hs:0:0:: Splicing declarations + singletonStar [''Nat, ''Int, ''String, ''Maybe, ''Vec] + ======> + data Rep :: Type + where + Singletons.Star.Nat :: Rep + Singletons.Star.Int :: Rep + Singletons.Star.String :: Rep + Singletons.Star.Maybe :: Rep -> Rep + Singletons.Star.Vec :: Rep -> Nat -> Rep + deriving (Eq, Ord, Read, Show) + type NatSym0 :: Type + type family NatSym0 :: Type where + NatSym0 = Nat + type IntSym0 :: Type + type family IntSym0 :: Type where + IntSym0 = Int + type StringSym0 :: Type + type family StringSym0 :: Type where + StringSym0 = String + type MaybeSym0 :: (~>) Type Type + data MaybeSym0 :: (~>) Type Type + where + MaybeSym0KindInference :: SameKind (Apply MaybeSym0 arg) (MaybeSym1 arg) => + MaybeSym0 a0123456789876543210 + type instance Apply MaybeSym0 a0123456789876543210 = Maybe a0123456789876543210 + instance SuppressUnusedWarnings MaybeSym0 where + suppressUnusedWarnings = snd ((,) MaybeSym0KindInference ()) + type MaybeSym1 :: Type -> Type + type family MaybeSym1 (a0123456789876543210 :: Type) :: Type where + MaybeSym1 a0123456789876543210 = Maybe a0123456789876543210 + type VecSym0 :: (~>) Type ((~>) Nat Type) + data VecSym0 :: (~>) Type ((~>) Nat Type) + where + VecSym0KindInference :: SameKind (Apply VecSym0 arg) (VecSym1 arg) => + VecSym0 a0123456789876543210 + type instance Apply VecSym0 a0123456789876543210 = VecSym1 a0123456789876543210 + instance SuppressUnusedWarnings VecSym0 where + suppressUnusedWarnings = snd ((,) VecSym0KindInference ()) + type VecSym1 :: Type -> (~>) Nat Type + data VecSym1 (a0123456789876543210 :: Type) :: (~>) Nat Type + where + VecSym1KindInference :: SameKind (Apply (VecSym1 a0123456789876543210) arg) (VecSym2 a0123456789876543210 arg) => + VecSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (VecSym1 a0123456789876543210) a0123456789876543210 = Vec a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (VecSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) VecSym1KindInference ()) + type VecSym2 :: Type -> Nat -> Type + type family VecSym2 (a0123456789876543210 :: Type) (a0123456789876543210 :: Nat) :: Type where + VecSym2 a0123456789876543210 a0123456789876543210 = Vec a0123456789876543210 a0123456789876543210 + type TFHelper_0123456789876543210 :: Type -> Type -> Bool + type family TFHelper_0123456789876543210 (a :: Type) (a :: Type) :: Bool where + TFHelper_0123456789876543210 Nat Nat = TrueSym0 + TFHelper_0123456789876543210 Nat Int = FalseSym0 + TFHelper_0123456789876543210 Nat String = FalseSym0 + TFHelper_0123456789876543210 Nat (Maybe _) = FalseSym0 + TFHelper_0123456789876543210 Nat (Vec _ _) = FalseSym0 + TFHelper_0123456789876543210 Int Nat = FalseSym0 + TFHelper_0123456789876543210 Int Int = TrueSym0 + TFHelper_0123456789876543210 Int String = FalseSym0 + TFHelper_0123456789876543210 Int (Maybe _) = FalseSym0 + TFHelper_0123456789876543210 Int (Vec _ _) = FalseSym0 + TFHelper_0123456789876543210 String Nat = FalseSym0 + TFHelper_0123456789876543210 String Int = FalseSym0 + TFHelper_0123456789876543210 String String = TrueSym0 + TFHelper_0123456789876543210 String (Maybe _) = FalseSym0 + TFHelper_0123456789876543210 String (Vec _ _) = FalseSym0 + TFHelper_0123456789876543210 (Maybe _) Nat = FalseSym0 + TFHelper_0123456789876543210 (Maybe _) Int = FalseSym0 + TFHelper_0123456789876543210 (Maybe _) String = FalseSym0 + TFHelper_0123456789876543210 (Maybe a_0123456789876543210) (Maybe b_0123456789876543210) = Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210 + TFHelper_0123456789876543210 (Maybe _) (Vec _ _) = FalseSym0 + TFHelper_0123456789876543210 (Vec _ _) Nat = FalseSym0 + TFHelper_0123456789876543210 (Vec _ _) Int = FalseSym0 + TFHelper_0123456789876543210 (Vec _ _) String = FalseSym0 + TFHelper_0123456789876543210 (Vec _ _) (Maybe _) = FalseSym0 + TFHelper_0123456789876543210 (Vec a_0123456789876543210 a_0123456789876543210) (Vec b_0123456789876543210 b_0123456789876543210) = Apply (Apply (&&@#@$) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210) + type TFHelper_0123456789876543210Sym0 :: (~>) Type ((~>) Type Bool) + data TFHelper_0123456789876543210Sym0 :: (~>) Type ((~>) Type Bool) + where + TFHelper_0123456789876543210Sym0KindInference :: SameKind (Apply TFHelper_0123456789876543210Sym0 arg) (TFHelper_0123456789876543210Sym1 arg) => + TFHelper_0123456789876543210Sym0 a0123456789876543210 + type instance Apply TFHelper_0123456789876543210Sym0 a0123456789876543210 = TFHelper_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings TFHelper_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) TFHelper_0123456789876543210Sym0KindInference ()) + type TFHelper_0123456789876543210Sym1 :: Type -> (~>) Type Bool + data TFHelper_0123456789876543210Sym1 (a0123456789876543210 :: Type) :: (~>) Type Bool + where + TFHelper_0123456789876543210Sym1KindInference :: SameKind (Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) arg) (TFHelper_0123456789876543210Sym2 a0123456789876543210 arg) => + TFHelper_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (TFHelper_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) TFHelper_0123456789876543210Sym1KindInference ()) + type TFHelper_0123456789876543210Sym2 :: Type -> Type -> Bool + type family TFHelper_0123456789876543210Sym2 (a0123456789876543210 :: Type) (a0123456789876543210 :: Type) :: Bool where + TFHelper_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PEq Type where + type (==) a a = Apply (Apply TFHelper_0123456789876543210Sym0 a) a + type Compare_0123456789876543210 :: Type -> Type -> Ordering + type family Compare_0123456789876543210 (a :: Type) (a :: Type) :: Ordering where + Compare_0123456789876543210 Nat Nat = Apply (Apply (Apply FoldlSym0 (<>@#@$)) EQSym0) NilSym0 + Compare_0123456789876543210 Int Int = Apply (Apply (Apply FoldlSym0 (<>@#@$)) EQSym0) NilSym0 + Compare_0123456789876543210 String String = Apply (Apply (Apply FoldlSym0 (<>@#@$)) EQSym0) NilSym0 + Compare_0123456789876543210 (Maybe a_0123456789876543210) (Maybe b_0123456789876543210) = Apply (Apply (Apply FoldlSym0 (<>@#@$)) EQSym0) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) NilSym0) + Compare_0123456789876543210 (Vec a_0123456789876543210 a_0123456789876543210) (Vec b_0123456789876543210 b_0123456789876543210) = Apply (Apply (Apply FoldlSym0 (<>@#@$)) EQSym0) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) NilSym0)) + Compare_0123456789876543210 Nat Int = LTSym0 + Compare_0123456789876543210 Nat String = LTSym0 + Compare_0123456789876543210 Nat (Maybe _) = LTSym0 + Compare_0123456789876543210 Nat (Vec _ _) = LTSym0 + Compare_0123456789876543210 Int Nat = GTSym0 + Compare_0123456789876543210 Int String = LTSym0 + Compare_0123456789876543210 Int (Maybe _) = LTSym0 + Compare_0123456789876543210 Int (Vec _ _) = LTSym0 + Compare_0123456789876543210 String Nat = GTSym0 + Compare_0123456789876543210 String Int = GTSym0 + Compare_0123456789876543210 String (Maybe _) = LTSym0 + Compare_0123456789876543210 String (Vec _ _) = LTSym0 + Compare_0123456789876543210 (Maybe _) Nat = GTSym0 + Compare_0123456789876543210 (Maybe _) Int = GTSym0 + Compare_0123456789876543210 (Maybe _) String = GTSym0 + Compare_0123456789876543210 (Maybe _) (Vec _ _) = LTSym0 + Compare_0123456789876543210 (Vec _ _) Nat = GTSym0 + Compare_0123456789876543210 (Vec _ _) Int = GTSym0 + Compare_0123456789876543210 (Vec _ _) String = GTSym0 + Compare_0123456789876543210 (Vec _ _) (Maybe _) = GTSym0 + type Compare_0123456789876543210Sym0 :: (~>) Type ((~>) Type Ordering) + data Compare_0123456789876543210Sym0 :: (~>) Type ((~>) Type Ordering) + where + Compare_0123456789876543210Sym0KindInference :: SameKind (Apply Compare_0123456789876543210Sym0 arg) (Compare_0123456789876543210Sym1 arg) => + Compare_0123456789876543210Sym0 a0123456789876543210 + type instance Apply Compare_0123456789876543210Sym0 a0123456789876543210 = Compare_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Compare_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Compare_0123456789876543210Sym0KindInference ()) + type Compare_0123456789876543210Sym1 :: Type -> (~>) Type Ordering + data Compare_0123456789876543210Sym1 (a0123456789876543210 :: Type) :: (~>) Type Ordering + where + Compare_0123456789876543210Sym1KindInference :: SameKind (Apply (Compare_0123456789876543210Sym1 a0123456789876543210) arg) (Compare_0123456789876543210Sym2 a0123456789876543210 arg) => + Compare_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (Compare_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Compare_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Compare_0123456789876543210Sym1KindInference ()) + type Compare_0123456789876543210Sym2 :: Type -> Type -> Ordering + type family Compare_0123456789876543210Sym2 (a0123456789876543210 :: Type) (a0123456789876543210 :: Type) :: Ordering where + Compare_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance POrd Type where + type Compare a a = Apply (Apply Compare_0123456789876543210Sym0 a) a + type ShowsPrec_0123456789876543210 :: GHC.Num.Natural.Natural + -> Type -> Symbol -> Symbol + type family ShowsPrec_0123456789876543210 (a :: GHC.Num.Natural.Natural) (a :: Type) (a :: Symbol) :: Symbol where + ShowsPrec_0123456789876543210 _ Nat a_0123456789876543210 = Apply (Apply ShowStringSym0 "Nat") a_0123456789876543210 + ShowsPrec_0123456789876543210 _ Int a_0123456789876543210 = Apply (Apply ShowStringSym0 "Int") a_0123456789876543210 + ShowsPrec_0123456789876543210 _ String a_0123456789876543210 = Apply (Apply ShowStringSym0 "String") a_0123456789876543210 + ShowsPrec_0123456789876543210 p_0123456789876543210 (Maybe arg_0123456789876543210) a_0123456789876543210 = Apply (Apply (Apply ShowParenSym0 (Apply (Apply (>@#@$) p_0123456789876543210) (FromInteger 10))) (Apply (Apply (.@#@$) (Apply ShowStringSym0 "Maybe ")) (Apply (Apply ShowsPrecSym0 (FromInteger 11)) arg_0123456789876543210))) a_0123456789876543210 + ShowsPrec_0123456789876543210 p_0123456789876543210 (Vec arg_0123456789876543210 arg_0123456789876543210) a_0123456789876543210 = Apply (Apply (Apply ShowParenSym0 (Apply (Apply (>@#@$) p_0123456789876543210) (FromInteger 10))) (Apply (Apply (.@#@$) (Apply ShowStringSym0 "Vec ")) (Apply (Apply (.@#@$) (Apply (Apply ShowsPrecSym0 (FromInteger 11)) arg_0123456789876543210)) (Apply (Apply (.@#@$) ShowSpaceSym0) (Apply (Apply ShowsPrecSym0 (FromInteger 11)) arg_0123456789876543210))))) a_0123456789876543210 + type ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) Type ((~>) Symbol Symbol)) + data ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) Type ((~>) Symbol Symbol)) + where + ShowsPrec_0123456789876543210Sym0KindInference :: SameKind (Apply ShowsPrec_0123456789876543210Sym0 arg) (ShowsPrec_0123456789876543210Sym1 arg) => + ShowsPrec_0123456789876543210Sym0 a0123456789876543210 + type instance Apply ShowsPrec_0123456789876543210Sym0 a0123456789876543210 = ShowsPrec_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings ShowsPrec_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym0KindInference ()) + type ShowsPrec_0123456789876543210Sym1 :: GHC.Num.Natural.Natural + -> (~>) Type ((~>) Symbol Symbol) + data ShowsPrec_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Num.Natural.Natural) :: (~>) Type ((~>) Symbol Symbol) + where + ShowsPrec_0123456789876543210Sym1KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 arg) => + ShowsPrec_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym1KindInference ()) + type ShowsPrec_0123456789876543210Sym2 :: GHC.Num.Natural.Natural + -> Type -> (~>) Symbol Symbol + data ShowsPrec_0123456789876543210Sym2 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: Type) :: (~>) Symbol Symbol + where + ShowsPrec_0123456789876543210Sym2KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 arg) => + ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym2KindInference ()) + type ShowsPrec_0123456789876543210Sym3 :: GHC.Num.Natural.Natural + -> Type -> Symbol -> Symbol + type family ShowsPrec_0123456789876543210Sym3 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: Type) (a0123456789876543210 :: Symbol) :: Symbol where + ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PShow Type where + type ShowsPrec a a a = Apply (Apply (Apply ShowsPrec_0123456789876543210Sym0 a) a) a + data SRep :: Type -> Type + where + SNat :: SRep (Nat :: Type) + SInt :: SRep (Int :: Type) + SString :: SRep (String :: Type) + SMaybe :: forall (n :: Type). (Sing n) -> SRep (Maybe n :: Type) + SVec :: forall (n :: Type) (n :: Nat). + (Sing n) -> (Sing n) -> SRep (Vec n n :: Type) + type instance Sing @Type = SRep + instance SingKind Type where + type Demote Type = Rep + fromSing SNat = Singletons.Star.Nat + fromSing SInt = Singletons.Star.Int + fromSing SString = Singletons.Star.String + fromSing (SMaybe b) = Singletons.Star.Maybe (fromSing b) + fromSing (SVec b b) = Singletons.Star.Vec (fromSing b) (fromSing b) + toSing Singletons.Star.Nat = SomeSing SNat + toSing Singletons.Star.Int = SomeSing SInt + toSing Singletons.Star.String = SomeSing SString + toSing (Singletons.Star.Maybe (b :: Demote Type)) + = case toSing b :: SomeSing Type of + SomeSing c -> SomeSing (SMaybe c) + toSing (Singletons.Star.Vec (b :: Demote Type) (b :: Demote Nat)) + = case + (,) (toSing b :: SomeSing Type) (toSing b :: SomeSing Nat) + of + (,) (SomeSing c) (SomeSing c) -> SomeSing (SVec c c) + instance (SDecide Type, SDecide Nat) => SDecide Type where + (%~) SNat SNat = Proved Refl + (%~) SNat SInt = Disproved (\ x -> case x of {}) + (%~) SNat SString = Disproved (\ x -> case x of {}) + (%~) SNat (SMaybe _) = Disproved (\ x -> case x of {}) + (%~) SNat (SVec _ _) = Disproved (\ x -> case x of {}) + (%~) SInt SNat = Disproved (\ x -> case x of {}) + (%~) SInt SInt = Proved Refl + (%~) SInt SString = Disproved (\ x -> case x of {}) + (%~) SInt (SMaybe _) = Disproved (\ x -> case x of {}) + (%~) SInt (SVec _ _) = Disproved (\ x -> case x of {}) + (%~) SString SNat = Disproved (\ x -> case x of {}) + (%~) SString SInt = Disproved (\ x -> case x of {}) + (%~) SString SString = Proved Refl + (%~) SString (SMaybe _) = Disproved (\ x -> case x of {}) + (%~) SString (SVec _ _) = Disproved (\ x -> case x of {}) + (%~) (SMaybe _) SNat = Disproved (\ x -> case x of {}) + (%~) (SMaybe _) SInt = Disproved (\ x -> case x of {}) + (%~) (SMaybe _) SString = Disproved (\ x -> case x of {}) + (%~) (SMaybe a) (SMaybe b) + = case (%~) a b of + Proved Refl -> Proved Refl + Disproved contra + -> Disproved (\ refl -> case refl of Refl -> contra Refl) + (%~) (SMaybe _) (SVec _ _) = Disproved (\ x -> case x of {}) + (%~) (SVec _ _) SNat = Disproved (\ x -> case x of {}) + (%~) (SVec _ _) SInt = Disproved (\ x -> case x of {}) + (%~) (SVec _ _) SString = Disproved (\ x -> case x of {}) + (%~) (SVec _ _) (SMaybe _) = Disproved (\ x -> case x of {}) + (%~) (SVec a a) (SVec b b) + = case (,) ((%~) a b) ((%~) a b) of + (,) (Proved Refl) (Proved Refl) -> Proved Refl + (,) (Disproved contra) _ + -> Disproved (\ refl -> case refl of Refl -> contra Refl) + (,) _ (Disproved contra) + -> Disproved (\ refl -> case refl of Refl -> contra Refl) + instance (SDecide Type, SDecide Nat) => + Data.Type.Equality.TestEquality (SRep :: Type -> Type) where + Data.Type.Equality.testEquality = decideEquality + instance (SDecide Type, SDecide Nat) => + Data.Type.Coercion.TestCoercion (SRep :: Type -> Type) where + Data.Type.Coercion.testCoercion = decideCoercion + instance (SEq Type, SEq Nat) => SEq Type where + (%==) :: + forall (t1 :: Type) (t2 :: Type). Sing t1 + -> Sing t2 + -> Sing (Apply (Apply ((==@#@$) :: TyFun Type ((~>) Type Bool) + -> Type) t1) t2) + (%==) SNat SNat = STrue + (%==) SNat SInt = SFalse + (%==) SNat SString = SFalse + (%==) SNat (SMaybe _) = SFalse + (%==) SNat (SVec _ _) = SFalse + (%==) SInt SNat = SFalse + (%==) SInt SInt = STrue + (%==) SInt SString = SFalse + (%==) SInt (SMaybe _) = SFalse + (%==) SInt (SVec _ _) = SFalse + (%==) SString SNat = SFalse + (%==) SString SInt = SFalse + (%==) SString SString = STrue + (%==) SString (SMaybe _) = SFalse + (%==) SString (SVec _ _) = SFalse + (%==) (SMaybe _) SNat = SFalse + (%==) (SMaybe _) SInt = SFalse + (%==) (SMaybe _) SString = SFalse + (%==) + (SMaybe (sA_0123456789876543210 :: Sing a_0123456789876543210)) + (SMaybe (sB_0123456789876543210 :: Sing b_0123456789876543210)) + = applySing + (applySing (singFun2 @(==@#@$) (%==)) sA_0123456789876543210) + sB_0123456789876543210 + (%==) (SMaybe _) (SVec _ _) = SFalse + (%==) (SVec _ _) SNat = SFalse + (%==) (SVec _ _) SInt = SFalse + (%==) (SVec _ _) SString = SFalse + (%==) (SVec _ _) (SMaybe _) = SFalse + (%==) + (SVec (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210)) + (SVec (sB_0123456789876543210 :: Sing b_0123456789876543210) + (sB_0123456789876543210 :: Sing b_0123456789876543210)) + = applySing + (applySing + (singFun2 @(&&@#@$) (%&&)) + (applySing + (applySing (singFun2 @(==@#@$) (%==)) sA_0123456789876543210) + sB_0123456789876543210)) + (applySing + (applySing (singFun2 @(==@#@$) (%==)) sA_0123456789876543210) + sB_0123456789876543210) + instance (SOrd Type, SOrd Nat) => SOrd Type where + sCompare :: + forall (t1 :: Type) (t2 :: Type). Sing t1 + -> Sing t2 + -> Sing (Apply (Apply (CompareSym0 :: TyFun Type ((~>) Type Ordering) + -> Type) t1) t2) + sCompare SNat SNat + = applySing + (applySing + (applySing (singFun3 @FoldlSym0 sFoldl) (singFun2 @(<>@#@$) (%<>))) + SEQ) + SNil + sCompare SInt SInt + = applySing + (applySing + (applySing (singFun3 @FoldlSym0 sFoldl) (singFun2 @(<>@#@$) (%<>))) + SEQ) + SNil + sCompare SString SString + = applySing + (applySing + (applySing (singFun3 @FoldlSym0 sFoldl) (singFun2 @(<>@#@$) (%<>))) + SEQ) + SNil + sCompare + (SMaybe (sA_0123456789876543210 :: Sing a_0123456789876543210)) + (SMaybe (sB_0123456789876543210 :: Sing b_0123456789876543210)) + = applySing + (applySing + (applySing (singFun3 @FoldlSym0 sFoldl) (singFun2 @(<>@#@$) (%<>))) + SEQ) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing + (applySing (singFun2 @CompareSym0 sCompare) sA_0123456789876543210) + sB_0123456789876543210)) + SNil) + sCompare + (SVec (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210)) + (SVec (sB_0123456789876543210 :: Sing b_0123456789876543210) + (sB_0123456789876543210 :: Sing b_0123456789876543210)) + = applySing + (applySing + (applySing (singFun3 @FoldlSym0 sFoldl) (singFun2 @(<>@#@$) (%<>))) + SEQ) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing + (applySing (singFun2 @CompareSym0 sCompare) sA_0123456789876543210) + sB_0123456789876543210)) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing + (applySing (singFun2 @CompareSym0 sCompare) sA_0123456789876543210) + sB_0123456789876543210)) + SNil)) + sCompare SNat SInt = SLT + sCompare SNat SString = SLT + sCompare SNat (SMaybe _) = SLT + sCompare SNat (SVec _ _) = SLT + sCompare SInt SNat = SGT + sCompare SInt SString = SLT + sCompare SInt (SMaybe _) = SLT + sCompare SInt (SVec _ _) = SLT + sCompare SString SNat = SGT + sCompare SString SInt = SGT + sCompare SString (SMaybe _) = SLT + sCompare SString (SVec _ _) = SLT + sCompare (SMaybe _) SNat = SGT + sCompare (SMaybe _) SInt = SGT + sCompare (SMaybe _) SString = SGT + sCompare (SMaybe _) (SVec _ _) = SLT + sCompare (SVec _ _) SNat = SGT + sCompare (SVec _ _) SInt = SGT + sCompare (SVec _ _) SString = SGT + sCompare (SVec _ _) (SMaybe _) = SGT + instance (SShow Type, SShow Nat) => SShow Type where + sShowsPrec :: + forall (t1 :: GHC.Num.Natural.Natural) + (t2 :: Type) + (t3 :: Symbol). Sing t1 + -> Sing t2 + -> Sing t3 + -> Sing (Apply (Apply (Apply (ShowsPrecSym0 :: TyFun GHC.Num.Natural.Natural ((~>) Type ((~>) Symbol Symbol)) + -> Type) t1) t2) t3) + sShowsPrec + _ + SNat + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "Nat")) + sA_0123456789876543210 + sShowsPrec + _ + SInt + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "Int")) + sA_0123456789876543210 + sShowsPrec + _ + SString + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "String")) + sA_0123456789876543210 + sShowsPrec + (sP_0123456789876543210 :: Sing p_0123456789876543210) + (SMaybe (sArg_0123456789876543210 :: Sing arg_0123456789876543210)) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (applySing + (singFun3 @ShowParenSym0 sShowParen) + (applySing + (applySing (singFun2 @(>@#@$) (%>)) sP_0123456789876543210) + (sFromInteger (sing :: Sing 10)))) + (applySing + (applySing + (singFun3 @(.@#@$) (%.)) + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "Maybe "))) + (applySing + (applySing + (singFun3 @ShowsPrecSym0 sShowsPrec) + (sFromInteger (sing :: Sing 11))) + sArg_0123456789876543210))) + sA_0123456789876543210 + sShowsPrec + (sP_0123456789876543210 :: Sing p_0123456789876543210) + (SVec (sArg_0123456789876543210 :: Sing arg_0123456789876543210) + (sArg_0123456789876543210 :: Sing arg_0123456789876543210)) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (applySing + (singFun3 @ShowParenSym0 sShowParen) + (applySing + (applySing (singFun2 @(>@#@$) (%>)) sP_0123456789876543210) + (sFromInteger (sing :: Sing 10)))) + (applySing + (applySing + (singFun3 @(.@#@$) (%.)) + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "Vec "))) + (applySing + (applySing + (singFun3 @(.@#@$) (%.)) + (applySing + (applySing + (singFun3 @ShowsPrecSym0 sShowsPrec) + (sFromInteger (sing :: Sing 11))) + sArg_0123456789876543210)) + (applySing + (applySing + (singFun3 @(.@#@$) (%.)) (singFun1 @ShowSpaceSym0 sShowSpace)) + (applySing + (applySing + (singFun3 @ShowsPrecSym0 sShowsPrec) + (sFromInteger (sing :: Sing 11))) + sArg_0123456789876543210))))) + sA_0123456789876543210 + instance SingI Nat where + sing = SNat + instance SingI Int where + sing = SInt + instance SingI String where + sing = SString + instance SingI n => SingI (Maybe (n :: Type)) where + sing = SMaybe sing + instance SingI1 Maybe where + liftSing = SMaybe + instance SingI (MaybeSym0 :: (~>) Type Type) where + sing = singFun1 @MaybeSym0 SMaybe + instance (SingI n, SingI n) => + SingI (Vec (n :: Type) (n :: Nat)) where + sing = SVec sing sing + instance SingI n => SingI1 (Vec (n :: Type)) where + liftSing = SVec sing + instance SingI2 Vec where + liftSing2 = SVec + instance SingI (VecSym0 :: (~>) Type ((~>) Nat Type)) where + sing = singFun2 @VecSym0 SVec + instance SingI d => + SingI (VecSym1 (d :: Type) :: (~>) Nat Type) where + sing = singFun1 @(VecSym1 (d :: Type)) (SVec (sing @d)) + instance SingI1 (VecSym1 :: Type -> (~>) Nat Type) where + liftSing (s :: Sing (d :: Type)) + = singFun1 @(VecSym1 (d :: Type)) (SVec s)
tests/compile-and-dump/Singletons/Star.hs view
@@ -1,13 +1,13 @@-module Singletons.Star where--import Data.Singletons.Decide-import Data.Singletons.Base.CustomStar-import Prelude.Singletons-import Singletons.Nat-import Data.Kind (Type)--data Vec :: Type -> Nat -> Type where- VNil :: Vec a Zero- VCons :: a -> Vec a n -> Vec a (Succ n)--$(singletonStar [''Nat, ''Int, ''String, ''Maybe, ''Vec])+module Singletons.Star where + +import Data.Singletons.Decide +import Data.Singletons.Base.CustomStar +import Prelude.Singletons +import Singletons.Nat +import Data.Kind (Type) + +data Vec :: Type -> Nat -> Type where + VNil :: Vec a Zero + VCons :: a -> Vec a n -> Vec a (Succ n) + +$(singletonStar [''Nat, ''Int, ''String, ''Maybe, ''Vec])
tests/compile-and-dump/Singletons/T124.golden view
@@ -1,35 +1,37 @@-Singletons/T124.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| foo :: Bool -> ()- foo True = ()- foo False = () |]- ======>- foo :: Bool -> ()- foo True = ()- foo False = ()- type FooSym0 :: (~>) Bool ()- data FooSym0 :: (~>) Bool ()- where- FooSym0KindInference :: SameKind (Apply FooSym0 arg) (FooSym1 arg) =>- FooSym0 a0123456789876543210- type instance Apply FooSym0 a0123456789876543210 = Foo a0123456789876543210- instance SuppressUnusedWarnings FooSym0 where- suppressUnusedWarnings = snd (((,) FooSym0KindInference) ())- type FooSym1 :: Bool -> ()- type family FooSym1 (a0123456789876543210 :: Bool) :: () where- FooSym1 a0123456789876543210 = Foo a0123456789876543210- type Foo :: Bool -> ()- type family Foo (a :: Bool) :: () where- Foo 'True = Tuple0Sym0- Foo 'False = Tuple0Sym0- sFoo :: forall (t :: Bool). Sing t -> Sing (Apply FooSym0 t :: ())- sFoo STrue = STuple0- sFoo SFalse = STuple0- instance SingI (FooSym0 :: (~>) Bool ()) where- sing = (singFun1 @FooSym0) sFoo-Singletons/T124.hs:0:0:: Splicing expression- sCases ''Bool [| b |] [| STuple0 |]- ======>- case b of- SFalse -> STuple0- STrue -> STuple0+Singletons/T124.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| foo :: Bool -> () + foo True = () + foo False = () |] + ======> + foo :: Bool -> () + foo True = () + foo False = () + type FooSym0 :: (~>) Bool () + data FooSym0 :: (~>) Bool () + where + FooSym0KindInference :: SameKind (Apply FooSym0 arg) (FooSym1 arg) => + FooSym0 a0123456789876543210 + type instance Apply FooSym0 a0123456789876543210 = Foo a0123456789876543210 + instance SuppressUnusedWarnings FooSym0 where + suppressUnusedWarnings = snd ((,) FooSym0KindInference ()) + type FooSym1 :: Bool -> () + type family FooSym1 (a0123456789876543210 :: Bool) :: () where + FooSym1 a0123456789876543210 = Foo a0123456789876543210 + type Foo :: Bool -> () + type family Foo (a :: Bool) :: () where + Foo 'True = Tuple0Sym0 + Foo 'False = Tuple0Sym0 + sFoo :: + (forall (t :: Bool). + Sing t -> Sing (Apply FooSym0 t :: ()) :: Type) + sFoo STrue = STuple0 + sFoo SFalse = STuple0 + instance SingI (FooSym0 :: (~>) Bool ()) where + sing = singFun1 @FooSym0 sFoo +Singletons/T124.hs:0:0:: Splicing expression + sCases ''Bool [| b |] [| STuple0 |] + ======> + case b of + SFalse -> STuple0 + STrue -> STuple0
tests/compile-and-dump/Singletons/T124.hs view
@@ -1,13 +1,13 @@-module Singletons.T124 where--import Data.Singletons.TH-import Prelude.Singletons--$(singletons [d|- foo :: Bool -> ()- foo True = ()- foo False = ()- |])--bar :: SBool b -> STuple0 (Foo b)-bar b = $(sCases ''Bool [| b |] [| STuple0 |])+module Singletons.T124 where + +import Data.Singletons.TH +import Prelude.Singletons + +$(singletons [d| + foo :: Bool -> () + foo True = () + foo False = () + |]) + +bar :: SBool b -> STuple0 (Foo b) +bar b = $(sCases ''Bool [| b |] [| STuple0 |])
tests/compile-and-dump/Singletons/T136.golden view
@@ -1,180 +1,186 @@-Singletons/T136.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| instance Enum BiNat where- succ [] = [True]- succ (False : as) = True : as- succ (True : as) = False : succ as- pred [] = error "pred 0"- pred (False : as) = True : pred as- pred (True : as) = False : as- toEnum i- | i < 0 = error "negative toEnum"- | i == 0 = []- | otherwise = succ (toEnum (pred i))- fromEnum [] = 0- fromEnum (False : as) = 2 * fromEnum as- fromEnum (True : as) = 1 + 2 * fromEnum as |]- ======>- instance Enum BiNat where- succ [] = [True]- succ (False : as) = (True : as)- succ (True : as) = (False : succ as)- pred [] = error "pred 0"- pred (False : as) = (True : pred as)- pred (True : as) = (False : as)- toEnum i- | (i < 0) = error "negative toEnum"- | (i == 0) = []- | otherwise = succ (toEnum (pred i))- fromEnum [] = 0- fromEnum (False : as) = (2 * fromEnum as)- fromEnum (True : as) = (1 + (2 * fromEnum as))- type Succ_0123456789876543210 :: [Bool] -> [Bool]- type family Succ_0123456789876543210 (a :: [Bool]) :: [Bool] where- Succ_0123456789876543210 '[] = Apply (Apply (:@#@$) TrueSym0) NilSym0- Succ_0123456789876543210 ('(:) 'False as) = Apply (Apply (:@#@$) TrueSym0) as- Succ_0123456789876543210 ('(:) 'True as) = Apply (Apply (:@#@$) FalseSym0) (Apply SuccSym0 as)- type Succ_0123456789876543210Sym0 :: (~>) [Bool] [Bool]- data Succ_0123456789876543210Sym0 :: (~>) [Bool] [Bool]- where- Succ_0123456789876543210Sym0KindInference :: SameKind (Apply Succ_0123456789876543210Sym0 arg) (Succ_0123456789876543210Sym1 arg) =>- Succ_0123456789876543210Sym0 a0123456789876543210- type instance Apply Succ_0123456789876543210Sym0 a0123456789876543210 = Succ_0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings Succ_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Succ_0123456789876543210Sym0KindInference) ())- type Succ_0123456789876543210Sym1 :: [Bool] -> [Bool]- type family Succ_0123456789876543210Sym1 (a0123456789876543210 :: [Bool]) :: [Bool] where- Succ_0123456789876543210Sym1 a0123456789876543210 = Succ_0123456789876543210 a0123456789876543210- type Pred_0123456789876543210 :: [Bool] -> [Bool]- type family Pred_0123456789876543210 (a :: [Bool]) :: [Bool] where- Pred_0123456789876543210 '[] = Apply ErrorSym0 "pred 0"- Pred_0123456789876543210 ('(:) 'False as) = Apply (Apply (:@#@$) TrueSym0) (Apply PredSym0 as)- Pred_0123456789876543210 ('(:) 'True as) = Apply (Apply (:@#@$) FalseSym0) as- type Pred_0123456789876543210Sym0 :: (~>) [Bool] [Bool]- data Pred_0123456789876543210Sym0 :: (~>) [Bool] [Bool]- where- Pred_0123456789876543210Sym0KindInference :: SameKind (Apply Pred_0123456789876543210Sym0 arg) (Pred_0123456789876543210Sym1 arg) =>- Pred_0123456789876543210Sym0 a0123456789876543210- type instance Apply Pred_0123456789876543210Sym0 a0123456789876543210 = Pred_0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings Pred_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Pred_0123456789876543210Sym0KindInference) ())- type Pred_0123456789876543210Sym1 :: [Bool] -> [Bool]- type family Pred_0123456789876543210Sym1 (a0123456789876543210 :: [Bool]) :: [Bool] where- Pred_0123456789876543210Sym1 a0123456789876543210 = Pred_0123456789876543210 a0123456789876543210- type family Case_0123456789876543210 i arg_0123456789876543210 t where- Case_0123456789876543210 i arg_0123456789876543210 'True = NilSym0- Case_0123456789876543210 i arg_0123456789876543210 'False = Apply SuccSym0 (Apply ToEnumSym0 (Apply PredSym0 i))- type family Case_0123456789876543210 i arg_0123456789876543210 t where- Case_0123456789876543210 i arg_0123456789876543210 'True = Apply ErrorSym0 "negative toEnum"- Case_0123456789876543210 i arg_0123456789876543210 'False = Case_0123456789876543210 i arg_0123456789876543210 (Apply (Apply (==@#@$) i) (FromInteger 0))- type family Case_0123456789876543210 arg_0123456789876543210 t where- Case_0123456789876543210 arg_0123456789876543210 i = Case_0123456789876543210 i arg_0123456789876543210 (Apply (Apply (<@#@$) i) (FromInteger 0))- type ToEnum_0123456789876543210 :: GHC.Num.Natural.Natural- -> [Bool]- type family ToEnum_0123456789876543210 (a :: GHC.Num.Natural.Natural) :: [Bool] where- ToEnum_0123456789876543210 arg_0123456789876543210 = Case_0123456789876543210 arg_0123456789876543210 arg_0123456789876543210- type ToEnum_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural [Bool]- data ToEnum_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural [Bool]- where- ToEnum_0123456789876543210Sym0KindInference :: SameKind (Apply ToEnum_0123456789876543210Sym0 arg) (ToEnum_0123456789876543210Sym1 arg) =>- ToEnum_0123456789876543210Sym0 a0123456789876543210- type instance Apply ToEnum_0123456789876543210Sym0 a0123456789876543210 = ToEnum_0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings ToEnum_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) ToEnum_0123456789876543210Sym0KindInference) ())- type ToEnum_0123456789876543210Sym1 :: GHC.Num.Natural.Natural- -> [Bool]- type family ToEnum_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Num.Natural.Natural) :: [Bool] where- ToEnum_0123456789876543210Sym1 a0123456789876543210 = ToEnum_0123456789876543210 a0123456789876543210- type FromEnum_0123456789876543210 :: [Bool]- -> GHC.Num.Natural.Natural- type family FromEnum_0123456789876543210 (a :: [Bool]) :: GHC.Num.Natural.Natural where- FromEnum_0123456789876543210 '[] = FromInteger 0- FromEnum_0123456789876543210 ('(:) 'False as) = Apply (Apply (*@#@$) (FromInteger 2)) (Apply FromEnumSym0 as)- FromEnum_0123456789876543210 ('(:) 'True as) = Apply (Apply (+@#@$) (FromInteger 1)) (Apply (Apply (*@#@$) (FromInteger 2)) (Apply FromEnumSym0 as))- type FromEnum_0123456789876543210Sym0 :: (~>) [Bool] GHC.Num.Natural.Natural- data FromEnum_0123456789876543210Sym0 :: (~>) [Bool] GHC.Num.Natural.Natural- where- FromEnum_0123456789876543210Sym0KindInference :: SameKind (Apply FromEnum_0123456789876543210Sym0 arg) (FromEnum_0123456789876543210Sym1 arg) =>- FromEnum_0123456789876543210Sym0 a0123456789876543210- type instance Apply FromEnum_0123456789876543210Sym0 a0123456789876543210 = FromEnum_0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings FromEnum_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) FromEnum_0123456789876543210Sym0KindInference) ())- type FromEnum_0123456789876543210Sym1 :: [Bool]- -> GHC.Num.Natural.Natural- type family FromEnum_0123456789876543210Sym1 (a0123456789876543210 :: [Bool]) :: GHC.Num.Natural.Natural where- FromEnum_0123456789876543210Sym1 a0123456789876543210 = FromEnum_0123456789876543210 a0123456789876543210- instance PEnum [Bool] where- type Succ a = Apply Succ_0123456789876543210Sym0 a- type Pred a = Apply Pred_0123456789876543210Sym0 a- type ToEnum a = Apply ToEnum_0123456789876543210Sym0 a- type FromEnum a = Apply FromEnum_0123456789876543210Sym0 a- instance SEnum [Bool] where- sSucc ::- forall (t :: [Bool]). Sing t- -> Sing (Apply (SuccSym0 :: TyFun [Bool] [Bool] -> Type) t)- sPred ::- forall (t :: [Bool]). Sing t- -> Sing (Apply (PredSym0 :: TyFun [Bool] [Bool] -> Type) t)- sToEnum ::- forall (t :: GHC.Num.Natural.Natural). Sing t- -> Sing (Apply (ToEnumSym0 :: TyFun GHC.Num.Natural.Natural [Bool]- -> Type) t)- sFromEnum ::- forall (t :: [Bool]). Sing t- -> Sing (Apply (FromEnumSym0 :: TyFun [Bool] GHC.Num.Natural.Natural- -> Type) t)- sSucc SNil- = (applySing ((applySing ((singFun2 @(:@#@$)) SCons)) STrue)) SNil- sSucc (SCons SFalse (sAs :: Sing as))- = (applySing ((applySing ((singFun2 @(:@#@$)) SCons)) STrue)) sAs- sSucc (SCons STrue (sAs :: Sing as))- = (applySing ((applySing ((singFun2 @(:@#@$)) SCons)) SFalse))- ((applySing ((singFun1 @SuccSym0) sSucc)) sAs)- sPred SNil = sError (sing :: Sing "pred 0")- sPred (SCons SFalse (sAs :: Sing as))- = (applySing ((applySing ((singFun2 @(:@#@$)) SCons)) STrue))- ((applySing ((singFun1 @PredSym0) sPred)) sAs)- sPred (SCons STrue (sAs :: Sing as))- = (applySing ((applySing ((singFun2 @(:@#@$)) SCons)) SFalse)) sAs- sToEnum (sArg_0123456789876543210 :: Sing arg_0123456789876543210)- = (id- @(Sing (Case_0123456789876543210 arg_0123456789876543210 arg_0123456789876543210)))- (case sArg_0123456789876543210 of- (sI :: Sing i)- -> (id- @(Sing (Case_0123456789876543210 i arg_0123456789876543210 (Apply (Apply (<@#@$) i) (FromInteger 0)))))- (case- (applySing ((applySing ((singFun2 @(<@#@$)) (%<))) sI))- (sFromInteger (sing :: Sing 0))- of- STrue -> sError (sing :: Sing "negative toEnum")- SFalse- -> (id- @(Sing (Case_0123456789876543210 i arg_0123456789876543210 (Apply (Apply (==@#@$) i) (FromInteger 0)))))- (case- (applySing ((applySing ((singFun2 @(==@#@$)) (%==))) sI))- (sFromInteger (sing :: Sing 0))- of- STrue -> SNil- SFalse- -> (applySing ((singFun1 @SuccSym0) sSucc))- ((applySing ((singFun1 @ToEnumSym0) sToEnum))- ((applySing ((singFun1 @PredSym0) sPred)) sI)))))- sFromEnum SNil = sFromInteger (sing :: Sing 0)- sFromEnum (SCons SFalse (sAs :: Sing as))- = (applySing- ((applySing ((singFun2 @(*@#@$)) (%*)))- (sFromInteger (sing :: Sing 2))))- ((applySing ((singFun1 @FromEnumSym0) sFromEnum)) sAs)- sFromEnum (SCons STrue (sAs :: Sing as))- = (applySing- ((applySing ((singFun2 @(+@#@$)) (%+)))- (sFromInteger (sing :: Sing 1))))- ((applySing- ((applySing ((singFun2 @(*@#@$)) (%*)))- (sFromInteger (sing :: Sing 2))))- ((applySing ((singFun1 @FromEnumSym0) sFromEnum)) sAs))+Singletons/T136.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| instance Enum BiNat where + succ [] = [True] + succ (False : as) = True : as + succ (True : as) = False : succ as + pred [] = error "pred 0" + pred (False : as) = True : pred as + pred (True : as) = False : as + toEnum i + | i < 0 = error "negative toEnum" + | i == 0 = [] + | otherwise = succ (toEnum (pred i)) + fromEnum [] = 0 + fromEnum (False : as) = 2 * fromEnum as + fromEnum (True : as) = 1 + 2 * fromEnum as |] + ======> + instance Enum BiNat where + succ [] = [True] + succ (False : as) = (True : as) + succ (True : as) = (False : succ as) + pred [] = error "pred 0" + pred (False : as) = (True : pred as) + pred (True : as) = (False : as) + toEnum i + | (i < 0) = error "negative toEnum" + | (i == 0) = [] + | otherwise = succ (toEnum (pred i)) + fromEnum [] = 0 + fromEnum (False : as) = (2 * fromEnum as) + fromEnum (True : as) = (1 + (2 * fromEnum as)) + type Succ_0123456789876543210 :: [Bool] -> [Bool] + type family Succ_0123456789876543210 (a :: [Bool]) :: [Bool] where + Succ_0123456789876543210 '[] = Apply (Apply (:@#@$) TrueSym0) NilSym0 + Succ_0123456789876543210 ('(:) 'False as) = Apply (Apply (:@#@$) TrueSym0) as + Succ_0123456789876543210 ('(:) 'True as) = Apply (Apply (:@#@$) FalseSym0) (Apply SuccSym0 as) + type Succ_0123456789876543210Sym0 :: (~>) [Bool] [Bool] + data Succ_0123456789876543210Sym0 :: (~>) [Bool] [Bool] + where + Succ_0123456789876543210Sym0KindInference :: SameKind (Apply Succ_0123456789876543210Sym0 arg) (Succ_0123456789876543210Sym1 arg) => + Succ_0123456789876543210Sym0 a0123456789876543210 + type instance Apply Succ_0123456789876543210Sym0 a0123456789876543210 = Succ_0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings Succ_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Succ_0123456789876543210Sym0KindInference ()) + type Succ_0123456789876543210Sym1 :: [Bool] -> [Bool] + type family Succ_0123456789876543210Sym1 (a0123456789876543210 :: [Bool]) :: [Bool] where + Succ_0123456789876543210Sym1 a0123456789876543210 = Succ_0123456789876543210 a0123456789876543210 + type Pred_0123456789876543210 :: [Bool] -> [Bool] + type family Pred_0123456789876543210 (a :: [Bool]) :: [Bool] where + Pred_0123456789876543210 '[] = Apply ErrorSym0 "pred 0" + Pred_0123456789876543210 ('(:) 'False as) = Apply (Apply (:@#@$) TrueSym0) (Apply PredSym0 as) + Pred_0123456789876543210 ('(:) 'True as) = Apply (Apply (:@#@$) FalseSym0) as + type Pred_0123456789876543210Sym0 :: (~>) [Bool] [Bool] + data Pred_0123456789876543210Sym0 :: (~>) [Bool] [Bool] + where + Pred_0123456789876543210Sym0KindInference :: SameKind (Apply Pred_0123456789876543210Sym0 arg) (Pred_0123456789876543210Sym1 arg) => + Pred_0123456789876543210Sym0 a0123456789876543210 + type instance Apply Pred_0123456789876543210Sym0 a0123456789876543210 = Pred_0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings Pred_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Pred_0123456789876543210Sym0KindInference ()) + type Pred_0123456789876543210Sym1 :: [Bool] -> [Bool] + type family Pred_0123456789876543210Sym1 (a0123456789876543210 :: [Bool]) :: [Bool] where + Pred_0123456789876543210Sym1 a0123456789876543210 = Pred_0123456789876543210 a0123456789876543210 + type family Case_0123456789876543210 i arg_0123456789876543210 t where + Case_0123456789876543210 i arg_0123456789876543210 'True = NilSym0 + Case_0123456789876543210 i arg_0123456789876543210 'False = Apply SuccSym0 (Apply ToEnumSym0 (Apply PredSym0 i)) + type family Case_0123456789876543210 i arg_0123456789876543210 t where + Case_0123456789876543210 i arg_0123456789876543210 'True = Apply ErrorSym0 "negative toEnum" + Case_0123456789876543210 i arg_0123456789876543210 'False = Case_0123456789876543210 i arg_0123456789876543210 (Apply (Apply (==@#@$) i) (FromInteger 0)) + type family Case_0123456789876543210 arg_0123456789876543210 t where + Case_0123456789876543210 arg_0123456789876543210 i = Case_0123456789876543210 i arg_0123456789876543210 (Apply (Apply (<@#@$) i) (FromInteger 0)) + type ToEnum_0123456789876543210 :: GHC.Num.Natural.Natural + -> [Bool] + type family ToEnum_0123456789876543210 (a :: GHC.Num.Natural.Natural) :: [Bool] where + ToEnum_0123456789876543210 arg_0123456789876543210 = Case_0123456789876543210 arg_0123456789876543210 arg_0123456789876543210 + type ToEnum_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural [Bool] + data ToEnum_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural [Bool] + where + ToEnum_0123456789876543210Sym0KindInference :: SameKind (Apply ToEnum_0123456789876543210Sym0 arg) (ToEnum_0123456789876543210Sym1 arg) => + ToEnum_0123456789876543210Sym0 a0123456789876543210 + type instance Apply ToEnum_0123456789876543210Sym0 a0123456789876543210 = ToEnum_0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings ToEnum_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) ToEnum_0123456789876543210Sym0KindInference ()) + type ToEnum_0123456789876543210Sym1 :: GHC.Num.Natural.Natural + -> [Bool] + type family ToEnum_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Num.Natural.Natural) :: [Bool] where + ToEnum_0123456789876543210Sym1 a0123456789876543210 = ToEnum_0123456789876543210 a0123456789876543210 + type FromEnum_0123456789876543210 :: [Bool] + -> GHC.Num.Natural.Natural + type family FromEnum_0123456789876543210 (a :: [Bool]) :: GHC.Num.Natural.Natural where + FromEnum_0123456789876543210 '[] = FromInteger 0 + FromEnum_0123456789876543210 ('(:) 'False as) = Apply (Apply (*@#@$) (FromInteger 2)) (Apply FromEnumSym0 as) + FromEnum_0123456789876543210 ('(:) 'True as) = Apply (Apply (+@#@$) (FromInteger 1)) (Apply (Apply (*@#@$) (FromInteger 2)) (Apply FromEnumSym0 as)) + type FromEnum_0123456789876543210Sym0 :: (~>) [Bool] GHC.Num.Natural.Natural + data FromEnum_0123456789876543210Sym0 :: (~>) [Bool] GHC.Num.Natural.Natural + where + FromEnum_0123456789876543210Sym0KindInference :: SameKind (Apply FromEnum_0123456789876543210Sym0 arg) (FromEnum_0123456789876543210Sym1 arg) => + FromEnum_0123456789876543210Sym0 a0123456789876543210 + type instance Apply FromEnum_0123456789876543210Sym0 a0123456789876543210 = FromEnum_0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings FromEnum_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) FromEnum_0123456789876543210Sym0KindInference ()) + type FromEnum_0123456789876543210Sym1 :: [Bool] + -> GHC.Num.Natural.Natural + type family FromEnum_0123456789876543210Sym1 (a0123456789876543210 :: [Bool]) :: GHC.Num.Natural.Natural where + FromEnum_0123456789876543210Sym1 a0123456789876543210 = FromEnum_0123456789876543210 a0123456789876543210 + instance PEnum [Bool] where + type Succ a = Apply Succ_0123456789876543210Sym0 a + type Pred a = Apply Pred_0123456789876543210Sym0 a + type ToEnum a = Apply ToEnum_0123456789876543210Sym0 a + type FromEnum a = Apply FromEnum_0123456789876543210Sym0 a + instance SEnum [Bool] where + sSucc :: + forall (t :: [Bool]). Sing t + -> Sing (Apply (SuccSym0 :: TyFun [Bool] [Bool] -> Type) t) + sPred :: + forall (t :: [Bool]). Sing t + -> Sing (Apply (PredSym0 :: TyFun [Bool] [Bool] -> Type) t) + sToEnum :: + forall (t :: GHC.Num.Natural.Natural). Sing t + -> Sing (Apply (ToEnumSym0 :: TyFun GHC.Num.Natural.Natural [Bool] + -> Type) t) + sFromEnum :: + forall (t :: [Bool]). Sing t + -> Sing (Apply (FromEnumSym0 :: TyFun [Bool] GHC.Num.Natural.Natural + -> Type) t) + sSucc SNil + = applySing (applySing (singFun2 @(:@#@$) SCons) STrue) SNil + sSucc (SCons SFalse (sAs :: Sing as)) + = applySing (applySing (singFun2 @(:@#@$) SCons) STrue) sAs + sSucc (SCons STrue (sAs :: Sing as)) + = applySing + (applySing (singFun2 @(:@#@$) SCons) SFalse) + (applySing (singFun1 @SuccSym0 sSucc) sAs) + sPred SNil = sError (sing :: Sing "pred 0") + sPred (SCons SFalse (sAs :: Sing as)) + = applySing + (applySing (singFun2 @(:@#@$) SCons) STrue) + (applySing (singFun1 @PredSym0 sPred) sAs) + sPred (SCons STrue (sAs :: Sing as)) + = applySing (applySing (singFun2 @(:@#@$) SCons) SFalse) sAs + sToEnum (sArg_0123456789876543210 :: Sing arg_0123456789876543210) + = id + @(Sing (Case_0123456789876543210 arg_0123456789876543210 arg_0123456789876543210)) + (case sArg_0123456789876543210 of + (sI :: Sing i) + -> id + @(Sing (Case_0123456789876543210 i arg_0123456789876543210 (Apply (Apply (<@#@$) i) (FromInteger 0)))) + (case + applySing + (applySing (singFun2 @(<@#@$) (%<)) sI) + (sFromInteger (sing :: Sing 0)) + of + STrue -> sError (sing :: Sing "negative toEnum") + SFalse + -> id + @(Sing (Case_0123456789876543210 i arg_0123456789876543210 (Apply (Apply (==@#@$) i) (FromInteger 0)))) + (case + applySing + (applySing (singFun2 @(==@#@$) (%==)) sI) + (sFromInteger (sing :: Sing 0)) + of + STrue -> SNil + SFalse + -> applySing + (singFun1 @SuccSym0 sSucc) + (applySing + (singFun1 @ToEnumSym0 sToEnum) + (applySing (singFun1 @PredSym0 sPred) sI))))) + sFromEnum SNil = sFromInteger (sing :: Sing 0) + sFromEnum (SCons SFalse (sAs :: Sing as)) + = applySing + (applySing + (singFun2 @(*@#@$) (%*)) (sFromInteger (sing :: Sing 2))) + (applySing (singFun1 @FromEnumSym0 sFromEnum) sAs) + sFromEnum (SCons STrue (sAs :: Sing as)) + = applySing + (applySing + (singFun2 @(+@#@$) (%+)) (sFromInteger (sing :: Sing 1))) + (applySing + (applySing + (singFun2 @(*@#@$) (%*)) (sFromInteger (sing :: Sing 2))) + (applySing (singFun1 @FromEnumSym0 sFromEnum) sAs))
tests/compile-and-dump/Singletons/T136.hs view
@@ -1,27 +1,27 @@-module Binary where--import Data.Singletons.Base.Enum-import Data.Singletons.TH-import Prelude.Singletons--type Bit = Bool-type BiNat = [Bit]--$(singletons [d|- instance Enum BiNat where- succ [] = [True]- succ (False:as) = True : as- succ (True:as) = False : succ as-- pred [] = error "pred 0"- pred (False:as) = True : pred as- pred (True:as) = False : as-- toEnum i | i < 0 = error "negative toEnum"- | i == 0 = []- | otherwise = succ (toEnum (pred i))-- fromEnum [] = 0- fromEnum (False:as) = 2 * fromEnum as- fromEnum (True:as) = 1 + 2 * fromEnum as- |])+module Binary where + +import Data.Singletons.Base.Enum +import Data.Singletons.TH +import Prelude.Singletons + +type Bit = Bool +type BiNat = [Bit] + +$(singletons [d| + instance Enum BiNat where + succ [] = [True] + succ (False:as) = True : as + succ (True:as) = False : succ as + + pred [] = error "pred 0" + pred (False:as) = True : pred as + pred (True:as) = False : as + + toEnum i | i < 0 = error "negative toEnum" + | i == 0 = [] + | otherwise = succ (toEnum (pred i)) + + fromEnum [] = 0 + fromEnum (False:as) = 2 * fromEnum as + fromEnum (True:as) = 1 + 2 * fromEnum as + |])
tests/compile-and-dump/Singletons/T136b.golden view
@@ -1,54 +1,55 @@-Singletons/T136b.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| class C a where- meth :: a -> a |]- ======>- class C a where- meth :: a -> a- type MethSym0 :: forall a. (~>) a a- data MethSym0 :: (~>) a a- where- MethSym0KindInference :: SameKind (Apply MethSym0 arg) (MethSym1 arg) =>- MethSym0 a0123456789876543210- type instance Apply MethSym0 a0123456789876543210 = Meth a0123456789876543210- instance SuppressUnusedWarnings MethSym0 where- suppressUnusedWarnings = snd (((,) MethSym0KindInference) ())- type MethSym1 :: forall a. a -> a- type family MethSym1 (a0123456789876543210 :: a) :: a where- MethSym1 a0123456789876543210 = Meth a0123456789876543210- class PC a where- type family Meth (arg :: a) :: a- class SC a where- sMeth :: forall (t :: a). Sing t -> Sing (Apply MethSym0 t :: a)- instance SC a => SingI (MethSym0 :: (~>) a a) where- sing = (singFun1 @MethSym0) sMeth-Singletons/T136b.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| instance C Bool where- meth = not |]- ======>- instance C Bool where- meth = not- type Meth_0123456789876543210 :: Bool -> Bool- type family Meth_0123456789876543210 (a :: Bool) :: Bool where- Meth_0123456789876543210 a_0123456789876543210 = Apply NotSym0 a_0123456789876543210- type Meth_0123456789876543210Sym0 :: (~>) Bool Bool- data Meth_0123456789876543210Sym0 :: (~>) Bool Bool- where- Meth_0123456789876543210Sym0KindInference :: SameKind (Apply Meth_0123456789876543210Sym0 arg) (Meth_0123456789876543210Sym1 arg) =>- Meth_0123456789876543210Sym0 a0123456789876543210- type instance Apply Meth_0123456789876543210Sym0 a0123456789876543210 = Meth_0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings Meth_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Meth_0123456789876543210Sym0KindInference) ())- type Meth_0123456789876543210Sym1 :: Bool -> Bool- type family Meth_0123456789876543210Sym1 (a0123456789876543210 :: Bool) :: Bool where- Meth_0123456789876543210Sym1 a0123456789876543210 = Meth_0123456789876543210 a0123456789876543210- instance PC Bool where- type Meth a = Apply Meth_0123456789876543210Sym0 a- instance SC Bool where- sMeth ::- forall (t :: Bool). Sing t- -> Sing (Apply (MethSym0 :: TyFun Bool Bool -> Type) t)- sMeth (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing ((singFun1 @NotSym0) sNot)) sA_0123456789876543210+Singletons/T136b.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| class C a where + meth :: a -> a |] + ======> + class C a where + meth :: a -> a + type MethSym0 :: forall a. (~>) a a + data MethSym0 :: (~>) a a + where + MethSym0KindInference :: SameKind (Apply MethSym0 arg) (MethSym1 arg) => + MethSym0 a0123456789876543210 + type instance Apply MethSym0 a0123456789876543210 = Meth a0123456789876543210 + instance SuppressUnusedWarnings MethSym0 where + suppressUnusedWarnings = snd ((,) MethSym0KindInference ()) + type MethSym1 :: forall a. a -> a + type family MethSym1 (a0123456789876543210 :: a) :: a where + MethSym1 a0123456789876543210 = Meth a0123456789876543210 + class PC a where + type family Meth (arg :: a) :: a + class SC a where + sMeth :: + (forall (t :: a). Sing t -> Sing (Apply MethSym0 t :: a) :: Type) + instance SC a => SingI (MethSym0 :: (~>) a a) where + sing = singFun1 @MethSym0 sMeth +Singletons/T136b.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| instance C Bool where + meth = not |] + ======> + instance C Bool where + meth = not + type Meth_0123456789876543210 :: Bool -> Bool + type family Meth_0123456789876543210 (a :: Bool) :: Bool where + Meth_0123456789876543210 a_0123456789876543210 = Apply NotSym0 a_0123456789876543210 + type Meth_0123456789876543210Sym0 :: (~>) Bool Bool + data Meth_0123456789876543210Sym0 :: (~>) Bool Bool + where + Meth_0123456789876543210Sym0KindInference :: SameKind (Apply Meth_0123456789876543210Sym0 arg) (Meth_0123456789876543210Sym1 arg) => + Meth_0123456789876543210Sym0 a0123456789876543210 + type instance Apply Meth_0123456789876543210Sym0 a0123456789876543210 = Meth_0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings Meth_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Meth_0123456789876543210Sym0KindInference ()) + type Meth_0123456789876543210Sym1 :: Bool -> Bool + type family Meth_0123456789876543210Sym1 (a0123456789876543210 :: Bool) :: Bool where + Meth_0123456789876543210Sym1 a0123456789876543210 = Meth_0123456789876543210 a0123456789876543210 + instance PC Bool where + type Meth a = Apply Meth_0123456789876543210Sym0 a + instance SC Bool where + sMeth :: + forall (t :: Bool). Sing t + -> Sing (Apply (MethSym0 :: TyFun Bool Bool -> Type) t) + sMeth (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing (singFun1 @NotSym0 sNot) sA_0123456789876543210
tests/compile-and-dump/Singletons/T136b.hs view
@@ -1,14 +1,14 @@-module T136b where--import Data.Bool.Singletons-import Data.Singletons.TH--$(singletons [d|- class C a where- meth :: a -> a- |])--$(singletons [d|- instance C Bool where- meth = not- |])+module T136b where + +import Data.Bool.Singletons +import Data.Singletons.TH + +$(singletons [d| + class C a where + meth :: a -> a + |]) + +$(singletons [d| + instance C Bool where + meth = not + |])
tests/compile-and-dump/Singletons/T145.golden view
@@ -1,41 +1,42 @@-Singletons/T145.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| class Column (f :: Type -> Type) where- col :: f a -> a -> Bool |]- ======>- class Column (f :: Type -> Type) where- col :: f a -> a -> Bool- type ColSym0 :: forall f a. (~>) (f a) ((~>) a Bool)- data ColSym0 :: (~>) (f a) ((~>) a Bool)- where- ColSym0KindInference :: SameKind (Apply ColSym0 arg) (ColSym1 arg) =>- ColSym0 a0123456789876543210- type instance Apply ColSym0 a0123456789876543210 = ColSym1 a0123456789876543210- instance SuppressUnusedWarnings ColSym0 where- suppressUnusedWarnings = snd (((,) ColSym0KindInference) ())- type ColSym1 :: forall f a. f a -> (~>) a Bool- data ColSym1 (a0123456789876543210 :: f a) :: (~>) a Bool- where- ColSym1KindInference :: SameKind (Apply (ColSym1 a0123456789876543210) arg) (ColSym2 a0123456789876543210 arg) =>- ColSym1 a0123456789876543210 a0123456789876543210- type instance Apply (ColSym1 a0123456789876543210) a0123456789876543210 = Col a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ColSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) ColSym1KindInference) ())- type ColSym2 :: forall f a. f a -> a -> Bool- type family ColSym2 (a0123456789876543210 :: f a) (a0123456789876543210 :: a) :: Bool where- ColSym2 a0123456789876543210 a0123456789876543210 = Col a0123456789876543210 a0123456789876543210- class PColumn (f :: Type -> Type) where- type family Col (arg :: f a) (arg :: a) :: Bool- class SColumn (f :: Type -> Type) where- sCol ::- forall a (t :: f a) (t :: a). Sing t- -> Sing t -> Sing (Apply (Apply ColSym0 t) t :: Bool)- instance SColumn f =>- SingI (ColSym0 :: (~>) (f a) ((~>) a Bool)) where- sing = (singFun2 @ColSym0) sCol- instance (SColumn f, SingI d) =>- SingI (ColSym1 (d :: f a) :: (~>) a Bool) where- sing = (singFun1 @(ColSym1 (d :: f a))) (sCol (sing @d))- instance SColumn f => SingI1 (ColSym1 :: f a -> (~>) a Bool) where- liftSing (s :: Sing (d :: f a))- = (singFun1 @(ColSym1 (d :: f a))) (sCol s)+Singletons/T145.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| class Column (f :: Type -> Type) where + col :: f a -> a -> Bool |] + ======> + class Column (f :: Type -> Type) where + col :: f a -> a -> Bool + type ColSym0 :: forall f a. (~>) (f a) ((~>) a Bool) + data ColSym0 :: (~>) (f a) ((~>) a Bool) + where + ColSym0KindInference :: SameKind (Apply ColSym0 arg) (ColSym1 arg) => + ColSym0 a0123456789876543210 + type instance Apply ColSym0 a0123456789876543210 = ColSym1 a0123456789876543210 + instance SuppressUnusedWarnings ColSym0 where + suppressUnusedWarnings = snd ((,) ColSym0KindInference ()) + type ColSym1 :: forall f a. f a -> (~>) a Bool + data ColSym1 (a0123456789876543210 :: f a) :: (~>) a Bool + where + ColSym1KindInference :: SameKind (Apply (ColSym1 a0123456789876543210) arg) (ColSym2 a0123456789876543210 arg) => + ColSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (ColSym1 a0123456789876543210) a0123456789876543210 = Col a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ColSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) ColSym1KindInference ()) + type ColSym2 :: forall f a. f a -> a -> Bool + type family ColSym2 (a0123456789876543210 :: f a) (a0123456789876543210 :: a) :: Bool where + ColSym2 a0123456789876543210 a0123456789876543210 = Col a0123456789876543210 a0123456789876543210 + class PColumn (f :: Type -> Type) where + type family Col (arg :: f a) (arg :: a) :: Bool + class SColumn (f :: Type -> Type) where + sCol :: + (forall (t :: f a) (t :: a). + Sing t + -> Sing t -> Sing (Apply (Apply ColSym0 t) t :: Bool) :: Type) + instance SColumn f => + SingI (ColSym0 :: (~>) (f a) ((~>) a Bool)) where + sing = singFun2 @ColSym0 sCol + instance (SColumn f, SingI d) => + SingI (ColSym1 (d :: f a) :: (~>) a Bool) where + sing = singFun1 @(ColSym1 (d :: f a)) (sCol (sing @d)) + instance SColumn f => SingI1 (ColSym1 :: f a -> (~>) a Bool) where + liftSing (s :: Sing (d :: f a)) + = singFun1 @(ColSym1 (d :: f a)) (sCol s)
tests/compile-and-dump/Singletons/T145.hs view
@@ -1,9 +1,9 @@-module Singletons.T145 where--import Data.Singletons.TH-import Data.Kind (Type)--$(singletons [d|- class Column (f :: Type -> Type) where- col :: f a -> a -> Bool- |])+module Singletons.T145 where + +import Data.Singletons.TH +import Data.Kind (Type) + +$(singletons [d| + class Column (f :: Type -> Type) where + col :: f a -> a -> Bool + |])
tests/compile-and-dump/Singletons/T150.golden view
@@ -1,417 +1,417 @@-Singletons/T150.hs:(0,0)-(0,0): Splicing declarations- withOptions defaultOptions {genSingKindInsts = False}- $ singletons- $ lift- [d| headVec :: Vec (Succ n) a -> a- headVec (VCons x _) = x- tailVec :: Vec (Succ n) a -> Vec n a- tailVec (VCons _ xs) = xs- (!) :: Vec n a -> Fin n -> a- VCons x _ ! FZ = x- VCons _ xs ! FS n = xs ! n- VNil ! n = case n of {}- mapVec :: (a -> b) -> Vec n a -> Vec n b- mapVec _ VNil = VNil- mapVec f (VCons x xs) = VCons (f x) (mapVec f xs)- symmetry :: Equal a b -> Equal b a- symmetry Reflexive = Reflexive- transitivity :: Equal a b -> Equal b c -> Equal a c- transitivity Reflexive Reflexive = Reflexive- - data Fin :: Nat -> Type- where- FZ :: Fin (Succ n)- FS :: Fin n -> Fin (Succ n)- data Foo :: Type -> Type- where- MkFoo1 :: Foo Bool- MkFoo2 :: Foo Ordering- data Vec :: Nat -> Type -> Type- where- VNil :: Vec Zero a- VCons :: a -> Vec n a -> Vec (Succ n) a- data Equal :: Type -> Type -> Type where Reflexive :: Equal a a- data HList :: [Type] -> Type- where- HNil :: HList '[]- HCons :: x -> HList xs -> HList (x : xs)- data Obj :: Type where Obj :: a -> Obj |]- ======>- data Fin :: Nat -> Type- where- FZ :: Fin ('Succ n)- FS :: (Fin n) -> Fin ('Succ n)- data Foo :: Type -> Type- where- MkFoo1 :: Foo Bool- MkFoo2 :: Foo Ordering- data Vec :: Nat -> Type -> Type- where- VNil :: Vec 'Zero a- VCons :: a -> (Vec n a) -> Vec ('Succ n) a- headVec :: Vec ('Succ n) a -> a- headVec (VCons x _) = x- tailVec :: Vec ('Succ n) a -> Vec n a- tailVec (VCons _ xs) = xs- (!) :: Vec n a -> Fin n -> a- (!) (VCons x _) FZ = x- (!) (VCons _ xs) (FS n) = (xs ! n)- (!) VNil n = case n of {}- mapVec :: (a -> b) -> Vec n a -> Vec n b- mapVec _ VNil = VNil- mapVec f (VCons x xs) = (VCons (f x)) ((mapVec f) xs)- data Equal :: Type -> Type -> Type where Reflexive :: Equal a a- symmetry :: Equal a b -> Equal b a- symmetry Reflexive = Reflexive- transitivity :: Equal a b -> Equal b c -> Equal a c- transitivity Reflexive Reflexive = Reflexive- data HList :: [Type] -> Type- where- HNil :: HList '[]- HCons :: x -> (HList xs) -> HList ('(:) x xs)- data Obj :: Type where Obj :: a -> Obj- type FZSym0 :: Fin ('Succ n)- type family FZSym0 :: Fin ('Succ n) where- FZSym0 = FZ- type FSSym0 :: (~>) (Fin n) (Fin ('Succ n))- data FSSym0 :: (~>) (Fin n) (Fin ('Succ n))- where- FSSym0KindInference :: SameKind (Apply FSSym0 arg) (FSSym1 arg) =>- FSSym0 a0123456789876543210- type instance Apply FSSym0 a0123456789876543210 = FS a0123456789876543210- instance SuppressUnusedWarnings FSSym0 where- suppressUnusedWarnings = snd (((,) FSSym0KindInference) ())- type FSSym1 :: Fin n -> Fin ('Succ n)- type family FSSym1 (a0123456789876543210 :: Fin n) :: Fin ('Succ n) where- FSSym1 a0123456789876543210 = FS a0123456789876543210- type MkFoo1Sym0 :: Foo Bool- type family MkFoo1Sym0 :: Foo Bool where- MkFoo1Sym0 = MkFoo1- type MkFoo2Sym0 :: Foo Ordering- type family MkFoo2Sym0 :: Foo Ordering where- MkFoo2Sym0 = MkFoo2- type VNilSym0 :: Vec 'Zero a- type family VNilSym0 :: Vec 'Zero a where- VNilSym0 = VNil- type VConsSym0 :: (~>) a ((~>) (Vec n a) (Vec ('Succ n) a))- data VConsSym0 :: (~>) a ((~>) (Vec n a) (Vec ('Succ n) a))- where- VConsSym0KindInference :: SameKind (Apply VConsSym0 arg) (VConsSym1 arg) =>- VConsSym0 a0123456789876543210- type instance Apply VConsSym0 a0123456789876543210 = VConsSym1 a0123456789876543210- instance SuppressUnusedWarnings VConsSym0 where- suppressUnusedWarnings = snd (((,) VConsSym0KindInference) ())- type VConsSym1 :: a -> (~>) (Vec n a) (Vec ('Succ n) a)- data VConsSym1 (a0123456789876543210 :: a) :: (~>) (Vec n a) (Vec ('Succ n) a)- where- VConsSym1KindInference :: SameKind (Apply (VConsSym1 a0123456789876543210) arg) (VConsSym2 a0123456789876543210 arg) =>- VConsSym1 a0123456789876543210 a0123456789876543210- type instance Apply (VConsSym1 a0123456789876543210) a0123456789876543210 = VCons a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (VConsSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) VConsSym1KindInference) ())- type VConsSym2 :: a -> Vec n a -> Vec ('Succ n) a- type family VConsSym2 (a0123456789876543210 :: a) (a0123456789876543210 :: Vec n a) :: Vec ('Succ n) a where- VConsSym2 a0123456789876543210 a0123456789876543210 = VCons a0123456789876543210 a0123456789876543210- type ReflexiveSym0 :: Equal a a- type family ReflexiveSym0 :: Equal a a where- ReflexiveSym0 = Reflexive- type HNilSym0 :: HList '[]- type family HNilSym0 :: HList '[] where- HNilSym0 = HNil- type HConsSym0 :: (~>) x ((~>) (HList xs) (HList ('(:) x xs)))- data HConsSym0 :: (~>) x ((~>) (HList xs) (HList ('(:) x xs)))- where- HConsSym0KindInference :: SameKind (Apply HConsSym0 arg) (HConsSym1 arg) =>- HConsSym0 a0123456789876543210- type instance Apply HConsSym0 a0123456789876543210 = HConsSym1 a0123456789876543210- instance SuppressUnusedWarnings HConsSym0 where- suppressUnusedWarnings = snd (((,) HConsSym0KindInference) ())- type HConsSym1 :: x -> (~>) (HList xs) (HList ('(:) x xs))- data HConsSym1 (a0123456789876543210 :: x) :: (~>) (HList xs) (HList ('(:) x xs))- where- HConsSym1KindInference :: SameKind (Apply (HConsSym1 a0123456789876543210) arg) (HConsSym2 a0123456789876543210 arg) =>- HConsSym1 a0123456789876543210 a0123456789876543210- type instance Apply (HConsSym1 a0123456789876543210) a0123456789876543210 = HCons a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (HConsSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) HConsSym1KindInference) ())- type HConsSym2 :: x -> HList xs -> HList ('(:) x xs)- type family HConsSym2 (a0123456789876543210 :: x) (a0123456789876543210 :: HList xs) :: HList ('(:) x xs) where- HConsSym2 a0123456789876543210 a0123456789876543210 = HCons a0123456789876543210 a0123456789876543210- type ObjSym0 :: (~>) a Obj- data ObjSym0 :: (~>) a Obj- where- ObjSym0KindInference :: SameKind (Apply ObjSym0 arg) (ObjSym1 arg) =>- ObjSym0 a0123456789876543210- type instance Apply ObjSym0 a0123456789876543210 = Obj a0123456789876543210- instance SuppressUnusedWarnings ObjSym0 where- suppressUnusedWarnings = snd (((,) ObjSym0KindInference) ())- type ObjSym1 :: a -> Obj- type family ObjSym1 (a0123456789876543210 :: a) :: Obj where- ObjSym1 a0123456789876543210 = Obj a0123456789876543210- type family Case_0123456789876543210 n t where- type TransitivitySym0 :: (~>) (Equal a b) ((~>) (Equal b c) (Equal a c))- data TransitivitySym0 :: (~>) (Equal a b) ((~>) (Equal b c) (Equal a c))- where- TransitivitySym0KindInference :: SameKind (Apply TransitivitySym0 arg) (TransitivitySym1 arg) =>- TransitivitySym0 a0123456789876543210- type instance Apply TransitivitySym0 a0123456789876543210 = TransitivitySym1 a0123456789876543210- instance SuppressUnusedWarnings TransitivitySym0 where- suppressUnusedWarnings- = snd (((,) TransitivitySym0KindInference) ())- type TransitivitySym1 :: Equal a b -> (~>) (Equal b c) (Equal a c)- data TransitivitySym1 (a0123456789876543210 :: Equal a b) :: (~>) (Equal b c) (Equal a c)- where- TransitivitySym1KindInference :: SameKind (Apply (TransitivitySym1 a0123456789876543210) arg) (TransitivitySym2 a0123456789876543210 arg) =>- TransitivitySym1 a0123456789876543210 a0123456789876543210- type instance Apply (TransitivitySym1 a0123456789876543210) a0123456789876543210 = Transitivity a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (TransitivitySym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) TransitivitySym1KindInference) ())- type TransitivitySym2 :: Equal a b -> Equal b c -> Equal a c- type family TransitivitySym2 (a0123456789876543210 :: Equal a b) (a0123456789876543210 :: Equal b c) :: Equal a c where- TransitivitySym2 a0123456789876543210 a0123456789876543210 = Transitivity a0123456789876543210 a0123456789876543210- type SymmetrySym0 :: (~>) (Equal a b) (Equal b a)- data SymmetrySym0 :: (~>) (Equal a b) (Equal b a)- where- SymmetrySym0KindInference :: SameKind (Apply SymmetrySym0 arg) (SymmetrySym1 arg) =>- SymmetrySym0 a0123456789876543210- type instance Apply SymmetrySym0 a0123456789876543210 = Symmetry a0123456789876543210- instance SuppressUnusedWarnings SymmetrySym0 where- suppressUnusedWarnings = snd (((,) SymmetrySym0KindInference) ())- type SymmetrySym1 :: Equal a b -> Equal b a- type family SymmetrySym1 (a0123456789876543210 :: Equal a b) :: Equal b a where- SymmetrySym1 a0123456789876543210 = Symmetry a0123456789876543210- type MapVecSym0 :: (~>) ((~>) a b) ((~>) (Vec n a) (Vec n b))- data MapVecSym0 :: (~>) ((~>) a b) ((~>) (Vec n a) (Vec n b))- where- MapVecSym0KindInference :: SameKind (Apply MapVecSym0 arg) (MapVecSym1 arg) =>- MapVecSym0 a0123456789876543210- type instance Apply MapVecSym0 a0123456789876543210 = MapVecSym1 a0123456789876543210- instance SuppressUnusedWarnings MapVecSym0 where- suppressUnusedWarnings = snd (((,) MapVecSym0KindInference) ())- type MapVecSym1 :: (~>) a b -> (~>) (Vec n a) (Vec n b)- data MapVecSym1 (a0123456789876543210 :: (~>) a b) :: (~>) (Vec n a) (Vec n b)- where- MapVecSym1KindInference :: SameKind (Apply (MapVecSym1 a0123456789876543210) arg) (MapVecSym2 a0123456789876543210 arg) =>- MapVecSym1 a0123456789876543210 a0123456789876543210- type instance Apply (MapVecSym1 a0123456789876543210) a0123456789876543210 = MapVec a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (MapVecSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) MapVecSym1KindInference) ())- type MapVecSym2 :: (~>) a b -> Vec n a -> Vec n b- type family MapVecSym2 (a0123456789876543210 :: (~>) a b) (a0123456789876543210 :: Vec n a) :: Vec n b where- MapVecSym2 a0123456789876543210 a0123456789876543210 = MapVec a0123456789876543210 a0123456789876543210- type (!@#@$) :: (~>) (Vec n a) ((~>) (Fin n) a)- data (!@#@$) :: (~>) (Vec n a) ((~>) (Fin n) a)- where- (:!@#@$###) :: SameKind (Apply (!@#@$) arg) ((!@#@$$) arg) =>- (!@#@$) a0123456789876543210- type instance Apply (!@#@$) a0123456789876543210 = (!@#@$$) a0123456789876543210- instance SuppressUnusedWarnings (!@#@$) where- suppressUnusedWarnings = snd (((,) (:!@#@$###)) ())- type (!@#@$$) :: Vec n a -> (~>) (Fin n) a- data (!@#@$$) (a0123456789876543210 :: Vec n a) :: (~>) (Fin n) a- where- (:!@#@$$###) :: SameKind (Apply ((!@#@$$) a0123456789876543210) arg) ((!@#@$$$) a0123456789876543210 arg) =>- (!@#@$$) a0123456789876543210 a0123456789876543210- type instance Apply ((!@#@$$) a0123456789876543210) a0123456789876543210 = (!) a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings ((!@#@$$) a0123456789876543210) where- suppressUnusedWarnings = snd (((,) (:!@#@$$###)) ())- type (!@#@$$$) :: Vec n a -> Fin n -> a- type family (!@#@$$$) (a0123456789876543210 :: Vec n a) (a0123456789876543210 :: Fin n) :: a where- (!@#@$$$) a0123456789876543210 a0123456789876543210 = (!) a0123456789876543210 a0123456789876543210- type TailVecSym0 :: (~>) (Vec ('Succ n) a) (Vec n a)- data TailVecSym0 :: (~>) (Vec ('Succ n) a) (Vec n a)- where- TailVecSym0KindInference :: SameKind (Apply TailVecSym0 arg) (TailVecSym1 arg) =>- TailVecSym0 a0123456789876543210- type instance Apply TailVecSym0 a0123456789876543210 = TailVec a0123456789876543210- instance SuppressUnusedWarnings TailVecSym0 where- suppressUnusedWarnings = snd (((,) TailVecSym0KindInference) ())- type TailVecSym1 :: Vec ('Succ n) a -> Vec n a- type family TailVecSym1 (a0123456789876543210 :: Vec ('Succ n) a) :: Vec n a where- TailVecSym1 a0123456789876543210 = TailVec a0123456789876543210- type HeadVecSym0 :: (~>) (Vec ('Succ n) a) a- data HeadVecSym0 :: (~>) (Vec ('Succ n) a) a- where- HeadVecSym0KindInference :: SameKind (Apply HeadVecSym0 arg) (HeadVecSym1 arg) =>- HeadVecSym0 a0123456789876543210- type instance Apply HeadVecSym0 a0123456789876543210 = HeadVec a0123456789876543210- instance SuppressUnusedWarnings HeadVecSym0 where- suppressUnusedWarnings = snd (((,) HeadVecSym0KindInference) ())- type HeadVecSym1 :: Vec ('Succ n) a -> a- type family HeadVecSym1 (a0123456789876543210 :: Vec ('Succ n) a) :: a where- HeadVecSym1 a0123456789876543210 = HeadVec a0123456789876543210- type Transitivity :: Equal a b -> Equal b c -> Equal a c- type family Transitivity (a :: Equal a b) (a :: Equal b c) :: Equal a c where- Transitivity Reflexive Reflexive = ReflexiveSym0- type Symmetry :: Equal a b -> Equal b a- type family Symmetry (a :: Equal a b) :: Equal b a where- Symmetry Reflexive = ReflexiveSym0- type MapVec :: (~>) a b -> Vec n a -> Vec n b- type family MapVec (a :: (~>) a b) (a :: Vec n a) :: Vec n b where- MapVec _ VNil = VNilSym0- MapVec f (VCons x xs) = Apply (Apply VConsSym0 (Apply f x)) (Apply (Apply MapVecSym0 f) xs)- type (!) :: Vec n a -> Fin n -> a- type family (!) (a :: Vec n a) (a :: Fin n) :: a where- (!) (VCons x _) FZ = x- (!) (VCons _ xs) (FS n) = Apply (Apply (!@#@$) xs) n- (!) VNil n = Case_0123456789876543210 n n- type TailVec :: Vec ('Succ n) a -> Vec n a- type family TailVec (a :: Vec ('Succ n) a) :: Vec n a where- TailVec (VCons _ xs) = xs- type HeadVec :: Vec ('Succ n) a -> a- type family HeadVec (a :: Vec ('Succ n) a) :: a where- HeadVec (VCons x _) = x- sTransitivity ::- forall a b c (t :: Equal a b) (t :: Equal b c). Sing t- -> Sing t- -> Sing (Apply (Apply TransitivitySym0 t) t :: Equal a c)- sSymmetry ::- forall a b (t :: Equal a b). Sing t- -> Sing (Apply SymmetrySym0 t :: Equal b a)- sMapVec ::- forall a b n (t :: (~>) a b) (t :: Vec n a). Sing t- -> Sing t- -> Sing (Apply (Apply MapVecSym0 t) t :: Vec n b)- (%!) ::- forall n a (t :: Vec n a) (t :: Fin n). Sing t- -> Sing t -> Sing (Apply (Apply (!@#@$) t) t :: a)- sTailVec ::- forall n a (t :: Vec ('Succ n) a). Sing t- -> Sing (Apply TailVecSym0 t :: Vec n a)- sHeadVec ::- forall n a (t :: Vec ('Succ n) a). Sing t- -> Sing (Apply HeadVecSym0 t :: a)- sTransitivity SReflexive SReflexive = SReflexive- sSymmetry SReflexive = SReflexive- sMapVec _ SVNil = SVNil- sMapVec (sF :: Sing f) (SVCons (sX :: Sing x) (sXs :: Sing xs))- = (applySing- ((applySing ((singFun2 @VConsSym0) SVCons)) ((applySing sF) sX)))- ((applySing ((applySing ((singFun2 @MapVecSym0) sMapVec)) sF)) sXs)- (%!) (SVCons (sX :: Sing x) _) SFZ = sX- (%!) (SVCons _ (sXs :: Sing xs)) (SFS (sN :: Sing n))- = (applySing ((applySing ((singFun2 @(!@#@$)) (%!))) sXs)) sN- (%!) SVNil (sN :: Sing n)- = (id @(Sing (Case_0123456789876543210 n n :: a))) (case sN of {})- sTailVec (SVCons _ (sXs :: Sing xs)) = sXs- sHeadVec (SVCons (sX :: Sing x) _) = sX- instance SingI (TransitivitySym0 :: (~>) (Equal a b) ((~>) (Equal b c) (Equal a c))) where- sing = (singFun2 @TransitivitySym0) sTransitivity- instance SingI d =>- SingI (TransitivitySym1 (d :: Equal a b) :: (~>) (Equal b c) (Equal a c)) where- sing- = (singFun1 @(TransitivitySym1 (d :: Equal a b)))- (sTransitivity (sing @d))- instance SingI1 (TransitivitySym1 :: Equal a b- -> (~>) (Equal b c) (Equal a c)) where- liftSing (s :: Sing (d :: Equal a b))- = (singFun1 @(TransitivitySym1 (d :: Equal a b))) (sTransitivity s)- instance SingI (SymmetrySym0 :: (~>) (Equal a b) (Equal b a)) where- sing = (singFun1 @SymmetrySym0) sSymmetry- instance SingI (MapVecSym0 :: (~>) ((~>) a b) ((~>) (Vec n a) (Vec n b))) where- sing = (singFun2 @MapVecSym0) sMapVec- instance SingI d =>- SingI (MapVecSym1 (d :: (~>) a b) :: (~>) (Vec n a) (Vec n b)) where- sing = (singFun1 @(MapVecSym1 (d :: (~>) a b))) (sMapVec (sing @d))- instance SingI1 (MapVecSym1 :: (~>) a b- -> (~>) (Vec n a) (Vec n b)) where- liftSing (s :: Sing (d :: (~>) a b))- = (singFun1 @(MapVecSym1 (d :: (~>) a b))) (sMapVec s)- instance SingI ((!@#@$) :: (~>) (Vec n a) ((~>) (Fin n) a)) where- sing = (singFun2 @(!@#@$)) (%!)- instance SingI d =>- SingI ((!@#@$$) (d :: Vec n a) :: (~>) (Fin n) a) where- sing = (singFun1 @((!@#@$$) (d :: Vec n a))) ((%!) (sing @d))- instance SingI1 ((!@#@$$) :: Vec n a -> (~>) (Fin n) a) where- liftSing (s :: Sing (d :: Vec n a))- = (singFun1 @((!@#@$$) (d :: Vec n a))) ((%!) s)- instance SingI (TailVecSym0 :: (~>) (Vec ('Succ n) a) (Vec n a)) where- sing = (singFun1 @TailVecSym0) sTailVec- instance SingI (HeadVecSym0 :: (~>) (Vec ('Succ n) a) a) where- sing = (singFun1 @HeadVecSym0) sHeadVec- data SFin :: forall (a :: Nat). Fin a -> Type- where- SFZ :: forall n. SFin (FZ :: Fin ('Succ n))- SFS :: forall n (n :: Fin n).- (Sing n) -> SFin (FS n :: Fin ('Succ n))- type instance Sing @(Fin a) = SFin- data SFoo :: forall (a :: Type). Foo a -> Type- where- SMkFoo1 :: SFoo (MkFoo1 :: Foo Bool)- SMkFoo2 :: SFoo (MkFoo2 :: Foo Ordering)- type instance Sing @(Foo a) = SFoo- data SVec :: forall (a :: Nat) (a :: Type). Vec a a -> Type- where- SVNil :: forall a. SVec (VNil :: Vec 'Zero a)- SVCons :: forall a n (n :: a) (n :: Vec n a).- (Sing n) -> (Sing n) -> SVec (VCons n n :: Vec ('Succ n) a)- type instance Sing @(Vec a a) = SVec- data SEqual :: forall (a :: Type) (a :: Type). Equal a a -> Type- where SReflexive :: forall a. SEqual (Reflexive :: Equal a a)- type instance Sing @(Equal a a) = SEqual- data SHList :: forall (a :: [Type]). HList a -> Type- where- SHNil :: SHList (HNil :: HList '[])- SHCons :: forall x xs (n :: x) (n :: HList xs).- (Sing n) -> (Sing n) -> SHList (HCons n n :: HList ('(:) x xs))- type instance Sing @(HList a) = SHList- data SObj :: Obj -> Type- where SObj :: forall a (n :: a). (Sing n) -> SObj (Obj n :: Obj)- type instance Sing @Obj = SObj- instance SingI FZ where- sing = SFZ- instance SingI n => SingI (FS (n :: Fin n)) where- sing = SFS sing- instance SingI1 FS where- liftSing = SFS- instance SingI (FSSym0 :: (~>) (Fin n) (Fin ('Succ n))) where- sing = (singFun1 @FSSym0) SFS- instance SingI MkFoo1 where- sing = SMkFoo1- instance SingI MkFoo2 where- sing = SMkFoo2- instance SingI VNil where- sing = SVNil- instance (SingI n, SingI n) =>- SingI (VCons (n :: a) (n :: Vec n a)) where- sing = (SVCons sing) sing- instance SingI n => SingI1 (VCons (n :: a)) where- liftSing = SVCons sing- instance SingI2 VCons where- liftSing2 = SVCons- instance SingI (VConsSym0 :: (~>) a ((~>) (Vec n a) (Vec ('Succ n) a))) where- sing = (singFun2 @VConsSym0) SVCons- instance SingI d =>- SingI (VConsSym1 (d :: a) :: (~>) (Vec n a) (Vec ('Succ n) a)) where- sing = (singFun1 @(VConsSym1 (d :: a))) (SVCons (sing @d))- instance SingI1 (VConsSym1 :: a- -> (~>) (Vec n a) (Vec ('Succ n) a)) where- liftSing (s :: Sing (d :: a))- = (singFun1 @(VConsSym1 (d :: a))) (SVCons s)- instance SingI Reflexive where- sing = SReflexive- instance SingI HNil where- sing = SHNil- instance (SingI n, SingI n) =>- SingI (HCons (n :: x) (n :: HList xs)) where- sing = (SHCons sing) sing- instance SingI n => SingI1 (HCons (n :: x)) where- liftSing = SHCons sing- instance SingI2 HCons where- liftSing2 = SHCons- instance SingI (HConsSym0 :: (~>) x ((~>) (HList xs) (HList ('(:) x xs)))) where- sing = (singFun2 @HConsSym0) SHCons- instance SingI d =>- SingI (HConsSym1 (d :: x) :: (~>) (HList xs) (HList ('(:) x xs))) where- sing = (singFun1 @(HConsSym1 (d :: x))) (SHCons (sing @d))- instance SingI1 (HConsSym1 :: x- -> (~>) (HList xs) (HList ('(:) x xs))) where- liftSing (s :: Sing (d :: x))- = (singFun1 @(HConsSym1 (d :: x))) (SHCons s)- instance SingI n => SingI (Obj (n :: a)) where- sing = SObj sing- instance SingI1 Obj where- liftSing = SObj- instance SingI (ObjSym0 :: (~>) a Obj) where- sing = (singFun1 @ObjSym0) SObj+Singletons/T150.hs:(0,0)-(0,0): Splicing declarations + withOptions defaultOptions {genSingKindInsts = False} + $ singletons + $ lift + [d| headVec :: Vec (Succ n) a -> a + headVec (VCons x _) = x + tailVec :: Vec (Succ n) a -> Vec n a + tailVec (VCons _ xs) = xs + (!) :: Vec n a -> Fin n -> a + VCons x _ ! FZ = x + VCons _ xs ! FS n = xs ! n + VNil ! n = case n of {} + mapVec :: (a -> b) -> Vec n a -> Vec n b + mapVec _ VNil = VNil + mapVec f (VCons x xs) = VCons (f x) (mapVec f xs) + symmetry :: Equal a b -> Equal b a + symmetry Reflexive = Reflexive + transitivity :: Equal a b -> Equal b c -> Equal a c + transitivity Reflexive Reflexive = Reflexive + + data Fin :: Nat -> Type + where + FZ :: Fin (Succ n) + FS :: Fin n -> Fin (Succ n) + data Foo :: Type -> Type + where + MkFoo1 :: Foo Bool + MkFoo2 :: Foo Ordering + data Vec :: Nat -> Type -> Type + where + VNil :: Vec Zero a + VCons :: a -> Vec n a -> Vec (Succ n) a + data Equal :: Type -> Type -> Type where Reflexive :: Equal a a + data HList :: [Type] -> Type + where + HNil :: HList '[] + HCons :: x -> HList xs -> HList (x : xs) + data Obj :: Type where Obj :: a -> Obj |] + ======> + data Fin :: Nat -> Type + where + FZ :: Fin ('Succ n) + FS :: (Fin n) -> Fin ('Succ n) + data Foo :: Type -> Type + where + MkFoo1 :: Foo Bool + MkFoo2 :: Foo Ordering + data Vec :: Nat -> Type -> Type + where + VNil :: Vec 'Zero a + VCons :: a -> (Vec n a) -> Vec ('Succ n) a + headVec :: Vec ('Succ n) a -> a + headVec (VCons x _) = x + tailVec :: Vec ('Succ n) a -> Vec n a + tailVec (VCons _ xs) = xs + (!) :: Vec n a -> Fin n -> a + (!) (VCons x _) FZ = x + (!) (VCons _ xs) (FS n) = (xs ! n) + (!) VNil n = case n of {} + mapVec :: (a -> b) -> Vec n a -> Vec n b + mapVec _ VNil = VNil + mapVec f (VCons x xs) = VCons (f x) (mapVec f xs) + data Equal :: Type -> Type -> Type where Reflexive :: Equal a a + symmetry :: Equal a b -> Equal b a + symmetry Reflexive = Reflexive + transitivity :: Equal a b -> Equal b c -> Equal a c + transitivity Reflexive Reflexive = Reflexive + data HList :: [Type] -> Type + where + HNil :: HList '[] + HCons :: x -> (HList xs) -> HList ('(:) x xs) + data Obj :: Type where Obj :: a -> Obj + type FZSym0 :: Fin ('Succ n) + type family FZSym0 :: Fin ('Succ n) where + FZSym0 = FZ + type FSSym0 :: (~>) (Fin n) (Fin ('Succ n)) + data FSSym0 :: (~>) (Fin n) (Fin ('Succ n)) + where + FSSym0KindInference :: SameKind (Apply FSSym0 arg) (FSSym1 arg) => + FSSym0 a0123456789876543210 + type instance Apply FSSym0 a0123456789876543210 = FS a0123456789876543210 + instance SuppressUnusedWarnings FSSym0 where + suppressUnusedWarnings = snd ((,) FSSym0KindInference ()) + type FSSym1 :: Fin n -> Fin ('Succ n) + type family FSSym1 (a0123456789876543210 :: Fin n) :: Fin ('Succ n) where + FSSym1 a0123456789876543210 = FS a0123456789876543210 + type MkFoo1Sym0 :: Foo Bool + type family MkFoo1Sym0 :: Foo Bool where + MkFoo1Sym0 = MkFoo1 + type MkFoo2Sym0 :: Foo Ordering + type family MkFoo2Sym0 :: Foo Ordering where + MkFoo2Sym0 = MkFoo2 + type VNilSym0 :: Vec 'Zero a + type family VNilSym0 :: Vec 'Zero a where + VNilSym0 = VNil + type VConsSym0 :: (~>) a ((~>) (Vec n a) (Vec ('Succ n) a)) + data VConsSym0 :: (~>) a ((~>) (Vec n a) (Vec ('Succ n) a)) + where + VConsSym0KindInference :: SameKind (Apply VConsSym0 arg) (VConsSym1 arg) => + VConsSym0 a0123456789876543210 + type instance Apply VConsSym0 a0123456789876543210 = VConsSym1 a0123456789876543210 + instance SuppressUnusedWarnings VConsSym0 where + suppressUnusedWarnings = snd ((,) VConsSym0KindInference ()) + type VConsSym1 :: a -> (~>) (Vec n a) (Vec ('Succ n) a) + data VConsSym1 (a0123456789876543210 :: a) :: (~>) (Vec n a) (Vec ('Succ n) a) + where + VConsSym1KindInference :: SameKind (Apply (VConsSym1 a0123456789876543210) arg) (VConsSym2 a0123456789876543210 arg) => + VConsSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (VConsSym1 a0123456789876543210) a0123456789876543210 = VCons a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (VConsSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) VConsSym1KindInference ()) + type VConsSym2 :: a -> Vec n a -> Vec ('Succ n) a + type family VConsSym2 (a0123456789876543210 :: a) (a0123456789876543210 :: Vec n a) :: Vec ('Succ n) a where + VConsSym2 a0123456789876543210 a0123456789876543210 = VCons a0123456789876543210 a0123456789876543210 + type ReflexiveSym0 :: Equal a a + type family ReflexiveSym0 :: Equal a a where + ReflexiveSym0 = Reflexive + type HNilSym0 :: HList '[] + type family HNilSym0 :: HList '[] where + HNilSym0 = HNil + type HConsSym0 :: (~>) x ((~>) (HList xs) (HList ('(:) x xs))) + data HConsSym0 :: (~>) x ((~>) (HList xs) (HList ('(:) x xs))) + where + HConsSym0KindInference :: SameKind (Apply HConsSym0 arg) (HConsSym1 arg) => + HConsSym0 a0123456789876543210 + type instance Apply HConsSym0 a0123456789876543210 = HConsSym1 a0123456789876543210 + instance SuppressUnusedWarnings HConsSym0 where + suppressUnusedWarnings = snd ((,) HConsSym0KindInference ()) + type HConsSym1 :: x -> (~>) (HList xs) (HList ('(:) x xs)) + data HConsSym1 (a0123456789876543210 :: x) :: (~>) (HList xs) (HList ('(:) x xs)) + where + HConsSym1KindInference :: SameKind (Apply (HConsSym1 a0123456789876543210) arg) (HConsSym2 a0123456789876543210 arg) => + HConsSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (HConsSym1 a0123456789876543210) a0123456789876543210 = HCons a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (HConsSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) HConsSym1KindInference ()) + type HConsSym2 :: x -> HList xs -> HList ('(:) x xs) + type family HConsSym2 (a0123456789876543210 :: x) (a0123456789876543210 :: HList xs) :: HList ('(:) x xs) where + HConsSym2 a0123456789876543210 a0123456789876543210 = HCons a0123456789876543210 a0123456789876543210 + type ObjSym0 :: (~>) a Obj + data ObjSym0 :: (~>) a Obj + where + ObjSym0KindInference :: SameKind (Apply ObjSym0 arg) (ObjSym1 arg) => + ObjSym0 a0123456789876543210 + type instance Apply ObjSym0 a0123456789876543210 = Obj a0123456789876543210 + instance SuppressUnusedWarnings ObjSym0 where + suppressUnusedWarnings = snd ((,) ObjSym0KindInference ()) + type ObjSym1 :: a -> Obj + type family ObjSym1 (a0123456789876543210 :: a) :: Obj where + ObjSym1 a0123456789876543210 = Obj a0123456789876543210 + type family Case_0123456789876543210 n t where + type TransitivitySym0 :: (~>) (Equal a b) ((~>) (Equal b c) (Equal a c)) + data TransitivitySym0 :: (~>) (Equal a b) ((~>) (Equal b c) (Equal a c)) + where + TransitivitySym0KindInference :: SameKind (Apply TransitivitySym0 arg) (TransitivitySym1 arg) => + TransitivitySym0 a0123456789876543210 + type instance Apply TransitivitySym0 a0123456789876543210 = TransitivitySym1 a0123456789876543210 + instance SuppressUnusedWarnings TransitivitySym0 where + suppressUnusedWarnings = snd ((,) TransitivitySym0KindInference ()) + type TransitivitySym1 :: Equal a b -> (~>) (Equal b c) (Equal a c) + data TransitivitySym1 (a0123456789876543210 :: Equal a b) :: (~>) (Equal b c) (Equal a c) + where + TransitivitySym1KindInference :: SameKind (Apply (TransitivitySym1 a0123456789876543210) arg) (TransitivitySym2 a0123456789876543210 arg) => + TransitivitySym1 a0123456789876543210 a0123456789876543210 + type instance Apply (TransitivitySym1 a0123456789876543210) a0123456789876543210 = Transitivity a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (TransitivitySym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) TransitivitySym1KindInference ()) + type TransitivitySym2 :: Equal a b -> Equal b c -> Equal a c + type family TransitivitySym2 (a0123456789876543210 :: Equal a b) (a0123456789876543210 :: Equal b c) :: Equal a c where + TransitivitySym2 a0123456789876543210 a0123456789876543210 = Transitivity a0123456789876543210 a0123456789876543210 + type SymmetrySym0 :: (~>) (Equal a b) (Equal b a) + data SymmetrySym0 :: (~>) (Equal a b) (Equal b a) + where + SymmetrySym0KindInference :: SameKind (Apply SymmetrySym0 arg) (SymmetrySym1 arg) => + SymmetrySym0 a0123456789876543210 + type instance Apply SymmetrySym0 a0123456789876543210 = Symmetry a0123456789876543210 + instance SuppressUnusedWarnings SymmetrySym0 where + suppressUnusedWarnings = snd ((,) SymmetrySym0KindInference ()) + type SymmetrySym1 :: Equal a b -> Equal b a + type family SymmetrySym1 (a0123456789876543210 :: Equal a b) :: Equal b a where + SymmetrySym1 a0123456789876543210 = Symmetry a0123456789876543210 + type MapVecSym0 :: (~>) ((~>) a b) ((~>) (Vec n a) (Vec n b)) + data MapVecSym0 :: (~>) ((~>) a b) ((~>) (Vec n a) (Vec n b)) + where + MapVecSym0KindInference :: SameKind (Apply MapVecSym0 arg) (MapVecSym1 arg) => + MapVecSym0 a0123456789876543210 + type instance Apply MapVecSym0 a0123456789876543210 = MapVecSym1 a0123456789876543210 + instance SuppressUnusedWarnings MapVecSym0 where + suppressUnusedWarnings = snd ((,) MapVecSym0KindInference ()) + type MapVecSym1 :: (~>) a b -> (~>) (Vec n a) (Vec n b) + data MapVecSym1 (a0123456789876543210 :: (~>) a b) :: (~>) (Vec n a) (Vec n b) + where + MapVecSym1KindInference :: SameKind (Apply (MapVecSym1 a0123456789876543210) arg) (MapVecSym2 a0123456789876543210 arg) => + MapVecSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (MapVecSym1 a0123456789876543210) a0123456789876543210 = MapVec a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (MapVecSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) MapVecSym1KindInference ()) + type MapVecSym2 :: (~>) a b -> Vec n a -> Vec n b + type family MapVecSym2 (a0123456789876543210 :: (~>) a b) (a0123456789876543210 :: Vec n a) :: Vec n b where + MapVecSym2 a0123456789876543210 a0123456789876543210 = MapVec a0123456789876543210 a0123456789876543210 + type (!@#@$) :: (~>) (Vec n a) ((~>) (Fin n) a) + data (!@#@$) :: (~>) (Vec n a) ((~>) (Fin n) a) + where + (:!@#@$###) :: SameKind (Apply (!@#@$) arg) ((!@#@$$) arg) => + (!@#@$) a0123456789876543210 + type instance Apply (!@#@$) a0123456789876543210 = (!@#@$$) a0123456789876543210 + instance SuppressUnusedWarnings (!@#@$) where + suppressUnusedWarnings = snd ((,) (:!@#@$###) ()) + type (!@#@$$) :: Vec n a -> (~>) (Fin n) a + data (!@#@$$) (a0123456789876543210 :: Vec n a) :: (~>) (Fin n) a + where + (:!@#@$$###) :: SameKind (Apply ((!@#@$$) a0123456789876543210) arg) ((!@#@$$$) a0123456789876543210 arg) => + (!@#@$$) a0123456789876543210 a0123456789876543210 + type instance Apply ((!@#@$$) a0123456789876543210) a0123456789876543210 = (!) a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings ((!@#@$$) a0123456789876543210) where + suppressUnusedWarnings = snd ((,) (:!@#@$$###) ()) + type (!@#@$$$) :: Vec n a -> Fin n -> a + type family (!@#@$$$) (a0123456789876543210 :: Vec n a) (a0123456789876543210 :: Fin n) :: a where + (!@#@$$$) a0123456789876543210 a0123456789876543210 = (!) a0123456789876543210 a0123456789876543210 + type TailVecSym0 :: (~>) (Vec ('Succ n) a) (Vec n a) + data TailVecSym0 :: (~>) (Vec ('Succ n) a) (Vec n a) + where + TailVecSym0KindInference :: SameKind (Apply TailVecSym0 arg) (TailVecSym1 arg) => + TailVecSym0 a0123456789876543210 + type instance Apply TailVecSym0 a0123456789876543210 = TailVec a0123456789876543210 + instance SuppressUnusedWarnings TailVecSym0 where + suppressUnusedWarnings = snd ((,) TailVecSym0KindInference ()) + type TailVecSym1 :: Vec ('Succ n) a -> Vec n a + type family TailVecSym1 (a0123456789876543210 :: Vec ('Succ n) a) :: Vec n a where + TailVecSym1 a0123456789876543210 = TailVec a0123456789876543210 + type HeadVecSym0 :: (~>) (Vec ('Succ n) a) a + data HeadVecSym0 :: (~>) (Vec ('Succ n) a) a + where + HeadVecSym0KindInference :: SameKind (Apply HeadVecSym0 arg) (HeadVecSym1 arg) => + HeadVecSym0 a0123456789876543210 + type instance Apply HeadVecSym0 a0123456789876543210 = HeadVec a0123456789876543210 + instance SuppressUnusedWarnings HeadVecSym0 where + suppressUnusedWarnings = snd ((,) HeadVecSym0KindInference ()) + type HeadVecSym1 :: Vec ('Succ n) a -> a + type family HeadVecSym1 (a0123456789876543210 :: Vec ('Succ n) a) :: a where + HeadVecSym1 a0123456789876543210 = HeadVec a0123456789876543210 + type Transitivity :: Equal a b -> Equal b c -> Equal a c + type family Transitivity (a :: Equal a b) (a :: Equal b c) :: Equal a c where + Transitivity Reflexive Reflexive = ReflexiveSym0 + type Symmetry :: Equal a b -> Equal b a + type family Symmetry (a :: Equal a b) :: Equal b a where + Symmetry Reflexive = ReflexiveSym0 + type MapVec :: (~>) a b -> Vec n a -> Vec n b + type family MapVec (a :: (~>) a b) (a :: Vec n a) :: Vec n b where + MapVec _ VNil = VNilSym0 + MapVec f (VCons x xs) = Apply (Apply VConsSym0 (Apply f x)) (Apply (Apply MapVecSym0 f) xs) + type (!) :: Vec n a -> Fin n -> a + type family (!) (a :: Vec n a) (a :: Fin n) :: a where + (!) (VCons x _) FZ = x + (!) (VCons _ xs) (FS n) = Apply (Apply (!@#@$) xs) n + (!) VNil n = Case_0123456789876543210 n n + type TailVec :: Vec ('Succ n) a -> Vec n a + type family TailVec (a :: Vec ('Succ n) a) :: Vec n a where + TailVec (VCons _ xs) = xs + type HeadVec :: Vec ('Succ n) a -> a + type family HeadVec (a :: Vec ('Succ n) a) :: a where + HeadVec (VCons x _) = x + sTransitivity :: + (forall (t :: Equal a b) (t :: Equal b c). + Sing t + -> Sing t + -> Sing (Apply (Apply TransitivitySym0 t) t :: Equal a c) :: Type) + sSymmetry :: + (forall (t :: Equal a b). + Sing t -> Sing (Apply SymmetrySym0 t :: Equal b a) :: Type) + sMapVec :: + (forall (t :: (~>) a b) (t :: Vec n a). + Sing t + -> Sing t + -> Sing (Apply (Apply MapVecSym0 t) t :: Vec n b) :: Type) + (%!) :: + (forall (t :: Vec n a) (t :: Fin n). + Sing t -> Sing t -> Sing (Apply (Apply (!@#@$) t) t :: a) :: Type) + sTailVec :: + (forall (t :: Vec ('Succ n) a). + Sing t -> Sing (Apply TailVecSym0 t :: Vec n a) :: Type) + sHeadVec :: + (forall (t :: Vec ('Succ n) a). + Sing t -> Sing (Apply HeadVecSym0 t :: a) :: Type) + sTransitivity SReflexive SReflexive = SReflexive + sSymmetry SReflexive = SReflexive + sMapVec _ SVNil = SVNil + sMapVec (sF :: Sing f) (SVCons (sX :: Sing x) (sXs :: Sing xs)) + = applySing + (applySing (singFun2 @VConsSym0 SVCons) (applySing sF sX)) + (applySing (applySing (singFun2 @MapVecSym0 sMapVec) sF) sXs) + (%!) (SVCons (sX :: Sing x) _) SFZ = sX + (%!) (SVCons _ (sXs :: Sing xs)) (SFS (sN :: Sing n)) + = applySing (applySing (singFun2 @(!@#@$) (%!)) sXs) sN + (%!) SVNil (sN :: Sing n) + = id @(Sing (Case_0123456789876543210 n n)) (case sN of {}) + sTailVec (SVCons _ (sXs :: Sing xs)) = sXs + sHeadVec (SVCons (sX :: Sing x) _) = sX + instance SingI (TransitivitySym0 :: (~>) (Equal a b) ((~>) (Equal b c) (Equal a c))) where + sing = singFun2 @TransitivitySym0 sTransitivity + instance SingI d => + SingI (TransitivitySym1 (d :: Equal a b) :: (~>) (Equal b c) (Equal a c)) where + sing + = singFun1 + @(TransitivitySym1 (d :: Equal a b)) (sTransitivity (sing @d)) + instance SingI1 (TransitivitySym1 :: Equal a b + -> (~>) (Equal b c) (Equal a c)) where + liftSing (s :: Sing (d :: Equal a b)) + = singFun1 @(TransitivitySym1 (d :: Equal a b)) (sTransitivity s) + instance SingI (SymmetrySym0 :: (~>) (Equal a b) (Equal b a)) where + sing = singFun1 @SymmetrySym0 sSymmetry + instance SingI (MapVecSym0 :: (~>) ((~>) a b) ((~>) (Vec n a) (Vec n b))) where + sing = singFun2 @MapVecSym0 sMapVec + instance SingI d => + SingI (MapVecSym1 (d :: (~>) a b) :: (~>) (Vec n a) (Vec n b)) where + sing = singFun1 @(MapVecSym1 (d :: (~>) a b)) (sMapVec (sing @d)) + instance SingI1 (MapVecSym1 :: (~>) a b + -> (~>) (Vec n a) (Vec n b)) where + liftSing (s :: Sing (d :: (~>) a b)) + = singFun1 @(MapVecSym1 (d :: (~>) a b)) (sMapVec s) + instance SingI ((!@#@$) :: (~>) (Vec n a) ((~>) (Fin n) a)) where + sing = singFun2 @(!@#@$) (%!) + instance SingI d => + SingI ((!@#@$$) (d :: Vec n a) :: (~>) (Fin n) a) where + sing = singFun1 @((!@#@$$) (d :: Vec n a)) ((%!) (sing @d)) + instance SingI1 ((!@#@$$) :: Vec n a -> (~>) (Fin n) a) where + liftSing (s :: Sing (d :: Vec n a)) + = singFun1 @((!@#@$$) (d :: Vec n a)) ((%!) s) + instance SingI (TailVecSym0 :: (~>) (Vec ('Succ n) a) (Vec n a)) where + sing = singFun1 @TailVecSym0 sTailVec + instance SingI (HeadVecSym0 :: (~>) (Vec ('Succ n) a) a) where + sing = singFun1 @HeadVecSym0 sHeadVec + data SFin :: forall (a :: Nat). Fin a -> Type + where + SFZ :: forall n. SFin (FZ :: Fin ('Succ n)) + SFS :: forall n (n :: Fin n). + (Sing n) -> SFin (FS n :: Fin ('Succ n)) + type instance Sing @(Fin a) = SFin + data SFoo :: forall (a :: Type). Foo a -> Type + where + SMkFoo1 :: SFoo (MkFoo1 :: Foo Bool) + SMkFoo2 :: SFoo (MkFoo2 :: Foo Ordering) + type instance Sing @(Foo a) = SFoo + data SVec :: forall (a :: Nat) (a :: Type). Vec a a -> Type + where + SVNil :: forall a. SVec (VNil :: Vec 'Zero a) + SVCons :: forall a n (n :: a) (n :: Vec n a). + (Sing n) -> (Sing n) -> SVec (VCons n n :: Vec ('Succ n) a) + type instance Sing @(Vec a a) = SVec + data SEqual :: forall (a :: Type) (a :: Type). Equal a a -> Type + where SReflexive :: forall a. SEqual (Reflexive :: Equal a a) + type instance Sing @(Equal a a) = SEqual + data SHList :: forall (a :: [Type]). HList a -> Type + where + SHNil :: SHList (HNil :: HList '[]) + SHCons :: forall x xs (n :: x) (n :: HList xs). + (Sing n) -> (Sing n) -> SHList (HCons n n :: HList ('(:) x xs)) + type instance Sing @(HList a) = SHList + data SObj :: Obj -> Type + where SObj :: forall a (n :: a). (Sing n) -> SObj (Obj n :: Obj) + type instance Sing @Obj = SObj + instance SingI FZ where + sing = SFZ + instance SingI n => SingI (FS (n :: Fin n)) where + sing = SFS sing + instance SingI1 FS where + liftSing = SFS + instance SingI (FSSym0 :: (~>) (Fin n) (Fin ('Succ n))) where + sing = singFun1 @FSSym0 SFS + instance SingI MkFoo1 where + sing = SMkFoo1 + instance SingI MkFoo2 where + sing = SMkFoo2 + instance SingI VNil where + sing = SVNil + instance (SingI n, SingI n) => + SingI (VCons (n :: a) (n :: Vec n a)) where + sing = SVCons sing sing + instance SingI n => SingI1 (VCons (n :: a)) where + liftSing = SVCons sing + instance SingI2 VCons where + liftSing2 = SVCons + instance SingI (VConsSym0 :: (~>) a ((~>) (Vec n a) (Vec ('Succ n) a))) where + sing = singFun2 @VConsSym0 SVCons + instance SingI d => + SingI (VConsSym1 (d :: a) :: (~>) (Vec n a) (Vec ('Succ n) a)) where + sing = singFun1 @(VConsSym1 (d :: a)) (SVCons (sing @d)) + instance SingI1 (VConsSym1 :: a + -> (~>) (Vec n a) (Vec ('Succ n) a)) where + liftSing (s :: Sing (d :: a)) + = singFun1 @(VConsSym1 (d :: a)) (SVCons s) + instance SingI Reflexive where + sing = SReflexive + instance SingI HNil where + sing = SHNil + instance (SingI n, SingI n) => + SingI (HCons (n :: x) (n :: HList xs)) where + sing = SHCons sing sing + instance SingI n => SingI1 (HCons (n :: x)) where + liftSing = SHCons sing + instance SingI2 HCons where + liftSing2 = SHCons + instance SingI (HConsSym0 :: (~>) x ((~>) (HList xs) (HList ('(:) x xs)))) where + sing = singFun2 @HConsSym0 SHCons + instance SingI d => + SingI (HConsSym1 (d :: x) :: (~>) (HList xs) (HList ('(:) x xs))) where + sing = singFun1 @(HConsSym1 (d :: x)) (SHCons (sing @d)) + instance SingI1 (HConsSym1 :: x + -> (~>) (HList xs) (HList ('(:) x xs))) where + liftSing (s :: Sing (d :: x)) + = singFun1 @(HConsSym1 (d :: x)) (SHCons s) + instance SingI n => SingI (Obj (n :: a)) where + sing = SObj sing + instance SingI1 Obj where + liftSing = SObj + instance SingI (ObjSym0 :: (~>) a Obj) where + sing = singFun1 @ObjSym0 SObj
tests/compile-and-dump/Singletons/T150.hs view
@@ -1,53 +1,53 @@-module T150 where--import Control.Monad.Trans.Class-import Data.Kind-import Data.Singletons.TH-import Data.Singletons.TH.Options-import Singletons.Nat--$(withOptions defaultOptions{genSingKindInsts = False} $- singletons $ lift- [d| data Fin :: Nat -> Type where- FZ :: Fin (Succ n)- FS :: Fin n -> Fin (Succ n)-- data Foo :: Type -> Type where- MkFoo1 :: Foo Bool- MkFoo2 :: Foo Ordering-- data Vec :: Nat -> Type -> Type where- VNil :: Vec Zero a- VCons :: a -> Vec n a -> Vec (Succ n) a-- headVec :: Vec (Succ n) a -> a- headVec (VCons x _) = x-- tailVec :: Vec (Succ n) a -> Vec n a- tailVec (VCons _ xs) = xs-- (!) :: Vec n a -> Fin n -> a- VCons x _ ! FZ = x- VCons _ xs ! FS n = xs ! n- VNil ! n = case n of {}-- mapVec :: (a -> b) -> Vec n a -> Vec n b- mapVec _ VNil = VNil- mapVec f (VCons x xs) = VCons (f x) (mapVec f xs)-- data Equal :: Type -> Type -> Type where- Reflexive :: Equal a a-- symmetry :: Equal a b -> Equal b a- symmetry Reflexive = Reflexive-- transitivity :: Equal a b -> Equal b c -> Equal a c- transitivity Reflexive Reflexive = Reflexive-- data HList :: [Type] -> Type where- HNil :: HList '[]- HCons :: x -> HList xs -> HList (x:xs)-- data Obj :: Type where- Obj :: a -> Obj- |])+module T150 where + +import Control.Monad.Trans.Class +import Data.Kind +import Data.Singletons.TH +import Data.Singletons.TH.Options +import Singletons.Nat + +$(withOptions defaultOptions{genSingKindInsts = False} $ + singletons $ lift + [d| data Fin :: Nat -> Type where + FZ :: Fin (Succ n) + FS :: Fin n -> Fin (Succ n) + + data Foo :: Type -> Type where + MkFoo1 :: Foo Bool + MkFoo2 :: Foo Ordering + + data Vec :: Nat -> Type -> Type where + VNil :: Vec Zero a + VCons :: a -> Vec n a -> Vec (Succ n) a + + headVec :: Vec (Succ n) a -> a + headVec (VCons x _) = x + + tailVec :: Vec (Succ n) a -> Vec n a + tailVec (VCons _ xs) = xs + + (!) :: Vec n a -> Fin n -> a + VCons x _ ! FZ = x + VCons _ xs ! FS n = xs ! n + VNil ! n = case n of {} + + mapVec :: (a -> b) -> Vec n a -> Vec n b + mapVec _ VNil = VNil + mapVec f (VCons x xs) = VCons (f x) (mapVec f xs) + + data Equal :: Type -> Type -> Type where + Reflexive :: Equal a a + + symmetry :: Equal a b -> Equal b a + symmetry Reflexive = Reflexive + + transitivity :: Equal a b -> Equal b c -> Equal a c + transitivity Reflexive Reflexive = Reflexive + + data HList :: [Type] -> Type where + HNil :: HList '[] + HCons :: x -> HList xs -> HList (x:xs) + + data Obj :: Type where + Obj :: a -> Obj + |])
tests/compile-and-dump/Singletons/T153.hs view
@@ -1,10 +1,10 @@-module Singletons.T153 where--import Data.Singletons-import Prelude.Singletons--foo :: Int-foo = withSomeSing @(Maybe Bool) (Just True) $ \case- SJust STrue -> 0- SJust SFalse -> 1- SNothing -> 2+module Singletons.T153 where + +import Data.Singletons +import Prelude.Singletons + +foo :: Int +foo = withSomeSing @(Maybe Bool) (Just True) $ \case + SJust STrue -> 0 + SJust SFalse -> 1 + SNothing -> 2
tests/compile-and-dump/Singletons/T157.hs view
@@ -1,6 +1,6 @@-module T157 where--import Prelude.Singletons--foo :: SList '["a", "b", "c"]-foo = sing `SCons` sing `SCons` sing+module T157 where + +import Prelude.Singletons + +foo :: SList '["a", "b", "c"] +foo = sing `SCons` sing `SCons` sing
tests/compile-and-dump/Singletons/T159.golden view
@@ -1,267 +1,267 @@-Singletons/T159.hs:0:0:: Splicing declarations- genSingletons [''T0, ''T1]- ======>- type ASym0 :: T0- type family ASym0 :: T0 where- ASym0 = 'A- type BSym0 :: T0- type family BSym0 :: T0 where- BSym0 = 'B- type CSym0 :: T0- type family CSym0 :: T0 where- CSym0 = 'C- type DSym0 :: T0- type family DSym0 :: T0 where- DSym0 = 'D- type ESym0 :: T0- type family ESym0 :: T0 where- ESym0 = 'E- type FSym0 :: T0- type family FSym0 :: T0 where- FSym0 = 'F- type ST0 :: T0 -> Type- data ST0 :: T0 -> Type- where- SA :: ST0 ('A :: T0)- SB :: ST0 ('B :: T0)- SC :: ST0 ('C :: T0)- SD :: ST0 ('D :: T0)- SE :: ST0 ('E :: T0)- SF :: ST0 ('F :: T0)- type instance Sing @T0 = ST0- instance SingKind T0 where- type Demote T0 = T0- fromSing SA = A- fromSing SB = B- fromSing SC = C- fromSing SD = D- fromSing SE = E- fromSing SF = F- toSing A = SomeSing SA- toSing B = SomeSing SB- toSing C = SomeSing SC- toSing D = SomeSing SD- toSing E = SomeSing SE- toSing F = SomeSing SF- instance SingI 'A where- sing = SA- instance SingI 'B where- sing = SB- instance SingI 'C where- sing = SC- instance SingI 'D where- sing = SD- instance SingI 'E where- sing = SE- instance SingI 'F where- sing = SF- type N1Sym0 :: T1- type family N1Sym0 :: T1 where- N1Sym0 = 'N1- type C1Sym0 :: (~>) T0 ((~>) T1 T1)- data C1Sym0 :: (~>) T0 ((~>) T1 T1)- where- C1Sym0KindInference :: SameKind (Apply C1Sym0 arg) (C1Sym1 arg) =>- C1Sym0 a0123456789876543210- type instance Apply C1Sym0 a0123456789876543210 = C1Sym1 a0123456789876543210- instance SuppressUnusedWarnings C1Sym0 where- suppressUnusedWarnings = snd (((,) C1Sym0KindInference) ())- infixr 5 `C1Sym0`- type C1Sym1 :: T0 -> (~>) T1 T1- data C1Sym1 (a0123456789876543210 :: T0) :: (~>) T1 T1- where- C1Sym1KindInference :: SameKind (Apply (C1Sym1 a0123456789876543210) arg) (C1Sym2 a0123456789876543210 arg) =>- C1Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (C1Sym1 a0123456789876543210) a0123456789876543210 = 'C1 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (C1Sym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) C1Sym1KindInference) ())- infixr 5 `C1Sym1`- type C1Sym2 :: T0 -> T1 -> T1- type family C1Sym2 (a0123456789876543210 :: T0) (a0123456789876543210 :: T1) :: T1 where- C1Sym2 a0123456789876543210 a0123456789876543210 = 'C1 a0123456789876543210 a0123456789876543210- infixr 5 `C1Sym2`- type (:&&@#@$) :: (~>) T0 ((~>) T1 T1)- data (:&&@#@$) :: (~>) T0 ((~>) T1 T1)- where- (::&&@#@$###) :: SameKind (Apply (:&&@#@$) arg) ((:&&@#@$$) arg) =>- (:&&@#@$) a0123456789876543210- type instance Apply (:&&@#@$) a0123456789876543210 = (:&&@#@$$) a0123456789876543210- instance SuppressUnusedWarnings (:&&@#@$) where- suppressUnusedWarnings = snd (((,) (::&&@#@$###)) ())- infixr 5 :&&@#@$- type (:&&@#@$$) :: T0 -> (~>) T1 T1- data (:&&@#@$$) (a0123456789876543210 :: T0) :: (~>) T1 T1- where- (::&&@#@$$###) :: SameKind (Apply ((:&&@#@$$) a0123456789876543210) arg) ((:&&@#@$$$) a0123456789876543210 arg) =>- (:&&@#@$$) a0123456789876543210 a0123456789876543210- type instance Apply ((:&&@#@$$) a0123456789876543210) a0123456789876543210 = '(:&&) a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings ((:&&@#@$$) a0123456789876543210) where- suppressUnusedWarnings = snd (((,) (::&&@#@$$###)) ())- infixr 5 :&&@#@$$- type (:&&@#@$$$) :: T0 -> T1 -> T1- type family (:&&@#@$$$) (a0123456789876543210 :: T0) (a0123456789876543210 :: T1) :: T1 where- (:&&@#@$$$) a0123456789876543210 a0123456789876543210 = '(:&&) a0123456789876543210 a0123456789876543210- infixr 5 :&&@#@$$$- type ST1 :: T1 -> Type- data ST1 :: T1 -> Type- where- SN1 :: ST1 ('N1 :: T1)- SC1 :: forall (n :: T0) (n :: T1).- (Sing n) -> (Sing n) -> ST1 ('C1 n n :: T1)- (:%&&) :: forall (n :: T0) (n :: T1).- (Sing n) -> (Sing n) -> ST1 ('(:&&) n n :: T1)- type instance Sing @T1 = ST1- instance SingKind T1 where- type Demote T1 = T1- fromSing SN1 = N1- fromSing (SC1 b b) = (C1 (fromSing b)) (fromSing b)- fromSing ((:%&&) b b) = ((:&&) (fromSing b)) (fromSing b)- toSing N1 = SomeSing SN1- toSing (C1 (b :: Demote T0) (b :: Demote T1))- = case ((,) (toSing b :: SomeSing T0)) (toSing b :: SomeSing T1) of- (,) (SomeSing c) (SomeSing c) -> SomeSing ((SC1 c) c)- toSing ((:&&) (b :: Demote T0) (b :: Demote T1))- = case ((,) (toSing b :: SomeSing T0)) (toSing b :: SomeSing T1) of- (,) (SomeSing c) (SomeSing c) -> SomeSing (((:%&&) c) c)- infixr 5 `SC1`- infixr 5 :%&&- instance SingI 'N1 where- sing = SN1- instance (SingI n, SingI n) =>- SingI ('C1 (n :: T0) (n :: T1)) where- sing = (SC1 sing) sing- instance SingI n => SingI1 ('C1 (n :: T0)) where- liftSing = SC1 sing- instance SingI2 'C1 where- liftSing2 = SC1- instance SingI (C1Sym0 :: (~>) T0 ((~>) T1 T1)) where- sing = (singFun2 @C1Sym0) SC1- instance SingI d => SingI (C1Sym1 (d :: T0) :: (~>) T1 T1) where- sing = (singFun1 @(C1Sym1 (d :: T0))) (SC1 (sing @d))- instance SingI1 (C1Sym1 :: T0 -> (~>) T1 T1) where- liftSing (s :: Sing (d :: T0))- = (singFun1 @(C1Sym1 (d :: T0))) (SC1 s)- instance (SingI n, SingI n) =>- SingI ('(:&&) (n :: T0) (n :: T1)) where- sing = ((:%&&) sing) sing- instance SingI n => SingI1 ('(:&&) (n :: T0)) where- liftSing = (:%&&) sing- instance SingI2 '(:&&) where- liftSing2 = (:%&&)- instance SingI ((:&&@#@$) :: (~>) T0 ((~>) T1 T1)) where- sing = (singFun2 @(:&&@#@$)) (:%&&)- instance SingI d =>- SingI ((:&&@#@$$) (d :: T0) :: (~>) T1 T1) where- sing = (singFun1 @((:&&@#@$$) (d :: T0))) ((:%&&) (sing @d))- instance SingI1 ((:&&@#@$$) :: T0 -> (~>) T1 T1) where- liftSing (s :: Sing (d :: T0))- = (singFun1 @((:&&@#@$$) (d :: T0))) ((:%&&) s)-Singletons/T159.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| infixr 5 :||- infixr 5 `C2`- - data T2 = N2 | C2 T0 T2 | T0 :|| T2 |]- ======>- data T2 = N2 | C2 T0 T2 | T0 :|| T2- infixr 5 `C2`- infixr 5 :||- type N2Sym0 :: T2- type family N2Sym0 :: T2 where- N2Sym0 = N2- type C2Sym0 :: (~>) T0 ((~>) T2 T2)- data C2Sym0 :: (~>) T0 ((~>) T2 T2)- where- C2Sym0KindInference :: SameKind (Apply C2Sym0 arg) (C2Sym1 arg) =>- C2Sym0 a0123456789876543210- type instance Apply C2Sym0 a0123456789876543210 = C2Sym1 a0123456789876543210- instance SuppressUnusedWarnings C2Sym0 where- suppressUnusedWarnings = snd (((,) C2Sym0KindInference) ())- infixr 5 `C2Sym0`- type C2Sym1 :: T0 -> (~>) T2 T2- data C2Sym1 (a0123456789876543210 :: T0) :: (~>) T2 T2- where- C2Sym1KindInference :: SameKind (Apply (C2Sym1 a0123456789876543210) arg) (C2Sym2 a0123456789876543210 arg) =>- C2Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (C2Sym1 a0123456789876543210) a0123456789876543210 = C2 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (C2Sym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) C2Sym1KindInference) ())- infixr 5 `C2Sym1`- type C2Sym2 :: T0 -> T2 -> T2- type family C2Sym2 (a0123456789876543210 :: T0) (a0123456789876543210 :: T2) :: T2 where- C2Sym2 a0123456789876543210 a0123456789876543210 = C2 a0123456789876543210 a0123456789876543210- infixr 5 `C2Sym2`- type (:||@#@$) :: (~>) T0 ((~>) T2 T2)- data (:||@#@$) :: (~>) T0 ((~>) T2 T2)- where- (::||@#@$###) :: SameKind (Apply (:||@#@$) arg) ((:||@#@$$) arg) =>- (:||@#@$) a0123456789876543210- type instance Apply (:||@#@$) a0123456789876543210 = (:||@#@$$) a0123456789876543210- instance SuppressUnusedWarnings (:||@#@$) where- suppressUnusedWarnings = snd (((,) (::||@#@$###)) ())- infixr 5 :||@#@$- type (:||@#@$$) :: T0 -> (~>) T2 T2- data (:||@#@$$) (a0123456789876543210 :: T0) :: (~>) T2 T2- where- (::||@#@$$###) :: SameKind (Apply ((:||@#@$$) a0123456789876543210) arg) ((:||@#@$$$) a0123456789876543210 arg) =>- (:||@#@$$) a0123456789876543210 a0123456789876543210- type instance Apply ((:||@#@$$) a0123456789876543210) a0123456789876543210 = (:||) a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings ((:||@#@$$) a0123456789876543210) where- suppressUnusedWarnings = snd (((,) (::||@#@$$###)) ())- infixr 5 :||@#@$$- type (:||@#@$$$) :: T0 -> T2 -> T2- type family (:||@#@$$$) (a0123456789876543210 :: T0) (a0123456789876543210 :: T2) :: T2 where- (:||@#@$$$) a0123456789876543210 a0123456789876543210 = (:||) a0123456789876543210 a0123456789876543210- infixr 5 :||@#@$$$- infixr 5 :%||- infixr 5 `SC2`- data ST2 :: T2 -> Type- where- SN2 :: ST2 (N2 :: T2)- SC2 :: forall (n :: T0) (n :: T2).- (Sing n) -> (Sing n) -> ST2 (C2 n n :: T2)- (:%||) :: forall (n :: T0) (n :: T2).- (Sing n) -> (Sing n) -> ST2 ((:||) n n :: T2)- type instance Sing @T2 = ST2- instance SingKind T2 where- type Demote T2 = T2- fromSing SN2 = N2- fromSing (SC2 b b) = (C2 (fromSing b)) (fromSing b)- fromSing ((:%||) b b) = ((:||) (fromSing b)) (fromSing b)- toSing N2 = SomeSing SN2- toSing (C2 (b :: Demote T0) (b :: Demote T2))- = case ((,) (toSing b :: SomeSing T0)) (toSing b :: SomeSing T2) of- (,) (SomeSing c) (SomeSing c) -> SomeSing ((SC2 c) c)- toSing ((:||) (b :: Demote T0) (b :: Demote T2))- = case ((,) (toSing b :: SomeSing T0)) (toSing b :: SomeSing T2) of- (,) (SomeSing c) (SomeSing c) -> SomeSing (((:%||) c) c)- instance SingI N2 where- sing = SN2- instance (SingI n, SingI n) => SingI (C2 (n :: T0) (n :: T2)) where- sing = (SC2 sing) sing- instance SingI n => SingI1 (C2 (n :: T0)) where- liftSing = SC2 sing- instance SingI2 C2 where- liftSing2 = SC2- instance SingI (C2Sym0 :: (~>) T0 ((~>) T2 T2)) where- sing = (singFun2 @C2Sym0) SC2- instance SingI d => SingI (C2Sym1 (d :: T0) :: (~>) T2 T2) where- sing = (singFun1 @(C2Sym1 (d :: T0))) (SC2 (sing @d))- instance SingI1 (C2Sym1 :: T0 -> (~>) T2 T2) where- liftSing (s :: Sing (d :: T0))- = (singFun1 @(C2Sym1 (d :: T0))) (SC2 s)- instance (SingI n, SingI n) =>- SingI ((:||) (n :: T0) (n :: T2)) where- sing = ((:%||) sing) sing- instance SingI n => SingI1 ((:||) (n :: T0)) where- liftSing = (:%||) sing- instance SingI2 (:||) where- liftSing2 = (:%||)- instance SingI ((:||@#@$) :: (~>) T0 ((~>) T2 T2)) where- sing = (singFun2 @(:||@#@$)) (:%||)- instance SingI d =>- SingI ((:||@#@$$) (d :: T0) :: (~>) T2 T2) where- sing = (singFun1 @((:||@#@$$) (d :: T0))) ((:%||) (sing @d))- instance SingI1 ((:||@#@$$) :: T0 -> (~>) T2 T2) where- liftSing (s :: Sing (d :: T0))- = (singFun1 @((:||@#@$$) (d :: T0))) ((:%||) s)+Singletons/T159.hs:0:0:: Splicing declarations + genSingletons [''T0, ''T1] + ======> + type ASym0 :: T0 + type family ASym0 :: T0 where + ASym0 = 'A + type BSym0 :: T0 + type family BSym0 :: T0 where + BSym0 = 'B + type CSym0 :: T0 + type family CSym0 :: T0 where + CSym0 = 'C + type DSym0 :: T0 + type family DSym0 :: T0 where + DSym0 = 'D + type ESym0 :: T0 + type family ESym0 :: T0 where + ESym0 = 'E + type FSym0 :: T0 + type family FSym0 :: T0 where + FSym0 = 'F + type ST0 :: T0 -> Type + data ST0 :: T0 -> Type + where + SA :: ST0 ('A :: T0) + SB :: ST0 ('B :: T0) + SC :: ST0 ('C :: T0) + SD :: ST0 ('D :: T0) + SE :: ST0 ('E :: T0) + SF :: ST0 ('F :: T0) + type instance Sing @T0 = ST0 + instance SingKind T0 where + type Demote T0 = T0 + fromSing SA = A + fromSing SB = B + fromSing SC = C + fromSing SD = D + fromSing SE = E + fromSing SF = F + toSing A = SomeSing SA + toSing B = SomeSing SB + toSing C = SomeSing SC + toSing D = SomeSing SD + toSing E = SomeSing SE + toSing F = SomeSing SF + instance SingI 'A where + sing = SA + instance SingI 'B where + sing = SB + instance SingI 'C where + sing = SC + instance SingI 'D where + sing = SD + instance SingI 'E where + sing = SE + instance SingI 'F where + sing = SF + type N1Sym0 :: T1 + type family N1Sym0 :: T1 where + N1Sym0 = 'N1 + type C1Sym0 :: (~>) T0 ((~>) T1 T1) + data C1Sym0 :: (~>) T0 ((~>) T1 T1) + where + C1Sym0KindInference :: SameKind (Apply C1Sym0 arg) (C1Sym1 arg) => + C1Sym0 a0123456789876543210 + type instance Apply C1Sym0 a0123456789876543210 = C1Sym1 a0123456789876543210 + instance SuppressUnusedWarnings C1Sym0 where + suppressUnusedWarnings = snd ((,) C1Sym0KindInference ()) + infixr 5 `C1Sym0` + type C1Sym1 :: T0 -> (~>) T1 T1 + data C1Sym1 (a0123456789876543210 :: T0) :: (~>) T1 T1 + where + C1Sym1KindInference :: SameKind (Apply (C1Sym1 a0123456789876543210) arg) (C1Sym2 a0123456789876543210 arg) => + C1Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (C1Sym1 a0123456789876543210) a0123456789876543210 = 'C1 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (C1Sym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) C1Sym1KindInference ()) + infixr 5 `C1Sym1` + type C1Sym2 :: T0 -> T1 -> T1 + type family C1Sym2 (a0123456789876543210 :: T0) (a0123456789876543210 :: T1) :: T1 where + C1Sym2 a0123456789876543210 a0123456789876543210 = 'C1 a0123456789876543210 a0123456789876543210 + infixr 5 `C1Sym2` + type (:&&@#@$) :: (~>) T0 ((~>) T1 T1) + data (:&&@#@$) :: (~>) T0 ((~>) T1 T1) + where + (::&&@#@$###) :: SameKind (Apply (:&&@#@$) arg) ((:&&@#@$$) arg) => + (:&&@#@$) a0123456789876543210 + type instance Apply (:&&@#@$) a0123456789876543210 = (:&&@#@$$) a0123456789876543210 + instance SuppressUnusedWarnings (:&&@#@$) where + suppressUnusedWarnings = snd ((,) (::&&@#@$###) ()) + infixr 5 :&&@#@$ + type (:&&@#@$$) :: T0 -> (~>) T1 T1 + data (:&&@#@$$) (a0123456789876543210 :: T0) :: (~>) T1 T1 + where + (::&&@#@$$###) :: SameKind (Apply ((:&&@#@$$) a0123456789876543210) arg) ((:&&@#@$$$) a0123456789876543210 arg) => + (:&&@#@$$) a0123456789876543210 a0123456789876543210 + type instance Apply ((:&&@#@$$) a0123456789876543210) a0123456789876543210 = '(:&&) a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings ((:&&@#@$$) a0123456789876543210) where + suppressUnusedWarnings = snd ((,) (::&&@#@$$###) ()) + infixr 5 :&&@#@$$ + type (:&&@#@$$$) :: T0 -> T1 -> T1 + type family (:&&@#@$$$) (a0123456789876543210 :: T0) (a0123456789876543210 :: T1) :: T1 where + (:&&@#@$$$) a0123456789876543210 a0123456789876543210 = '(:&&) a0123456789876543210 a0123456789876543210 + infixr 5 :&&@#@$$$ + type ST1 :: T1 -> Type + data ST1 :: T1 -> Type + where + SN1 :: ST1 ('N1 :: T1) + SC1 :: forall (n :: T0) (n :: T1). + (Sing n) -> (Sing n) -> ST1 ('C1 n n :: T1) + (:%&&) :: forall (n :: T0) (n :: T1). + (Sing n) -> (Sing n) -> ST1 ('(:&&) n n :: T1) + type instance Sing @T1 = ST1 + instance SingKind T1 where + type Demote T1 = T1 + fromSing SN1 = N1 + fromSing (SC1 b b) = C1 (fromSing b) (fromSing b) + fromSing ((:%&&) b b) = (:&&) (fromSing b) (fromSing b) + toSing N1 = SomeSing SN1 + toSing (C1 (b :: Demote T0) (b :: Demote T1)) + = case (,) (toSing b :: SomeSing T0) (toSing b :: SomeSing T1) of + (,) (SomeSing c) (SomeSing c) -> SomeSing (SC1 c c) + toSing ((:&&) (b :: Demote T0) (b :: Demote T1)) + = case (,) (toSing b :: SomeSing T0) (toSing b :: SomeSing T1) of + (,) (SomeSing c) (SomeSing c) -> SomeSing ((:%&&) c c) + infixr 5 `SC1` + infixr 5 :%&& + instance SingI 'N1 where + sing = SN1 + instance (SingI n, SingI n) => + SingI ('C1 (n :: T0) (n :: T1)) where + sing = SC1 sing sing + instance SingI n => SingI1 ('C1 (n :: T0)) where + liftSing = SC1 sing + instance SingI2 'C1 where + liftSing2 = SC1 + instance SingI (C1Sym0 :: (~>) T0 ((~>) T1 T1)) where + sing = singFun2 @C1Sym0 SC1 + instance SingI d => SingI (C1Sym1 (d :: T0) :: (~>) T1 T1) where + sing = singFun1 @(C1Sym1 (d :: T0)) (SC1 (sing @d)) + instance SingI1 (C1Sym1 :: T0 -> (~>) T1 T1) where + liftSing (s :: Sing (d :: T0)) + = singFun1 @(C1Sym1 (d :: T0)) (SC1 s) + instance (SingI n, SingI n) => + SingI ('(:&&) (n :: T0) (n :: T1)) where + sing = (:%&&) sing sing + instance SingI n => SingI1 ('(:&&) (n :: T0)) where + liftSing = (:%&&) sing + instance SingI2 '(:&&) where + liftSing2 = (:%&&) + instance SingI ((:&&@#@$) :: (~>) T0 ((~>) T1 T1)) where + sing = singFun2 @(:&&@#@$) (:%&&) + instance SingI d => + SingI ((:&&@#@$$) (d :: T0) :: (~>) T1 T1) where + sing = singFun1 @((:&&@#@$$) (d :: T0)) ((:%&&) (sing @d)) + instance SingI1 ((:&&@#@$$) :: T0 -> (~>) T1 T1) where + liftSing (s :: Sing (d :: T0)) + = singFun1 @((:&&@#@$$) (d :: T0)) ((:%&&) s) +Singletons/T159.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| infixr 5 :|| + infixr 5 `C2` + + data T2 = N2 | C2 T0 T2 | T0 :|| T2 |] + ======> + data T2 = N2 | C2 T0 T2 | T0 :|| T2 + infixr 5 `C2` + infixr 5 :|| + type N2Sym0 :: T2 + type family N2Sym0 :: T2 where + N2Sym0 = N2 + type C2Sym0 :: (~>) T0 ((~>) T2 T2) + data C2Sym0 :: (~>) T0 ((~>) T2 T2) + where + C2Sym0KindInference :: SameKind (Apply C2Sym0 arg) (C2Sym1 arg) => + C2Sym0 a0123456789876543210 + type instance Apply C2Sym0 a0123456789876543210 = C2Sym1 a0123456789876543210 + instance SuppressUnusedWarnings C2Sym0 where + suppressUnusedWarnings = snd ((,) C2Sym0KindInference ()) + infixr 5 `C2Sym0` + type C2Sym1 :: T0 -> (~>) T2 T2 + data C2Sym1 (a0123456789876543210 :: T0) :: (~>) T2 T2 + where + C2Sym1KindInference :: SameKind (Apply (C2Sym1 a0123456789876543210) arg) (C2Sym2 a0123456789876543210 arg) => + C2Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (C2Sym1 a0123456789876543210) a0123456789876543210 = C2 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (C2Sym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) C2Sym1KindInference ()) + infixr 5 `C2Sym1` + type C2Sym2 :: T0 -> T2 -> T2 + type family C2Sym2 (a0123456789876543210 :: T0) (a0123456789876543210 :: T2) :: T2 where + C2Sym2 a0123456789876543210 a0123456789876543210 = C2 a0123456789876543210 a0123456789876543210 + infixr 5 `C2Sym2` + type (:||@#@$) :: (~>) T0 ((~>) T2 T2) + data (:||@#@$) :: (~>) T0 ((~>) T2 T2) + where + (::||@#@$###) :: SameKind (Apply (:||@#@$) arg) ((:||@#@$$) arg) => + (:||@#@$) a0123456789876543210 + type instance Apply (:||@#@$) a0123456789876543210 = (:||@#@$$) a0123456789876543210 + instance SuppressUnusedWarnings (:||@#@$) where + suppressUnusedWarnings = snd ((,) (::||@#@$###) ()) + infixr 5 :||@#@$ + type (:||@#@$$) :: T0 -> (~>) T2 T2 + data (:||@#@$$) (a0123456789876543210 :: T0) :: (~>) T2 T2 + where + (::||@#@$$###) :: SameKind (Apply ((:||@#@$$) a0123456789876543210) arg) ((:||@#@$$$) a0123456789876543210 arg) => + (:||@#@$$) a0123456789876543210 a0123456789876543210 + type instance Apply ((:||@#@$$) a0123456789876543210) a0123456789876543210 = (:||) a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings ((:||@#@$$) a0123456789876543210) where + suppressUnusedWarnings = snd ((,) (::||@#@$$###) ()) + infixr 5 :||@#@$$ + type (:||@#@$$$) :: T0 -> T2 -> T2 + type family (:||@#@$$$) (a0123456789876543210 :: T0) (a0123456789876543210 :: T2) :: T2 where + (:||@#@$$$) a0123456789876543210 a0123456789876543210 = (:||) a0123456789876543210 a0123456789876543210 + infixr 5 :||@#@$$$ + infixr 5 :%|| + infixr 5 `SC2` + data ST2 :: T2 -> Type + where + SN2 :: ST2 (N2 :: T2) + SC2 :: forall (n :: T0) (n :: T2). + (Sing n) -> (Sing n) -> ST2 (C2 n n :: T2) + (:%||) :: forall (n :: T0) (n :: T2). + (Sing n) -> (Sing n) -> ST2 ((:||) n n :: T2) + type instance Sing @T2 = ST2 + instance SingKind T2 where + type Demote T2 = T2 + fromSing SN2 = N2 + fromSing (SC2 b b) = C2 (fromSing b) (fromSing b) + fromSing ((:%||) b b) = (:||) (fromSing b) (fromSing b) + toSing N2 = SomeSing SN2 + toSing (C2 (b :: Demote T0) (b :: Demote T2)) + = case (,) (toSing b :: SomeSing T0) (toSing b :: SomeSing T2) of + (,) (SomeSing c) (SomeSing c) -> SomeSing (SC2 c c) + toSing ((:||) (b :: Demote T0) (b :: Demote T2)) + = case (,) (toSing b :: SomeSing T0) (toSing b :: SomeSing T2) of + (,) (SomeSing c) (SomeSing c) -> SomeSing ((:%||) c c) + instance SingI N2 where + sing = SN2 + instance (SingI n, SingI n) => SingI (C2 (n :: T0) (n :: T2)) where + sing = SC2 sing sing + instance SingI n => SingI1 (C2 (n :: T0)) where + liftSing = SC2 sing + instance SingI2 C2 where + liftSing2 = SC2 + instance SingI (C2Sym0 :: (~>) T0 ((~>) T2 T2)) where + sing = singFun2 @C2Sym0 SC2 + instance SingI d => SingI (C2Sym1 (d :: T0) :: (~>) T2 T2) where + sing = singFun1 @(C2Sym1 (d :: T0)) (SC2 (sing @d)) + instance SingI1 (C2Sym1 :: T0 -> (~>) T2 T2) where + liftSing (s :: Sing (d :: T0)) + = singFun1 @(C2Sym1 (d :: T0)) (SC2 s) + instance (SingI n, SingI n) => + SingI ((:||) (n :: T0) (n :: T2)) where + sing = (:%||) sing sing + instance SingI n => SingI1 ((:||) (n :: T0)) where + liftSing = (:%||) sing + instance SingI2 (:||) where + liftSing2 = (:%||) + instance SingI ((:||@#@$) :: (~>) T0 ((~>) T2 T2)) where + sing = singFun2 @(:||@#@$) (:%||) + instance SingI d => + SingI ((:||@#@$$) (d :: T0) :: (~>) T2 T2) where + sing = singFun1 @((:||@#@$$) (d :: T0)) ((:%||) (sing @d)) + instance SingI1 ((:||@#@$$) :: T0 -> (~>) T2 T2) where + liftSing (s :: Sing (d :: T0)) + = singFun1 @((:||@#@$$) (d :: T0)) ((:%||) s)
tests/compile-and-dump/Singletons/T159.hs view
@@ -1,27 +1,27 @@-module T159 where--import Data.Singletons.TH--data T0 = A | B | C | D | E | F- deriving (Show)--data T1 = N1 | C1 T0 T1 | T0 :&& T1- deriving (Show)--infixr 5 `C1`-infixr 5 :&&--genSingletons [''T0, ''T1]--singletons [d|- data T2 = N2 | C2 T0 T2 | T0 :|| T2-- infixr 5 `C2`- infixr 5 :||- |]--t1 :: T1-t1 = fromSing $ SA `SC1` SB `SC1` SD :%&& SE :%&& SF `SC1` SN1--t2 :: T2-t2 = fromSing $ SA `SC2` SB `SC2` SD :%|| SE :%|| SF `SC2` SN2+module T159 where + +import Data.Singletons.TH + +data T0 = A | B | C | D | E | F + deriving (Show) + +data T1 = N1 | C1 T0 T1 | T0 :&& T1 + deriving (Show) + +infixr 5 `C1` +infixr 5 :&& + +genSingletons [''T0, ''T1] + +singletons [d| + data T2 = N2 | C2 T0 T2 | T0 :|| T2 + + infixr 5 `C2` + infixr 5 :|| + |] + +t1 :: T1 +t1 = fromSing $ SA `SC1` SB `SC1` SD :%&& SE :%&& SF `SC1` SN1 + +t2 :: T2 +t2 = fromSing $ SA `SC2` SB `SC2` SD :%|| SE :%|| SF `SC2` SN2
tests/compile-and-dump/Singletons/T160.golden view
@@ -1,69 +1,70 @@-Singletons/T160.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| foo :: (Num a, Eq a) => a -> a- foo x = if x == 0 then 1 else typeError $ ShowType x |]- ======>- foo :: (Num a, Eq a) => a -> a- foo x = if (x == 0) then 1 else (typeError $ ShowType x)- data Let0123456789876543210Scrutinee_0123456789876543210Sym0 x0123456789876543210- where- Let0123456789876543210Scrutinee_0123456789876543210Sym0KindInference :: SameKind (Apply Let0123456789876543210Scrutinee_0123456789876543210Sym0 arg) (Let0123456789876543210Scrutinee_0123456789876543210Sym1 arg) =>- Let0123456789876543210Scrutinee_0123456789876543210Sym0 x0123456789876543210- type instance Apply Let0123456789876543210Scrutinee_0123456789876543210Sym0 x0123456789876543210 = Let0123456789876543210Scrutinee_0123456789876543210 x0123456789876543210- instance SuppressUnusedWarnings Let0123456789876543210Scrutinee_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd- (((,)- Let0123456789876543210Scrutinee_0123456789876543210Sym0KindInference)- ())- type family Let0123456789876543210Scrutinee_0123456789876543210Sym1 x0123456789876543210 where- Let0123456789876543210Scrutinee_0123456789876543210Sym1 x0123456789876543210 = Let0123456789876543210Scrutinee_0123456789876543210 x0123456789876543210- type family Let0123456789876543210Scrutinee_0123456789876543210 x where- Let0123456789876543210Scrutinee_0123456789876543210 x = Apply (Apply (==@#@$) x) (FromInteger 0)- type family Case_0123456789876543210 x t where- Case_0123456789876543210 x 'True = FromInteger 1- Case_0123456789876543210 x 'False = Apply (Apply ($@#@$) TypeErrorSym0) (Apply ShowTypeSym0 x)- type FooSym0 :: (~>) a a- data FooSym0 :: (~>) a a- where- FooSym0KindInference :: SameKind (Apply FooSym0 arg) (FooSym1 arg) =>- FooSym0 a0123456789876543210- type instance Apply FooSym0 a0123456789876543210 = Foo a0123456789876543210- instance SuppressUnusedWarnings FooSym0 where- suppressUnusedWarnings = snd (((,) FooSym0KindInference) ())- type FooSym1 :: a -> a- type family FooSym1 (a0123456789876543210 :: a) :: a where- FooSym1 a0123456789876543210 = Foo a0123456789876543210- type Foo :: a -> a- type family Foo (a :: a) :: a where- Foo x = Case_0123456789876543210 x (Let0123456789876543210Scrutinee_0123456789876543210Sym1 x)- sFoo ::- forall a (t :: a). (SNum a, SEq a) =>- Sing t -> Sing (Apply FooSym0 t :: a)- sFoo (sX :: Sing x)- = let- sScrutinee_0123456789876543210 ::- Sing @_ (Let0123456789876543210Scrutinee_0123456789876543210Sym1 x)- sScrutinee_0123456789876543210- = (applySing ((applySing ((singFun2 @(==@#@$)) (%==))) sX))- (sFromInteger (sing :: Sing 0))- in- (id- @(Sing (Case_0123456789876543210 x (Let0123456789876543210Scrutinee_0123456789876543210Sym1 x) :: a)))- (case sScrutinee_0123456789876543210 of- STrue -> sFromInteger (sing :: Sing 1)- SFalse- -> (applySing- ((applySing ((singFun2 @($@#@$)) (%$)))- ((singFun1 @TypeErrorSym0) sTypeError)))- ((applySing ((singFun1 @ShowTypeSym0) SShowType)) sX))- instance (SNum a, SEq a) => SingI (FooSym0 :: (~>) a a) where- sing = (singFun1 @FooSym0) sFoo--Singletons/T160.hs:0:0: error:- • 1- • In the expression: Refl- In an equation for ‘f’: f = Refl- |-13 | f = Refl- | ^^^^+Singletons/T160.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| foo :: (Num a, Eq a) => a -> a + foo x = if x == 0 then 1 else typeError $ ShowType x |] + ======> + foo :: (Num a, Eq a) => a -> a + foo x = if (x == 0) then 1 else (typeError $ ShowType x) + data Let0123456789876543210Scrutinee_0123456789876543210Sym0 x0123456789876543210 + where + Let0123456789876543210Scrutinee_0123456789876543210Sym0KindInference :: SameKind (Apply Let0123456789876543210Scrutinee_0123456789876543210Sym0 arg) (Let0123456789876543210Scrutinee_0123456789876543210Sym1 arg) => + Let0123456789876543210Scrutinee_0123456789876543210Sym0 x0123456789876543210 + type instance Apply Let0123456789876543210Scrutinee_0123456789876543210Sym0 x0123456789876543210 = Let0123456789876543210Scrutinee_0123456789876543210 x0123456789876543210 + instance SuppressUnusedWarnings Let0123456789876543210Scrutinee_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd + ((,) + Let0123456789876543210Scrutinee_0123456789876543210Sym0KindInference + ()) + type family Let0123456789876543210Scrutinee_0123456789876543210Sym1 x0123456789876543210 where + Let0123456789876543210Scrutinee_0123456789876543210Sym1 x0123456789876543210 = Let0123456789876543210Scrutinee_0123456789876543210 x0123456789876543210 + type family Let0123456789876543210Scrutinee_0123456789876543210 x where + Let0123456789876543210Scrutinee_0123456789876543210 x = Apply (Apply (==@#@$) x) (FromInteger 0) + type family Case_0123456789876543210 x t where + Case_0123456789876543210 x 'True = FromInteger 1 + Case_0123456789876543210 x 'False = Apply (Apply ($@#@$) TypeErrorSym0) (Apply ShowTypeSym0 x) + type FooSym0 :: (~>) a a + data FooSym0 :: (~>) a a + where + FooSym0KindInference :: SameKind (Apply FooSym0 arg) (FooSym1 arg) => + FooSym0 a0123456789876543210 + type instance Apply FooSym0 a0123456789876543210 = Foo a0123456789876543210 + instance SuppressUnusedWarnings FooSym0 where + suppressUnusedWarnings = snd ((,) FooSym0KindInference ()) + type FooSym1 :: a -> a + type family FooSym1 (a0123456789876543210 :: a) :: a where + FooSym1 a0123456789876543210 = Foo a0123456789876543210 + type Foo :: a -> a + type family Foo (a :: a) :: a where + Foo x = Case_0123456789876543210 x (Let0123456789876543210Scrutinee_0123456789876543210Sym1 x) + sFoo :: + (forall (t :: a). + (SNum a, SEq a) => Sing t -> Sing (Apply FooSym0 t :: a) :: Type) + sFoo (sX :: Sing x) + = let + sScrutinee_0123456789876543210 :: + Sing @_ (Let0123456789876543210Scrutinee_0123456789876543210Sym1 x) + sScrutinee_0123456789876543210 + = applySing + (applySing (singFun2 @(==@#@$) (%==)) sX) + (sFromInteger (sing :: Sing 0)) + in + id + @(Sing (Case_0123456789876543210 x (Let0123456789876543210Scrutinee_0123456789876543210Sym1 x))) + (case sScrutinee_0123456789876543210 of + STrue -> sFromInteger (sing :: Sing 1) + SFalse + -> applySing + (applySing + (singFun2 @($@#@$) (%$)) (singFun1 @TypeErrorSym0 sTypeError)) + (applySing (singFun1 @ShowTypeSym0 SShowType) sX)) + instance (SNum a, SEq a) => SingI (FooSym0 :: (~>) a a) where + sing = singFun1 @FooSym0 sFoo + +Singletons/T160.hs:0:0: error: [GHC-64725] + • 1 + • In the expression: Refl + In an equation for ‘f’: f = Refl + | +13 | f = Refl + | ^^^^
tests/compile-and-dump/Singletons/T160.hs view
@@ -1,13 +1,13 @@-module T160 where--import Data.Singletons.Base.TypeError-import Data.Singletons.TH-import Prelude.Singletons--$(singletons- [d| foo :: (Num a, Eq a) => a -> a- foo x = if x == 0 then 1 else typeError $ ShowType x- |])--f :: Foo 1 :~: 42-f = Refl+module T160 where + +import Data.Singletons.Base.TypeError +import Data.Singletons.TH +import Prelude.Singletons + +$(singletons + [d| foo :: (Num a, Eq a) => a -> a + foo x = if x == 0 then 1 else typeError $ ShowType x + |]) + +f :: Foo 1 :~: 42 +f = Refl
tests/compile-and-dump/Singletons/T163.golden view
@@ -1,51 +1,51 @@-Singletons/T163.hs:0:0:: Splicing declarations- singletons [d| data a + b = L a | R b |]- ======>- data (+) a b = L a | R b- type LSym0 :: forall a b. (~>) a ((+) a b)- data LSym0 :: (~>) a ((+) a b)- where- LSym0KindInference :: SameKind (Apply LSym0 arg) (LSym1 arg) =>- LSym0 a0123456789876543210- type instance Apply LSym0 a0123456789876543210 = L a0123456789876543210- instance SuppressUnusedWarnings LSym0 where- suppressUnusedWarnings = snd (((,) LSym0KindInference) ())- type LSym1 :: forall a b. a -> (+) a b- type family LSym1 (a0123456789876543210 :: a) :: (+) a b where- LSym1 a0123456789876543210 = L a0123456789876543210- type RSym0 :: forall a b. (~>) b ((+) a b)- data RSym0 :: (~>) b ((+) a b)- where- RSym0KindInference :: SameKind (Apply RSym0 arg) (RSym1 arg) =>- RSym0 a0123456789876543210- type instance Apply RSym0 a0123456789876543210 = R a0123456789876543210- instance SuppressUnusedWarnings RSym0 where- suppressUnusedWarnings = snd (((,) RSym0KindInference) ())- type RSym1 :: forall a b. b -> (+) a b- type family RSym1 (a0123456789876543210 :: b) :: (+) a b where- RSym1 a0123456789876543210 = R a0123456789876543210- data (%+) :: forall a b. (+) a b -> Type- where- SL :: forall a b (n :: a). (Sing n) -> (%+) (L n :: (+) a b)- SR :: forall a b (n :: b). (Sing n) -> (%+) (R n :: (+) a b)- type instance Sing @((+) a b) = (%+)- instance (SingKind a, SingKind b) => SingKind ((+) a b) where- type Demote ((+) a b) = (+) (Demote a) (Demote b)- fromSing (SL b) = L (fromSing b)- fromSing (SR b) = R (fromSing b)- toSing (L (b :: Demote a))- = case toSing b :: SomeSing a of SomeSing c -> SomeSing (SL c)- toSing (R (b :: Demote b))- = case toSing b :: SomeSing b of SomeSing c -> SomeSing (SR c)- instance SingI n => SingI (L (n :: a)) where- sing = SL sing- instance SingI1 L where- liftSing = SL- instance SingI (LSym0 :: (~>) a ((+) a b)) where- sing = (singFun1 @LSym0) SL- instance SingI n => SingI (R (n :: b)) where- sing = SR sing- instance SingI1 R where- liftSing = SR- instance SingI (RSym0 :: (~>) b ((+) a b)) where- sing = (singFun1 @RSym0) SR+Singletons/T163.hs:0:0:: Splicing declarations + singletons [d| data a + b = L a | R b |] + ======> + data (+) a b = L a | R b + type LSym0 :: forall a b. (~>) a ((+) a b) + data LSym0 :: (~>) a ((+) a b) + where + LSym0KindInference :: SameKind (Apply LSym0 arg) (LSym1 arg) => + LSym0 a0123456789876543210 + type instance Apply LSym0 a0123456789876543210 = L a0123456789876543210 + instance SuppressUnusedWarnings LSym0 where + suppressUnusedWarnings = snd ((,) LSym0KindInference ()) + type LSym1 :: forall a b. a -> (+) a b + type family LSym1 (a0123456789876543210 :: a) :: (+) a b where + LSym1 a0123456789876543210 = L a0123456789876543210 + type RSym0 :: forall a b. (~>) b ((+) a b) + data RSym0 :: (~>) b ((+) a b) + where + RSym0KindInference :: SameKind (Apply RSym0 arg) (RSym1 arg) => + RSym0 a0123456789876543210 + type instance Apply RSym0 a0123456789876543210 = R a0123456789876543210 + instance SuppressUnusedWarnings RSym0 where + suppressUnusedWarnings = snd ((,) RSym0KindInference ()) + type RSym1 :: forall a b. b -> (+) a b + type family RSym1 (a0123456789876543210 :: b) :: (+) a b where + RSym1 a0123456789876543210 = R a0123456789876543210 + data (%+) :: forall a b. (+) a b -> Type + where + SL :: forall a b (n :: a). (Sing n) -> (%+) (L n :: (+) a b) + SR :: forall a b (n :: b). (Sing n) -> (%+) (R n :: (+) a b) + type instance Sing @((+) a b) = (%+) + instance (SingKind a, SingKind b) => SingKind ((+) a b) where + type Demote ((+) a b) = (+) (Demote a) (Demote b) + fromSing (SL b) = L (fromSing b) + fromSing (SR b) = R (fromSing b) + toSing (L (b :: Demote a)) + = case toSing b :: SomeSing a of SomeSing c -> SomeSing (SL c) + toSing (R (b :: Demote b)) + = case toSing b :: SomeSing b of SomeSing c -> SomeSing (SR c) + instance SingI n => SingI (L (n :: a)) where + sing = SL sing + instance SingI1 L where + liftSing = SL + instance SingI (LSym0 :: (~>) a ((+) a b)) where + sing = singFun1 @LSym0 SL + instance SingI n => SingI (R (n :: b)) where + sing = SR sing + instance SingI1 R where + liftSing = SR + instance SingI (RSym0 :: (~>) b ((+) a b)) where + sing = singFun1 @RSym0 SR
tests/compile-and-dump/Singletons/T163.hs view
@@ -1,5 +1,5 @@-module T163 where--import Data.Singletons.TH--$(singletons [d| data a + b = L a | R b |])+module T163 where + +import Data.Singletons.TH + +$(singletons [d| data a + b = L a | R b |])
tests/compile-and-dump/Singletons/T166.golden view
@@ -1,149 +1,154 @@-Singletons/T166.hs:(0,0)-(0,0): Splicing declarations- singletonsOnly- [d| class Foo a where- foosPrec :: Natural -> a -> [Bool] -> [Bool]- foo :: a -> [Bool]- foo x s = foosPrec 0 x s |]- ======>- type FoosPrecSym0 :: forall a. (~>) Natural ((~>) a ((~>) [Bool] [Bool]))- data FoosPrecSym0 :: (~>) Natural ((~>) a ((~>) [Bool] [Bool]))- where- FoosPrecSym0KindInference :: SameKind (Apply FoosPrecSym0 arg) (FoosPrecSym1 arg) =>- FoosPrecSym0 a0123456789876543210- type instance Apply FoosPrecSym0 a0123456789876543210 = FoosPrecSym1 a0123456789876543210- instance SuppressUnusedWarnings FoosPrecSym0 where- suppressUnusedWarnings = snd (((,) FoosPrecSym0KindInference) ())- type FoosPrecSym1 :: forall a. Natural- -> (~>) a ((~>) [Bool] [Bool])- data FoosPrecSym1 (a0123456789876543210 :: Natural) :: (~>) a ((~>) [Bool] [Bool])- where- FoosPrecSym1KindInference :: SameKind (Apply (FoosPrecSym1 a0123456789876543210) arg) (FoosPrecSym2 a0123456789876543210 arg) =>- FoosPrecSym1 a0123456789876543210 a0123456789876543210- type instance Apply (FoosPrecSym1 a0123456789876543210) a0123456789876543210 = FoosPrecSym2 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (FoosPrecSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) FoosPrecSym1KindInference) ())- type FoosPrecSym2 :: forall a. Natural -> a -> (~>) [Bool] [Bool]- data FoosPrecSym2 (a0123456789876543210 :: Natural) (a0123456789876543210 :: a) :: (~>) [Bool] [Bool]- where- FoosPrecSym2KindInference :: SameKind (Apply (FoosPrecSym2 a0123456789876543210 a0123456789876543210) arg) (FoosPrecSym3 a0123456789876543210 a0123456789876543210 arg) =>- FoosPrecSym2 a0123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply (FoosPrecSym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = FoosPrec a0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (FoosPrecSym2 a0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) FoosPrecSym2KindInference) ())- type FoosPrecSym3 :: forall a. Natural -> a -> [Bool] -> [Bool]- type family FoosPrecSym3 (a0123456789876543210 :: Natural) (a0123456789876543210 :: a) (a0123456789876543210 :: [Bool]) :: [Bool] where- FoosPrecSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = FoosPrec a0123456789876543210 a0123456789876543210 a0123456789876543210- type FooSym0 :: forall a. (~>) a [Bool]- data FooSym0 :: (~>) a [Bool]- where- FooSym0KindInference :: SameKind (Apply FooSym0 arg) (FooSym1 arg) =>- FooSym0 a0123456789876543210- type instance Apply FooSym0 a0123456789876543210 = Foo a0123456789876543210- instance SuppressUnusedWarnings FooSym0 where- suppressUnusedWarnings = snd (((,) FooSym0KindInference) ())- type FooSym1 :: forall a. a -> [Bool]- type family FooSym1 (a0123456789876543210 :: a) :: [Bool] where- FooSym1 a0123456789876543210 = Foo a0123456789876543210- type family Lambda_0123456789876543210 x s where- Lambda_0123456789876543210 x s = Apply (Apply (Apply FoosPrecSym0 (FromInteger 0)) x) s- data Lambda_0123456789876543210Sym0 x0123456789876543210- where- Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) =>- Lambda_0123456789876543210Sym0 x0123456789876543210- type instance Apply Lambda_0123456789876543210Sym0 x0123456789876543210 = Lambda_0123456789876543210Sym1 x0123456789876543210- instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym0KindInference) ())- data Lambda_0123456789876543210Sym1 x0123456789876543210 s0123456789876543210- where- Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) arg) (Lambda_0123456789876543210Sym2 x0123456789876543210 arg) =>- Lambda_0123456789876543210Sym1 x0123456789876543210 s0123456789876543210- type instance Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) s0123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 s0123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 x0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym1KindInference) ())- type family Lambda_0123456789876543210Sym2 x0123456789876543210 s0123456789876543210 where- Lambda_0123456789876543210Sym2 x0123456789876543210 s0123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 s0123456789876543210- type Foo_0123456789876543210 :: a -> [Bool]- type family Foo_0123456789876543210 (a :: a) :: [Bool] where- Foo_0123456789876543210 x = Apply Lambda_0123456789876543210Sym0 x- type Foo_0123456789876543210Sym0 :: (~>) a [Bool]- data Foo_0123456789876543210Sym0 :: (~>) a [Bool]- where- Foo_0123456789876543210Sym0KindInference :: SameKind (Apply Foo_0123456789876543210Sym0 arg) (Foo_0123456789876543210Sym1 arg) =>- Foo_0123456789876543210Sym0 a0123456789876543210- type instance Apply Foo_0123456789876543210Sym0 a0123456789876543210 = Foo_0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings Foo_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Foo_0123456789876543210Sym0KindInference) ())- type Foo_0123456789876543210Sym1 :: a -> [Bool]- type family Foo_0123456789876543210Sym1 (a0123456789876543210 :: a) :: [Bool] where- Foo_0123456789876543210Sym1 a0123456789876543210 = Foo_0123456789876543210 a0123456789876543210- class PFoo a where- type family FoosPrec (arg :: Natural) (arg :: a) (arg :: [Bool]) :: [Bool]- type family Foo (arg :: a) :: [Bool]- type Foo a = Apply Foo_0123456789876543210Sym0 a- class SFoo a where- sFoosPrec ::- forall (t :: Natural) (t :: a) (t :: [Bool]). Sing t- -> Sing t- -> Sing t- -> Sing (Apply (Apply (Apply FoosPrecSym0 t) t) t :: [Bool])- sFoo :: forall (t :: a). Sing t -> Sing (Apply FooSym0 t :: [Bool])- default sFoo ::- forall (t :: a). ((Apply FooSym0 t :: [Bool])- ~ Apply Foo_0123456789876543210Sym0 t) =>- Sing t -> Sing (Apply FooSym0 t :: [Bool])- sFoo (sX :: Sing x)- = (singFun1 @(Apply Lambda_0123456789876543210Sym0 x))- (\ sS- -> case sS of- (_ :: Sing s)- -> (applySing- ((applySing- ((applySing ((singFun3 @FoosPrecSym0) sFoosPrec))- (sFromInteger (sing :: Sing 0))))- sX))- sS)- instance SFoo a =>- SingI (FoosPrecSym0 :: (~>) Natural ((~>) a ((~>) [Bool] [Bool]))) where- sing = (singFun3 @FoosPrecSym0) sFoosPrec- instance (SFoo a, SingI d) =>- SingI (FoosPrecSym1 (d :: Natural) :: (~>) a ((~>) [Bool] [Bool])) where- sing- = (singFun2 @(FoosPrecSym1 (d :: Natural))) (sFoosPrec (sing @d))- instance SFoo a =>- SingI1 (FoosPrecSym1 :: Natural- -> (~>) a ((~>) [Bool] [Bool])) where- liftSing (s :: Sing (d :: Natural))- = (singFun2 @(FoosPrecSym1 (d :: Natural))) (sFoosPrec s)- instance (SFoo a, SingI d, SingI d) =>- SingI (FoosPrecSym2 (d :: Natural) (d :: a) :: (~>) [Bool] [Bool]) where- sing- = (singFun1 @(FoosPrecSym2 (d :: Natural) (d :: a)))- ((sFoosPrec (sing @d)) (sing @d))- instance (SFoo a, SingI d) =>- SingI1 (FoosPrecSym2 (d :: Natural) :: a- -> (~>) [Bool] [Bool]) where- liftSing (s :: Sing (d :: a))- = (singFun1 @(FoosPrecSym2 (d :: Natural) (d :: a)))- ((sFoosPrec (sing @d)) s)- instance SFoo a =>- SingI2 (FoosPrecSym2 :: Natural -> a -> (~>) [Bool] [Bool]) where- liftSing2 (s :: Sing (d :: Natural)) (s :: Sing (d :: a))- = (singFun1 @(FoosPrecSym2 (d :: Natural) (d :: a)))- ((sFoosPrec s) s)- instance SFoo a => SingI (FooSym0 :: (~>) a [Bool]) where- sing = (singFun1 @FooSym0) sFoo--Singletons/T166.hs:0:0: error:- • Expecting one more argument to ‘Apply Lambda_0123456789876543210Sym0 x’- Expected kind ‘[Bool]’,- but ‘Apply Lambda_0123456789876543210Sym0 x’ has kind ‘TyFun- [Bool] [Bool]- -> Type’- • In the type ‘Apply Lambda_0123456789876543210Sym0 x’- In the type family declaration for ‘Foo_0123456789876543210’- |-6 | $(singletonsOnly [d|- | ^^^^^^^^^^^^^^^^^^^...+Singletons/T166.hs:(0,0)-(0,0): Splicing declarations + singletonsOnly + [d| class Foo a where + foosPrec :: Natural -> a -> [Bool] -> [Bool] + foo :: a -> [Bool] + foo x s = foosPrec 0 x s |] + ======> + type FoosPrecSym0 :: forall a. (~>) Natural ((~>) a ((~>) [Bool] [Bool])) + data FoosPrecSym0 :: (~>) Natural ((~>) a ((~>) [Bool] [Bool])) + where + FoosPrecSym0KindInference :: SameKind (Apply FoosPrecSym0 arg) (FoosPrecSym1 arg) => + FoosPrecSym0 a0123456789876543210 + type instance Apply FoosPrecSym0 a0123456789876543210 = FoosPrecSym1 a0123456789876543210 + instance SuppressUnusedWarnings FoosPrecSym0 where + suppressUnusedWarnings = snd ((,) FoosPrecSym0KindInference ()) + type FoosPrecSym1 :: forall a. Natural + -> (~>) a ((~>) [Bool] [Bool]) + data FoosPrecSym1 (a0123456789876543210 :: Natural) :: (~>) a ((~>) [Bool] [Bool]) + where + FoosPrecSym1KindInference :: SameKind (Apply (FoosPrecSym1 a0123456789876543210) arg) (FoosPrecSym2 a0123456789876543210 arg) => + FoosPrecSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (FoosPrecSym1 a0123456789876543210) a0123456789876543210 = FoosPrecSym2 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (FoosPrecSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) FoosPrecSym1KindInference ()) + type FoosPrecSym2 :: forall a. Natural -> a -> (~>) [Bool] [Bool] + data FoosPrecSym2 (a0123456789876543210 :: Natural) (a0123456789876543210 :: a) :: (~>) [Bool] [Bool] + where + FoosPrecSym2KindInference :: SameKind (Apply (FoosPrecSym2 a0123456789876543210 a0123456789876543210) arg) (FoosPrecSym3 a0123456789876543210 a0123456789876543210 arg) => + FoosPrecSym2 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply (FoosPrecSym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = FoosPrec a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (FoosPrecSym2 a0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) FoosPrecSym2KindInference ()) + type FoosPrecSym3 :: forall a. Natural -> a -> [Bool] -> [Bool] + type family FoosPrecSym3 (a0123456789876543210 :: Natural) (a0123456789876543210 :: a) (a0123456789876543210 :: [Bool]) :: [Bool] where + FoosPrecSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = FoosPrec a0123456789876543210 a0123456789876543210 a0123456789876543210 + type FooSym0 :: forall a. (~>) a [Bool] + data FooSym0 :: (~>) a [Bool] + where + FooSym0KindInference :: SameKind (Apply FooSym0 arg) (FooSym1 arg) => + FooSym0 a0123456789876543210 + type instance Apply FooSym0 a0123456789876543210 = Foo a0123456789876543210 + instance SuppressUnusedWarnings FooSym0 where + suppressUnusedWarnings = snd ((,) FooSym0KindInference ()) + type FooSym1 :: forall a. a -> [Bool] + type family FooSym1 (a0123456789876543210 :: a) :: [Bool] where + FooSym1 a0123456789876543210 = Foo a0123456789876543210 + type family Lambda_0123456789876543210 x s where + Lambda_0123456789876543210 x s = Apply (Apply (Apply FoosPrecSym0 (FromInteger 0)) x) s + data Lambda_0123456789876543210Sym0 x0123456789876543210 + where + Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) => + Lambda_0123456789876543210Sym0 x0123456789876543210 + type instance Apply Lambda_0123456789876543210Sym0 x0123456789876543210 = Lambda_0123456789876543210Sym1 x0123456789876543210 + instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym0KindInference ()) + data Lambda_0123456789876543210Sym1 x0123456789876543210 s0123456789876543210 + where + Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) arg) (Lambda_0123456789876543210Sym2 x0123456789876543210 arg) => + Lambda_0123456789876543210Sym1 x0123456789876543210 s0123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) s0123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 s0123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 x0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym1KindInference ()) + type family Lambda_0123456789876543210Sym2 x0123456789876543210 s0123456789876543210 where + Lambda_0123456789876543210Sym2 x0123456789876543210 s0123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 s0123456789876543210 + type Foo_0123456789876543210 :: a -> [Bool] + type family Foo_0123456789876543210 (a :: a) :: [Bool] where + Foo_0123456789876543210 x = Apply Lambda_0123456789876543210Sym0 x + type Foo_0123456789876543210Sym0 :: (~>) a [Bool] + data Foo_0123456789876543210Sym0 :: (~>) a [Bool] + where + Foo_0123456789876543210Sym0KindInference :: SameKind (Apply Foo_0123456789876543210Sym0 arg) (Foo_0123456789876543210Sym1 arg) => + Foo_0123456789876543210Sym0 a0123456789876543210 + type instance Apply Foo_0123456789876543210Sym0 a0123456789876543210 = Foo_0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings Foo_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Foo_0123456789876543210Sym0KindInference ()) + type Foo_0123456789876543210Sym1 :: a -> [Bool] + type family Foo_0123456789876543210Sym1 (a0123456789876543210 :: a) :: [Bool] where + Foo_0123456789876543210Sym1 a0123456789876543210 = Foo_0123456789876543210 a0123456789876543210 + class PFoo a where + type family FoosPrec (arg :: Natural) (arg :: a) (arg :: [Bool]) :: [Bool] + type family Foo (arg :: a) :: [Bool] + type Foo a = Apply Foo_0123456789876543210Sym0 a + class SFoo a where + sFoosPrec :: + (forall (t :: Natural) (t :: a) (t :: [Bool]). + Sing t + -> Sing t + -> Sing t + -> Sing (Apply (Apply (Apply FoosPrecSym0 t) t) t :: [Bool]) :: Type) + sFoo :: + (forall (t :: a). + Sing t -> Sing (Apply FooSym0 t :: [Bool]) :: Type) + default sFoo :: + (forall (t :: a). + ((Apply FooSym0 t :: [Bool]) + ~ Apply Foo_0123456789876543210Sym0 t) => + Sing t -> Sing (Apply FooSym0 t :: [Bool]) :: Type) + sFoo (sX :: Sing x) + = singFun1 + @(Apply Lambda_0123456789876543210Sym0 x) + (\ sS + -> case sS of + (_ :: Sing s) + -> applySing + (applySing + (applySing + (singFun3 @FoosPrecSym0 sFoosPrec) (sFromInteger (sing :: Sing 0))) + sX) + sS) + instance SFoo a => + SingI (FoosPrecSym0 :: (~>) Natural ((~>) a ((~>) [Bool] [Bool]))) where + sing = singFun3 @FoosPrecSym0 sFoosPrec + instance (SFoo a, SingI d) => + SingI (FoosPrecSym1 (d :: Natural) :: (~>) a ((~>) [Bool] [Bool])) where + sing + = singFun2 @(FoosPrecSym1 (d :: Natural)) (sFoosPrec (sing @d)) + instance SFoo a => + SingI1 (FoosPrecSym1 :: Natural + -> (~>) a ((~>) [Bool] [Bool])) where + liftSing (s :: Sing (d :: Natural)) + = singFun2 @(FoosPrecSym1 (d :: Natural)) (sFoosPrec s) + instance (SFoo a, SingI d, SingI d) => + SingI (FoosPrecSym2 (d :: Natural) (d :: a) :: (~>) [Bool] [Bool]) where + sing + = singFun1 + @(FoosPrecSym2 (d :: Natural) (d :: a)) + (sFoosPrec (sing @d) (sing @d)) + instance (SFoo a, SingI d) => + SingI1 (FoosPrecSym2 (d :: Natural) :: a + -> (~>) [Bool] [Bool]) where + liftSing (s :: Sing (d :: a)) + = singFun1 + @(FoosPrecSym2 (d :: Natural) (d :: a)) (sFoosPrec (sing @d) s) + instance SFoo a => + SingI2 (FoosPrecSym2 :: Natural -> a -> (~>) [Bool] [Bool]) where + liftSing2 (s :: Sing (d :: Natural)) (s :: Sing (d :: a)) + = singFun1 @(FoosPrecSym2 (d :: Natural) (d :: a)) (sFoosPrec s s) + instance SFoo a => SingI (FooSym0 :: (~>) a [Bool]) where + sing = singFun1 @FooSym0 sFoo + +Singletons/T166.hs:0:0: error: [GHC-83865] + • Expecting one more argument to ‘Apply Lambda_0123456789876543210Sym0 x’ + Expected kind ‘[Bool]’, + but ‘Apply Lambda_0123456789876543210Sym0 x’ has kind ‘TyFun + [Bool] [Bool] + -> Type’ + • In the type ‘Apply Lambda_0123456789876543210Sym0 x’ + In the type family declaration for ‘Foo_0123456789876543210’ + | +6 | $(singletonsOnly [d| + | ^^^^^^^^^^^^^^^^^^^...
tests/compile-and-dump/Singletons/T166.hs view
@@ -1,12 +1,12 @@-module SingletonsBug where--import Data.Singletons.Base.TH-import GHC.TypeLits--$(singletonsOnly [d|- class Foo a where- foosPrec :: Natural -> a -> [Bool] -> [Bool]- foo :: a -> [Bool]-- foo x s = foosPrec 0 x s- |])+module SingletonsBug where + +import Data.Singletons.Base.TH +import GHC.TypeLits + +$(singletonsOnly [d| + class Foo a where + foosPrec :: Natural -> a -> [Bool] -> [Bool] + foo :: a -> [Bool] + + foo x s = foosPrec 0 x s + |])
tests/compile-and-dump/Singletons/T167.golden view
@@ -1,195 +1,199 @@-Singletons/T167.hs:(0,0)-(0,0): Splicing declarations- singletonsOnly- [d| class Foo a where- foosPrec :: Natural -> a -> DiffList- fooList :: a -> DiffList- fooList = undefined- - instance Foo a => Foo [a] where- foosPrec _ = fooList |]- ======>- type FoosPrecSym0 :: forall a. (~>) Natural ((~>) a ((~>) [Bool] [Bool]))- data FoosPrecSym0 :: (~>) Natural ((~>) a ((~>) [Bool] [Bool]))- where- FoosPrecSym0KindInference :: SameKind (Apply FoosPrecSym0 arg) (FoosPrecSym1 arg) =>- FoosPrecSym0 a0123456789876543210- type instance Apply FoosPrecSym0 a0123456789876543210 = FoosPrecSym1 a0123456789876543210- instance SuppressUnusedWarnings FoosPrecSym0 where- suppressUnusedWarnings = snd (((,) FoosPrecSym0KindInference) ())- type FoosPrecSym1 :: forall a. Natural- -> (~>) a ((~>) [Bool] [Bool])- data FoosPrecSym1 (a0123456789876543210 :: Natural) :: (~>) a ((~>) [Bool] [Bool])- where- FoosPrecSym1KindInference :: SameKind (Apply (FoosPrecSym1 a0123456789876543210) arg) (FoosPrecSym2 a0123456789876543210 arg) =>- FoosPrecSym1 a0123456789876543210 a0123456789876543210- type instance Apply (FoosPrecSym1 a0123456789876543210) a0123456789876543210 = FoosPrecSym2 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (FoosPrecSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) FoosPrecSym1KindInference) ())- type FoosPrecSym2 :: forall a. Natural -> a -> (~>) [Bool] [Bool]- data FoosPrecSym2 (a0123456789876543210 :: Natural) (a0123456789876543210 :: a) :: (~>) [Bool] [Bool]- where- FoosPrecSym2KindInference :: SameKind (Apply (FoosPrecSym2 a0123456789876543210 a0123456789876543210) arg) (FoosPrecSym3 a0123456789876543210 a0123456789876543210 arg) =>- FoosPrecSym2 a0123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply (FoosPrecSym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = FoosPrec a0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (FoosPrecSym2 a0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) FoosPrecSym2KindInference) ())- type FoosPrecSym3 :: forall a. Natural -> a -> [Bool] -> [Bool]- type family FoosPrecSym3 (a0123456789876543210 :: Natural) (a0123456789876543210 :: a) (a0123456789876543210 :: [Bool]) :: [Bool] where- FoosPrecSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = FoosPrec a0123456789876543210 a0123456789876543210 a0123456789876543210- type FooListSym0 :: forall a. (~>) a ((~>) [Bool] [Bool])- data FooListSym0 :: (~>) a ((~>) [Bool] [Bool])- where- FooListSym0KindInference :: SameKind (Apply FooListSym0 arg) (FooListSym1 arg) =>- FooListSym0 a0123456789876543210- type instance Apply FooListSym0 a0123456789876543210 = FooListSym1 a0123456789876543210- instance SuppressUnusedWarnings FooListSym0 where- suppressUnusedWarnings = snd (((,) FooListSym0KindInference) ())- type FooListSym1 :: forall a. a -> (~>) [Bool] [Bool]- data FooListSym1 (a0123456789876543210 :: a) :: (~>) [Bool] [Bool]- where- FooListSym1KindInference :: SameKind (Apply (FooListSym1 a0123456789876543210) arg) (FooListSym2 a0123456789876543210 arg) =>- FooListSym1 a0123456789876543210 a0123456789876543210- type instance Apply (FooListSym1 a0123456789876543210) a0123456789876543210 = FooList a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (FooListSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) FooListSym1KindInference) ())- type FooListSym2 :: forall a. a -> [Bool] -> [Bool]- type family FooListSym2 (a0123456789876543210 :: a) (a0123456789876543210 :: [Bool]) :: [Bool] where- FooListSym2 a0123456789876543210 a0123456789876543210 = FooList a0123456789876543210 a0123456789876543210- type FooList_0123456789876543210 :: a -> [Bool] -> [Bool]- type family FooList_0123456789876543210 (a :: a) (a :: [Bool]) :: [Bool] where- FooList_0123456789876543210 a_0123456789876543210 a_0123456789876543210 = Apply (Apply UndefinedSym0 a_0123456789876543210) a_0123456789876543210- type FooList_0123456789876543210Sym0 :: (~>) a ((~>) [Bool] [Bool])- data FooList_0123456789876543210Sym0 :: (~>) a ((~>) [Bool] [Bool])- where- FooList_0123456789876543210Sym0KindInference :: SameKind (Apply FooList_0123456789876543210Sym0 arg) (FooList_0123456789876543210Sym1 arg) =>- FooList_0123456789876543210Sym0 a0123456789876543210- type instance Apply FooList_0123456789876543210Sym0 a0123456789876543210 = FooList_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings FooList_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) FooList_0123456789876543210Sym0KindInference) ())- type FooList_0123456789876543210Sym1 :: a -> (~>) [Bool] [Bool]- data FooList_0123456789876543210Sym1 (a0123456789876543210 :: a) :: (~>) [Bool] [Bool]- where- FooList_0123456789876543210Sym1KindInference :: SameKind (Apply (FooList_0123456789876543210Sym1 a0123456789876543210) arg) (FooList_0123456789876543210Sym2 a0123456789876543210 arg) =>- FooList_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (FooList_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = FooList_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (FooList_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) FooList_0123456789876543210Sym1KindInference) ())- type FooList_0123456789876543210Sym2 :: a -> [Bool] -> [Bool]- type family FooList_0123456789876543210Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: [Bool]) :: [Bool] where- FooList_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = FooList_0123456789876543210 a0123456789876543210 a0123456789876543210- class PFoo a where- type family FoosPrec (arg :: Natural) (arg :: a) (arg :: [Bool]) :: [Bool]- type family FooList (arg :: a) (arg :: [Bool]) :: [Bool]- type FooList a a = Apply (Apply FooList_0123456789876543210Sym0 a) a- type FoosPrec_0123456789876543210 :: Natural- -> [a] -> [Bool] -> [Bool]- type family FoosPrec_0123456789876543210 (a :: Natural) (a :: [a]) (a :: [Bool]) :: [Bool] where- FoosPrec_0123456789876543210 _ a_0123456789876543210 a_0123456789876543210 = Apply (Apply FooListSym0 a_0123456789876543210) a_0123456789876543210- type FoosPrec_0123456789876543210Sym0 :: (~>) Natural ((~>) [a] ((~>) [Bool] [Bool]))- data FoosPrec_0123456789876543210Sym0 :: (~>) Natural ((~>) [a] ((~>) [Bool] [Bool]))- where- FoosPrec_0123456789876543210Sym0KindInference :: SameKind (Apply FoosPrec_0123456789876543210Sym0 arg) (FoosPrec_0123456789876543210Sym1 arg) =>- FoosPrec_0123456789876543210Sym0 a0123456789876543210- type instance Apply FoosPrec_0123456789876543210Sym0 a0123456789876543210 = FoosPrec_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings FoosPrec_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) FoosPrec_0123456789876543210Sym0KindInference) ())- type FoosPrec_0123456789876543210Sym1 :: Natural- -> (~>) [a] ((~>) [Bool] [Bool])- data FoosPrec_0123456789876543210Sym1 (a0123456789876543210 :: Natural) :: (~>) [a] ((~>) [Bool] [Bool])- where- FoosPrec_0123456789876543210Sym1KindInference :: SameKind (Apply (FoosPrec_0123456789876543210Sym1 a0123456789876543210) arg) (FoosPrec_0123456789876543210Sym2 a0123456789876543210 arg) =>- FoosPrec_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (FoosPrec_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = FoosPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (FoosPrec_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) FoosPrec_0123456789876543210Sym1KindInference) ())- type FoosPrec_0123456789876543210Sym2 :: Natural- -> [a] -> (~>) [Bool] [Bool]- data FoosPrec_0123456789876543210Sym2 (a0123456789876543210 :: Natural) (a0123456789876543210 :: [a]) :: (~>) [Bool] [Bool]- where- FoosPrec_0123456789876543210Sym2KindInference :: SameKind (Apply (FoosPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) arg) (FoosPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 arg) =>- FoosPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply (FoosPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = FoosPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (FoosPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) FoosPrec_0123456789876543210Sym2KindInference) ())- type FoosPrec_0123456789876543210Sym3 :: Natural- -> [a] -> [Bool] -> [Bool]- type family FoosPrec_0123456789876543210Sym3 (a0123456789876543210 :: Natural) (a0123456789876543210 :: [a]) (a0123456789876543210 :: [Bool]) :: [Bool] where- FoosPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = FoosPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance PFoo [a] where- type FoosPrec a a a = Apply (Apply (Apply FoosPrec_0123456789876543210Sym0 a) a) a- class SFoo a where- sFoosPrec ::- forall (t :: Natural) (t :: a) (t :: [Bool]). Sing t- -> Sing t- -> Sing t- -> Sing (Apply (Apply (Apply FoosPrecSym0 t) t) t :: [Bool])- sFooList ::- forall (t :: a) (t :: [Bool]). Sing t- -> Sing t -> Sing (Apply (Apply FooListSym0 t) t :: [Bool])- default sFooList ::- forall (t :: a)- (t :: [Bool]). ((Apply (Apply FooListSym0 t) t :: [Bool])- ~ Apply (Apply FooList_0123456789876543210Sym0 t) t) =>- Sing t- -> Sing t -> Sing (Apply (Apply FooListSym0 t) t :: [Bool])- sFooList- (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (sUndefined sA_0123456789876543210) sA_0123456789876543210- instance SFoo a => SFoo [a] where- sFoosPrec ::- forall (t :: Natural) (t :: [a]) (t :: [Bool]). Sing t- -> Sing t- -> Sing t- -> Sing (Apply (Apply (Apply FoosPrecSym0 t) t) t :: [Bool])- sFoosPrec- _- (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing ((singFun2 @FooListSym0) sFooList))- sA_0123456789876543210))- sA_0123456789876543210- instance SFoo a =>- SingI (FoosPrecSym0 :: (~>) Natural ((~>) a ((~>) [Bool] [Bool]))) where- sing = (singFun3 @FoosPrecSym0) sFoosPrec- instance (SFoo a, SingI d) =>- SingI (FoosPrecSym1 (d :: Natural) :: (~>) a ((~>) [Bool] [Bool])) where- sing- = (singFun2 @(FoosPrecSym1 (d :: Natural))) (sFoosPrec (sing @d))- instance SFoo a =>- SingI1 (FoosPrecSym1 :: Natural- -> (~>) a ((~>) [Bool] [Bool])) where- liftSing (s :: Sing (d :: Natural))- = (singFun2 @(FoosPrecSym1 (d :: Natural))) (sFoosPrec s)- instance (SFoo a, SingI d, SingI d) =>- SingI (FoosPrecSym2 (d :: Natural) (d :: a) :: (~>) [Bool] [Bool]) where- sing- = (singFun1 @(FoosPrecSym2 (d :: Natural) (d :: a)))- ((sFoosPrec (sing @d)) (sing @d))- instance (SFoo a, SingI d) =>- SingI1 (FoosPrecSym2 (d :: Natural) :: a- -> (~>) [Bool] [Bool]) where- liftSing (s :: Sing (d :: a))- = (singFun1 @(FoosPrecSym2 (d :: Natural) (d :: a)))- ((sFoosPrec (sing @d)) s)- instance SFoo a =>- SingI2 (FoosPrecSym2 :: Natural -> a -> (~>) [Bool] [Bool]) where- liftSing2 (s :: Sing (d :: Natural)) (s :: Sing (d :: a))- = (singFun1 @(FoosPrecSym2 (d :: Natural) (d :: a)))- ((sFoosPrec s) s)- instance SFoo a =>- SingI (FooListSym0 :: (~>) a ((~>) [Bool] [Bool])) where- sing = (singFun2 @FooListSym0) sFooList- instance (SFoo a, SingI d) =>- SingI (FooListSym1 (d :: a) :: (~>) [Bool] [Bool]) where- sing = (singFun1 @(FooListSym1 (d :: a))) (sFooList (sing @d))- instance SFoo a =>- SingI1 (FooListSym1 :: a -> (~>) [Bool] [Bool]) where- liftSing (s :: Sing (d :: a))- = (singFun1 @(FooListSym1 (d :: a))) (sFooList s)+Singletons/T167.hs:(0,0)-(0,0): Splicing declarations + singletonsOnly + [d| class Foo a where + foosPrec :: Natural -> a -> DiffList + fooList :: a -> DiffList + fooList = undefined + + instance Foo a => Foo [a] where + foosPrec _ = fooList |] + ======> + type FoosPrecSym0 :: forall a. (~>) Natural ((~>) a ((~>) [Bool] [Bool])) + data FoosPrecSym0 :: (~>) Natural ((~>) a ((~>) [Bool] [Bool])) + where + FoosPrecSym0KindInference :: SameKind (Apply FoosPrecSym0 arg) (FoosPrecSym1 arg) => + FoosPrecSym0 a0123456789876543210 + type instance Apply FoosPrecSym0 a0123456789876543210 = FoosPrecSym1 a0123456789876543210 + instance SuppressUnusedWarnings FoosPrecSym0 where + suppressUnusedWarnings = snd ((,) FoosPrecSym0KindInference ()) + type FoosPrecSym1 :: forall a. Natural + -> (~>) a ((~>) [Bool] [Bool]) + data FoosPrecSym1 (a0123456789876543210 :: Natural) :: (~>) a ((~>) [Bool] [Bool]) + where + FoosPrecSym1KindInference :: SameKind (Apply (FoosPrecSym1 a0123456789876543210) arg) (FoosPrecSym2 a0123456789876543210 arg) => + FoosPrecSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (FoosPrecSym1 a0123456789876543210) a0123456789876543210 = FoosPrecSym2 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (FoosPrecSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) FoosPrecSym1KindInference ()) + type FoosPrecSym2 :: forall a. Natural -> a -> (~>) [Bool] [Bool] + data FoosPrecSym2 (a0123456789876543210 :: Natural) (a0123456789876543210 :: a) :: (~>) [Bool] [Bool] + where + FoosPrecSym2KindInference :: SameKind (Apply (FoosPrecSym2 a0123456789876543210 a0123456789876543210) arg) (FoosPrecSym3 a0123456789876543210 a0123456789876543210 arg) => + FoosPrecSym2 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply (FoosPrecSym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = FoosPrec a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (FoosPrecSym2 a0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) FoosPrecSym2KindInference ()) + type FoosPrecSym3 :: forall a. Natural -> a -> [Bool] -> [Bool] + type family FoosPrecSym3 (a0123456789876543210 :: Natural) (a0123456789876543210 :: a) (a0123456789876543210 :: [Bool]) :: [Bool] where + FoosPrecSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = FoosPrec a0123456789876543210 a0123456789876543210 a0123456789876543210 + type FooListSym0 :: forall a. (~>) a ((~>) [Bool] [Bool]) + data FooListSym0 :: (~>) a ((~>) [Bool] [Bool]) + where + FooListSym0KindInference :: SameKind (Apply FooListSym0 arg) (FooListSym1 arg) => + FooListSym0 a0123456789876543210 + type instance Apply FooListSym0 a0123456789876543210 = FooListSym1 a0123456789876543210 + instance SuppressUnusedWarnings FooListSym0 where + suppressUnusedWarnings = snd ((,) FooListSym0KindInference ()) + type FooListSym1 :: forall a. a -> (~>) [Bool] [Bool] + data FooListSym1 (a0123456789876543210 :: a) :: (~>) [Bool] [Bool] + where + FooListSym1KindInference :: SameKind (Apply (FooListSym1 a0123456789876543210) arg) (FooListSym2 a0123456789876543210 arg) => + FooListSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (FooListSym1 a0123456789876543210) a0123456789876543210 = FooList a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (FooListSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) FooListSym1KindInference ()) + type FooListSym2 :: forall a. a -> [Bool] -> [Bool] + type family FooListSym2 (a0123456789876543210 :: a) (a0123456789876543210 :: [Bool]) :: [Bool] where + FooListSym2 a0123456789876543210 a0123456789876543210 = FooList a0123456789876543210 a0123456789876543210 + type FooList_0123456789876543210 :: a -> [Bool] -> [Bool] + type family FooList_0123456789876543210 (a :: a) (a :: [Bool]) :: [Bool] where + FooList_0123456789876543210 a_0123456789876543210 a_0123456789876543210 = Apply (Apply UndefinedSym0 a_0123456789876543210) a_0123456789876543210 + type FooList_0123456789876543210Sym0 :: (~>) a ((~>) [Bool] [Bool]) + data FooList_0123456789876543210Sym0 :: (~>) a ((~>) [Bool] [Bool]) + where + FooList_0123456789876543210Sym0KindInference :: SameKind (Apply FooList_0123456789876543210Sym0 arg) (FooList_0123456789876543210Sym1 arg) => + FooList_0123456789876543210Sym0 a0123456789876543210 + type instance Apply FooList_0123456789876543210Sym0 a0123456789876543210 = FooList_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings FooList_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) FooList_0123456789876543210Sym0KindInference ()) + type FooList_0123456789876543210Sym1 :: a -> (~>) [Bool] [Bool] + data FooList_0123456789876543210Sym1 (a0123456789876543210 :: a) :: (~>) [Bool] [Bool] + where + FooList_0123456789876543210Sym1KindInference :: SameKind (Apply (FooList_0123456789876543210Sym1 a0123456789876543210) arg) (FooList_0123456789876543210Sym2 a0123456789876543210 arg) => + FooList_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (FooList_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = FooList_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (FooList_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) FooList_0123456789876543210Sym1KindInference ()) + type FooList_0123456789876543210Sym2 :: a -> [Bool] -> [Bool] + type family FooList_0123456789876543210Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: [Bool]) :: [Bool] where + FooList_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = FooList_0123456789876543210 a0123456789876543210 a0123456789876543210 + class PFoo a where + type family FoosPrec (arg :: Natural) (arg :: a) (arg :: [Bool]) :: [Bool] + type family FooList (arg :: a) (arg :: [Bool]) :: [Bool] + type FooList a a = Apply (Apply FooList_0123456789876543210Sym0 a) a + type FoosPrec_0123456789876543210 :: Natural + -> [a] -> [Bool] -> [Bool] + type family FoosPrec_0123456789876543210 (a :: Natural) (a :: [a]) (a :: [Bool]) :: [Bool] where + FoosPrec_0123456789876543210 _ a_0123456789876543210 a_0123456789876543210 = Apply (Apply FooListSym0 a_0123456789876543210) a_0123456789876543210 + type FoosPrec_0123456789876543210Sym0 :: (~>) Natural ((~>) [a] ((~>) [Bool] [Bool])) + data FoosPrec_0123456789876543210Sym0 :: (~>) Natural ((~>) [a] ((~>) [Bool] [Bool])) + where + FoosPrec_0123456789876543210Sym0KindInference :: SameKind (Apply FoosPrec_0123456789876543210Sym0 arg) (FoosPrec_0123456789876543210Sym1 arg) => + FoosPrec_0123456789876543210Sym0 a0123456789876543210 + type instance Apply FoosPrec_0123456789876543210Sym0 a0123456789876543210 = FoosPrec_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings FoosPrec_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) FoosPrec_0123456789876543210Sym0KindInference ()) + type FoosPrec_0123456789876543210Sym1 :: Natural + -> (~>) [a] ((~>) [Bool] [Bool]) + data FoosPrec_0123456789876543210Sym1 (a0123456789876543210 :: Natural) :: (~>) [a] ((~>) [Bool] [Bool]) + where + FoosPrec_0123456789876543210Sym1KindInference :: SameKind (Apply (FoosPrec_0123456789876543210Sym1 a0123456789876543210) arg) (FoosPrec_0123456789876543210Sym2 a0123456789876543210 arg) => + FoosPrec_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (FoosPrec_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = FoosPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (FoosPrec_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) FoosPrec_0123456789876543210Sym1KindInference ()) + type FoosPrec_0123456789876543210Sym2 :: Natural + -> [a] -> (~>) [Bool] [Bool] + data FoosPrec_0123456789876543210Sym2 (a0123456789876543210 :: Natural) (a0123456789876543210 :: [a]) :: (~>) [Bool] [Bool] + where + FoosPrec_0123456789876543210Sym2KindInference :: SameKind (Apply (FoosPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) arg) (FoosPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 arg) => + FoosPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply (FoosPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = FoosPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (FoosPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) FoosPrec_0123456789876543210Sym2KindInference ()) + type FoosPrec_0123456789876543210Sym3 :: Natural + -> [a] -> [Bool] -> [Bool] + type family FoosPrec_0123456789876543210Sym3 (a0123456789876543210 :: Natural) (a0123456789876543210 :: [a]) (a0123456789876543210 :: [Bool]) :: [Bool] where + FoosPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = FoosPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PFoo [a] where + type FoosPrec a a a = Apply (Apply (Apply FoosPrec_0123456789876543210Sym0 a) a) a + class SFoo a where + sFoosPrec :: + (forall (t :: Natural) (t :: a) (t :: [Bool]). + Sing t + -> Sing t + -> Sing t + -> Sing (Apply (Apply (Apply FoosPrecSym0 t) t) t :: [Bool]) :: Type) + sFooList :: + (forall (t :: a) (t :: [Bool]). + Sing t + -> Sing t + -> Sing (Apply (Apply FooListSym0 t) t :: [Bool]) :: Type) + default sFooList :: + (forall (t :: a) (t :: [Bool]). + ((Apply (Apply FooListSym0 t) t :: [Bool]) + ~ Apply (Apply FooList_0123456789876543210Sym0 t) t) => + Sing t + -> Sing t + -> Sing (Apply (Apply FooListSym0 t) t :: [Bool]) :: Type) + sFooList + (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = sUndefined sA_0123456789876543210 sA_0123456789876543210 + instance SFoo a => SFoo [a] where + sFoosPrec :: + (forall (t :: Natural) (t :: [a]) (t :: [Bool]). + Sing t + -> Sing t + -> Sing t + -> Sing (Apply (Apply (Apply FoosPrecSym0 t) t) t :: [Bool]) :: Type) + sFoosPrec + _ + (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing (singFun2 @FooListSym0 sFooList) sA_0123456789876543210) + sA_0123456789876543210 + instance SFoo a => + SingI (FoosPrecSym0 :: (~>) Natural ((~>) a ((~>) [Bool] [Bool]))) where + sing = singFun3 @FoosPrecSym0 sFoosPrec + instance (SFoo a, SingI d) => + SingI (FoosPrecSym1 (d :: Natural) :: (~>) a ((~>) [Bool] [Bool])) where + sing + = singFun2 @(FoosPrecSym1 (d :: Natural)) (sFoosPrec (sing @d)) + instance SFoo a => + SingI1 (FoosPrecSym1 :: Natural + -> (~>) a ((~>) [Bool] [Bool])) where + liftSing (s :: Sing (d :: Natural)) + = singFun2 @(FoosPrecSym1 (d :: Natural)) (sFoosPrec s) + instance (SFoo a, SingI d, SingI d) => + SingI (FoosPrecSym2 (d :: Natural) (d :: a) :: (~>) [Bool] [Bool]) where + sing + = singFun1 + @(FoosPrecSym2 (d :: Natural) (d :: a)) + (sFoosPrec (sing @d) (sing @d)) + instance (SFoo a, SingI d) => + SingI1 (FoosPrecSym2 (d :: Natural) :: a + -> (~>) [Bool] [Bool]) where + liftSing (s :: Sing (d :: a)) + = singFun1 + @(FoosPrecSym2 (d :: Natural) (d :: a)) (sFoosPrec (sing @d) s) + instance SFoo a => + SingI2 (FoosPrecSym2 :: Natural -> a -> (~>) [Bool] [Bool]) where + liftSing2 (s :: Sing (d :: Natural)) (s :: Sing (d :: a)) + = singFun1 @(FoosPrecSym2 (d :: Natural) (d :: a)) (sFoosPrec s s) + instance SFoo a => + SingI (FooListSym0 :: (~>) a ((~>) [Bool] [Bool])) where + sing = singFun2 @FooListSym0 sFooList + instance (SFoo a, SingI d) => + SingI (FooListSym1 (d :: a) :: (~>) [Bool] [Bool]) where + sing = singFun1 @(FooListSym1 (d :: a)) (sFooList (sing @d)) + instance SFoo a => + SingI1 (FooListSym1 :: a -> (~>) [Bool] [Bool]) where + liftSing (s :: Sing (d :: a)) + = singFun1 @(FooListSym1 (d :: a)) (sFooList s)
tests/compile-and-dump/Singletons/T167.hs view
@@ -1,16 +1,16 @@-module Singletons.T167 where--import Data.Singletons.Base.TH-import GHC.TypeLits--type DiffList = [Bool] -> [Bool]--$(singletonsOnly [d|- class Foo a where- foosPrec :: Natural -> a -> DiffList- fooList :: a -> DiffList- fooList = undefined-- instance Foo a => Foo [a] where- foosPrec _ = fooList- |])+module Singletons.T167 where + +import Data.Singletons.Base.TH +import GHC.TypeLits + +type DiffList = [Bool] -> [Bool] + +$(singletonsOnly [d| + class Foo a where + foosPrec :: Natural -> a -> DiffList + fooList :: a -> DiffList + fooList = undefined + + instance Foo a => Foo [a] where + foosPrec _ = fooList + |])
tests/compile-and-dump/Singletons/T172.golden view
@@ -1,46 +1,46 @@-Singletons/T172.hs:(0,0)-(0,0): Splicing declarations- singletonsOnly- [d| ($>) :: Natural -> Natural -> Natural- ($>) = (+) |]- ======>- type ($>@#@$) :: (~>) Natural ((~>) Natural Natural)- data ($>@#@$) :: (~>) Natural ((~>) Natural Natural)- where- (:$>@#@$###) :: SameKind (Apply ($>@#@$) arg) (($>@#@$$) arg) =>- ($>@#@$) a0123456789876543210- type instance Apply ($>@#@$) a0123456789876543210 = ($>@#@$$) a0123456789876543210- instance SuppressUnusedWarnings ($>@#@$) where- suppressUnusedWarnings = snd (((,) (:$>@#@$###)) ())- type ($>@#@$$) :: Natural -> (~>) Natural Natural- data ($>@#@$$) (a0123456789876543210 :: Natural) :: (~>) Natural Natural- where- (:$>@#@$$###) :: SameKind (Apply (($>@#@$$) a0123456789876543210) arg) (($>@#@$$$) a0123456789876543210 arg) =>- ($>@#@$$) a0123456789876543210 a0123456789876543210- type instance Apply (($>@#@$$) a0123456789876543210) a0123456789876543210 = ($>) a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (($>@#@$$) a0123456789876543210) where- suppressUnusedWarnings = snd (((,) (:$>@#@$$###)) ())- type ($>@#@$$$) :: Natural -> Natural -> Natural- type family ($>@#@$$$) (a0123456789876543210 :: Natural) (a0123456789876543210 :: Natural) :: Natural where- ($>@#@$$$) a0123456789876543210 a0123456789876543210 = ($>) a0123456789876543210 a0123456789876543210- type ($>) :: Natural -> Natural -> Natural- type family ($>) (a :: Natural) (a :: Natural) :: Natural where- ($>) a_0123456789876543210 a_0123456789876543210 = Apply (Apply (+@#@$) a_0123456789876543210) a_0123456789876543210- (%$>) ::- forall (t :: Natural) (t :: Natural). Sing t- -> Sing t- -> Sing (Apply (Apply ($>@#@$) t) t :: Natural)- (%$>)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing ((singFun2 @(+@#@$)) (%+))) sA_0123456789876543210))- sA_0123456789876543210- instance SingI (($>@#@$) :: (~>) Natural ((~>) Natural Natural)) where- sing = (singFun2 @($>@#@$)) (%$>)- instance SingI d =>- SingI (($>@#@$$) (d :: Natural) :: (~>) Natural Natural) where- sing = (singFun1 @(($>@#@$$) (d :: Natural))) ((%$>) (sing @d))- instance SingI1 (($>@#@$$) :: Natural- -> (~>) Natural Natural) where- liftSing (s :: Sing (d :: Natural))- = (singFun1 @(($>@#@$$) (d :: Natural))) ((%$>) s)+Singletons/T172.hs:(0,0)-(0,0): Splicing declarations + singletonsOnly + [d| ($>) :: Natural -> Natural -> Natural + ($>) = (+) |] + ======> + type ($>@#@$) :: (~>) Natural ((~>) Natural Natural) + data ($>@#@$) :: (~>) Natural ((~>) Natural Natural) + where + (:$>@#@$###) :: SameKind (Apply ($>@#@$) arg) (($>@#@$$) arg) => + ($>@#@$) a0123456789876543210 + type instance Apply ($>@#@$) a0123456789876543210 = ($>@#@$$) a0123456789876543210 + instance SuppressUnusedWarnings ($>@#@$) where + suppressUnusedWarnings = snd ((,) (:$>@#@$###) ()) + type ($>@#@$$) :: Natural -> (~>) Natural Natural + data ($>@#@$$) (a0123456789876543210 :: Natural) :: (~>) Natural Natural + where + (:$>@#@$$###) :: SameKind (Apply (($>@#@$$) a0123456789876543210) arg) (($>@#@$$$) a0123456789876543210 arg) => + ($>@#@$$) a0123456789876543210 a0123456789876543210 + type instance Apply (($>@#@$$) a0123456789876543210) a0123456789876543210 = ($>) a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (($>@#@$$) a0123456789876543210) where + suppressUnusedWarnings = snd ((,) (:$>@#@$$###) ()) + type ($>@#@$$$) :: Natural -> Natural -> Natural + type family ($>@#@$$$) (a0123456789876543210 :: Natural) (a0123456789876543210 :: Natural) :: Natural where + ($>@#@$$$) a0123456789876543210 a0123456789876543210 = ($>) a0123456789876543210 a0123456789876543210 + type ($>) :: Natural -> Natural -> Natural + type family ($>) (a :: Natural) (a :: Natural) :: Natural where + ($>) a_0123456789876543210 a_0123456789876543210 = Apply (Apply (+@#@$) a_0123456789876543210) a_0123456789876543210 + (%$>) :: + (forall (t :: Natural) (t :: Natural). + Sing t + -> Sing t -> Sing (Apply (Apply ($>@#@$) t) t :: Natural) :: Type) + (%$>) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing (singFun2 @(+@#@$) (%+)) sA_0123456789876543210) + sA_0123456789876543210 + instance SingI (($>@#@$) :: (~>) Natural ((~>) Natural Natural)) where + sing = singFun2 @($>@#@$) (%$>) + instance SingI d => + SingI (($>@#@$$) (d :: Natural) :: (~>) Natural Natural) where + sing = singFun1 @(($>@#@$$) (d :: Natural)) ((%$>) (sing @d)) + instance SingI1 (($>@#@$$) :: Natural + -> (~>) Natural Natural) where + liftSing (s :: Sing (d :: Natural)) + = singFun1 @(($>@#@$$) (d :: Natural)) ((%$>) s)
tests/compile-and-dump/Singletons/T172.hs view
@@ -1,10 +1,10 @@-module T172 where--import Data.Singletons.TH-import GHC.TypeLits.Singletons-import Prelude.Singletons--$(singletonsOnly [d|- ($>) :: Natural -> Natural -> Natural- ($>) = (+)- |])+module T172 where + +import Data.Singletons.TH +import GHC.TypeLits.Singletons +import Prelude.Singletons + +$(singletonsOnly [d| + ($>) :: Natural -> Natural -> Natural + ($>) = (+) + |])
tests/compile-and-dump/Singletons/T175.golden view
@@ -1,55 +1,55 @@-Singletons/T175.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| quux2 :: Bar2 a => a- quux2 = baz- - class Foo a where- baz :: a- class Foo a => Bar1 a where- quux1 :: a- quux1 = baz- class Foo a => Bar2 a |]- ======>- class Foo a where- baz :: a- class Foo a => Bar1 a where- quux1 :: a- quux1 = baz- class Foo a => Bar2 a- quux2 :: Bar2 a => a- quux2 = baz- type Quux2Sym0 :: a- type family Quux2Sym0 :: a where- Quux2Sym0 = Quux2- type Quux2 :: a- type family Quux2 :: a where- Quux2 = BazSym0- type BazSym0 :: forall a. a- type family BazSym0 :: a where- BazSym0 = Baz- class PFoo a where- type family Baz :: a- type Quux1Sym0 :: forall a. a- type family Quux1Sym0 :: a where- Quux1Sym0 = Quux1- type Quux1_0123456789876543210 :: a- type family Quux1_0123456789876543210 :: a where- Quux1_0123456789876543210 = BazSym0- type Quux1_0123456789876543210Sym0 :: a- type family Quux1_0123456789876543210Sym0 :: a where- Quux1_0123456789876543210Sym0 = Quux1_0123456789876543210- class PBar1 a where- type family Quux1 :: a- type Quux1 = Quux1_0123456789876543210Sym0- class PBar2 a- sQuux2 :: forall a. SBar2 a => Sing (Quux2Sym0 :: a)- sQuux2 = sBaz- class SFoo a where- sBaz :: Sing (BazSym0 :: a)- class SFoo a => SBar1 a where- sQuux1 :: Sing (Quux1Sym0 :: a)- default sQuux1 ::- ((Quux1Sym0 :: a) ~ Quux1_0123456789876543210Sym0) =>- Sing (Quux1Sym0 :: a)- sQuux1 = sBaz- class SFoo a => SBar2 a+Singletons/T175.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| quux2 :: Bar2 a => a + quux2 = baz + + class Foo a where + baz :: a + class Foo a => Bar1 a where + quux1 :: a + quux1 = baz + class Foo a => Bar2 a |] + ======> + class Foo a where + baz :: a + class Foo a => Bar1 a where + quux1 :: a + quux1 = baz + class Foo a => Bar2 a + quux2 :: Bar2 a => a + quux2 = baz + type Quux2Sym0 :: a + type family Quux2Sym0 :: a where + Quux2Sym0 = Quux2 + type Quux2 :: a + type family Quux2 :: a where + Quux2 = BazSym0 + type BazSym0 :: forall a. a + type family BazSym0 :: a where + BazSym0 = Baz + class PFoo a where + type family Baz :: a + type Quux1Sym0 :: forall a. a + type family Quux1Sym0 :: a where + Quux1Sym0 = Quux1 + type Quux1_0123456789876543210 :: a + type family Quux1_0123456789876543210 :: a where + Quux1_0123456789876543210 = BazSym0 + type Quux1_0123456789876543210Sym0 :: a + type family Quux1_0123456789876543210Sym0 :: a where + Quux1_0123456789876543210Sym0 = Quux1_0123456789876543210 + class PBar1 a where + type family Quux1 :: a + type Quux1 = Quux1_0123456789876543210Sym0 + class PBar2 a + sQuux2 :: (SBar2 a => Sing (Quux2Sym0 :: a) :: Type) + sQuux2 = sBaz + class SFoo a where + sBaz :: (Sing (BazSym0 :: a) :: Type) + class SFoo a => SBar1 a where + sQuux1 :: (Sing (Quux1Sym0 :: a) :: Type) + default sQuux1 :: + (((Quux1Sym0 :: a) ~ Quux1_0123456789876543210Sym0) => + Sing (Quux1Sym0 :: a) :: Type) + sQuux1 = sBaz + class SFoo a => SBar2 a
tests/compile-and-dump/Singletons/T175.hs view
@@ -1,18 +1,18 @@-module T175 where--import Data.Singletons.TH-import Prelude.Singletons--$(singletons [d|- class Foo a where- baz :: a-- class Foo a => Bar1 a where- quux1 :: a- quux1 = baz-- class Foo a => Bar2 a where-- quux2 :: Bar2 a => a- quux2 = baz- |])+module T175 where + +import Data.Singletons.TH +import Prelude.Singletons + +$(singletons [d| + class Foo a where + baz :: a + + class Foo a => Bar1 a where + quux1 :: a + quux1 = baz + + class Foo a => Bar2 a where + + quux2 :: Bar2 a => a + quux2 = baz + |])
tests/compile-and-dump/Singletons/T176.golden view
@@ -1,173 +1,175 @@-Singletons/T176.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| quux1 :: Foo1 a => a -> a- quux1 x = x `bar1` \ _ -> baz1- quux2 :: Foo2 a => a -> a- quux2 x = x `bar2` baz2- - class Foo1 a where- bar1 :: a -> (a -> b) -> b- baz1 :: a- class Foo2 a where- bar2 :: a -> b -> b- baz2 :: a |]- ======>- class Foo1 a where- bar1 :: a -> (a -> b) -> b- baz1 :: a- quux1 :: Foo1 a => a -> a- quux1 x = (x `bar1` (\ _ -> baz1))- class Foo2 a where- bar2 :: a -> b -> b- baz2 :: a- quux2 :: Foo2 a => a -> a- quux2 x = (x `bar2` baz2)- type family Case_0123456789876543210 arg_0123456789876543210 x t where- Case_0123456789876543210 arg_0123456789876543210 x _ = Baz1Sym0- type family Lambda_0123456789876543210 x arg_0123456789876543210 where- Lambda_0123456789876543210 x arg_0123456789876543210 = Case_0123456789876543210 arg_0123456789876543210 x arg_0123456789876543210- data Lambda_0123456789876543210Sym0 x0123456789876543210- where- Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) =>- Lambda_0123456789876543210Sym0 x0123456789876543210- type instance Apply Lambda_0123456789876543210Sym0 x0123456789876543210 = Lambda_0123456789876543210Sym1 x0123456789876543210- instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym0KindInference) ())- data Lambda_0123456789876543210Sym1 x0123456789876543210 arg_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) arg) (Lambda_0123456789876543210Sym2 x0123456789876543210 arg) =>- Lambda_0123456789876543210Sym1 x0123456789876543210 arg_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 arg_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 x0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym1KindInference) ())- type family Lambda_0123456789876543210Sym2 x0123456789876543210 arg_01234567898765432100123456789876543210 where- Lambda_0123456789876543210Sym2 x0123456789876543210 arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 arg_01234567898765432100123456789876543210- type Quux2Sym0 :: (~>) a a- data Quux2Sym0 :: (~>) a a- where- Quux2Sym0KindInference :: SameKind (Apply Quux2Sym0 arg) (Quux2Sym1 arg) =>- Quux2Sym0 a0123456789876543210- type instance Apply Quux2Sym0 a0123456789876543210 = Quux2 a0123456789876543210- instance SuppressUnusedWarnings Quux2Sym0 where- suppressUnusedWarnings = snd (((,) Quux2Sym0KindInference) ())- type Quux2Sym1 :: a -> a- type family Quux2Sym1 (a0123456789876543210 :: a) :: a where- Quux2Sym1 a0123456789876543210 = Quux2 a0123456789876543210- type Quux1Sym0 :: (~>) a a- data Quux1Sym0 :: (~>) a a- where- Quux1Sym0KindInference :: SameKind (Apply Quux1Sym0 arg) (Quux1Sym1 arg) =>- Quux1Sym0 a0123456789876543210- type instance Apply Quux1Sym0 a0123456789876543210 = Quux1 a0123456789876543210- instance SuppressUnusedWarnings Quux1Sym0 where- suppressUnusedWarnings = snd (((,) Quux1Sym0KindInference) ())- type Quux1Sym1 :: a -> a- type family Quux1Sym1 (a0123456789876543210 :: a) :: a where- Quux1Sym1 a0123456789876543210 = Quux1 a0123456789876543210- type Quux2 :: a -> a- type family Quux2 (a :: a) :: a where- Quux2 x = Apply (Apply Bar2Sym0 x) Baz2Sym0- type Quux1 :: a -> a- type family Quux1 (a :: a) :: a where- Quux1 x = Apply (Apply Bar1Sym0 x) (Apply Lambda_0123456789876543210Sym0 x)- type Bar1Sym0 :: forall a b. (~>) a ((~>) ((~>) a b) b)- data Bar1Sym0 :: (~>) a ((~>) ((~>) a b) b)- where- Bar1Sym0KindInference :: SameKind (Apply Bar1Sym0 arg) (Bar1Sym1 arg) =>- Bar1Sym0 a0123456789876543210- type instance Apply Bar1Sym0 a0123456789876543210 = Bar1Sym1 a0123456789876543210- instance SuppressUnusedWarnings Bar1Sym0 where- suppressUnusedWarnings = snd (((,) Bar1Sym0KindInference) ())- type Bar1Sym1 :: forall a b. a -> (~>) ((~>) a b) b- data Bar1Sym1 (a0123456789876543210 :: a) :: (~>) ((~>) a b) b- where- Bar1Sym1KindInference :: SameKind (Apply (Bar1Sym1 a0123456789876543210) arg) (Bar1Sym2 a0123456789876543210 arg) =>- Bar1Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (Bar1Sym1 a0123456789876543210) a0123456789876543210 = Bar1 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Bar1Sym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) Bar1Sym1KindInference) ())- type Bar1Sym2 :: forall a b. a -> (~>) a b -> b- type family Bar1Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: (~>) a b) :: b where- Bar1Sym2 a0123456789876543210 a0123456789876543210 = Bar1 a0123456789876543210 a0123456789876543210- type Baz1Sym0 :: forall a. a- type family Baz1Sym0 :: a where- Baz1Sym0 = Baz1- class PFoo1 a where- type family Bar1 (arg :: a) (arg :: (~>) a b) :: b- type family Baz1 :: a- type Bar2Sym0 :: forall a b. (~>) a ((~>) b b)- data Bar2Sym0 :: (~>) a ((~>) b b)- where- Bar2Sym0KindInference :: SameKind (Apply Bar2Sym0 arg) (Bar2Sym1 arg) =>- Bar2Sym0 a0123456789876543210- type instance Apply Bar2Sym0 a0123456789876543210 = Bar2Sym1 a0123456789876543210- instance SuppressUnusedWarnings Bar2Sym0 where- suppressUnusedWarnings = snd (((,) Bar2Sym0KindInference) ())- type Bar2Sym1 :: forall a b. a -> (~>) b b- data Bar2Sym1 (a0123456789876543210 :: a) :: (~>) b b- where- Bar2Sym1KindInference :: SameKind (Apply (Bar2Sym1 a0123456789876543210) arg) (Bar2Sym2 a0123456789876543210 arg) =>- Bar2Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (Bar2Sym1 a0123456789876543210) a0123456789876543210 = Bar2 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Bar2Sym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) Bar2Sym1KindInference) ())- type Bar2Sym2 :: forall a b. a -> b -> b- type family Bar2Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: b where- Bar2Sym2 a0123456789876543210 a0123456789876543210 = Bar2 a0123456789876543210 a0123456789876543210- type Baz2Sym0 :: forall a. a- type family Baz2Sym0 :: a where- Baz2Sym0 = Baz2- class PFoo2 a where- type family Bar2 (arg :: a) (arg :: b) :: b- type family Baz2 :: a- sQuux2 ::- forall a (t :: a). SFoo2 a =>- Sing t -> Sing (Apply Quux2Sym0 t :: a)- sQuux1 ::- forall a (t :: a). SFoo1 a =>- Sing t -> Sing (Apply Quux1Sym0 t :: a)- sQuux2 (sX :: Sing x)- = (applySing ((applySing ((singFun2 @Bar2Sym0) sBar2)) sX)) sBaz2- sQuux1 (sX :: Sing x)- = (applySing ((applySing ((singFun2 @Bar1Sym0) sBar1)) sX))- ((singFun1 @(Apply Lambda_0123456789876543210Sym0 x))- (\ sArg_0123456789876543210- -> case sArg_0123456789876543210 of- (_ :: Sing arg_0123456789876543210)- -> (id- @(Sing (Case_0123456789876543210 arg_0123456789876543210 x arg_0123456789876543210)))- (case sArg_0123456789876543210 of _ -> sBaz1)))- instance SFoo2 a => SingI (Quux2Sym0 :: (~>) a a) where- sing = (singFun1 @Quux2Sym0) sQuux2- instance SFoo1 a => SingI (Quux1Sym0 :: (~>) a a) where- sing = (singFun1 @Quux1Sym0) sQuux1- class SFoo1 a where- sBar1 ::- forall b (t :: a) (t :: (~>) a b). Sing t- -> Sing t -> Sing (Apply (Apply Bar1Sym0 t) t :: b)- sBaz1 :: Sing (Baz1Sym0 :: a)- class SFoo2 a where- sBar2 ::- forall b (t :: a) (t :: b). Sing t- -> Sing t -> Sing (Apply (Apply Bar2Sym0 t) t :: b)- sBaz2 :: Sing (Baz2Sym0 :: a)- instance SFoo1 a =>- SingI (Bar1Sym0 :: (~>) a ((~>) ((~>) a b) b)) where- sing = (singFun2 @Bar1Sym0) sBar1- instance (SFoo1 a, SingI d) =>- SingI (Bar1Sym1 (d :: a) :: (~>) ((~>) a b) b) where- sing = (singFun1 @(Bar1Sym1 (d :: a))) (sBar1 (sing @d))- instance SFoo1 a =>- SingI1 (Bar1Sym1 :: a -> (~>) ((~>) a b) b) where- liftSing (s :: Sing (d :: a))- = (singFun1 @(Bar1Sym1 (d :: a))) (sBar1 s)- instance SFoo2 a => SingI (Bar2Sym0 :: (~>) a ((~>) b b)) where- sing = (singFun2 @Bar2Sym0) sBar2- instance (SFoo2 a, SingI d) =>- SingI (Bar2Sym1 (d :: a) :: (~>) b b) where- sing = (singFun1 @(Bar2Sym1 (d :: a))) (sBar2 (sing @d))- instance SFoo2 a => SingI1 (Bar2Sym1 :: a -> (~>) b b) where- liftSing (s :: Sing (d :: a))- = (singFun1 @(Bar2Sym1 (d :: a))) (sBar2 s)+Singletons/T176.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| quux1 :: Foo1 a => a -> a + quux1 x = x `bar1` \ _ -> baz1 + quux2 :: Foo2 a => a -> a + quux2 x = x `bar2` baz2 + + class Foo1 a where + bar1 :: a -> (a -> b) -> b + baz1 :: a + class Foo2 a where + bar2 :: a -> b -> b + baz2 :: a |] + ======> + class Foo1 a where + bar1 :: a -> (a -> b) -> b + baz1 :: a + quux1 :: Foo1 a => a -> a + quux1 x = (x `bar1` (\ _ -> baz1)) + class Foo2 a where + bar2 :: a -> b -> b + baz2 :: a + quux2 :: Foo2 a => a -> a + quux2 x = (x `bar2` baz2) + type family Case_0123456789876543210 arg_0123456789876543210 x t where + Case_0123456789876543210 arg_0123456789876543210 x _ = Baz1Sym0 + type family Lambda_0123456789876543210 x arg_0123456789876543210 where + Lambda_0123456789876543210 x arg_0123456789876543210 = Case_0123456789876543210 arg_0123456789876543210 x arg_0123456789876543210 + data Lambda_0123456789876543210Sym0 x0123456789876543210 + where + Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) => + Lambda_0123456789876543210Sym0 x0123456789876543210 + type instance Apply Lambda_0123456789876543210Sym0 x0123456789876543210 = Lambda_0123456789876543210Sym1 x0123456789876543210 + instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym0KindInference ()) + data Lambda_0123456789876543210Sym1 x0123456789876543210 arg_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) arg) (Lambda_0123456789876543210Sym2 x0123456789876543210 arg) => + Lambda_0123456789876543210Sym1 x0123456789876543210 arg_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 arg_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 x0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym1KindInference ()) + type family Lambda_0123456789876543210Sym2 x0123456789876543210 arg_01234567898765432100123456789876543210 where + Lambda_0123456789876543210Sym2 x0123456789876543210 arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 arg_01234567898765432100123456789876543210 + type Quux2Sym0 :: (~>) a a + data Quux2Sym0 :: (~>) a a + where + Quux2Sym0KindInference :: SameKind (Apply Quux2Sym0 arg) (Quux2Sym1 arg) => + Quux2Sym0 a0123456789876543210 + type instance Apply Quux2Sym0 a0123456789876543210 = Quux2 a0123456789876543210 + instance SuppressUnusedWarnings Quux2Sym0 where + suppressUnusedWarnings = snd ((,) Quux2Sym0KindInference ()) + type Quux2Sym1 :: a -> a + type family Quux2Sym1 (a0123456789876543210 :: a) :: a where + Quux2Sym1 a0123456789876543210 = Quux2 a0123456789876543210 + type Quux1Sym0 :: (~>) a a + data Quux1Sym0 :: (~>) a a + where + Quux1Sym0KindInference :: SameKind (Apply Quux1Sym0 arg) (Quux1Sym1 arg) => + Quux1Sym0 a0123456789876543210 + type instance Apply Quux1Sym0 a0123456789876543210 = Quux1 a0123456789876543210 + instance SuppressUnusedWarnings Quux1Sym0 where + suppressUnusedWarnings = snd ((,) Quux1Sym0KindInference ()) + type Quux1Sym1 :: a -> a + type family Quux1Sym1 (a0123456789876543210 :: a) :: a where + Quux1Sym1 a0123456789876543210 = Quux1 a0123456789876543210 + type Quux2 :: a -> a + type family Quux2 (a :: a) :: a where + Quux2 x = Apply (Apply Bar2Sym0 x) Baz2Sym0 + type Quux1 :: a -> a + type family Quux1 (a :: a) :: a where + Quux1 x = Apply (Apply Bar1Sym0 x) (Apply Lambda_0123456789876543210Sym0 x) + type Bar1Sym0 :: forall a b. (~>) a ((~>) ((~>) a b) b) + data Bar1Sym0 :: (~>) a ((~>) ((~>) a b) b) + where + Bar1Sym0KindInference :: SameKind (Apply Bar1Sym0 arg) (Bar1Sym1 arg) => + Bar1Sym0 a0123456789876543210 + type instance Apply Bar1Sym0 a0123456789876543210 = Bar1Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Bar1Sym0 where + suppressUnusedWarnings = snd ((,) Bar1Sym0KindInference ()) + type Bar1Sym1 :: forall a b. a -> (~>) ((~>) a b) b + data Bar1Sym1 (a0123456789876543210 :: a) :: (~>) ((~>) a b) b + where + Bar1Sym1KindInference :: SameKind (Apply (Bar1Sym1 a0123456789876543210) arg) (Bar1Sym2 a0123456789876543210 arg) => + Bar1Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (Bar1Sym1 a0123456789876543210) a0123456789876543210 = Bar1 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Bar1Sym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) Bar1Sym1KindInference ()) + type Bar1Sym2 :: forall a b. a -> (~>) a b -> b + type family Bar1Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: (~>) a b) :: b where + Bar1Sym2 a0123456789876543210 a0123456789876543210 = Bar1 a0123456789876543210 a0123456789876543210 + type Baz1Sym0 :: forall a. a + type family Baz1Sym0 :: a where + Baz1Sym0 = Baz1 + class PFoo1 a where + type family Bar1 (arg :: a) (arg :: (~>) a b) :: b + type family Baz1 :: a + type Bar2Sym0 :: forall a b. (~>) a ((~>) b b) + data Bar2Sym0 :: (~>) a ((~>) b b) + where + Bar2Sym0KindInference :: SameKind (Apply Bar2Sym0 arg) (Bar2Sym1 arg) => + Bar2Sym0 a0123456789876543210 + type instance Apply Bar2Sym0 a0123456789876543210 = Bar2Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Bar2Sym0 where + suppressUnusedWarnings = snd ((,) Bar2Sym0KindInference ()) + type Bar2Sym1 :: forall a b. a -> (~>) b b + data Bar2Sym1 (a0123456789876543210 :: a) :: (~>) b b + where + Bar2Sym1KindInference :: SameKind (Apply (Bar2Sym1 a0123456789876543210) arg) (Bar2Sym2 a0123456789876543210 arg) => + Bar2Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (Bar2Sym1 a0123456789876543210) a0123456789876543210 = Bar2 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Bar2Sym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) Bar2Sym1KindInference ()) + type Bar2Sym2 :: forall a b. a -> b -> b + type family Bar2Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: b where + Bar2Sym2 a0123456789876543210 a0123456789876543210 = Bar2 a0123456789876543210 a0123456789876543210 + type Baz2Sym0 :: forall a. a + type family Baz2Sym0 :: a where + Baz2Sym0 = Baz2 + class PFoo2 a where + type family Bar2 (arg :: a) (arg :: b) :: b + type family Baz2 :: a + sQuux2 :: + (forall (t :: a). + SFoo2 a => Sing t -> Sing (Apply Quux2Sym0 t :: a) :: Type) + sQuux1 :: + (forall (t :: a). + SFoo1 a => Sing t -> Sing (Apply Quux1Sym0 t :: a) :: Type) + sQuux2 (sX :: Sing x) + = applySing (applySing (singFun2 @Bar2Sym0 sBar2) sX) sBaz2 + sQuux1 (sX :: Sing x) + = applySing + (applySing (singFun2 @Bar1Sym0 sBar1) sX) + (singFun1 + @(Apply Lambda_0123456789876543210Sym0 x) + (\ sArg_0123456789876543210 + -> case sArg_0123456789876543210 of + (_ :: Sing arg_0123456789876543210) + -> id + @(Sing (Case_0123456789876543210 arg_0123456789876543210 x arg_0123456789876543210)) + (case sArg_0123456789876543210 of _ -> sBaz1))) + instance SFoo2 a => SingI (Quux2Sym0 :: (~>) a a) where + sing = singFun1 @Quux2Sym0 sQuux2 + instance SFoo1 a => SingI (Quux1Sym0 :: (~>) a a) where + sing = singFun1 @Quux1Sym0 sQuux1 + class SFoo1 a where + sBar1 :: + (forall (t :: a) (t :: (~>) a b). + Sing t -> Sing t -> Sing (Apply (Apply Bar1Sym0 t) t :: b) :: Type) + sBaz1 :: (Sing (Baz1Sym0 :: a) :: Type) + class SFoo2 a where + sBar2 :: + (forall (t :: a) (t :: b). + Sing t -> Sing t -> Sing (Apply (Apply Bar2Sym0 t) t :: b) :: Type) + sBaz2 :: (Sing (Baz2Sym0 :: a) :: Type) + instance SFoo1 a => + SingI (Bar1Sym0 :: (~>) a ((~>) ((~>) a b) b)) where + sing = singFun2 @Bar1Sym0 sBar1 + instance (SFoo1 a, SingI d) => + SingI (Bar1Sym1 (d :: a) :: (~>) ((~>) a b) b) where + sing = singFun1 @(Bar1Sym1 (d :: a)) (sBar1 (sing @d)) + instance SFoo1 a => + SingI1 (Bar1Sym1 :: a -> (~>) ((~>) a b) b) where + liftSing (s :: Sing (d :: a)) + = singFun1 @(Bar1Sym1 (d :: a)) (sBar1 s) + instance SFoo2 a => SingI (Bar2Sym0 :: (~>) a ((~>) b b)) where + sing = singFun2 @Bar2Sym0 sBar2 + instance (SFoo2 a, SingI d) => + SingI (Bar2Sym1 (d :: a) :: (~>) b b) where + sing = singFun1 @(Bar2Sym1 (d :: a)) (sBar2 (sing @d)) + instance SFoo2 a => SingI1 (Bar2Sym1 :: a -> (~>) b b) where + liftSing (s :: Sing (d :: a)) + = singFun1 @(Bar2Sym1 (d :: a)) (sBar2 s)
tests/compile-and-dump/Singletons/T176.hs view
@@ -1,21 +1,21 @@-module T176 where--import Data.Kind (Type)-import Data.Singletons.TH-import Prelude.Singletons--$(singletons [d|- class Foo1 a where- bar1 :: a -> (a -> b) -> b- baz1 :: a-- quux1 :: Foo1 a => a -> a- quux1 x = x `bar1` \_ -> baz1-- class Foo2 a where- bar2 :: a -> b -> b- baz2 :: a-- quux2 :: Foo2 a => a -> a- quux2 x = x `bar2` baz2- |])+module T176 where + +import Data.Kind (Type) +import Data.Singletons.TH +import Prelude.Singletons + +$(singletons [d| + class Foo1 a where + bar1 :: a -> (a -> b) -> b + baz1 :: a + + quux1 :: Foo1 a => a -> a + quux1 x = x `bar1` \_ -> baz1 + + class Foo2 a where + bar2 :: a -> b -> b + baz2 :: a + + quux2 :: Foo2 a => a -> a + quux2 x = x `bar2` baz2 + |])
tests/compile-and-dump/Singletons/T178.golden view
@@ -1,262 +1,259 @@-Singletons/T178.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| empty :: U- empty = []- - data Occ- = Str | Opt | Many- deriving (Eq, Ord, Show)- type U = [(Symbol, Occ)] |]- ======>- data Occ- = Str | Opt | Many- deriving (Eq, Ord, Show)- type U = [(Symbol, Occ)]- empty :: U- empty = []- type family USym0 where- USym0 = U- type StrSym0 :: Occ- type family StrSym0 :: Occ where- StrSym0 = Str- type OptSym0 :: Occ- type family OptSym0 :: Occ where- OptSym0 = Opt- type ManySym0 :: Occ- type family ManySym0 :: Occ where- ManySym0 = Many- type EmptySym0 :: [(Symbol, Occ)]- type family EmptySym0 :: [(Symbol, Occ)] where- EmptySym0 = Empty- type Empty :: [(Symbol, Occ)]- type family Empty :: [(Symbol, Occ)] where- Empty = NilSym0- type TFHelper_0123456789876543210 :: Occ -> Occ -> Bool- type family TFHelper_0123456789876543210 (a :: Occ) (a :: Occ) :: Bool where- TFHelper_0123456789876543210 Str Str = TrueSym0- TFHelper_0123456789876543210 Str Opt = FalseSym0- TFHelper_0123456789876543210 Str Many = FalseSym0- TFHelper_0123456789876543210 Opt Str = FalseSym0- TFHelper_0123456789876543210 Opt Opt = TrueSym0- TFHelper_0123456789876543210 Opt Many = FalseSym0- TFHelper_0123456789876543210 Many Str = FalseSym0- TFHelper_0123456789876543210 Many Opt = FalseSym0- TFHelper_0123456789876543210 Many Many = TrueSym0- type TFHelper_0123456789876543210Sym0 :: (~>) Occ ((~>) Occ Bool)- data TFHelper_0123456789876543210Sym0 :: (~>) Occ ((~>) Occ Bool)- where- TFHelper_0123456789876543210Sym0KindInference :: SameKind (Apply TFHelper_0123456789876543210Sym0 arg) (TFHelper_0123456789876543210Sym1 arg) =>- TFHelper_0123456789876543210Sym0 a0123456789876543210- type instance Apply TFHelper_0123456789876543210Sym0 a0123456789876543210 = TFHelper_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings TFHelper_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) TFHelper_0123456789876543210Sym0KindInference) ())- type TFHelper_0123456789876543210Sym1 :: Occ -> (~>) Occ Bool- data TFHelper_0123456789876543210Sym1 (a0123456789876543210 :: Occ) :: (~>) Occ Bool- where- TFHelper_0123456789876543210Sym1KindInference :: SameKind (Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) arg) (TFHelper_0123456789876543210Sym2 a0123456789876543210 arg) =>- TFHelper_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (TFHelper_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) TFHelper_0123456789876543210Sym1KindInference) ())- type TFHelper_0123456789876543210Sym2 :: Occ -> Occ -> Bool- type family TFHelper_0123456789876543210Sym2 (a0123456789876543210 :: Occ) (a0123456789876543210 :: Occ) :: Bool where- TFHelper_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210- instance PEq Occ where- type (==) a a = Apply (Apply TFHelper_0123456789876543210Sym0 a) a- type Compare_0123456789876543210 :: Occ -> Occ -> Ordering- type family Compare_0123456789876543210 (a :: Occ) (a :: Occ) :: Ordering where- Compare_0123456789876543210 Str Str = Apply (Apply (Apply FoldlSym0 ThenCmpSym0) EQSym0) NilSym0- Compare_0123456789876543210 Opt Opt = Apply (Apply (Apply FoldlSym0 ThenCmpSym0) EQSym0) NilSym0- Compare_0123456789876543210 Many Many = Apply (Apply (Apply FoldlSym0 ThenCmpSym0) EQSym0) NilSym0- Compare_0123456789876543210 Str Opt = LTSym0- Compare_0123456789876543210 Str Many = LTSym0- Compare_0123456789876543210 Opt Str = GTSym0- Compare_0123456789876543210 Opt Many = LTSym0- Compare_0123456789876543210 Many Str = GTSym0- Compare_0123456789876543210 Many Opt = GTSym0- type Compare_0123456789876543210Sym0 :: (~>) Occ ((~>) Occ Ordering)- data Compare_0123456789876543210Sym0 :: (~>) Occ ((~>) Occ Ordering)- where- Compare_0123456789876543210Sym0KindInference :: SameKind (Apply Compare_0123456789876543210Sym0 arg) (Compare_0123456789876543210Sym1 arg) =>- Compare_0123456789876543210Sym0 a0123456789876543210- type instance Apply Compare_0123456789876543210Sym0 a0123456789876543210 = Compare_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings Compare_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Compare_0123456789876543210Sym0KindInference) ())- type Compare_0123456789876543210Sym1 :: Occ -> (~>) Occ Ordering- data Compare_0123456789876543210Sym1 (a0123456789876543210 :: Occ) :: (~>) Occ Ordering- where- Compare_0123456789876543210Sym1KindInference :: SameKind (Apply (Compare_0123456789876543210Sym1 a0123456789876543210) arg) (Compare_0123456789876543210Sym2 a0123456789876543210 arg) =>- Compare_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (Compare_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Compare_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Compare_0123456789876543210Sym1KindInference) ())- type Compare_0123456789876543210Sym2 :: Occ -> Occ -> Ordering- type family Compare_0123456789876543210Sym2 (a0123456789876543210 :: Occ) (a0123456789876543210 :: Occ) :: Ordering where- Compare_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210- instance POrd Occ where- type Compare a a = Apply (Apply Compare_0123456789876543210Sym0 a) a- type ShowsPrec_0123456789876543210 :: Natural- -> Occ -> Symbol -> Symbol- type family ShowsPrec_0123456789876543210 (a :: Natural) (a :: Occ) (a :: Symbol) :: Symbol where- ShowsPrec_0123456789876543210 _ Str a_0123456789876543210 = Apply (Apply ShowStringSym0 "Str") a_0123456789876543210- ShowsPrec_0123456789876543210 _ Opt a_0123456789876543210 = Apply (Apply ShowStringSym0 "Opt") a_0123456789876543210- ShowsPrec_0123456789876543210 _ Many a_0123456789876543210 = Apply (Apply ShowStringSym0 "Many") a_0123456789876543210- type ShowsPrec_0123456789876543210Sym0 :: (~>) Natural ((~>) Occ ((~>) Symbol Symbol))- data ShowsPrec_0123456789876543210Sym0 :: (~>) Natural ((~>) Occ ((~>) Symbol Symbol))- where- ShowsPrec_0123456789876543210Sym0KindInference :: SameKind (Apply ShowsPrec_0123456789876543210Sym0 arg) (ShowsPrec_0123456789876543210Sym1 arg) =>- ShowsPrec_0123456789876543210Sym0 a0123456789876543210- type instance Apply ShowsPrec_0123456789876543210Sym0 a0123456789876543210 = ShowsPrec_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings ShowsPrec_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym0KindInference) ())- type ShowsPrec_0123456789876543210Sym1 :: Natural- -> (~>) Occ ((~>) Symbol Symbol)- data ShowsPrec_0123456789876543210Sym1 (a0123456789876543210 :: Natural) :: (~>) Occ ((~>) Symbol Symbol)- where- ShowsPrec_0123456789876543210Sym1KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 arg) =>- ShowsPrec_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym1KindInference) ())- type ShowsPrec_0123456789876543210Sym2 :: Natural- -> Occ -> (~>) Symbol Symbol- data ShowsPrec_0123456789876543210Sym2 (a0123456789876543210 :: Natural) (a0123456789876543210 :: Occ) :: (~>) Symbol Symbol- where- ShowsPrec_0123456789876543210Sym2KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 arg) =>- ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym2KindInference) ())- type ShowsPrec_0123456789876543210Sym3 :: Natural- -> Occ -> Symbol -> Symbol- type family ShowsPrec_0123456789876543210Sym3 (a0123456789876543210 :: Natural) (a0123456789876543210 :: Occ) (a0123456789876543210 :: Symbol) :: Symbol where- ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance PShow Occ where- type ShowsPrec a a a = Apply (Apply (Apply ShowsPrec_0123456789876543210Sym0 a) a) a- sEmpty :: Sing (EmptySym0 :: [(Symbol, Occ)])- sEmpty = SNil- data SOcc :: Occ -> Type- where- SStr :: SOcc (Str :: Occ)- SOpt :: SOcc (Opt :: Occ)- SMany :: SOcc (Many :: Occ)- type instance Sing @Occ = SOcc- instance SingKind Occ where- type Demote Occ = Occ- fromSing SStr = Str- fromSing SOpt = Opt- fromSing SMany = Many- toSing Str = SomeSing SStr- toSing Opt = SomeSing SOpt- toSing Many = SomeSing SMany- instance SEq Occ where- (%==) ::- forall (t1 :: Occ) (t2 :: Occ). Sing t1- -> Sing t2- -> Sing (Apply (Apply ((==@#@$) :: TyFun Occ ((~>) Occ Bool)- -> Type) t1) t2)- (%==) SStr SStr = STrue- (%==) SStr SOpt = SFalse- (%==) SStr SMany = SFalse- (%==) SOpt SStr = SFalse- (%==) SOpt SOpt = STrue- (%==) SOpt SMany = SFalse- (%==) SMany SStr = SFalse- (%==) SMany SOpt = SFalse- (%==) SMany SMany = STrue- instance SOrd Occ where- sCompare ::- forall (t1 :: Occ) (t2 :: Occ). Sing t1- -> Sing t2- -> Sing (Apply (Apply (CompareSym0 :: TyFun Occ ((~>) Occ Ordering)- -> Type) t1) t2)- sCompare SStr SStr- = (applySing- ((applySing- ((applySing ((singFun3 @FoldlSym0) sFoldl))- ((singFun2 @ThenCmpSym0) sThenCmp)))- SEQ))- SNil- sCompare SOpt SOpt- = (applySing- ((applySing- ((applySing ((singFun3 @FoldlSym0) sFoldl))- ((singFun2 @ThenCmpSym0) sThenCmp)))- SEQ))- SNil- sCompare SMany SMany- = (applySing- ((applySing- ((applySing ((singFun3 @FoldlSym0) sFoldl))- ((singFun2 @ThenCmpSym0) sThenCmp)))- SEQ))- SNil- sCompare SStr SOpt = SLT- sCompare SStr SMany = SLT- sCompare SOpt SStr = SGT- sCompare SOpt SMany = SLT- sCompare SMany SStr = SGT- sCompare SMany SOpt = SGT- instance SShow Occ where- sShowsPrec ::- forall (t1 :: Natural) (t2 :: Occ) (t3 :: Symbol). Sing t1- -> Sing t2- -> Sing t3- -> Sing (Apply (Apply (Apply (ShowsPrecSym0 :: TyFun Natural ((~>) Occ ((~>) Symbol Symbol))- -> Type) t1) t2) t3)- sShowsPrec- _- SStr- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "Str")))- sA_0123456789876543210- sShowsPrec- _- SOpt- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "Opt")))- sA_0123456789876543210- sShowsPrec- _- SMany- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "Many")))- sA_0123456789876543210- instance SDecide Occ where- (%~) SStr SStr = Proved Refl- (%~) SStr SOpt = Disproved (\ x -> case x of {})- (%~) SStr SMany = Disproved (\ x -> case x of {})- (%~) SOpt SStr = Disproved (\ x -> case x of {})- (%~) SOpt SOpt = Proved Refl- (%~) SOpt SMany = Disproved (\ x -> case x of {})- (%~) SMany SStr = Disproved (\ x -> case x of {})- (%~) SMany SOpt = Disproved (\ x -> case x of {})- (%~) SMany SMany = Proved Refl- instance Data.Type.Equality.TestEquality (SOcc :: Occ- -> Type) where- Data.Type.Equality.testEquality- = Data.Singletons.Decide.decideEquality- instance Data.Type.Coercion.TestCoercion (SOcc :: Occ- -> Type) where- Data.Type.Coercion.testCoercion- = Data.Singletons.Decide.decideCoercion- deriving instance Show (SOcc (z :: Occ))- instance SingI Str where- sing = SStr- instance SingI Opt where- sing = SOpt- instance SingI Many where- sing = SMany+Singletons/T178.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| empty :: U + empty = [] + + data Occ + = Str | Opt | Many + deriving (Eq, Ord, Show) + type U = [(Symbol, Occ)] |] + ======> + data Occ + = Str | Opt | Many + deriving (Eq, Ord, Show) + type U = [(Symbol, Occ)] + empty :: U + empty = [] + type family USym0 where + USym0 = U + type StrSym0 :: Occ + type family StrSym0 :: Occ where + StrSym0 = Str + type OptSym0 :: Occ + type family OptSym0 :: Occ where + OptSym0 = Opt + type ManySym0 :: Occ + type family ManySym0 :: Occ where + ManySym0 = Many + type EmptySym0 :: [(Symbol, Occ)] + type family EmptySym0 :: [(Symbol, Occ)] where + EmptySym0 = Empty + type Empty :: [(Symbol, Occ)] + type family Empty :: [(Symbol, Occ)] where + Empty = NilSym0 + type TFHelper_0123456789876543210 :: Occ -> Occ -> Bool + type family TFHelper_0123456789876543210 (a :: Occ) (a :: Occ) :: Bool where + TFHelper_0123456789876543210 Str Str = TrueSym0 + TFHelper_0123456789876543210 Str Opt = FalseSym0 + TFHelper_0123456789876543210 Str Many = FalseSym0 + TFHelper_0123456789876543210 Opt Str = FalseSym0 + TFHelper_0123456789876543210 Opt Opt = TrueSym0 + TFHelper_0123456789876543210 Opt Many = FalseSym0 + TFHelper_0123456789876543210 Many Str = FalseSym0 + TFHelper_0123456789876543210 Many Opt = FalseSym0 + TFHelper_0123456789876543210 Many Many = TrueSym0 + type TFHelper_0123456789876543210Sym0 :: (~>) Occ ((~>) Occ Bool) + data TFHelper_0123456789876543210Sym0 :: (~>) Occ ((~>) Occ Bool) + where + TFHelper_0123456789876543210Sym0KindInference :: SameKind (Apply TFHelper_0123456789876543210Sym0 arg) (TFHelper_0123456789876543210Sym1 arg) => + TFHelper_0123456789876543210Sym0 a0123456789876543210 + type instance Apply TFHelper_0123456789876543210Sym0 a0123456789876543210 = TFHelper_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings TFHelper_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) TFHelper_0123456789876543210Sym0KindInference ()) + type TFHelper_0123456789876543210Sym1 :: Occ -> (~>) Occ Bool + data TFHelper_0123456789876543210Sym1 (a0123456789876543210 :: Occ) :: (~>) Occ Bool + where + TFHelper_0123456789876543210Sym1KindInference :: SameKind (Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) arg) (TFHelper_0123456789876543210Sym2 a0123456789876543210 arg) => + TFHelper_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (TFHelper_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) TFHelper_0123456789876543210Sym1KindInference ()) + type TFHelper_0123456789876543210Sym2 :: Occ -> Occ -> Bool + type family TFHelper_0123456789876543210Sym2 (a0123456789876543210 :: Occ) (a0123456789876543210 :: Occ) :: Bool where + TFHelper_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PEq Occ where + type (==) a a = Apply (Apply TFHelper_0123456789876543210Sym0 a) a + type Compare_0123456789876543210 :: Occ -> Occ -> Ordering + type family Compare_0123456789876543210 (a :: Occ) (a :: Occ) :: Ordering where + Compare_0123456789876543210 Str Str = Apply (Apply (Apply FoldlSym0 (<>@#@$)) EQSym0) NilSym0 + Compare_0123456789876543210 Opt Opt = Apply (Apply (Apply FoldlSym0 (<>@#@$)) EQSym0) NilSym0 + Compare_0123456789876543210 Many Many = Apply (Apply (Apply FoldlSym0 (<>@#@$)) EQSym0) NilSym0 + Compare_0123456789876543210 Str Opt = LTSym0 + Compare_0123456789876543210 Str Many = LTSym0 + Compare_0123456789876543210 Opt Str = GTSym0 + Compare_0123456789876543210 Opt Many = LTSym0 + Compare_0123456789876543210 Many Str = GTSym0 + Compare_0123456789876543210 Many Opt = GTSym0 + type Compare_0123456789876543210Sym0 :: (~>) Occ ((~>) Occ Ordering) + data Compare_0123456789876543210Sym0 :: (~>) Occ ((~>) Occ Ordering) + where + Compare_0123456789876543210Sym0KindInference :: SameKind (Apply Compare_0123456789876543210Sym0 arg) (Compare_0123456789876543210Sym1 arg) => + Compare_0123456789876543210Sym0 a0123456789876543210 + type instance Apply Compare_0123456789876543210Sym0 a0123456789876543210 = Compare_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Compare_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Compare_0123456789876543210Sym0KindInference ()) + type Compare_0123456789876543210Sym1 :: Occ -> (~>) Occ Ordering + data Compare_0123456789876543210Sym1 (a0123456789876543210 :: Occ) :: (~>) Occ Ordering + where + Compare_0123456789876543210Sym1KindInference :: SameKind (Apply (Compare_0123456789876543210Sym1 a0123456789876543210) arg) (Compare_0123456789876543210Sym2 a0123456789876543210 arg) => + Compare_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (Compare_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Compare_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Compare_0123456789876543210Sym1KindInference ()) + type Compare_0123456789876543210Sym2 :: Occ -> Occ -> Ordering + type family Compare_0123456789876543210Sym2 (a0123456789876543210 :: Occ) (a0123456789876543210 :: Occ) :: Ordering where + Compare_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance POrd Occ where + type Compare a a = Apply (Apply Compare_0123456789876543210Sym0 a) a + type ShowsPrec_0123456789876543210 :: Natural + -> Occ -> Symbol -> Symbol + type family ShowsPrec_0123456789876543210 (a :: Natural) (a :: Occ) (a :: Symbol) :: Symbol where + ShowsPrec_0123456789876543210 _ Str a_0123456789876543210 = Apply (Apply ShowStringSym0 "Str") a_0123456789876543210 + ShowsPrec_0123456789876543210 _ Opt a_0123456789876543210 = Apply (Apply ShowStringSym0 "Opt") a_0123456789876543210 + ShowsPrec_0123456789876543210 _ Many a_0123456789876543210 = Apply (Apply ShowStringSym0 "Many") a_0123456789876543210 + type ShowsPrec_0123456789876543210Sym0 :: (~>) Natural ((~>) Occ ((~>) Symbol Symbol)) + data ShowsPrec_0123456789876543210Sym0 :: (~>) Natural ((~>) Occ ((~>) Symbol Symbol)) + where + ShowsPrec_0123456789876543210Sym0KindInference :: SameKind (Apply ShowsPrec_0123456789876543210Sym0 arg) (ShowsPrec_0123456789876543210Sym1 arg) => + ShowsPrec_0123456789876543210Sym0 a0123456789876543210 + type instance Apply ShowsPrec_0123456789876543210Sym0 a0123456789876543210 = ShowsPrec_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings ShowsPrec_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym0KindInference ()) + type ShowsPrec_0123456789876543210Sym1 :: Natural + -> (~>) Occ ((~>) Symbol Symbol) + data ShowsPrec_0123456789876543210Sym1 (a0123456789876543210 :: Natural) :: (~>) Occ ((~>) Symbol Symbol) + where + ShowsPrec_0123456789876543210Sym1KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 arg) => + ShowsPrec_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym1KindInference ()) + type ShowsPrec_0123456789876543210Sym2 :: Natural + -> Occ -> (~>) Symbol Symbol + data ShowsPrec_0123456789876543210Sym2 (a0123456789876543210 :: Natural) (a0123456789876543210 :: Occ) :: (~>) Symbol Symbol + where + ShowsPrec_0123456789876543210Sym2KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 arg) => + ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym2KindInference ()) + type ShowsPrec_0123456789876543210Sym3 :: Natural + -> Occ -> Symbol -> Symbol + type family ShowsPrec_0123456789876543210Sym3 (a0123456789876543210 :: Natural) (a0123456789876543210 :: Occ) (a0123456789876543210 :: Symbol) :: Symbol where + ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PShow Occ where + type ShowsPrec a a a = Apply (Apply (Apply ShowsPrec_0123456789876543210Sym0 a) a) a + sEmpty :: (Sing (EmptySym0 :: [(Symbol, Occ)]) :: Type) + sEmpty = SNil + data SOcc :: Occ -> Type + where + SStr :: SOcc (Str :: Occ) + SOpt :: SOcc (Opt :: Occ) + SMany :: SOcc (Many :: Occ) + type instance Sing @Occ = SOcc + instance SingKind Occ where + type Demote Occ = Occ + fromSing SStr = Str + fromSing SOpt = Opt + fromSing SMany = Many + toSing Str = SomeSing SStr + toSing Opt = SomeSing SOpt + toSing Many = SomeSing SMany + instance SEq Occ where + (%==) :: + forall (t1 :: Occ) (t2 :: Occ). Sing t1 + -> Sing t2 + -> Sing (Apply (Apply ((==@#@$) :: TyFun Occ ((~>) Occ Bool) + -> Type) t1) t2) + (%==) SStr SStr = STrue + (%==) SStr SOpt = SFalse + (%==) SStr SMany = SFalse + (%==) SOpt SStr = SFalse + (%==) SOpt SOpt = STrue + (%==) SOpt SMany = SFalse + (%==) SMany SStr = SFalse + (%==) SMany SOpt = SFalse + (%==) SMany SMany = STrue + instance SOrd Occ where + sCompare :: + forall (t1 :: Occ) (t2 :: Occ). Sing t1 + -> Sing t2 + -> Sing (Apply (Apply (CompareSym0 :: TyFun Occ ((~>) Occ Ordering) + -> Type) t1) t2) + sCompare SStr SStr + = applySing + (applySing + (applySing (singFun3 @FoldlSym0 sFoldl) (singFun2 @(<>@#@$) (%<>))) + SEQ) + SNil + sCompare SOpt SOpt + = applySing + (applySing + (applySing (singFun3 @FoldlSym0 sFoldl) (singFun2 @(<>@#@$) (%<>))) + SEQ) + SNil + sCompare SMany SMany + = applySing + (applySing + (applySing (singFun3 @FoldlSym0 sFoldl) (singFun2 @(<>@#@$) (%<>))) + SEQ) + SNil + sCompare SStr SOpt = SLT + sCompare SStr SMany = SLT + sCompare SOpt SStr = SGT + sCompare SOpt SMany = SLT + sCompare SMany SStr = SGT + sCompare SMany SOpt = SGT + instance SShow Occ where + sShowsPrec :: + forall (t1 :: Natural) (t2 :: Occ) (t3 :: Symbol). Sing t1 + -> Sing t2 + -> Sing t3 + -> Sing (Apply (Apply (Apply (ShowsPrecSym0 :: TyFun Natural ((~>) Occ ((~>) Symbol Symbol)) + -> Type) t1) t2) t3) + sShowsPrec + _ + SStr + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "Str")) + sA_0123456789876543210 + sShowsPrec + _ + SOpt + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "Opt")) + sA_0123456789876543210 + sShowsPrec + _ + SMany + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "Many")) + sA_0123456789876543210 + instance SDecide Occ where + (%~) SStr SStr = Proved Refl + (%~) SStr SOpt = Disproved (\ x -> case x of {}) + (%~) SStr SMany = Disproved (\ x -> case x of {}) + (%~) SOpt SStr = Disproved (\ x -> case x of {}) + (%~) SOpt SOpt = Proved Refl + (%~) SOpt SMany = Disproved (\ x -> case x of {}) + (%~) SMany SStr = Disproved (\ x -> case x of {}) + (%~) SMany SOpt = Disproved (\ x -> case x of {}) + (%~) SMany SMany = Proved Refl + instance Data.Type.Equality.TestEquality (SOcc :: Occ + -> Type) where + Data.Type.Equality.testEquality + = Data.Singletons.Decide.decideEquality + instance Data.Type.Coercion.TestCoercion (SOcc :: Occ + -> Type) where + Data.Type.Coercion.testCoercion + = Data.Singletons.Decide.decideCoercion + deriving instance Show (SOcc (z :: Occ)) + instance SingI Str where + sing = SStr + instance SingI Opt where + sing = SOpt + instance SingI Many where + sing = SMany
tests/compile-and-dump/Singletons/T178.hs view
@@ -1,15 +1,15 @@-module T178 where--import GHC.TypeLits-import Data.Singletons.Base.TH--$(singletons [d|-- -- Note: Ord automatically defines "max"- data Occ = Str | Opt | Many deriving (Eq, Ord, Show)-- type U = [(Symbol,Occ)]-- empty :: U- empty = []- |])+module T178 where + +import GHC.TypeLits +import Data.Singletons.Base.TH + +$(singletons [d| + + -- Note: Ord automatically defines "max" + data Occ = Str | Opt | Many deriving (Eq, Ord, Show) + + type U = [(Symbol,Occ)] + + empty :: U + empty = [] + |])
tests/compile-and-dump/Singletons/T183.golden view
@@ -1,523 +1,532 @@-Singletons/T183.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| f1 (x :: Maybe Bool) = (x :: Maybe Bool)- f2 (x :: Maybe a) = (x :: Maybe a)- f3 (Just a :: Maybe Bool) = "hi"- g x = case Just x of (Just y :: Maybe Bool) -> (y :: Bool)- foo1 :: Maybe a -> a- foo1 (Just x :: Maybe a) = (x :: a)- foo2, foo3 :: forall a. Maybe a -> a- foo2 (Just x :: Maybe a) = (x :: a)- foo3 (Just x) = (x :: a)- foo4 :: (a, b) -> (b, a)- foo4 = \ (x :: a, y :: b) -> (y :: b, x :: a)- foo5, foo6 :: Maybe (Maybe a) -> Maybe (Maybe a)- foo5 (Just (Just (x :: a) :: Maybe a) :: Maybe (Maybe a))- = Just (Just (x :: a) :: Maybe a) :: Maybe (Maybe a)- foo6 (Just x :: Maybe (Maybe a))- = case x :: Maybe a of- (Just (y :: a) :: Maybe a) -> Just (Just (y :: a) :: Maybe a)- foo7 :: a -> b -> a- foo7 (x :: a) (_ :: b) = (x :: a)- foo8 :: forall a. Maybe a -> Maybe a- foo8 x@(Just (_ :: a) :: Maybe a) = x- foo8 x@(Nothing :: Maybe a) = x- foo9 :: a -> a- foo9 (x :: a)- = let- g :: a -> b -> a- g y _ = y- in g x () |]- ======>- f1 (x :: Maybe Bool) = x :: Maybe Bool- f2 (x :: Maybe a) = x :: Maybe a- f3 (Just a :: Maybe Bool) = "hi"- g x = case Just x of (Just y :: Maybe Bool) -> y :: Bool- foo1 :: Maybe a -> a- foo1 (Just x :: Maybe a) = x :: a- foo2 :: forall a. Maybe a -> a- foo3 :: forall a. Maybe a -> a- foo2 (Just x :: Maybe a) = x :: a- foo3 (Just x) = x :: a- foo4 :: (a, b) -> (b, a)- foo4 = \ (x :: a, y :: b) -> (y :: b, x :: a)- foo5 :: Maybe (Maybe a) -> Maybe (Maybe a)- foo6 :: Maybe (Maybe a) -> Maybe (Maybe a)- foo5 (Just (Just (x :: a) :: Maybe a) :: Maybe (Maybe a))- = Just (Just (x :: a) :: Maybe a) :: Maybe (Maybe a)- foo6 (Just x :: Maybe (Maybe a))- = case x :: Maybe a of- (Just (y :: a) :: Maybe a) -> Just (Just (y :: a) :: Maybe a)- foo7 :: a -> b -> a- foo7 (x :: a) (_ :: b) = x :: a- foo8 :: forall a. Maybe a -> Maybe a- foo8 x@(Just (_ :: a) :: Maybe a) = x- foo8 x@(Nothing :: Maybe a) = x- foo9 :: a -> a- foo9 (x :: a)- = let- g :: a -> b -> a- g y _ = y- in (g x) ()- data Let0123456789876543210GSym0 x0123456789876543210- where- Let0123456789876543210GSym0KindInference :: SameKind (Apply Let0123456789876543210GSym0 arg) (Let0123456789876543210GSym1 arg) =>- Let0123456789876543210GSym0 x0123456789876543210- type instance Apply Let0123456789876543210GSym0 x0123456789876543210 = Let0123456789876543210GSym1 x0123456789876543210- instance SuppressUnusedWarnings Let0123456789876543210GSym0 where- suppressUnusedWarnings- = snd (((,) Let0123456789876543210GSym0KindInference) ())- data Let0123456789876543210GSym1 x0123456789876543210 :: (~>) a ((~>) b0123456789876543210 a)- where- Let0123456789876543210GSym1KindInference :: SameKind (Apply (Let0123456789876543210GSym1 x0123456789876543210) arg) (Let0123456789876543210GSym2 x0123456789876543210 arg) =>- Let0123456789876543210GSym1 x0123456789876543210 a0123456789876543210- type instance Apply (Let0123456789876543210GSym1 x0123456789876543210) a0123456789876543210 = Let0123456789876543210GSym2 x0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Let0123456789876543210GSym1 x0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Let0123456789876543210GSym1KindInference) ())- data Let0123456789876543210GSym2 x0123456789876543210 (a0123456789876543210 :: a) :: (~>) b0123456789876543210 a- where- Let0123456789876543210GSym2KindInference :: SameKind (Apply (Let0123456789876543210GSym2 x0123456789876543210 a0123456789876543210) arg) (Let0123456789876543210GSym3 x0123456789876543210 a0123456789876543210 arg) =>- Let0123456789876543210GSym2 x0123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply (Let0123456789876543210GSym2 x0123456789876543210 a0123456789876543210) a0123456789876543210 = Let0123456789876543210G x0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Let0123456789876543210GSym2 x0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Let0123456789876543210GSym2KindInference) ())- type family Let0123456789876543210GSym3 x0123456789876543210 (a0123456789876543210 :: a) (a0123456789876543210 :: b0123456789876543210) :: a where- Let0123456789876543210GSym3 x0123456789876543210 a0123456789876543210 a0123456789876543210 = Let0123456789876543210G x0123456789876543210 a0123456789876543210 a0123456789876543210- type family Let0123456789876543210G x (a :: a) (a :: b) :: a where- Let0123456789876543210G x y _ = y- data Let0123456789876543210XSym0 wild_01234567898765432100123456789876543210- where- Let0123456789876543210XSym0KindInference :: SameKind (Apply Let0123456789876543210XSym0 arg) (Let0123456789876543210XSym1 arg) =>- Let0123456789876543210XSym0 wild_01234567898765432100123456789876543210- type instance Apply Let0123456789876543210XSym0 wild_01234567898765432100123456789876543210 = Let0123456789876543210X wild_01234567898765432100123456789876543210- instance SuppressUnusedWarnings Let0123456789876543210XSym0 where- suppressUnusedWarnings- = snd (((,) Let0123456789876543210XSym0KindInference) ())- type family Let0123456789876543210XSym1 wild_01234567898765432100123456789876543210 where- Let0123456789876543210XSym1 wild_01234567898765432100123456789876543210 = Let0123456789876543210X wild_01234567898765432100123456789876543210- type family Let0123456789876543210X wild_0123456789876543210 where- Let0123456789876543210X wild_0123456789876543210 = Apply JustSym0 (wild_0123456789876543210 :: a) :: Maybe a- type family Let0123456789876543210XSym0 where- Let0123456789876543210XSym0 = Let0123456789876543210X- type family Let0123456789876543210X where- Let0123456789876543210X = NothingSym0 :: Maybe a- data Let0123456789876543210Scrutinee_0123456789876543210Sym0 x0123456789876543210- where- Let0123456789876543210Scrutinee_0123456789876543210Sym0KindInference :: SameKind (Apply Let0123456789876543210Scrutinee_0123456789876543210Sym0 arg) (Let0123456789876543210Scrutinee_0123456789876543210Sym1 arg) =>- Let0123456789876543210Scrutinee_0123456789876543210Sym0 x0123456789876543210- type instance Apply Let0123456789876543210Scrutinee_0123456789876543210Sym0 x0123456789876543210 = Let0123456789876543210Scrutinee_0123456789876543210 x0123456789876543210- instance SuppressUnusedWarnings Let0123456789876543210Scrutinee_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd- (((,)- Let0123456789876543210Scrutinee_0123456789876543210Sym0KindInference)- ())- type family Let0123456789876543210Scrutinee_0123456789876543210Sym1 x0123456789876543210 where- Let0123456789876543210Scrutinee_0123456789876543210Sym1 x0123456789876543210 = Let0123456789876543210Scrutinee_0123456789876543210 x0123456789876543210- type family Let0123456789876543210Scrutinee_0123456789876543210 x where- Let0123456789876543210Scrutinee_0123456789876543210 x = x :: Maybe a- type family Case_0123456789876543210 x t where- Case_0123456789876543210 x ('Just (y :: a) :: Maybe a) = Apply JustSym0 (Apply JustSym0 (y :: a) :: Maybe a)- type family Case_0123456789876543210 arg_0123456789876543210 a_0123456789876543210 t where- Case_0123456789876543210 arg_0123456789876543210 a_0123456789876543210 '(x :: a,- y :: b) = Apply (Apply Tuple2Sym0 (y :: b)) (x :: a)- type family Lambda_0123456789876543210 a_0123456789876543210 arg_0123456789876543210 where- Lambda_0123456789876543210 a_0123456789876543210 arg_0123456789876543210 = Case_0123456789876543210 arg_0123456789876543210 a_0123456789876543210 arg_0123456789876543210- data Lambda_0123456789876543210Sym0 a_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) =>- Lambda_0123456789876543210Sym0 a_01234567898765432100123456789876543210- type instance Apply Lambda_0123456789876543210Sym0 a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210- instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym0KindInference) ())- data Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210 arg_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210 arg_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210) arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210 a_01234567898765432100123456789876543210 arg_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym1KindInference) ())- type family Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 arg_01234567898765432100123456789876543210 where- Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210 a_01234567898765432100123456789876543210 arg_01234567898765432100123456789876543210- data Let0123456789876543210Scrutinee_0123456789876543210Sym0 x0123456789876543210- where- Let0123456789876543210Scrutinee_0123456789876543210Sym0KindInference :: SameKind (Apply Let0123456789876543210Scrutinee_0123456789876543210Sym0 arg) (Let0123456789876543210Scrutinee_0123456789876543210Sym1 arg) =>- Let0123456789876543210Scrutinee_0123456789876543210Sym0 x0123456789876543210- type instance Apply Let0123456789876543210Scrutinee_0123456789876543210Sym0 x0123456789876543210 = Let0123456789876543210Scrutinee_0123456789876543210 x0123456789876543210- instance SuppressUnusedWarnings Let0123456789876543210Scrutinee_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd- (((,)- Let0123456789876543210Scrutinee_0123456789876543210Sym0KindInference)- ())- type family Let0123456789876543210Scrutinee_0123456789876543210Sym1 x0123456789876543210 where- Let0123456789876543210Scrutinee_0123456789876543210Sym1 x0123456789876543210 = Let0123456789876543210Scrutinee_0123456789876543210 x0123456789876543210- type family Let0123456789876543210Scrutinee_0123456789876543210 x where- Let0123456789876543210Scrutinee_0123456789876543210 x = Apply JustSym0 x- type family Case_0123456789876543210 x t where- Case_0123456789876543210 x ('Just y :: Maybe Bool) = y :: Bool- type Foo9Sym0 :: (~>) a a- data Foo9Sym0 :: (~>) a a- where- Foo9Sym0KindInference :: SameKind (Apply Foo9Sym0 arg) (Foo9Sym1 arg) =>- Foo9Sym0 a0123456789876543210- type instance Apply Foo9Sym0 a0123456789876543210 = Foo9 a0123456789876543210- instance SuppressUnusedWarnings Foo9Sym0 where- suppressUnusedWarnings = snd (((,) Foo9Sym0KindInference) ())- type Foo9Sym1 :: a -> a- type family Foo9Sym1 (a0123456789876543210 :: a) :: a where- Foo9Sym1 a0123456789876543210 = Foo9 a0123456789876543210- type Foo8Sym0 :: forall a. (~>) (Maybe a) (Maybe a)- data Foo8Sym0 :: (~>) (Maybe a) (Maybe a)- where- Foo8Sym0KindInference :: SameKind (Apply Foo8Sym0 arg) (Foo8Sym1 arg) =>- Foo8Sym0 a0123456789876543210- type instance Apply Foo8Sym0 a0123456789876543210 = Foo8 a0123456789876543210- instance SuppressUnusedWarnings Foo8Sym0 where- suppressUnusedWarnings = snd (((,) Foo8Sym0KindInference) ())- type Foo8Sym1 :: forall a. Maybe a -> Maybe a- type family Foo8Sym1 (a0123456789876543210 :: Maybe a) :: Maybe a where- Foo8Sym1 a0123456789876543210 = Foo8 a0123456789876543210- type Foo7Sym0 :: (~>) a ((~>) b a)- data Foo7Sym0 :: (~>) a ((~>) b a)- where- Foo7Sym0KindInference :: SameKind (Apply Foo7Sym0 arg) (Foo7Sym1 arg) =>- Foo7Sym0 a0123456789876543210- type instance Apply Foo7Sym0 a0123456789876543210 = Foo7Sym1 a0123456789876543210- instance SuppressUnusedWarnings Foo7Sym0 where- suppressUnusedWarnings = snd (((,) Foo7Sym0KindInference) ())- type Foo7Sym1 :: a -> (~>) b a- data Foo7Sym1 (a0123456789876543210 :: a) :: (~>) b a- where- Foo7Sym1KindInference :: SameKind (Apply (Foo7Sym1 a0123456789876543210) arg) (Foo7Sym2 a0123456789876543210 arg) =>- Foo7Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (Foo7Sym1 a0123456789876543210) a0123456789876543210 = Foo7 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Foo7Sym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) Foo7Sym1KindInference) ())- type Foo7Sym2 :: a -> b -> a- type family Foo7Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: a where- Foo7Sym2 a0123456789876543210 a0123456789876543210 = Foo7 a0123456789876543210 a0123456789876543210- type Foo6Sym0 :: (~>) (Maybe (Maybe a)) (Maybe (Maybe a))- data Foo6Sym0 :: (~>) (Maybe (Maybe a)) (Maybe (Maybe a))- where- Foo6Sym0KindInference :: SameKind (Apply Foo6Sym0 arg) (Foo6Sym1 arg) =>- Foo6Sym0 a0123456789876543210- type instance Apply Foo6Sym0 a0123456789876543210 = Foo6 a0123456789876543210- instance SuppressUnusedWarnings Foo6Sym0 where- suppressUnusedWarnings = snd (((,) Foo6Sym0KindInference) ())- type Foo6Sym1 :: Maybe (Maybe a) -> Maybe (Maybe a)- type family Foo6Sym1 (a0123456789876543210 :: Maybe (Maybe a)) :: Maybe (Maybe a) where- Foo6Sym1 a0123456789876543210 = Foo6 a0123456789876543210- type Foo5Sym0 :: (~>) (Maybe (Maybe a)) (Maybe (Maybe a))- data Foo5Sym0 :: (~>) (Maybe (Maybe a)) (Maybe (Maybe a))- where- Foo5Sym0KindInference :: SameKind (Apply Foo5Sym0 arg) (Foo5Sym1 arg) =>- Foo5Sym0 a0123456789876543210- type instance Apply Foo5Sym0 a0123456789876543210 = Foo5 a0123456789876543210- instance SuppressUnusedWarnings Foo5Sym0 where- suppressUnusedWarnings = snd (((,) Foo5Sym0KindInference) ())- type Foo5Sym1 :: Maybe (Maybe a) -> Maybe (Maybe a)- type family Foo5Sym1 (a0123456789876543210 :: Maybe (Maybe a)) :: Maybe (Maybe a) where- Foo5Sym1 a0123456789876543210 = Foo5 a0123456789876543210- type Foo4Sym0 :: (~>) (a, b) (b, a)- data Foo4Sym0 :: (~>) (a, b) (b, a)- where- Foo4Sym0KindInference :: SameKind (Apply Foo4Sym0 arg) (Foo4Sym1 arg) =>- Foo4Sym0 a0123456789876543210- type instance Apply Foo4Sym0 a0123456789876543210 = Foo4 a0123456789876543210- instance SuppressUnusedWarnings Foo4Sym0 where- suppressUnusedWarnings = snd (((,) Foo4Sym0KindInference) ())- type Foo4Sym1 :: (a, b) -> (b, a)- type family Foo4Sym1 (a0123456789876543210 :: (a, b)) :: (b,- a) where- Foo4Sym1 a0123456789876543210 = Foo4 a0123456789876543210- type Foo3Sym0 :: forall a. (~>) (Maybe a) a- data Foo3Sym0 :: (~>) (Maybe a) a- where- Foo3Sym0KindInference :: SameKind (Apply Foo3Sym0 arg) (Foo3Sym1 arg) =>- Foo3Sym0 a0123456789876543210- type instance Apply Foo3Sym0 a0123456789876543210 = Foo3 a0123456789876543210- instance SuppressUnusedWarnings Foo3Sym0 where- suppressUnusedWarnings = snd (((,) Foo3Sym0KindInference) ())- type Foo3Sym1 :: forall a. Maybe a -> a- type family Foo3Sym1 (a0123456789876543210 :: Maybe a) :: a where- Foo3Sym1 a0123456789876543210 = Foo3 a0123456789876543210- type Foo2Sym0 :: forall a. (~>) (Maybe a) a- data Foo2Sym0 :: (~>) (Maybe a) a- where- Foo2Sym0KindInference :: SameKind (Apply Foo2Sym0 arg) (Foo2Sym1 arg) =>- Foo2Sym0 a0123456789876543210- type instance Apply Foo2Sym0 a0123456789876543210 = Foo2 a0123456789876543210- instance SuppressUnusedWarnings Foo2Sym0 where- suppressUnusedWarnings = snd (((,) Foo2Sym0KindInference) ())- type Foo2Sym1 :: forall a. Maybe a -> a- type family Foo2Sym1 (a0123456789876543210 :: Maybe a) :: a where- Foo2Sym1 a0123456789876543210 = Foo2 a0123456789876543210- type Foo1Sym0 :: (~>) (Maybe a) a- data Foo1Sym0 :: (~>) (Maybe a) a- where- Foo1Sym0KindInference :: SameKind (Apply Foo1Sym0 arg) (Foo1Sym1 arg) =>- Foo1Sym0 a0123456789876543210- type instance Apply Foo1Sym0 a0123456789876543210 = Foo1 a0123456789876543210- instance SuppressUnusedWarnings Foo1Sym0 where- suppressUnusedWarnings = snd (((,) Foo1Sym0KindInference) ())- type Foo1Sym1 :: Maybe a -> a- type family Foo1Sym1 (a0123456789876543210 :: Maybe a) :: a where- Foo1Sym1 a0123456789876543210 = Foo1 a0123456789876543210- data GSym0 a0123456789876543210- where- GSym0KindInference :: SameKind (Apply GSym0 arg) (GSym1 arg) =>- GSym0 a0123456789876543210- type instance Apply GSym0 a0123456789876543210 = G a0123456789876543210- instance SuppressUnusedWarnings GSym0 where- suppressUnusedWarnings = snd (((,) GSym0KindInference) ())- type family GSym1 a0123456789876543210 where- GSym1 a0123456789876543210 = G a0123456789876543210- data F3Sym0 a0123456789876543210- where- F3Sym0KindInference :: SameKind (Apply F3Sym0 arg) (F3Sym1 arg) =>- F3Sym0 a0123456789876543210- type instance Apply F3Sym0 a0123456789876543210 = F3 a0123456789876543210- instance SuppressUnusedWarnings F3Sym0 where- suppressUnusedWarnings = snd (((,) F3Sym0KindInference) ())- type family F3Sym1 a0123456789876543210 where- F3Sym1 a0123456789876543210 = F3 a0123456789876543210- data F2Sym0 a0123456789876543210- where- F2Sym0KindInference :: SameKind (Apply F2Sym0 arg) (F2Sym1 arg) =>- F2Sym0 a0123456789876543210- type instance Apply F2Sym0 a0123456789876543210 = F2 a0123456789876543210- instance SuppressUnusedWarnings F2Sym0 where- suppressUnusedWarnings = snd (((,) F2Sym0KindInference) ())- type family F2Sym1 a0123456789876543210 where- F2Sym1 a0123456789876543210 = F2 a0123456789876543210- data F1Sym0 a0123456789876543210- where- F1Sym0KindInference :: SameKind (Apply F1Sym0 arg) (F1Sym1 arg) =>- F1Sym0 a0123456789876543210- type instance Apply F1Sym0 a0123456789876543210 = F1 a0123456789876543210- instance SuppressUnusedWarnings F1Sym0 where- suppressUnusedWarnings = snd (((,) F1Sym0KindInference) ())- type family F1Sym1 a0123456789876543210 where- F1Sym1 a0123456789876543210 = F1 a0123456789876543210- type Foo9 :: a -> a- type family Foo9 (a :: a) :: a where- Foo9 (x :: a) = Apply (Apply (Let0123456789876543210GSym1 x) x) Tuple0Sym0- type Foo8 :: forall a. Maybe a -> Maybe a- type family Foo8 (a :: Maybe a) :: Maybe a where- Foo8 ('Just (wild_0123456789876543210 :: a) :: Maybe a) = Let0123456789876543210XSym1 wild_0123456789876543210- Foo8 ('Nothing :: Maybe a) = Let0123456789876543210XSym0- type Foo7 :: a -> b -> a- type family Foo7 (a :: a) (a :: b) :: a where- Foo7 (x :: a) (wild_0123456789876543210 :: b) = x :: a- type Foo6 :: Maybe (Maybe a) -> Maybe (Maybe a)- type family Foo6 (a :: Maybe (Maybe a)) :: Maybe (Maybe a) where- Foo6 ('Just x :: Maybe (Maybe a)) = Case_0123456789876543210 x (Let0123456789876543210Scrutinee_0123456789876543210Sym1 x)- type Foo5 :: Maybe (Maybe a) -> Maybe (Maybe a)- type family Foo5 (a :: Maybe (Maybe a)) :: Maybe (Maybe a) where- Foo5 ('Just ('Just (x :: a) :: Maybe a) :: Maybe (Maybe a)) = Apply JustSym0 (Apply JustSym0 (x :: a) :: Maybe a) :: Maybe (Maybe a)- type Foo4 :: (a, b) -> (b, a)- type family Foo4 (a :: (a, b)) :: (b, a) where- Foo4 a_0123456789876543210 = Apply (Apply Lambda_0123456789876543210Sym0 a_0123456789876543210) a_0123456789876543210- type Foo3 :: forall a. Maybe a -> a- type family Foo3 (a :: Maybe a) :: a where- Foo3 ('Just x) = x :: a- type Foo2 :: forall a. Maybe a -> a- type family Foo2 (a :: Maybe a) :: a where- Foo2 ('Just x :: Maybe a) = x :: a- type Foo1 :: Maybe a -> a- type family Foo1 (a :: Maybe a) :: a where- Foo1 ('Just x :: Maybe a) = x :: a- type family G a where- G x = Case_0123456789876543210 x (Let0123456789876543210Scrutinee_0123456789876543210Sym1 x)- type family F3 a where- F3 ('Just a :: Maybe Bool) = "hi"- type family F2 a where- F2 (x :: Maybe a) = x :: Maybe a- type family F1 a where- F1 (x :: Maybe Bool) = x :: Maybe Bool- sFoo9 :: forall a (t :: a). Sing t -> Sing (Apply Foo9Sym0 t :: a)- sFoo8 ::- forall a (t :: Maybe a). Sing t- -> Sing (Apply Foo8Sym0 t :: Maybe a)- sFoo7 ::- forall a b (t :: a) (t :: b). Sing t- -> Sing t -> Sing (Apply (Apply Foo7Sym0 t) t :: a)- sFoo6 ::- forall a (t :: Maybe (Maybe a)). Sing t- -> Sing (Apply Foo6Sym0 t :: Maybe (Maybe a))- sFoo5 ::- forall a (t :: Maybe (Maybe a)). Sing t- -> Sing (Apply Foo5Sym0 t :: Maybe (Maybe a))- sFoo4 ::- forall a b (t :: (a, b)). Sing t- -> Sing (Apply Foo4Sym0 t :: (b, a))- sFoo3 ::- forall a (t :: Maybe a). Sing t -> Sing (Apply Foo3Sym0 t :: a)- sFoo2 ::- forall a (t :: Maybe a). Sing t -> Sing (Apply Foo2Sym0 t :: a)- sFoo1 ::- forall a (t :: Maybe a). Sing t -> Sing (Apply Foo1Sym0 t :: a)- sG :: forall arg. Sing arg -> Sing (Apply GSym0 arg)- sF3 :: forall arg. Sing arg -> Sing (Apply F3Sym0 arg)- sF2 :: forall arg. Sing arg -> Sing (Apply F2Sym0 arg)- sF1 :: forall arg. Sing arg -> Sing (Apply F1Sym0 arg)- sFoo9 (sX :: Sing x)- = case sX :: Sing x of- (_ :: Sing (x :: a))- -> let- sG ::- forall b (t :: a) (t :: b). Sing t- -> Sing t- -> Sing (Apply (Apply (Let0123456789876543210GSym1 x) t) t :: a)- sG (sY :: Sing y) _ = sY- in- (applySing- ((applySing ((singFun2 @(Let0123456789876543210GSym1 x)) sG)) sX))- STuple0- sFoo8- (SJust (sWild_0123456789876543210 :: Sing wild_0123456789876543210))- = case- ((,) (sWild_0123456789876543210 :: Sing wild_0123456789876543210))- (SJust- (sWild_0123456789876543210 :: Sing wild_0123456789876543210))- of- (,) (_ :: Sing (wild_0123456789876543210 :: a))- (_ :: Sing ('Just (wild_0123456789876543210 :: a) :: Maybe a))- -> let- sX ::- Sing @_ (Let0123456789876543210XSym1 wild_0123456789876543210)- sX- = (applySing ((singFun1 @JustSym0) SJust))- (sWild_0123456789876543210 ::- Sing (wild_0123456789876543210 :: a)) ::- Sing (Apply JustSym0 (wild_0123456789876543210 :: a) :: Maybe a)- in sX- sFoo8 SNothing- = case SNothing of- (_ :: Sing ('Nothing :: Maybe a))- -> let- sX :: Sing @_ Let0123456789876543210XSym0- sX = SNothing :: Sing (NothingSym0 :: Maybe a)- in sX- sFoo7- (sX :: Sing x)- (sWild_0123456789876543210 :: Sing wild_0123456789876543210)- = case- ((,) (sX :: Sing x))- (sWild_0123456789876543210 :: Sing wild_0123456789876543210)- of- (,) (_ :: Sing (x :: a))- (_ :: Sing (wild_0123456789876543210 :: b))- -> sX :: Sing (x :: a)- sFoo6 (SJust (sX :: Sing x))- = case SJust (sX :: Sing x) of- (_ :: Sing ('Just x :: Maybe (Maybe a)))- -> let- sScrutinee_0123456789876543210 ::- Sing @_ (Let0123456789876543210Scrutinee_0123456789876543210Sym1 x)- sScrutinee_0123456789876543210 = sX :: Sing (x :: Maybe a)- in- (id- @(Sing (Case_0123456789876543210 x (Let0123456789876543210Scrutinee_0123456789876543210Sym1 x) :: Maybe (Maybe a))))- (case sScrutinee_0123456789876543210 of- SJust (sY :: Sing y)- -> case ((,) (sY :: Sing y)) (SJust (sY :: Sing y)) of- (,) (_ :: Sing (y :: a)) (_ :: Sing ('Just (y :: a) :: Maybe a))- -> (applySing ((singFun1 @JustSym0) SJust))- ((applySing ((singFun1 @JustSym0) SJust))- (sY :: Sing (y :: a)) ::- Sing (Apply JustSym0 (y :: a) :: Maybe a)))- sFoo5 (SJust (SJust (sX :: Sing x)))- = case- (((,,) (sX :: Sing x)) (SJust (sX :: Sing x)))- (SJust (SJust (sX :: Sing x)))- of- (,,) (_ :: Sing (x :: a)) (_ :: Sing ('Just (x :: a) :: Maybe a))- (_ :: Sing ('Just ('Just (x :: a) :: Maybe a) :: Maybe (Maybe a)))- -> (applySing ((singFun1 @JustSym0) SJust))- ((applySing ((singFun1 @JustSym0) SJust)) (sX :: Sing (x :: a)) ::- Sing (Apply JustSym0 (x :: a) :: Maybe a)) ::- Sing (Apply JustSym0 (Apply JustSym0 (x :: a) :: Maybe a) :: Maybe (Maybe a))- sFoo4 (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((singFun1- @(Apply Lambda_0123456789876543210Sym0 a_0123456789876543210))- (\ sArg_0123456789876543210- -> case sArg_0123456789876543210 of- (_ :: Sing arg_0123456789876543210)- -> (id- @(Sing (Case_0123456789876543210 arg_0123456789876543210 a_0123456789876543210 arg_0123456789876543210)))- (case sArg_0123456789876543210 of- STuple2 (sX :: Sing x) (sY :: Sing y)- -> case ((,) (sX :: Sing x)) (sY :: Sing y) of- (,) (_ :: Sing (x :: a)) (_ :: Sing (y :: b))- -> (applySing- ((applySing ((singFun2 @Tuple2Sym0) STuple2))- (sY :: Sing (y :: b))))- (sX :: Sing (x :: a))))))- sA_0123456789876543210- sFoo3 (SJust (sX :: Sing x)) = sX :: Sing (x :: a)- sFoo2 (SJust (sX :: Sing x))- = case SJust (sX :: Sing x) of- (_ :: Sing ('Just x :: Maybe a)) -> sX :: Sing (x :: a)- sFoo1 (SJust (sX :: Sing x))- = case SJust (sX :: Sing x) of- (_ :: Sing ('Just x :: Maybe a)) -> sX :: Sing (x :: a)- sG (sX :: Sing x)- = let- sScrutinee_0123456789876543210 ::- Sing @_ (Let0123456789876543210Scrutinee_0123456789876543210Sym1 x)- sScrutinee_0123456789876543210- = (applySing ((singFun1 @JustSym0) SJust)) sX- in- (id- @(Sing (Case_0123456789876543210 x (Let0123456789876543210Scrutinee_0123456789876543210Sym1 x))))- (case sScrutinee_0123456789876543210 of- SJust (sY :: Sing y)- -> case SJust (sY :: Sing y) of- (_ :: Sing ('Just y :: Maybe Bool)) -> sY :: Sing (y :: Bool))- sF3 (SJust (sA :: Sing a))- = case SJust (sA :: Sing a) of- (_ :: Sing ('Just a :: Maybe Bool)) -> sing :: Sing "hi"- sF2 (sX :: Sing x)- = case sX :: Sing x of- (_ :: Sing (x :: Maybe a)) -> sX :: Sing (x :: Maybe a)- sF1 (sX :: Sing x)- = case sX :: Sing x of- (_ :: Sing (x :: Maybe Bool)) -> sX :: Sing (x :: Maybe Bool)- instance SingI (Foo9Sym0 :: (~>) a a) where- sing = (singFun1 @Foo9Sym0) sFoo9- instance SingI (Foo8Sym0 :: (~>) (Maybe a) (Maybe a)) where- sing = (singFun1 @Foo8Sym0) sFoo8- instance SingI (Foo7Sym0 :: (~>) a ((~>) b a)) where- sing = (singFun2 @Foo7Sym0) sFoo7- instance SingI d => SingI (Foo7Sym1 (d :: a) :: (~>) b a) where- sing = (singFun1 @(Foo7Sym1 (d :: a))) (sFoo7 (sing @d))- instance SingI1 (Foo7Sym1 :: a -> (~>) b a) where- liftSing (s :: Sing (d :: a))- = (singFun1 @(Foo7Sym1 (d :: a))) (sFoo7 s)- instance SingI (Foo6Sym0 :: (~>) (Maybe (Maybe a)) (Maybe (Maybe a))) where- sing = (singFun1 @Foo6Sym0) sFoo6- instance SingI (Foo5Sym0 :: (~>) (Maybe (Maybe a)) (Maybe (Maybe a))) where- sing = (singFun1 @Foo5Sym0) sFoo5- instance SingI (Foo4Sym0 :: (~>) (a, b) (b, a)) where- sing = (singFun1 @Foo4Sym0) sFoo4- instance SingI (Foo3Sym0 :: (~>) (Maybe a) a) where- sing = (singFun1 @Foo3Sym0) sFoo3- instance SingI (Foo2Sym0 :: (~>) (Maybe a) a) where- sing = (singFun1 @Foo2Sym0) sFoo2- instance SingI (Foo1Sym0 :: (~>) (Maybe a) a) where- sing = (singFun1 @Foo1Sym0) sFoo1- instance SingI GSym0 where- sing = (singFun1 @GSym0) sG- instance SingI F3Sym0 where- sing = (singFun1 @F3Sym0) sF3- instance SingI F2Sym0 where- sing = (singFun1 @F2Sym0) sF2- instance SingI F1Sym0 where- sing = (singFun1 @F1Sym0) sF1+Singletons/T183.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| f1 (x :: Maybe Bool) = (x :: Maybe Bool) + f2 (x :: Maybe a) = (x :: Maybe a) + f3 (Just a :: Maybe Bool) = "hi" + g x = case Just x of (Just y :: Maybe Bool) -> (y :: Bool) + foo1 :: Maybe a -> a + foo1 (Just x :: Maybe a) = (x :: a) + foo2, foo3 :: forall a. Maybe a -> a + foo2 (Just x :: Maybe a) = (x :: a) + foo3 (Just x) = (x :: a) + foo4 :: (a, b) -> (b, a) + foo4 = \ (x :: a, y :: b) -> (y :: b, x :: a) + foo5, foo6 :: Maybe (Maybe a) -> Maybe (Maybe a) + foo5 (Just (Just (x :: a) :: Maybe a) :: Maybe (Maybe a)) + = Just (Just (x :: a) :: Maybe a) :: Maybe (Maybe a) + foo6 (Just x :: Maybe (Maybe a)) + = case x :: Maybe a of + (Just (y :: a) :: Maybe a) -> Just (Just (y :: a) :: Maybe a) + foo7 :: a -> b -> a + foo7 (x :: a) (_ :: b) = (x :: a) + foo8 :: forall a. Maybe a -> Maybe a + foo8 x@(Just (_ :: a) :: Maybe a) = x + foo8 x@(Nothing :: Maybe a) = x + foo9 :: a -> a + foo9 (x :: a) + = let + g :: a -> b -> a + g y _ = y + in g x () |] + ======> + f1 (x :: Maybe Bool) = x :: Maybe Bool + f2 (x :: Maybe a) = x :: Maybe a + f3 (Just a :: Maybe Bool) = "hi" + g x = case Just x of (Just y :: Maybe Bool) -> y :: Bool + foo1 :: Maybe a -> a + foo1 (Just x :: Maybe a) = x :: a + foo2 :: forall a. Maybe a -> a + foo3 :: forall a. Maybe a -> a + foo2 (Just x :: Maybe a) = x :: a + foo3 (Just x) = x :: a + foo4 :: (a, b) -> (b, a) + foo4 = \ (x :: a, y :: b) -> (y :: b, x :: a) + foo5 :: Maybe (Maybe a) -> Maybe (Maybe a) + foo6 :: Maybe (Maybe a) -> Maybe (Maybe a) + foo5 (Just (Just (x :: a) :: Maybe a) :: Maybe (Maybe a)) + = Just (Just (x :: a) :: Maybe a) :: Maybe (Maybe a) + foo6 (Just x :: Maybe (Maybe a)) + = case x :: Maybe a of + (Just (y :: a) :: Maybe a) -> Just (Just (y :: a) :: Maybe a) + foo7 :: a -> b -> a + foo7 (x :: a) (_ :: b) = x :: a + foo8 :: forall a. Maybe a -> Maybe a + foo8 x@(Just (_ :: a) :: Maybe a) = x + foo8 x@(Nothing :: Maybe a) = x + foo9 :: a -> a + foo9 (x :: a) + = let + g :: a -> b -> a + g y _ = y + in g x () + data Let0123456789876543210GSym0 x0123456789876543210 + where + Let0123456789876543210GSym0KindInference :: SameKind (Apply Let0123456789876543210GSym0 arg) (Let0123456789876543210GSym1 arg) => + Let0123456789876543210GSym0 x0123456789876543210 + type instance Apply Let0123456789876543210GSym0 x0123456789876543210 = Let0123456789876543210GSym1 x0123456789876543210 + instance SuppressUnusedWarnings Let0123456789876543210GSym0 where + suppressUnusedWarnings + = snd ((,) Let0123456789876543210GSym0KindInference ()) + data Let0123456789876543210GSym1 x0123456789876543210 :: (~>) a ((~>) b0123456789876543210 a) + where + Let0123456789876543210GSym1KindInference :: SameKind (Apply (Let0123456789876543210GSym1 x0123456789876543210) arg) (Let0123456789876543210GSym2 x0123456789876543210 arg) => + Let0123456789876543210GSym1 x0123456789876543210 a0123456789876543210 + type instance Apply (Let0123456789876543210GSym1 x0123456789876543210) a0123456789876543210 = Let0123456789876543210GSym2 x0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Let0123456789876543210GSym1 x0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Let0123456789876543210GSym1KindInference ()) + data Let0123456789876543210GSym2 x0123456789876543210 (a0123456789876543210 :: a) :: (~>) b0123456789876543210 a + where + Let0123456789876543210GSym2KindInference :: SameKind (Apply (Let0123456789876543210GSym2 x0123456789876543210 a0123456789876543210) arg) (Let0123456789876543210GSym3 x0123456789876543210 a0123456789876543210 arg) => + Let0123456789876543210GSym2 x0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply (Let0123456789876543210GSym2 x0123456789876543210 a0123456789876543210) a0123456789876543210 = Let0123456789876543210G x0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Let0123456789876543210GSym2 x0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Let0123456789876543210GSym2KindInference ()) + type family Let0123456789876543210GSym3 x0123456789876543210 (a0123456789876543210 :: a) (a0123456789876543210 :: b0123456789876543210) :: a where + Let0123456789876543210GSym3 x0123456789876543210 a0123456789876543210 a0123456789876543210 = Let0123456789876543210G x0123456789876543210 a0123456789876543210 a0123456789876543210 + type family Let0123456789876543210G x (a :: a) (a :: b) :: a where + Let0123456789876543210G x y _ = y + data Let0123456789876543210XSym0 wild_01234567898765432100123456789876543210 + where + Let0123456789876543210XSym0KindInference :: SameKind (Apply Let0123456789876543210XSym0 arg) (Let0123456789876543210XSym1 arg) => + Let0123456789876543210XSym0 wild_01234567898765432100123456789876543210 + type instance Apply Let0123456789876543210XSym0 wild_01234567898765432100123456789876543210 = Let0123456789876543210X wild_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings Let0123456789876543210XSym0 where + suppressUnusedWarnings + = snd ((,) Let0123456789876543210XSym0KindInference ()) + type family Let0123456789876543210XSym1 wild_01234567898765432100123456789876543210 where + Let0123456789876543210XSym1 wild_01234567898765432100123456789876543210 = Let0123456789876543210X wild_01234567898765432100123456789876543210 + type family Let0123456789876543210X wild_0123456789876543210 where + Let0123456789876543210X wild_0123456789876543210 = Apply JustSym0 (wild_0123456789876543210 :: a) :: Maybe a + type family Let0123456789876543210XSym0 where + Let0123456789876543210XSym0 = Let0123456789876543210X + type family Let0123456789876543210X where + Let0123456789876543210X = NothingSym0 :: Maybe a + data Let0123456789876543210Scrutinee_0123456789876543210Sym0 x0123456789876543210 + where + Let0123456789876543210Scrutinee_0123456789876543210Sym0KindInference :: SameKind (Apply Let0123456789876543210Scrutinee_0123456789876543210Sym0 arg) (Let0123456789876543210Scrutinee_0123456789876543210Sym1 arg) => + Let0123456789876543210Scrutinee_0123456789876543210Sym0 x0123456789876543210 + type instance Apply Let0123456789876543210Scrutinee_0123456789876543210Sym0 x0123456789876543210 = Let0123456789876543210Scrutinee_0123456789876543210 x0123456789876543210 + instance SuppressUnusedWarnings Let0123456789876543210Scrutinee_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd + ((,) + Let0123456789876543210Scrutinee_0123456789876543210Sym0KindInference + ()) + type family Let0123456789876543210Scrutinee_0123456789876543210Sym1 x0123456789876543210 where + Let0123456789876543210Scrutinee_0123456789876543210Sym1 x0123456789876543210 = Let0123456789876543210Scrutinee_0123456789876543210 x0123456789876543210 + type family Let0123456789876543210Scrutinee_0123456789876543210 x where + Let0123456789876543210Scrutinee_0123456789876543210 x = x :: Maybe a + type family Case_0123456789876543210 x t where + Case_0123456789876543210 x ('Just (y :: a) :: Maybe a) = Apply JustSym0 (Apply JustSym0 (y :: a) :: Maybe a) + type family Case_0123456789876543210 arg_0123456789876543210 a_0123456789876543210 t where + Case_0123456789876543210 arg_0123456789876543210 a_0123456789876543210 '(x :: a, + y :: b) = Apply (Apply Tuple2Sym0 (y :: b)) (x :: a) + type family Lambda_0123456789876543210 a_0123456789876543210 arg_0123456789876543210 where + Lambda_0123456789876543210 a_0123456789876543210 arg_0123456789876543210 = Case_0123456789876543210 arg_0123456789876543210 a_0123456789876543210 arg_0123456789876543210 + data Lambda_0123456789876543210Sym0 a_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) => + Lambda_0123456789876543210Sym0 a_01234567898765432100123456789876543210 + type instance Apply Lambda_0123456789876543210Sym0 a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym0KindInference ()) + data Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210 arg_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210 arg_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210) arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210 a_01234567898765432100123456789876543210 arg_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym1KindInference ()) + type family Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 arg_01234567898765432100123456789876543210 where + Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210 a_01234567898765432100123456789876543210 arg_01234567898765432100123456789876543210 + data Let0123456789876543210Scrutinee_0123456789876543210Sym0 x0123456789876543210 + where + Let0123456789876543210Scrutinee_0123456789876543210Sym0KindInference :: SameKind (Apply Let0123456789876543210Scrutinee_0123456789876543210Sym0 arg) (Let0123456789876543210Scrutinee_0123456789876543210Sym1 arg) => + Let0123456789876543210Scrutinee_0123456789876543210Sym0 x0123456789876543210 + type instance Apply Let0123456789876543210Scrutinee_0123456789876543210Sym0 x0123456789876543210 = Let0123456789876543210Scrutinee_0123456789876543210 x0123456789876543210 + instance SuppressUnusedWarnings Let0123456789876543210Scrutinee_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd + ((,) + Let0123456789876543210Scrutinee_0123456789876543210Sym0KindInference + ()) + type family Let0123456789876543210Scrutinee_0123456789876543210Sym1 x0123456789876543210 where + Let0123456789876543210Scrutinee_0123456789876543210Sym1 x0123456789876543210 = Let0123456789876543210Scrutinee_0123456789876543210 x0123456789876543210 + type family Let0123456789876543210Scrutinee_0123456789876543210 x where + Let0123456789876543210Scrutinee_0123456789876543210 x = Apply JustSym0 x + type family Case_0123456789876543210 x t where + Case_0123456789876543210 x ('Just y :: Maybe Bool) = y :: Bool + type Foo9Sym0 :: (~>) a a + data Foo9Sym0 :: (~>) a a + where + Foo9Sym0KindInference :: SameKind (Apply Foo9Sym0 arg) (Foo9Sym1 arg) => + Foo9Sym0 a0123456789876543210 + type instance Apply Foo9Sym0 a0123456789876543210 = Foo9 a0123456789876543210 + instance SuppressUnusedWarnings Foo9Sym0 where + suppressUnusedWarnings = snd ((,) Foo9Sym0KindInference ()) + type Foo9Sym1 :: a -> a + type family Foo9Sym1 (a0123456789876543210 :: a) :: a where + Foo9Sym1 a0123456789876543210 = Foo9 a0123456789876543210 + type Foo8Sym0 :: forall a. (~>) (Maybe a) (Maybe a) + data Foo8Sym0 :: (~>) (Maybe a) (Maybe a) + where + Foo8Sym0KindInference :: SameKind (Apply Foo8Sym0 arg) (Foo8Sym1 arg) => + Foo8Sym0 a0123456789876543210 + type instance Apply Foo8Sym0 a0123456789876543210 = Foo8 a0123456789876543210 + instance SuppressUnusedWarnings Foo8Sym0 where + suppressUnusedWarnings = snd ((,) Foo8Sym0KindInference ()) + type Foo8Sym1 :: forall a. Maybe a -> Maybe a + type family Foo8Sym1 (a0123456789876543210 :: Maybe a) :: Maybe a where + Foo8Sym1 a0123456789876543210 = Foo8 a0123456789876543210 + type Foo7Sym0 :: (~>) a ((~>) b a) + data Foo7Sym0 :: (~>) a ((~>) b a) + where + Foo7Sym0KindInference :: SameKind (Apply Foo7Sym0 arg) (Foo7Sym1 arg) => + Foo7Sym0 a0123456789876543210 + type instance Apply Foo7Sym0 a0123456789876543210 = Foo7Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Foo7Sym0 where + suppressUnusedWarnings = snd ((,) Foo7Sym0KindInference ()) + type Foo7Sym1 :: a -> (~>) b a + data Foo7Sym1 (a0123456789876543210 :: a) :: (~>) b a + where + Foo7Sym1KindInference :: SameKind (Apply (Foo7Sym1 a0123456789876543210) arg) (Foo7Sym2 a0123456789876543210 arg) => + Foo7Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (Foo7Sym1 a0123456789876543210) a0123456789876543210 = Foo7 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Foo7Sym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) Foo7Sym1KindInference ()) + type Foo7Sym2 :: a -> b -> a + type family Foo7Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: a where + Foo7Sym2 a0123456789876543210 a0123456789876543210 = Foo7 a0123456789876543210 a0123456789876543210 + type Foo6Sym0 :: (~>) (Maybe (Maybe a)) (Maybe (Maybe a)) + data Foo6Sym0 :: (~>) (Maybe (Maybe a)) (Maybe (Maybe a)) + where + Foo6Sym0KindInference :: SameKind (Apply Foo6Sym0 arg) (Foo6Sym1 arg) => + Foo6Sym0 a0123456789876543210 + type instance Apply Foo6Sym0 a0123456789876543210 = Foo6 a0123456789876543210 + instance SuppressUnusedWarnings Foo6Sym0 where + suppressUnusedWarnings = snd ((,) Foo6Sym0KindInference ()) + type Foo6Sym1 :: Maybe (Maybe a) -> Maybe (Maybe a) + type family Foo6Sym1 (a0123456789876543210 :: Maybe (Maybe a)) :: Maybe (Maybe a) where + Foo6Sym1 a0123456789876543210 = Foo6 a0123456789876543210 + type Foo5Sym0 :: (~>) (Maybe (Maybe a)) (Maybe (Maybe a)) + data Foo5Sym0 :: (~>) (Maybe (Maybe a)) (Maybe (Maybe a)) + where + Foo5Sym0KindInference :: SameKind (Apply Foo5Sym0 arg) (Foo5Sym1 arg) => + Foo5Sym0 a0123456789876543210 + type instance Apply Foo5Sym0 a0123456789876543210 = Foo5 a0123456789876543210 + instance SuppressUnusedWarnings Foo5Sym0 where + suppressUnusedWarnings = snd ((,) Foo5Sym0KindInference ()) + type Foo5Sym1 :: Maybe (Maybe a) -> Maybe (Maybe a) + type family Foo5Sym1 (a0123456789876543210 :: Maybe (Maybe a)) :: Maybe (Maybe a) where + Foo5Sym1 a0123456789876543210 = Foo5 a0123456789876543210 + type Foo4Sym0 :: (~>) (a, b) (b, a) + data Foo4Sym0 :: (~>) (a, b) (b, a) + where + Foo4Sym0KindInference :: SameKind (Apply Foo4Sym0 arg) (Foo4Sym1 arg) => + Foo4Sym0 a0123456789876543210 + type instance Apply Foo4Sym0 a0123456789876543210 = Foo4 a0123456789876543210 + instance SuppressUnusedWarnings Foo4Sym0 where + suppressUnusedWarnings = snd ((,) Foo4Sym0KindInference ()) + type Foo4Sym1 :: (a, b) -> (b, a) + type family Foo4Sym1 (a0123456789876543210 :: (a, b)) :: (b, + a) where + Foo4Sym1 a0123456789876543210 = Foo4 a0123456789876543210 + type Foo3Sym0 :: forall a. (~>) (Maybe a) a + data Foo3Sym0 :: (~>) (Maybe a) a + where + Foo3Sym0KindInference :: SameKind (Apply Foo3Sym0 arg) (Foo3Sym1 arg) => + Foo3Sym0 a0123456789876543210 + type instance Apply Foo3Sym0 a0123456789876543210 = Foo3 a0123456789876543210 + instance SuppressUnusedWarnings Foo3Sym0 where + suppressUnusedWarnings = snd ((,) Foo3Sym0KindInference ()) + type Foo3Sym1 :: forall a. Maybe a -> a + type family Foo3Sym1 (a0123456789876543210 :: Maybe a) :: a where + Foo3Sym1 a0123456789876543210 = Foo3 a0123456789876543210 + type Foo2Sym0 :: forall a. (~>) (Maybe a) a + data Foo2Sym0 :: (~>) (Maybe a) a + where + Foo2Sym0KindInference :: SameKind (Apply Foo2Sym0 arg) (Foo2Sym1 arg) => + Foo2Sym0 a0123456789876543210 + type instance Apply Foo2Sym0 a0123456789876543210 = Foo2 a0123456789876543210 + instance SuppressUnusedWarnings Foo2Sym0 where + suppressUnusedWarnings = snd ((,) Foo2Sym0KindInference ()) + type Foo2Sym1 :: forall a. Maybe a -> a + type family Foo2Sym1 (a0123456789876543210 :: Maybe a) :: a where + Foo2Sym1 a0123456789876543210 = Foo2 a0123456789876543210 + type Foo1Sym0 :: (~>) (Maybe a) a + data Foo1Sym0 :: (~>) (Maybe a) a + where + Foo1Sym0KindInference :: SameKind (Apply Foo1Sym0 arg) (Foo1Sym1 arg) => + Foo1Sym0 a0123456789876543210 + type instance Apply Foo1Sym0 a0123456789876543210 = Foo1 a0123456789876543210 + instance SuppressUnusedWarnings Foo1Sym0 where + suppressUnusedWarnings = snd ((,) Foo1Sym0KindInference ()) + type Foo1Sym1 :: Maybe a -> a + type family Foo1Sym1 (a0123456789876543210 :: Maybe a) :: a where + Foo1Sym1 a0123456789876543210 = Foo1 a0123456789876543210 + data GSym0 a0123456789876543210 + where + GSym0KindInference :: SameKind (Apply GSym0 arg) (GSym1 arg) => + GSym0 a0123456789876543210 + type instance Apply GSym0 a0123456789876543210 = G a0123456789876543210 + instance SuppressUnusedWarnings GSym0 where + suppressUnusedWarnings = snd ((,) GSym0KindInference ()) + type family GSym1 a0123456789876543210 where + GSym1 a0123456789876543210 = G a0123456789876543210 + data F3Sym0 a0123456789876543210 + where + F3Sym0KindInference :: SameKind (Apply F3Sym0 arg) (F3Sym1 arg) => + F3Sym0 a0123456789876543210 + type instance Apply F3Sym0 a0123456789876543210 = F3 a0123456789876543210 + instance SuppressUnusedWarnings F3Sym0 where + suppressUnusedWarnings = snd ((,) F3Sym0KindInference ()) + type family F3Sym1 a0123456789876543210 where + F3Sym1 a0123456789876543210 = F3 a0123456789876543210 + data F2Sym0 a0123456789876543210 + where + F2Sym0KindInference :: SameKind (Apply F2Sym0 arg) (F2Sym1 arg) => + F2Sym0 a0123456789876543210 + type instance Apply F2Sym0 a0123456789876543210 = F2 a0123456789876543210 + instance SuppressUnusedWarnings F2Sym0 where + suppressUnusedWarnings = snd ((,) F2Sym0KindInference ()) + type family F2Sym1 a0123456789876543210 where + F2Sym1 a0123456789876543210 = F2 a0123456789876543210 + data F1Sym0 a0123456789876543210 + where + F1Sym0KindInference :: SameKind (Apply F1Sym0 arg) (F1Sym1 arg) => + F1Sym0 a0123456789876543210 + type instance Apply F1Sym0 a0123456789876543210 = F1 a0123456789876543210 + instance SuppressUnusedWarnings F1Sym0 where + suppressUnusedWarnings = snd ((,) F1Sym0KindInference ()) + type family F1Sym1 a0123456789876543210 where + F1Sym1 a0123456789876543210 = F1 a0123456789876543210 + type Foo9 :: a -> a + type family Foo9 (a :: a) :: a where + Foo9 (x :: a) = Apply (Apply (Let0123456789876543210GSym1 x) x) Tuple0Sym0 + type Foo8 :: forall a. Maybe a -> Maybe a + type family Foo8 (a :: Maybe a) :: Maybe a where + Foo8 ('Just (wild_0123456789876543210 :: a) :: Maybe a) = Let0123456789876543210XSym1 wild_0123456789876543210 + Foo8 ('Nothing :: Maybe a) = Let0123456789876543210XSym0 + type Foo7 :: a -> b -> a + type family Foo7 (a :: a) (a :: b) :: a where + Foo7 (x :: a) (wild_0123456789876543210 :: b) = x :: a + type Foo6 :: Maybe (Maybe a) -> Maybe (Maybe a) + type family Foo6 (a :: Maybe (Maybe a)) :: Maybe (Maybe a) where + Foo6 ('Just x :: Maybe (Maybe a)) = Case_0123456789876543210 x (Let0123456789876543210Scrutinee_0123456789876543210Sym1 x) + type Foo5 :: Maybe (Maybe a) -> Maybe (Maybe a) + type family Foo5 (a :: Maybe (Maybe a)) :: Maybe (Maybe a) where + Foo5 ('Just ('Just (x :: a) :: Maybe a) :: Maybe (Maybe a)) = Apply JustSym0 (Apply JustSym0 (x :: a) :: Maybe a) :: Maybe (Maybe a) + type Foo4 :: (a, b) -> (b, a) + type family Foo4 (a :: (a, b)) :: (b, a) where + Foo4 a_0123456789876543210 = Apply (Apply Lambda_0123456789876543210Sym0 a_0123456789876543210) a_0123456789876543210 + type Foo3 :: forall a. Maybe a -> a + type family Foo3 (a :: Maybe a) :: a where + Foo3 ('Just x) = x :: a + type Foo2 :: forall a. Maybe a -> a + type family Foo2 (a :: Maybe a) :: a where + Foo2 ('Just x :: Maybe a) = x :: a + type Foo1 :: Maybe a -> a + type family Foo1 (a :: Maybe a) :: a where + Foo1 ('Just x :: Maybe a) = x :: a + type family G a where + G x = Case_0123456789876543210 x (Let0123456789876543210Scrutinee_0123456789876543210Sym1 x) + type family F3 a where + F3 ('Just a :: Maybe Bool) = "hi" + type family F2 a where + F2 (x :: Maybe a) = x :: Maybe a + type family F1 a where + F1 (x :: Maybe Bool) = x :: Maybe Bool + sFoo9 :: + (forall (t :: a). Sing t -> Sing (Apply Foo9Sym0 t :: a) :: Type) + sFoo8 :: + forall a (t :: Maybe a). Sing t + -> Sing (Apply Foo8Sym0 t :: Maybe a) + sFoo7 :: + (forall (t :: a) (t :: b). + Sing t -> Sing t -> Sing (Apply (Apply Foo7Sym0 t) t :: a) :: Type) + sFoo6 :: + (forall (t :: Maybe (Maybe a)). + Sing t -> Sing (Apply Foo6Sym0 t :: Maybe (Maybe a)) :: Type) + sFoo5 :: + (forall (t :: Maybe (Maybe a)). + Sing t -> Sing (Apply Foo5Sym0 t :: Maybe (Maybe a)) :: Type) + sFoo4 :: + (forall (t :: (a, b)). + Sing t -> Sing (Apply Foo4Sym0 t :: (b, a)) :: Type) + sFoo3 :: + forall a (t :: Maybe a). Sing t -> Sing (Apply Foo3Sym0 t :: a) + sFoo2 :: + forall a (t :: Maybe a). Sing t -> Sing (Apply Foo2Sym0 t :: a) + sFoo1 :: + (forall (t :: Maybe a). + Sing t -> Sing (Apply Foo1Sym0 t :: a) :: Type) + sG :: forall arg. Sing arg -> Sing (Apply GSym0 arg) + sF3 :: forall arg. Sing arg -> Sing (Apply F3Sym0 arg) + sF2 :: forall arg. Sing arg -> Sing (Apply F2Sym0 arg) + sF1 :: forall arg. Sing arg -> Sing (Apply F1Sym0 arg) + sFoo9 (sX :: Sing x) + = case sX :: Sing x of + (_ :: Sing (x :: a)) + -> let + sG :: + (forall (t :: a) (t :: b). + Sing t + -> Sing t + -> Sing (Apply (Apply (Let0123456789876543210GSym1 x) t) t :: a) :: Type) + sG (sY :: Sing y) _ = sY + in + applySing + (applySing (singFun2 @(Let0123456789876543210GSym1 x) sG) sX) + STuple0 + sFoo8 + (SJust (sWild_0123456789876543210 :: Sing wild_0123456789876543210)) + = case + (,) + (sWild_0123456789876543210 :: Sing wild_0123456789876543210) + (SJust + (sWild_0123456789876543210 :: Sing wild_0123456789876543210)) + of + (,) (_ :: Sing (wild_0123456789876543210 :: a)) + (_ :: Sing ('Just (wild_0123456789876543210 :: a) :: Maybe a)) + -> let + sX :: + Sing @_ (Let0123456789876543210XSym1 wild_0123456789876543210) + sX + = applySing + (singFun1 @JustSym0 SJust) + (sWild_0123456789876543210 :: + Sing (wild_0123456789876543210 :: a)) :: + Sing (Apply JustSym0 (wild_0123456789876543210 :: a) :: Maybe a) + in sX + sFoo8 SNothing + = case SNothing of + (_ :: Sing ('Nothing :: Maybe a)) + -> let + sX :: Sing @_ Let0123456789876543210XSym0 + sX = SNothing :: Sing (NothingSym0 :: Maybe a) + in sX + sFoo7 + (sX :: Sing x) + (sWild_0123456789876543210 :: Sing wild_0123456789876543210) + = case + (,) + (sX :: Sing x) + (sWild_0123456789876543210 :: Sing wild_0123456789876543210) + of + (,) (_ :: Sing (x :: a)) + (_ :: Sing (wild_0123456789876543210 :: b)) + -> sX :: Sing (x :: a) + sFoo6 (SJust (sX :: Sing x)) + = case SJust (sX :: Sing x) of + (_ :: Sing ('Just x :: Maybe (Maybe a))) + -> let + sScrutinee_0123456789876543210 :: + Sing @_ (Let0123456789876543210Scrutinee_0123456789876543210Sym1 x) + sScrutinee_0123456789876543210 = sX :: Sing (x :: Maybe a) + in + id + @(Sing (Case_0123456789876543210 x (Let0123456789876543210Scrutinee_0123456789876543210Sym1 x))) + (case sScrutinee_0123456789876543210 of + SJust (sY :: Sing y) + -> case (,) (sY :: Sing y) (SJust (sY :: Sing y)) of + (,) (_ :: Sing (y :: a)) (_ :: Sing ('Just (y :: a) :: Maybe a)) + -> applySing + (singFun1 @JustSym0 SJust) + (applySing (singFun1 @JustSym0 SJust) (sY :: Sing (y :: a)) :: + Sing (Apply JustSym0 (y :: a) :: Maybe a))) + sFoo5 (SJust (SJust (sX :: Sing x))) + = case + (,,) + (sX :: Sing x) (SJust (sX :: Sing x)) + (SJust (SJust (sX :: Sing x))) + of + (,,) (_ :: Sing (x :: a)) (_ :: Sing ('Just (x :: a) :: Maybe a)) + (_ :: Sing ('Just ('Just (x :: a) :: Maybe a) :: Maybe (Maybe a))) + -> applySing + (singFun1 @JustSym0 SJust) + (applySing (singFun1 @JustSym0 SJust) (sX :: Sing (x :: a)) :: + Sing (Apply JustSym0 (x :: a) :: Maybe a)) :: + Sing (Apply JustSym0 (Apply JustSym0 (x :: a) :: Maybe a) :: Maybe (Maybe a)) + sFoo4 (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (singFun1 + @(Apply Lambda_0123456789876543210Sym0 a_0123456789876543210) + (\ sArg_0123456789876543210 + -> case sArg_0123456789876543210 of + (_ :: Sing arg_0123456789876543210) + -> id + @(Sing (Case_0123456789876543210 arg_0123456789876543210 a_0123456789876543210 arg_0123456789876543210)) + (case sArg_0123456789876543210 of + STuple2 (sX :: Sing x) (sY :: Sing y) + -> case (,) (sX :: Sing x) (sY :: Sing y) of + (,) (_ :: Sing (x :: a)) (_ :: Sing (y :: b)) + -> applySing + (applySing + (singFun2 @Tuple2Sym0 STuple2) + (sY :: Sing (y :: b))) + (sX :: Sing (x :: a))))) + sA_0123456789876543210 + sFoo3 (SJust (sX :: Sing x)) = sX :: Sing (x :: a) + sFoo2 (SJust (sX :: Sing x)) + = case SJust (sX :: Sing x) of + (_ :: Sing ('Just x :: Maybe a)) -> sX :: Sing (x :: a) + sFoo1 (SJust (sX :: Sing x)) + = case SJust (sX :: Sing x) of + (_ :: Sing ('Just x :: Maybe a)) -> sX :: Sing (x :: a) + sG (sX :: Sing x) + = let + sScrutinee_0123456789876543210 :: + Sing @_ (Let0123456789876543210Scrutinee_0123456789876543210Sym1 x) + sScrutinee_0123456789876543210 + = applySing (singFun1 @JustSym0 SJust) sX + in + id + @(Sing (Case_0123456789876543210 x (Let0123456789876543210Scrutinee_0123456789876543210Sym1 x))) + (case sScrutinee_0123456789876543210 of + SJust (sY :: Sing y) + -> case SJust (sY :: Sing y) of + (_ :: Sing ('Just y :: Maybe Bool)) -> sY :: Sing (y :: Bool)) + sF3 (SJust (sA :: Sing a)) + = case SJust (sA :: Sing a) of + (_ :: Sing ('Just a :: Maybe Bool)) -> sing :: Sing "hi" + sF2 (sX :: Sing x) + = case sX :: Sing x of + (_ :: Sing (x :: Maybe a)) -> sX :: Sing (x :: Maybe a) + sF1 (sX :: Sing x) + = case sX :: Sing x of + (_ :: Sing (x :: Maybe Bool)) -> sX :: Sing (x :: Maybe Bool) + instance SingI (Foo9Sym0 :: (~>) a a) where + sing = singFun1 @Foo9Sym0 sFoo9 + instance SingI (Foo8Sym0 :: (~>) (Maybe a) (Maybe a)) where + sing = singFun1 @Foo8Sym0 sFoo8 + instance SingI (Foo7Sym0 :: (~>) a ((~>) b a)) where + sing = singFun2 @Foo7Sym0 sFoo7 + instance SingI d => SingI (Foo7Sym1 (d :: a) :: (~>) b a) where + sing = singFun1 @(Foo7Sym1 (d :: a)) (sFoo7 (sing @d)) + instance SingI1 (Foo7Sym1 :: a -> (~>) b a) where + liftSing (s :: Sing (d :: a)) + = singFun1 @(Foo7Sym1 (d :: a)) (sFoo7 s) + instance SingI (Foo6Sym0 :: (~>) (Maybe (Maybe a)) (Maybe (Maybe a))) where + sing = singFun1 @Foo6Sym0 sFoo6 + instance SingI (Foo5Sym0 :: (~>) (Maybe (Maybe a)) (Maybe (Maybe a))) where + sing = singFun1 @Foo5Sym0 sFoo5 + instance SingI (Foo4Sym0 :: (~>) (a, b) (b, a)) where + sing = singFun1 @Foo4Sym0 sFoo4 + instance SingI (Foo3Sym0 :: (~>) (Maybe a) a) where + sing = singFun1 @Foo3Sym0 sFoo3 + instance SingI (Foo2Sym0 :: (~>) (Maybe a) a) where + sing = singFun1 @Foo2Sym0 sFoo2 + instance SingI (Foo1Sym0 :: (~>) (Maybe a) a) where + sing = singFun1 @Foo1Sym0 sFoo1 + instance SingI GSym0 where + sing = singFun1 @GSym0 sG + instance SingI F3Sym0 where + sing = singFun1 @F3Sym0 sF3 + instance SingI F2Sym0 where + sing = singFun1 @F2Sym0 sF2 + instance SingI F1Sym0 where + sing = singFun1 @F1Sym0 sF1
tests/compile-and-dump/Singletons/T183.hs view
@@ -1,65 +1,65 @@-module T183 where--import Data.Singletons.TH-import Prelude.Singletons--$(singletons [d|- ------ -- Examples from #183- ------- f1 (x :: Maybe Bool) = (x :: Maybe Bool)- f2 (x :: Maybe a) = (x :: Maybe a)- f3 (Just a :: Maybe Bool) = "hi"-- g x = case Just x of- (Just y :: Maybe Bool) -> (y :: Bool)-- ------ -- Using explicit type signatures- ------- -- No explicit forall- foo1 :: Maybe a -> a- foo1 (Just x :: Maybe a) = (x :: a)-- -- Explicit forall- foo2, foo3 :: forall a. Maybe a -> a- foo2 (Just x :: Maybe a) = (x :: a)- foo3 (Just x) = (x :: a)-- ------ -- Multiple pattern signatures- ------- foo4 :: (a, b) -> (b, a)- foo4 = \(x :: a, y :: b) -> (y :: b, x :: a)-- foo5, foo6 :: Maybe (Maybe a) -> Maybe (Maybe a)- foo5 (Just (Just (x :: a) :: Maybe a) :: Maybe (Maybe a))- = Just (Just (x :: a) :: Maybe a) :: Maybe (Maybe a)- foo6 (Just x :: Maybe (Maybe a))- = case x :: Maybe a of- (Just (y :: a) :: Maybe a) -> Just (Just (y :: a) :: Maybe a)-- ------ -- Other pattern features- ------- foo7 :: a -> b -> a- foo7 (x :: a) (_ :: b) = (x :: a)-- foo8 :: forall a. Maybe a -> Maybe a- foo8 x@(Just (_ :: a) :: Maybe a) = x- foo8 x@(Nothing :: Maybe a) = x-- ------ -- Type variable scoping (vis-à-vis #297)- ------- foo9 :: a -> a- foo9 (x :: a)- = let g :: a -> b -> a- g y _ = y- in g x ()- |])+module T183 where + +import Data.Singletons.TH +import Prelude.Singletons + +$(singletons [d| + ----- + -- Examples from #183 + ----- + + f1 (x :: Maybe Bool) = (x :: Maybe Bool) + f2 (x :: Maybe a) = (x :: Maybe a) + f3 (Just a :: Maybe Bool) = "hi" + + g x = case Just x of + (Just y :: Maybe Bool) -> (y :: Bool) + + ----- + -- Using explicit type signatures + ----- + + -- No explicit forall + foo1 :: Maybe a -> a + foo1 (Just x :: Maybe a) = (x :: a) + + -- Explicit forall + foo2, foo3 :: forall a. Maybe a -> a + foo2 (Just x :: Maybe a) = (x :: a) + foo3 (Just x) = (x :: a) + + ----- + -- Multiple pattern signatures + ----- + + foo4 :: (a, b) -> (b, a) + foo4 = \(x :: a, y :: b) -> (y :: b, x :: a) + + foo5, foo6 :: Maybe (Maybe a) -> Maybe (Maybe a) + foo5 (Just (Just (x :: a) :: Maybe a) :: Maybe (Maybe a)) + = Just (Just (x :: a) :: Maybe a) :: Maybe (Maybe a) + foo6 (Just x :: Maybe (Maybe a)) + = case x :: Maybe a of + (Just (y :: a) :: Maybe a) -> Just (Just (y :: a) :: Maybe a) + + ----- + -- Other pattern features + ----- + + foo7 :: a -> b -> a + foo7 (x :: a) (_ :: b) = (x :: a) + + foo8 :: forall a. Maybe a -> Maybe a + foo8 x@(Just (_ :: a) :: Maybe a) = x + foo8 x@(Nothing :: Maybe a) = x + + ----- + -- Type variable scoping (vis-à-vis #297) + ----- + + foo9 :: a -> a + foo9 (x :: a) + = let g :: a -> b -> a + g y _ = y + in g x () + |])
tests/compile-and-dump/Singletons/T184.golden view
@@ -1,455 +1,476 @@-Singletons/T184.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| boogie :: Maybe a -> Maybe Bool -> Maybe a- boogie ma mb- = do a <- ma- b <- mb- guard b- return a- zip' :: [a] -> [b] -> [(a, b)]- zip' xs ys = [(x, y) | x <- xs | y <- ys]- cartProd :: [a] -> [b] -> [(a, b)]- cartProd xs ys = [(x, y) | x <- xs, y <- ys]- trues :: [Bool] -> [Bool]- trues xs = [x | x <- xs, x] |]- ======>- boogie :: Maybe a -> Maybe Bool -> Maybe a- boogie ma mb- = do a <- ma- b <- mb- guard b- return a- zip' :: [a] -> [b] -> [(a, b)]- zip' xs ys = [(x, y) | x <- xs | y <- ys]- cartProd :: [a] -> [b] -> [(a, b)]- cartProd xs ys = [(x, y) | x <- xs, y <- ys]- trues :: [Bool] -> [Bool]- trues xs = [x | x <- xs, x]- type family Lambda_0123456789876543210 xs x where- Lambda_0123456789876543210 xs x = Apply (Apply (>>@#@$) (Apply GuardSym0 x)) (Apply ReturnSym0 x)- data Lambda_0123456789876543210Sym0 xs0123456789876543210- where- Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) =>- Lambda_0123456789876543210Sym0 xs0123456789876543210- type instance Apply Lambda_0123456789876543210Sym0 xs0123456789876543210 = Lambda_0123456789876543210Sym1 xs0123456789876543210- instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym0KindInference) ())- data Lambda_0123456789876543210Sym1 xs0123456789876543210 x0123456789876543210- where- Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 xs0123456789876543210) arg) (Lambda_0123456789876543210Sym2 xs0123456789876543210 arg) =>- Lambda_0123456789876543210Sym1 xs0123456789876543210 x0123456789876543210- type instance Apply (Lambda_0123456789876543210Sym1 xs0123456789876543210) x0123456789876543210 = Lambda_0123456789876543210 xs0123456789876543210 x0123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 xs0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym1KindInference) ())- type family Lambda_0123456789876543210Sym2 xs0123456789876543210 x0123456789876543210 where- Lambda_0123456789876543210Sym2 xs0123456789876543210 x0123456789876543210 = Lambda_0123456789876543210 xs0123456789876543210 x0123456789876543210- type family Lambda_0123456789876543210 x xs ys y where- Lambda_0123456789876543210 x xs ys y = Apply ReturnSym0 (Apply (Apply Tuple2Sym0 x) y)- data Lambda_0123456789876543210Sym0 x0123456789876543210- where- Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) =>- Lambda_0123456789876543210Sym0 x0123456789876543210- type instance Apply Lambda_0123456789876543210Sym0 x0123456789876543210 = Lambda_0123456789876543210Sym1 x0123456789876543210- instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym0KindInference) ())- data Lambda_0123456789876543210Sym1 x0123456789876543210 xs0123456789876543210- where- Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) arg) (Lambda_0123456789876543210Sym2 x0123456789876543210 arg) =>- Lambda_0123456789876543210Sym1 x0123456789876543210 xs0123456789876543210- type instance Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) xs0123456789876543210 = Lambda_0123456789876543210Sym2 x0123456789876543210 xs0123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 x0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym1KindInference) ())- data Lambda_0123456789876543210Sym2 x0123456789876543210 xs0123456789876543210 ys0123456789876543210- where- Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 x0123456789876543210 xs0123456789876543210) arg) (Lambda_0123456789876543210Sym3 x0123456789876543210 xs0123456789876543210 arg) =>- Lambda_0123456789876543210Sym2 x0123456789876543210 xs0123456789876543210 ys0123456789876543210- type instance Apply (Lambda_0123456789876543210Sym2 x0123456789876543210 xs0123456789876543210) ys0123456789876543210 = Lambda_0123456789876543210Sym3 x0123456789876543210 xs0123456789876543210 ys0123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 x0123456789876543210 xs0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym2KindInference) ())- data Lambda_0123456789876543210Sym3 x0123456789876543210 xs0123456789876543210 ys0123456789876543210 y0123456789876543210- where- Lambda_0123456789876543210Sym3KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym3 x0123456789876543210 xs0123456789876543210 ys0123456789876543210) arg) (Lambda_0123456789876543210Sym4 x0123456789876543210 xs0123456789876543210 ys0123456789876543210 arg) =>- Lambda_0123456789876543210Sym3 x0123456789876543210 xs0123456789876543210 ys0123456789876543210 y0123456789876543210- type instance Apply (Lambda_0123456789876543210Sym3 x0123456789876543210 xs0123456789876543210 ys0123456789876543210) y0123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 xs0123456789876543210 ys0123456789876543210 y0123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym3 x0123456789876543210 xs0123456789876543210 ys0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym3KindInference) ())- type family Lambda_0123456789876543210Sym4 x0123456789876543210 xs0123456789876543210 ys0123456789876543210 y0123456789876543210 where- Lambda_0123456789876543210Sym4 x0123456789876543210 xs0123456789876543210 ys0123456789876543210 y0123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 xs0123456789876543210 ys0123456789876543210 y0123456789876543210- type family Lambda_0123456789876543210 xs ys x where- Lambda_0123456789876543210 xs ys x = Apply (Apply (>>=@#@$) ys) (Apply (Apply (Apply Lambda_0123456789876543210Sym0 x) xs) ys)- data Lambda_0123456789876543210Sym0 xs0123456789876543210- where- Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) =>- Lambda_0123456789876543210Sym0 xs0123456789876543210- type instance Apply Lambda_0123456789876543210Sym0 xs0123456789876543210 = Lambda_0123456789876543210Sym1 xs0123456789876543210- instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym0KindInference) ())- data Lambda_0123456789876543210Sym1 xs0123456789876543210 ys0123456789876543210- where- Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 xs0123456789876543210) arg) (Lambda_0123456789876543210Sym2 xs0123456789876543210 arg) =>- Lambda_0123456789876543210Sym1 xs0123456789876543210 ys0123456789876543210- type instance Apply (Lambda_0123456789876543210Sym1 xs0123456789876543210) ys0123456789876543210 = Lambda_0123456789876543210Sym2 xs0123456789876543210 ys0123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 xs0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym1KindInference) ())- data Lambda_0123456789876543210Sym2 xs0123456789876543210 ys0123456789876543210 x0123456789876543210- where- Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 xs0123456789876543210 ys0123456789876543210) arg) (Lambda_0123456789876543210Sym3 xs0123456789876543210 ys0123456789876543210 arg) =>- Lambda_0123456789876543210Sym2 xs0123456789876543210 ys0123456789876543210 x0123456789876543210- type instance Apply (Lambda_0123456789876543210Sym2 xs0123456789876543210 ys0123456789876543210) x0123456789876543210 = Lambda_0123456789876543210 xs0123456789876543210 ys0123456789876543210 x0123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 xs0123456789876543210 ys0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym2KindInference) ())- type family Lambda_0123456789876543210Sym3 xs0123456789876543210 ys0123456789876543210 x0123456789876543210 where- Lambda_0123456789876543210Sym3 xs0123456789876543210 ys0123456789876543210 x0123456789876543210 = Lambda_0123456789876543210 xs0123456789876543210 ys0123456789876543210 x0123456789876543210- type family Lambda_0123456789876543210 xs ys x where- Lambda_0123456789876543210 xs ys x = Apply ReturnSym0 x- data Lambda_0123456789876543210Sym0 xs0123456789876543210- where- Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) =>- Lambda_0123456789876543210Sym0 xs0123456789876543210- type instance Apply Lambda_0123456789876543210Sym0 xs0123456789876543210 = Lambda_0123456789876543210Sym1 xs0123456789876543210- instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym0KindInference) ())- data Lambda_0123456789876543210Sym1 xs0123456789876543210 ys0123456789876543210- where- Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 xs0123456789876543210) arg) (Lambda_0123456789876543210Sym2 xs0123456789876543210 arg) =>- Lambda_0123456789876543210Sym1 xs0123456789876543210 ys0123456789876543210- type instance Apply (Lambda_0123456789876543210Sym1 xs0123456789876543210) ys0123456789876543210 = Lambda_0123456789876543210Sym2 xs0123456789876543210 ys0123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 xs0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym1KindInference) ())- data Lambda_0123456789876543210Sym2 xs0123456789876543210 ys0123456789876543210 x0123456789876543210- where- Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 xs0123456789876543210 ys0123456789876543210) arg) (Lambda_0123456789876543210Sym3 xs0123456789876543210 ys0123456789876543210 arg) =>- Lambda_0123456789876543210Sym2 xs0123456789876543210 ys0123456789876543210 x0123456789876543210- type instance Apply (Lambda_0123456789876543210Sym2 xs0123456789876543210 ys0123456789876543210) x0123456789876543210 = Lambda_0123456789876543210 xs0123456789876543210 ys0123456789876543210 x0123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 xs0123456789876543210 ys0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym2KindInference) ())- type family Lambda_0123456789876543210Sym3 xs0123456789876543210 ys0123456789876543210 x0123456789876543210 where- Lambda_0123456789876543210Sym3 xs0123456789876543210 ys0123456789876543210 x0123456789876543210 = Lambda_0123456789876543210 xs0123456789876543210 ys0123456789876543210 x0123456789876543210- type family Lambda_0123456789876543210 xs ys y where- Lambda_0123456789876543210 xs ys y = Apply ReturnSym0 y- data Lambda_0123456789876543210Sym0 xs0123456789876543210- where- Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) =>- Lambda_0123456789876543210Sym0 xs0123456789876543210- type instance Apply Lambda_0123456789876543210Sym0 xs0123456789876543210 = Lambda_0123456789876543210Sym1 xs0123456789876543210- instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym0KindInference) ())- data Lambda_0123456789876543210Sym1 xs0123456789876543210 ys0123456789876543210- where- Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 xs0123456789876543210) arg) (Lambda_0123456789876543210Sym2 xs0123456789876543210 arg) =>- Lambda_0123456789876543210Sym1 xs0123456789876543210 ys0123456789876543210- type instance Apply (Lambda_0123456789876543210Sym1 xs0123456789876543210) ys0123456789876543210 = Lambda_0123456789876543210Sym2 xs0123456789876543210 ys0123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 xs0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym1KindInference) ())- data Lambda_0123456789876543210Sym2 xs0123456789876543210 ys0123456789876543210 y0123456789876543210- where- Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 xs0123456789876543210 ys0123456789876543210) arg) (Lambda_0123456789876543210Sym3 xs0123456789876543210 ys0123456789876543210 arg) =>- Lambda_0123456789876543210Sym2 xs0123456789876543210 ys0123456789876543210 y0123456789876543210- type instance Apply (Lambda_0123456789876543210Sym2 xs0123456789876543210 ys0123456789876543210) y0123456789876543210 = Lambda_0123456789876543210 xs0123456789876543210 ys0123456789876543210 y0123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 xs0123456789876543210 ys0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym2KindInference) ())- type family Lambda_0123456789876543210Sym3 xs0123456789876543210 ys0123456789876543210 y0123456789876543210 where- Lambda_0123456789876543210Sym3 xs0123456789876543210 ys0123456789876543210 y0123456789876543210 = Lambda_0123456789876543210 xs0123456789876543210 ys0123456789876543210 y0123456789876543210- type family Case_0123456789876543210 arg_0123456789876543210 xs ys t where- Case_0123456789876543210 arg_0123456789876543210 xs ys '(x,- y) = Apply ReturnSym0 (Apply (Apply Tuple2Sym0 x) y)- type family Lambda_0123456789876543210 xs ys arg_0123456789876543210 where- Lambda_0123456789876543210 xs ys arg_0123456789876543210 = Case_0123456789876543210 arg_0123456789876543210 xs ys arg_0123456789876543210- data Lambda_0123456789876543210Sym0 xs0123456789876543210- where- Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) =>- Lambda_0123456789876543210Sym0 xs0123456789876543210- type instance Apply Lambda_0123456789876543210Sym0 xs0123456789876543210 = Lambda_0123456789876543210Sym1 xs0123456789876543210- instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym0KindInference) ())- data Lambda_0123456789876543210Sym1 xs0123456789876543210 ys0123456789876543210- where- Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 xs0123456789876543210) arg) (Lambda_0123456789876543210Sym2 xs0123456789876543210 arg) =>- Lambda_0123456789876543210Sym1 xs0123456789876543210 ys0123456789876543210- type instance Apply (Lambda_0123456789876543210Sym1 xs0123456789876543210) ys0123456789876543210 = Lambda_0123456789876543210Sym2 xs0123456789876543210 ys0123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 xs0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym1KindInference) ())- data Lambda_0123456789876543210Sym2 xs0123456789876543210 ys0123456789876543210 arg_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 xs0123456789876543210 ys0123456789876543210) arg) (Lambda_0123456789876543210Sym3 xs0123456789876543210 ys0123456789876543210 arg) =>- Lambda_0123456789876543210Sym2 xs0123456789876543210 ys0123456789876543210 arg_01234567898765432100123456789876543210- type instance Apply (Lambda_0123456789876543210Sym2 xs0123456789876543210 ys0123456789876543210) arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210 xs0123456789876543210 ys0123456789876543210 arg_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 xs0123456789876543210 ys0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym2KindInference) ())- type family Lambda_0123456789876543210Sym3 xs0123456789876543210 ys0123456789876543210 arg_01234567898765432100123456789876543210 where- Lambda_0123456789876543210Sym3 xs0123456789876543210 ys0123456789876543210 arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210 xs0123456789876543210 ys0123456789876543210 arg_01234567898765432100123456789876543210- type family Lambda_0123456789876543210 a ma mb b where- Lambda_0123456789876543210 a ma mb b = Apply (Apply (>>@#@$) (Apply GuardSym0 b)) (Apply ReturnSym0 a)- data Lambda_0123456789876543210Sym0 a0123456789876543210- where- Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) =>- Lambda_0123456789876543210Sym0 a0123456789876543210- type instance Apply Lambda_0123456789876543210Sym0 a0123456789876543210 = Lambda_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym0KindInference) ())- data Lambda_0123456789876543210Sym1 a0123456789876543210 ma0123456789876543210- where- Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 a0123456789876543210) arg) (Lambda_0123456789876543210Sym2 a0123456789876543210 arg) =>- Lambda_0123456789876543210Sym1 a0123456789876543210 ma0123456789876543210- type instance Apply (Lambda_0123456789876543210Sym1 a0123456789876543210) ma0123456789876543210 = Lambda_0123456789876543210Sym2 a0123456789876543210 ma0123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym1KindInference) ())- data Lambda_0123456789876543210Sym2 a0123456789876543210 ma0123456789876543210 mb0123456789876543210- where- Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 a0123456789876543210 ma0123456789876543210) arg) (Lambda_0123456789876543210Sym3 a0123456789876543210 ma0123456789876543210 arg) =>- Lambda_0123456789876543210Sym2 a0123456789876543210 ma0123456789876543210 mb0123456789876543210- type instance Apply (Lambda_0123456789876543210Sym2 a0123456789876543210 ma0123456789876543210) mb0123456789876543210 = Lambda_0123456789876543210Sym3 a0123456789876543210 ma0123456789876543210 mb0123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 a0123456789876543210 ma0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym2KindInference) ())- data Lambda_0123456789876543210Sym3 a0123456789876543210 ma0123456789876543210 mb0123456789876543210 b0123456789876543210- where- Lambda_0123456789876543210Sym3KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym3 a0123456789876543210 ma0123456789876543210 mb0123456789876543210) arg) (Lambda_0123456789876543210Sym4 a0123456789876543210 ma0123456789876543210 mb0123456789876543210 arg) =>- Lambda_0123456789876543210Sym3 a0123456789876543210 ma0123456789876543210 mb0123456789876543210 b0123456789876543210- type instance Apply (Lambda_0123456789876543210Sym3 a0123456789876543210 ma0123456789876543210 mb0123456789876543210) b0123456789876543210 = Lambda_0123456789876543210 a0123456789876543210 ma0123456789876543210 mb0123456789876543210 b0123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym3 a0123456789876543210 ma0123456789876543210 mb0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym3KindInference) ())- type family Lambda_0123456789876543210Sym4 a0123456789876543210 ma0123456789876543210 mb0123456789876543210 b0123456789876543210 where- Lambda_0123456789876543210Sym4 a0123456789876543210 ma0123456789876543210 mb0123456789876543210 b0123456789876543210 = Lambda_0123456789876543210 a0123456789876543210 ma0123456789876543210 mb0123456789876543210 b0123456789876543210- type family Lambda_0123456789876543210 ma mb a where- Lambda_0123456789876543210 ma mb a = Apply (Apply (>>=@#@$) mb) (Apply (Apply (Apply Lambda_0123456789876543210Sym0 a) ma) mb)- data Lambda_0123456789876543210Sym0 ma0123456789876543210- where- Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) =>- Lambda_0123456789876543210Sym0 ma0123456789876543210- type instance Apply Lambda_0123456789876543210Sym0 ma0123456789876543210 = Lambda_0123456789876543210Sym1 ma0123456789876543210- instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym0KindInference) ())- data Lambda_0123456789876543210Sym1 ma0123456789876543210 mb0123456789876543210- where- Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 ma0123456789876543210) arg) (Lambda_0123456789876543210Sym2 ma0123456789876543210 arg) =>- Lambda_0123456789876543210Sym1 ma0123456789876543210 mb0123456789876543210- type instance Apply (Lambda_0123456789876543210Sym1 ma0123456789876543210) mb0123456789876543210 = Lambda_0123456789876543210Sym2 ma0123456789876543210 mb0123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 ma0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym1KindInference) ())- data Lambda_0123456789876543210Sym2 ma0123456789876543210 mb0123456789876543210 a0123456789876543210- where- Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 ma0123456789876543210 mb0123456789876543210) arg) (Lambda_0123456789876543210Sym3 ma0123456789876543210 mb0123456789876543210 arg) =>- Lambda_0123456789876543210Sym2 ma0123456789876543210 mb0123456789876543210 a0123456789876543210- type instance Apply (Lambda_0123456789876543210Sym2 ma0123456789876543210 mb0123456789876543210) a0123456789876543210 = Lambda_0123456789876543210 ma0123456789876543210 mb0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 ma0123456789876543210 mb0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym2KindInference) ())- type family Lambda_0123456789876543210Sym3 ma0123456789876543210 mb0123456789876543210 a0123456789876543210 where- Lambda_0123456789876543210Sym3 ma0123456789876543210 mb0123456789876543210 a0123456789876543210 = Lambda_0123456789876543210 ma0123456789876543210 mb0123456789876543210 a0123456789876543210- type TruesSym0 :: (~>) [Bool] [Bool]- data TruesSym0 :: (~>) [Bool] [Bool]- where- TruesSym0KindInference :: SameKind (Apply TruesSym0 arg) (TruesSym1 arg) =>- TruesSym0 a0123456789876543210- type instance Apply TruesSym0 a0123456789876543210 = Trues a0123456789876543210- instance SuppressUnusedWarnings TruesSym0 where- suppressUnusedWarnings = snd (((,) TruesSym0KindInference) ())- type TruesSym1 :: [Bool] -> [Bool]- type family TruesSym1 (a0123456789876543210 :: [Bool]) :: [Bool] where- TruesSym1 a0123456789876543210 = Trues a0123456789876543210- type CartProdSym0 :: (~>) [a] ((~>) [b] [(a, b)])- data CartProdSym0 :: (~>) [a] ((~>) [b] [(a, b)])- where- CartProdSym0KindInference :: SameKind (Apply CartProdSym0 arg) (CartProdSym1 arg) =>- CartProdSym0 a0123456789876543210- type instance Apply CartProdSym0 a0123456789876543210 = CartProdSym1 a0123456789876543210- instance SuppressUnusedWarnings CartProdSym0 where- suppressUnusedWarnings = snd (((,) CartProdSym0KindInference) ())- type CartProdSym1 :: [a] -> (~>) [b] [(a, b)]- data CartProdSym1 (a0123456789876543210 :: [a]) :: (~>) [b] [(a,- b)]- where- CartProdSym1KindInference :: SameKind (Apply (CartProdSym1 a0123456789876543210) arg) (CartProdSym2 a0123456789876543210 arg) =>- CartProdSym1 a0123456789876543210 a0123456789876543210- type instance Apply (CartProdSym1 a0123456789876543210) a0123456789876543210 = CartProd a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (CartProdSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) CartProdSym1KindInference) ())- type CartProdSym2 :: [a] -> [b] -> [(a, b)]- type family CartProdSym2 (a0123456789876543210 :: [a]) (a0123456789876543210 :: [b]) :: [(a,- b)] where- CartProdSym2 a0123456789876543210 a0123456789876543210 = CartProd a0123456789876543210 a0123456789876543210- type Zip'Sym0 :: (~>) [a] ((~>) [b] [(a, b)])- data Zip'Sym0 :: (~>) [a] ((~>) [b] [(a, b)])- where- Zip'Sym0KindInference :: SameKind (Apply Zip'Sym0 arg) (Zip'Sym1 arg) =>- Zip'Sym0 a0123456789876543210- type instance Apply Zip'Sym0 a0123456789876543210 = Zip'Sym1 a0123456789876543210- instance SuppressUnusedWarnings Zip'Sym0 where- suppressUnusedWarnings = snd (((,) Zip'Sym0KindInference) ())- type Zip'Sym1 :: [a] -> (~>) [b] [(a, b)]- data Zip'Sym1 (a0123456789876543210 :: [a]) :: (~>) [b] [(a, b)]- where- Zip'Sym1KindInference :: SameKind (Apply (Zip'Sym1 a0123456789876543210) arg) (Zip'Sym2 a0123456789876543210 arg) =>- Zip'Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (Zip'Sym1 a0123456789876543210) a0123456789876543210 = Zip' a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Zip'Sym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) Zip'Sym1KindInference) ())- type Zip'Sym2 :: [a] -> [b] -> [(a, b)]- type family Zip'Sym2 (a0123456789876543210 :: [a]) (a0123456789876543210 :: [b]) :: [(a,- b)] where- Zip'Sym2 a0123456789876543210 a0123456789876543210 = Zip' a0123456789876543210 a0123456789876543210- type BoogieSym0 :: (~>) (Maybe a) ((~>) (Maybe Bool) (Maybe a))- data BoogieSym0 :: (~>) (Maybe a) ((~>) (Maybe Bool) (Maybe a))- where- BoogieSym0KindInference :: SameKind (Apply BoogieSym0 arg) (BoogieSym1 arg) =>- BoogieSym0 a0123456789876543210- type instance Apply BoogieSym0 a0123456789876543210 = BoogieSym1 a0123456789876543210- instance SuppressUnusedWarnings BoogieSym0 where- suppressUnusedWarnings = snd (((,) BoogieSym0KindInference) ())- type BoogieSym1 :: Maybe a -> (~>) (Maybe Bool) (Maybe a)- data BoogieSym1 (a0123456789876543210 :: Maybe a) :: (~>) (Maybe Bool) (Maybe a)- where- BoogieSym1KindInference :: SameKind (Apply (BoogieSym1 a0123456789876543210) arg) (BoogieSym2 a0123456789876543210 arg) =>- BoogieSym1 a0123456789876543210 a0123456789876543210- type instance Apply (BoogieSym1 a0123456789876543210) a0123456789876543210 = Boogie a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (BoogieSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) BoogieSym1KindInference) ())- type BoogieSym2 :: Maybe a -> Maybe Bool -> Maybe a- type family BoogieSym2 (a0123456789876543210 :: Maybe a) (a0123456789876543210 :: Maybe Bool) :: Maybe a where- BoogieSym2 a0123456789876543210 a0123456789876543210 = Boogie a0123456789876543210 a0123456789876543210- type Trues :: [Bool] -> [Bool]- type family Trues (a :: [Bool]) :: [Bool] where- Trues xs = Apply (Apply (>>=@#@$) xs) (Apply Lambda_0123456789876543210Sym0 xs)- type CartProd :: [a] -> [b] -> [(a, b)]- type family CartProd (a :: [a]) (a :: [b]) :: [(a, b)] where- CartProd xs ys = Apply (Apply (>>=@#@$) xs) (Apply (Apply Lambda_0123456789876543210Sym0 xs) ys)- type Zip' :: [a] -> [b] -> [(a, b)]- type family Zip' (a :: [a]) (a :: [b]) :: [(a, b)] where- Zip' xs ys = Apply (Apply (>>=@#@$) (Apply (Apply MzipSym0 (Apply (Apply (>>=@#@$) xs) (Apply (Apply Lambda_0123456789876543210Sym0 xs) ys))) (Apply (Apply (>>=@#@$) ys) (Apply (Apply Lambda_0123456789876543210Sym0 xs) ys)))) (Apply (Apply Lambda_0123456789876543210Sym0 xs) ys)- type Boogie :: Maybe a -> Maybe Bool -> Maybe a- type family Boogie (a :: Maybe a) (a :: Maybe Bool) :: Maybe a where- Boogie ma mb = Apply (Apply (>>=@#@$) ma) (Apply (Apply Lambda_0123456789876543210Sym0 ma) mb)- sTrues ::- forall (t :: [Bool]). Sing t -> Sing (Apply TruesSym0 t :: [Bool])- sCartProd ::- forall a b (t :: [a]) (t :: [b]). Sing t- -> Sing t- -> Sing (Apply (Apply CartProdSym0 t) t :: [(a, b)])- sZip' ::- forall a b (t :: [a]) (t :: [b]). Sing t- -> Sing t -> Sing (Apply (Apply Zip'Sym0 t) t :: [(a, b)])- sBoogie ::- forall a (t :: Maybe a) (t :: Maybe Bool). Sing t- -> Sing t- -> Sing (Apply (Apply BoogieSym0 t) t :: Maybe a)- sTrues (sXs :: Sing xs)- = (applySing ((applySing ((singFun2 @(>>=@#@$)) (%>>=))) sXs))- ((singFun1 @(Apply Lambda_0123456789876543210Sym0 xs))- (\ sX- -> case sX of- (_ :: Sing x)- -> (applySing- ((applySing ((singFun2 @(>>@#@$)) (%>>)))- ((applySing ((singFun1 @GuardSym0) sGuard)) sX)))- ((applySing ((singFun1 @ReturnSym0) sReturn)) sX)))- sCartProd (sXs :: Sing xs) (sYs :: Sing ys)- = (applySing ((applySing ((singFun2 @(>>=@#@$)) (%>>=))) sXs))- ((singFun1 @(Apply (Apply Lambda_0123456789876543210Sym0 xs) ys))- (\ sX- -> case sX of- (_ :: Sing x)- -> (applySing ((applySing ((singFun2 @(>>=@#@$)) (%>>=))) sYs))- ((singFun1- @(Apply (Apply (Apply Lambda_0123456789876543210Sym0 x) xs) ys))- (\ sY- -> case sY of- (_ :: Sing y)- -> (applySing ((singFun1 @ReturnSym0) sReturn))- ((applySing- ((applySing ((singFun2 @Tuple2Sym0) STuple2)) sX))- sY)))))- sZip' (sXs :: Sing xs) (sYs :: Sing ys)- = (applySing- ((applySing ((singFun2 @(>>=@#@$)) (%>>=)))- ((applySing- ((applySing ((singFun2 @MzipSym0) sMzip))- ((applySing ((applySing ((singFun2 @(>>=@#@$)) (%>>=))) sXs))- ((singFun1 @(Apply (Apply Lambda_0123456789876543210Sym0 xs) ys))- (\ sX- -> case sX of- (_ :: Sing x)- -> (applySing ((singFun1 @ReturnSym0) sReturn)) sX)))))- ((applySing ((applySing ((singFun2 @(>>=@#@$)) (%>>=))) sYs))- ((singFun1 @(Apply (Apply Lambda_0123456789876543210Sym0 xs) ys))- (\ sY- -> case sY of- (_ :: Sing y)- -> (applySing ((singFun1 @ReturnSym0) sReturn)) sY))))))- ((singFun1 @(Apply (Apply Lambda_0123456789876543210Sym0 xs) ys))- (\ sArg_0123456789876543210- -> case sArg_0123456789876543210 of- (_ :: Sing arg_0123456789876543210)- -> (id- @(Sing (Case_0123456789876543210 arg_0123456789876543210 xs ys arg_0123456789876543210)))- (case sArg_0123456789876543210 of- STuple2 (sX :: Sing x) (sY :: Sing y)- -> (applySing ((singFun1 @ReturnSym0) sReturn))- ((applySing ((applySing ((singFun2 @Tuple2Sym0) STuple2)) sX))- sY))))- sBoogie (sMa :: Sing ma) (sMb :: Sing mb)- = (applySing ((applySing ((singFun2 @(>>=@#@$)) (%>>=))) sMa))- ((singFun1 @(Apply (Apply Lambda_0123456789876543210Sym0 ma) mb))- (\ sA- -> case sA of- (_ :: Sing a)- -> (applySing ((applySing ((singFun2 @(>>=@#@$)) (%>>=))) sMb))- ((singFun1- @(Apply (Apply (Apply Lambda_0123456789876543210Sym0 a) ma) mb))- (\ sB- -> case sB of- (_ :: Sing b)- -> (applySing- ((applySing ((singFun2 @(>>@#@$)) (%>>)))- ((applySing ((singFun1 @GuardSym0) sGuard)) sB)))- ((applySing ((singFun1 @ReturnSym0) sReturn)) sA)))))- instance SingI (TruesSym0 :: (~>) [Bool] [Bool]) where- sing = (singFun1 @TruesSym0) sTrues- instance SingI (CartProdSym0 :: (~>) [a] ((~>) [b] [(a, b)])) where- sing = (singFun2 @CartProdSym0) sCartProd- instance SingI d =>- SingI (CartProdSym1 (d :: [a]) :: (~>) [b] [(a, b)]) where- sing = (singFun1 @(CartProdSym1 (d :: [a]))) (sCartProd (sing @d))- instance SingI1 (CartProdSym1 :: [a] -> (~>) [b] [(a, b)]) where- liftSing (s :: Sing (d :: [a]))- = (singFun1 @(CartProdSym1 (d :: [a]))) (sCartProd s)- instance SingI (Zip'Sym0 :: (~>) [a] ((~>) [b] [(a, b)])) where- sing = (singFun2 @Zip'Sym0) sZip'- instance SingI d =>- SingI (Zip'Sym1 (d :: [a]) :: (~>) [b] [(a, b)]) where- sing = (singFun1 @(Zip'Sym1 (d :: [a]))) (sZip' (sing @d))- instance SingI1 (Zip'Sym1 :: [a] -> (~>) [b] [(a, b)]) where- liftSing (s :: Sing (d :: [a]))- = (singFun1 @(Zip'Sym1 (d :: [a]))) (sZip' s)- instance SingI (BoogieSym0 :: (~>) (Maybe a) ((~>) (Maybe Bool) (Maybe a))) where- sing = (singFun2 @BoogieSym0) sBoogie- instance SingI d =>- SingI (BoogieSym1 (d :: Maybe a) :: (~>) (Maybe Bool) (Maybe a)) where- sing = (singFun1 @(BoogieSym1 (d :: Maybe a))) (sBoogie (sing @d))- instance SingI1 (BoogieSym1 :: Maybe a- -> (~>) (Maybe Bool) (Maybe a)) where- liftSing (s :: Sing (d :: Maybe a))- = (singFun1 @(BoogieSym1 (d :: Maybe a))) (sBoogie s)+Singletons/T184.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| boogie :: Maybe a -> Maybe Bool -> Maybe a + boogie ma mb + = do a <- ma + b <- mb + guard b + return a + zip' :: [a] -> [b] -> [(a, b)] + zip' xs ys = [(x, y) | x <- xs | y <- ys] + cartProd :: [a] -> [b] -> [(a, b)] + cartProd xs ys = [(x, y) | x <- xs, y <- ys] + trues :: [Bool] -> [Bool] + trues xs = [x | x <- xs, x] |] + ======> + boogie :: Maybe a -> Maybe Bool -> Maybe a + boogie ma mb + = do a <- ma + b <- mb + guard b + return a + zip' :: [a] -> [b] -> [(a, b)] + zip' xs ys = [(x, y) | x <- xs | y <- ys] + cartProd :: [a] -> [b] -> [(a, b)] + cartProd xs ys = [(x, y) | x <- xs, y <- ys] + trues :: [Bool] -> [Bool] + trues xs = [x | x <- xs, x] + type family Lambda_0123456789876543210 xs x where + Lambda_0123456789876543210 xs x = Apply (Apply (>>@#@$) (Apply GuardSym0 x)) (Apply ReturnSym0 x) + data Lambda_0123456789876543210Sym0 xs0123456789876543210 + where + Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) => + Lambda_0123456789876543210Sym0 xs0123456789876543210 + type instance Apply Lambda_0123456789876543210Sym0 xs0123456789876543210 = Lambda_0123456789876543210Sym1 xs0123456789876543210 + instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym0KindInference ()) + data Lambda_0123456789876543210Sym1 xs0123456789876543210 x0123456789876543210 + where + Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 xs0123456789876543210) arg) (Lambda_0123456789876543210Sym2 xs0123456789876543210 arg) => + Lambda_0123456789876543210Sym1 xs0123456789876543210 x0123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym1 xs0123456789876543210) x0123456789876543210 = Lambda_0123456789876543210 xs0123456789876543210 x0123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 xs0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym1KindInference ()) + type family Lambda_0123456789876543210Sym2 xs0123456789876543210 x0123456789876543210 where + Lambda_0123456789876543210Sym2 xs0123456789876543210 x0123456789876543210 = Lambda_0123456789876543210 xs0123456789876543210 x0123456789876543210 + type family Lambda_0123456789876543210 x xs ys y where + Lambda_0123456789876543210 x xs ys y = Apply ReturnSym0 (Apply (Apply Tuple2Sym0 x) y) + data Lambda_0123456789876543210Sym0 x0123456789876543210 + where + Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) => + Lambda_0123456789876543210Sym0 x0123456789876543210 + type instance Apply Lambda_0123456789876543210Sym0 x0123456789876543210 = Lambda_0123456789876543210Sym1 x0123456789876543210 + instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym0KindInference ()) + data Lambda_0123456789876543210Sym1 x0123456789876543210 xs0123456789876543210 + where + Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) arg) (Lambda_0123456789876543210Sym2 x0123456789876543210 arg) => + Lambda_0123456789876543210Sym1 x0123456789876543210 xs0123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym1 x0123456789876543210) xs0123456789876543210 = Lambda_0123456789876543210Sym2 x0123456789876543210 xs0123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 x0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym1KindInference ()) + data Lambda_0123456789876543210Sym2 x0123456789876543210 xs0123456789876543210 ys0123456789876543210 + where + Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 x0123456789876543210 xs0123456789876543210) arg) (Lambda_0123456789876543210Sym3 x0123456789876543210 xs0123456789876543210 arg) => + Lambda_0123456789876543210Sym2 x0123456789876543210 xs0123456789876543210 ys0123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym2 x0123456789876543210 xs0123456789876543210) ys0123456789876543210 = Lambda_0123456789876543210Sym3 x0123456789876543210 xs0123456789876543210 ys0123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 x0123456789876543210 xs0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym2KindInference ()) + data Lambda_0123456789876543210Sym3 x0123456789876543210 xs0123456789876543210 ys0123456789876543210 y0123456789876543210 + where + Lambda_0123456789876543210Sym3KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym3 x0123456789876543210 xs0123456789876543210 ys0123456789876543210) arg) (Lambda_0123456789876543210Sym4 x0123456789876543210 xs0123456789876543210 ys0123456789876543210 arg) => + Lambda_0123456789876543210Sym3 x0123456789876543210 xs0123456789876543210 ys0123456789876543210 y0123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym3 x0123456789876543210 xs0123456789876543210 ys0123456789876543210) y0123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 xs0123456789876543210 ys0123456789876543210 y0123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym3 x0123456789876543210 xs0123456789876543210 ys0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym3KindInference ()) + type family Lambda_0123456789876543210Sym4 x0123456789876543210 xs0123456789876543210 ys0123456789876543210 y0123456789876543210 where + Lambda_0123456789876543210Sym4 x0123456789876543210 xs0123456789876543210 ys0123456789876543210 y0123456789876543210 = Lambda_0123456789876543210 x0123456789876543210 xs0123456789876543210 ys0123456789876543210 y0123456789876543210 + type family Lambda_0123456789876543210 xs ys x where + Lambda_0123456789876543210 xs ys x = Apply (Apply (>>=@#@$) ys) (Apply (Apply (Apply Lambda_0123456789876543210Sym0 x) xs) ys) + data Lambda_0123456789876543210Sym0 xs0123456789876543210 + where + Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) => + Lambda_0123456789876543210Sym0 xs0123456789876543210 + type instance Apply Lambda_0123456789876543210Sym0 xs0123456789876543210 = Lambda_0123456789876543210Sym1 xs0123456789876543210 + instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym0KindInference ()) + data Lambda_0123456789876543210Sym1 xs0123456789876543210 ys0123456789876543210 + where + Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 xs0123456789876543210) arg) (Lambda_0123456789876543210Sym2 xs0123456789876543210 arg) => + Lambda_0123456789876543210Sym1 xs0123456789876543210 ys0123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym1 xs0123456789876543210) ys0123456789876543210 = Lambda_0123456789876543210Sym2 xs0123456789876543210 ys0123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 xs0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym1KindInference ()) + data Lambda_0123456789876543210Sym2 xs0123456789876543210 ys0123456789876543210 x0123456789876543210 + where + Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 xs0123456789876543210 ys0123456789876543210) arg) (Lambda_0123456789876543210Sym3 xs0123456789876543210 ys0123456789876543210 arg) => + Lambda_0123456789876543210Sym2 xs0123456789876543210 ys0123456789876543210 x0123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym2 xs0123456789876543210 ys0123456789876543210) x0123456789876543210 = Lambda_0123456789876543210 xs0123456789876543210 ys0123456789876543210 x0123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 xs0123456789876543210 ys0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym2KindInference ()) + type family Lambda_0123456789876543210Sym3 xs0123456789876543210 ys0123456789876543210 x0123456789876543210 where + Lambda_0123456789876543210Sym3 xs0123456789876543210 ys0123456789876543210 x0123456789876543210 = Lambda_0123456789876543210 xs0123456789876543210 ys0123456789876543210 x0123456789876543210 + type family Lambda_0123456789876543210 xs ys x where + Lambda_0123456789876543210 xs ys x = Apply ReturnSym0 x + data Lambda_0123456789876543210Sym0 xs0123456789876543210 + where + Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) => + Lambda_0123456789876543210Sym0 xs0123456789876543210 + type instance Apply Lambda_0123456789876543210Sym0 xs0123456789876543210 = Lambda_0123456789876543210Sym1 xs0123456789876543210 + instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym0KindInference ()) + data Lambda_0123456789876543210Sym1 xs0123456789876543210 ys0123456789876543210 + where + Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 xs0123456789876543210) arg) (Lambda_0123456789876543210Sym2 xs0123456789876543210 arg) => + Lambda_0123456789876543210Sym1 xs0123456789876543210 ys0123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym1 xs0123456789876543210) ys0123456789876543210 = Lambda_0123456789876543210Sym2 xs0123456789876543210 ys0123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 xs0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym1KindInference ()) + data Lambda_0123456789876543210Sym2 xs0123456789876543210 ys0123456789876543210 x0123456789876543210 + where + Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 xs0123456789876543210 ys0123456789876543210) arg) (Lambda_0123456789876543210Sym3 xs0123456789876543210 ys0123456789876543210 arg) => + Lambda_0123456789876543210Sym2 xs0123456789876543210 ys0123456789876543210 x0123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym2 xs0123456789876543210 ys0123456789876543210) x0123456789876543210 = Lambda_0123456789876543210 xs0123456789876543210 ys0123456789876543210 x0123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 xs0123456789876543210 ys0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym2KindInference ()) + type family Lambda_0123456789876543210Sym3 xs0123456789876543210 ys0123456789876543210 x0123456789876543210 where + Lambda_0123456789876543210Sym3 xs0123456789876543210 ys0123456789876543210 x0123456789876543210 = Lambda_0123456789876543210 xs0123456789876543210 ys0123456789876543210 x0123456789876543210 + type family Lambda_0123456789876543210 xs ys y where + Lambda_0123456789876543210 xs ys y = Apply ReturnSym0 y + data Lambda_0123456789876543210Sym0 xs0123456789876543210 + where + Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) => + Lambda_0123456789876543210Sym0 xs0123456789876543210 + type instance Apply Lambda_0123456789876543210Sym0 xs0123456789876543210 = Lambda_0123456789876543210Sym1 xs0123456789876543210 + instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym0KindInference ()) + data Lambda_0123456789876543210Sym1 xs0123456789876543210 ys0123456789876543210 + where + Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 xs0123456789876543210) arg) (Lambda_0123456789876543210Sym2 xs0123456789876543210 arg) => + Lambda_0123456789876543210Sym1 xs0123456789876543210 ys0123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym1 xs0123456789876543210) ys0123456789876543210 = Lambda_0123456789876543210Sym2 xs0123456789876543210 ys0123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 xs0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym1KindInference ()) + data Lambda_0123456789876543210Sym2 xs0123456789876543210 ys0123456789876543210 y0123456789876543210 + where + Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 xs0123456789876543210 ys0123456789876543210) arg) (Lambda_0123456789876543210Sym3 xs0123456789876543210 ys0123456789876543210 arg) => + Lambda_0123456789876543210Sym2 xs0123456789876543210 ys0123456789876543210 y0123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym2 xs0123456789876543210 ys0123456789876543210) y0123456789876543210 = Lambda_0123456789876543210 xs0123456789876543210 ys0123456789876543210 y0123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 xs0123456789876543210 ys0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym2KindInference ()) + type family Lambda_0123456789876543210Sym3 xs0123456789876543210 ys0123456789876543210 y0123456789876543210 where + Lambda_0123456789876543210Sym3 xs0123456789876543210 ys0123456789876543210 y0123456789876543210 = Lambda_0123456789876543210 xs0123456789876543210 ys0123456789876543210 y0123456789876543210 + type family Case_0123456789876543210 arg_0123456789876543210 xs ys t where + Case_0123456789876543210 arg_0123456789876543210 xs ys '(x, + y) = Apply ReturnSym0 (Apply (Apply Tuple2Sym0 x) y) + type family Lambda_0123456789876543210 xs ys arg_0123456789876543210 where + Lambda_0123456789876543210 xs ys arg_0123456789876543210 = Case_0123456789876543210 arg_0123456789876543210 xs ys arg_0123456789876543210 + data Lambda_0123456789876543210Sym0 xs0123456789876543210 + where + Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) => + Lambda_0123456789876543210Sym0 xs0123456789876543210 + type instance Apply Lambda_0123456789876543210Sym0 xs0123456789876543210 = Lambda_0123456789876543210Sym1 xs0123456789876543210 + instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym0KindInference ()) + data Lambda_0123456789876543210Sym1 xs0123456789876543210 ys0123456789876543210 + where + Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 xs0123456789876543210) arg) (Lambda_0123456789876543210Sym2 xs0123456789876543210 arg) => + Lambda_0123456789876543210Sym1 xs0123456789876543210 ys0123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym1 xs0123456789876543210) ys0123456789876543210 = Lambda_0123456789876543210Sym2 xs0123456789876543210 ys0123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 xs0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym1KindInference ()) + data Lambda_0123456789876543210Sym2 xs0123456789876543210 ys0123456789876543210 arg_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 xs0123456789876543210 ys0123456789876543210) arg) (Lambda_0123456789876543210Sym3 xs0123456789876543210 ys0123456789876543210 arg) => + Lambda_0123456789876543210Sym2 xs0123456789876543210 ys0123456789876543210 arg_01234567898765432100123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym2 xs0123456789876543210 ys0123456789876543210) arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210 xs0123456789876543210 ys0123456789876543210 arg_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 xs0123456789876543210 ys0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym2KindInference ()) + type family Lambda_0123456789876543210Sym3 xs0123456789876543210 ys0123456789876543210 arg_01234567898765432100123456789876543210 where + Lambda_0123456789876543210Sym3 xs0123456789876543210 ys0123456789876543210 arg_01234567898765432100123456789876543210 = Lambda_0123456789876543210 xs0123456789876543210 ys0123456789876543210 arg_01234567898765432100123456789876543210 + type family Lambda_0123456789876543210 a ma mb b where + Lambda_0123456789876543210 a ma mb b = Apply (Apply (>>@#@$) (Apply GuardSym0 b)) (Apply ReturnSym0 a) + data Lambda_0123456789876543210Sym0 a0123456789876543210 + where + Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) => + Lambda_0123456789876543210Sym0 a0123456789876543210 + type instance Apply Lambda_0123456789876543210Sym0 a0123456789876543210 = Lambda_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym0KindInference ()) + data Lambda_0123456789876543210Sym1 a0123456789876543210 ma0123456789876543210 + where + Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 a0123456789876543210) arg) (Lambda_0123456789876543210Sym2 a0123456789876543210 arg) => + Lambda_0123456789876543210Sym1 a0123456789876543210 ma0123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym1 a0123456789876543210) ma0123456789876543210 = Lambda_0123456789876543210Sym2 a0123456789876543210 ma0123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym1KindInference ()) + data Lambda_0123456789876543210Sym2 a0123456789876543210 ma0123456789876543210 mb0123456789876543210 + where + Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 a0123456789876543210 ma0123456789876543210) arg) (Lambda_0123456789876543210Sym3 a0123456789876543210 ma0123456789876543210 arg) => + Lambda_0123456789876543210Sym2 a0123456789876543210 ma0123456789876543210 mb0123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym2 a0123456789876543210 ma0123456789876543210) mb0123456789876543210 = Lambda_0123456789876543210Sym3 a0123456789876543210 ma0123456789876543210 mb0123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 a0123456789876543210 ma0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym2KindInference ()) + data Lambda_0123456789876543210Sym3 a0123456789876543210 ma0123456789876543210 mb0123456789876543210 b0123456789876543210 + where + Lambda_0123456789876543210Sym3KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym3 a0123456789876543210 ma0123456789876543210 mb0123456789876543210) arg) (Lambda_0123456789876543210Sym4 a0123456789876543210 ma0123456789876543210 mb0123456789876543210 arg) => + Lambda_0123456789876543210Sym3 a0123456789876543210 ma0123456789876543210 mb0123456789876543210 b0123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym3 a0123456789876543210 ma0123456789876543210 mb0123456789876543210) b0123456789876543210 = Lambda_0123456789876543210 a0123456789876543210 ma0123456789876543210 mb0123456789876543210 b0123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym3 a0123456789876543210 ma0123456789876543210 mb0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym3KindInference ()) + type family Lambda_0123456789876543210Sym4 a0123456789876543210 ma0123456789876543210 mb0123456789876543210 b0123456789876543210 where + Lambda_0123456789876543210Sym4 a0123456789876543210 ma0123456789876543210 mb0123456789876543210 b0123456789876543210 = Lambda_0123456789876543210 a0123456789876543210 ma0123456789876543210 mb0123456789876543210 b0123456789876543210 + type family Lambda_0123456789876543210 ma mb a where + Lambda_0123456789876543210 ma mb a = Apply (Apply (>>=@#@$) mb) (Apply (Apply (Apply Lambda_0123456789876543210Sym0 a) ma) mb) + data Lambda_0123456789876543210Sym0 ma0123456789876543210 + where + Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) => + Lambda_0123456789876543210Sym0 ma0123456789876543210 + type instance Apply Lambda_0123456789876543210Sym0 ma0123456789876543210 = Lambda_0123456789876543210Sym1 ma0123456789876543210 + instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym0KindInference ()) + data Lambda_0123456789876543210Sym1 ma0123456789876543210 mb0123456789876543210 + where + Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 ma0123456789876543210) arg) (Lambda_0123456789876543210Sym2 ma0123456789876543210 arg) => + Lambda_0123456789876543210Sym1 ma0123456789876543210 mb0123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym1 ma0123456789876543210) mb0123456789876543210 = Lambda_0123456789876543210Sym2 ma0123456789876543210 mb0123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 ma0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym1KindInference ()) + data Lambda_0123456789876543210Sym2 ma0123456789876543210 mb0123456789876543210 a0123456789876543210 + where + Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 ma0123456789876543210 mb0123456789876543210) arg) (Lambda_0123456789876543210Sym3 ma0123456789876543210 mb0123456789876543210 arg) => + Lambda_0123456789876543210Sym2 ma0123456789876543210 mb0123456789876543210 a0123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym2 ma0123456789876543210 mb0123456789876543210) a0123456789876543210 = Lambda_0123456789876543210 ma0123456789876543210 mb0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 ma0123456789876543210 mb0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym2KindInference ()) + type family Lambda_0123456789876543210Sym3 ma0123456789876543210 mb0123456789876543210 a0123456789876543210 where + Lambda_0123456789876543210Sym3 ma0123456789876543210 mb0123456789876543210 a0123456789876543210 = Lambda_0123456789876543210 ma0123456789876543210 mb0123456789876543210 a0123456789876543210 + type TruesSym0 :: (~>) [Bool] [Bool] + data TruesSym0 :: (~>) [Bool] [Bool] + where + TruesSym0KindInference :: SameKind (Apply TruesSym0 arg) (TruesSym1 arg) => + TruesSym0 a0123456789876543210 + type instance Apply TruesSym0 a0123456789876543210 = Trues a0123456789876543210 + instance SuppressUnusedWarnings TruesSym0 where + suppressUnusedWarnings = snd ((,) TruesSym0KindInference ()) + type TruesSym1 :: [Bool] -> [Bool] + type family TruesSym1 (a0123456789876543210 :: [Bool]) :: [Bool] where + TruesSym1 a0123456789876543210 = Trues a0123456789876543210 + type CartProdSym0 :: (~>) [a] ((~>) [b] [(a, b)]) + data CartProdSym0 :: (~>) [a] ((~>) [b] [(a, b)]) + where + CartProdSym0KindInference :: SameKind (Apply CartProdSym0 arg) (CartProdSym1 arg) => + CartProdSym0 a0123456789876543210 + type instance Apply CartProdSym0 a0123456789876543210 = CartProdSym1 a0123456789876543210 + instance SuppressUnusedWarnings CartProdSym0 where + suppressUnusedWarnings = snd ((,) CartProdSym0KindInference ()) + type CartProdSym1 :: [a] -> (~>) [b] [(a, b)] + data CartProdSym1 (a0123456789876543210 :: [a]) :: (~>) [b] [(a, + b)] + where + CartProdSym1KindInference :: SameKind (Apply (CartProdSym1 a0123456789876543210) arg) (CartProdSym2 a0123456789876543210 arg) => + CartProdSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (CartProdSym1 a0123456789876543210) a0123456789876543210 = CartProd a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (CartProdSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) CartProdSym1KindInference ()) + type CartProdSym2 :: [a] -> [b] -> [(a, b)] + type family CartProdSym2 (a0123456789876543210 :: [a]) (a0123456789876543210 :: [b]) :: [(a, + b)] where + CartProdSym2 a0123456789876543210 a0123456789876543210 = CartProd a0123456789876543210 a0123456789876543210 + type Zip'Sym0 :: (~>) [a] ((~>) [b] [(a, b)]) + data Zip'Sym0 :: (~>) [a] ((~>) [b] [(a, b)]) + where + Zip'Sym0KindInference :: SameKind (Apply Zip'Sym0 arg) (Zip'Sym1 arg) => + Zip'Sym0 a0123456789876543210 + type instance Apply Zip'Sym0 a0123456789876543210 = Zip'Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Zip'Sym0 where + suppressUnusedWarnings = snd ((,) Zip'Sym0KindInference ()) + type Zip'Sym1 :: [a] -> (~>) [b] [(a, b)] + data Zip'Sym1 (a0123456789876543210 :: [a]) :: (~>) [b] [(a, b)] + where + Zip'Sym1KindInference :: SameKind (Apply (Zip'Sym1 a0123456789876543210) arg) (Zip'Sym2 a0123456789876543210 arg) => + Zip'Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (Zip'Sym1 a0123456789876543210) a0123456789876543210 = Zip' a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Zip'Sym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) Zip'Sym1KindInference ()) + type Zip'Sym2 :: [a] -> [b] -> [(a, b)] + type family Zip'Sym2 (a0123456789876543210 :: [a]) (a0123456789876543210 :: [b]) :: [(a, + b)] where + Zip'Sym2 a0123456789876543210 a0123456789876543210 = Zip' a0123456789876543210 a0123456789876543210 + type BoogieSym0 :: (~>) (Maybe a) ((~>) (Maybe Bool) (Maybe a)) + data BoogieSym0 :: (~>) (Maybe a) ((~>) (Maybe Bool) (Maybe a)) + where + BoogieSym0KindInference :: SameKind (Apply BoogieSym0 arg) (BoogieSym1 arg) => + BoogieSym0 a0123456789876543210 + type instance Apply BoogieSym0 a0123456789876543210 = BoogieSym1 a0123456789876543210 + instance SuppressUnusedWarnings BoogieSym0 where + suppressUnusedWarnings = snd ((,) BoogieSym0KindInference ()) + type BoogieSym1 :: Maybe a -> (~>) (Maybe Bool) (Maybe a) + data BoogieSym1 (a0123456789876543210 :: Maybe a) :: (~>) (Maybe Bool) (Maybe a) + where + BoogieSym1KindInference :: SameKind (Apply (BoogieSym1 a0123456789876543210) arg) (BoogieSym2 a0123456789876543210 arg) => + BoogieSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (BoogieSym1 a0123456789876543210) a0123456789876543210 = Boogie a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (BoogieSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) BoogieSym1KindInference ()) + type BoogieSym2 :: Maybe a -> Maybe Bool -> Maybe a + type family BoogieSym2 (a0123456789876543210 :: Maybe a) (a0123456789876543210 :: Maybe Bool) :: Maybe a where + BoogieSym2 a0123456789876543210 a0123456789876543210 = Boogie a0123456789876543210 a0123456789876543210 + type Trues :: [Bool] -> [Bool] + type family Trues (a :: [Bool]) :: [Bool] where + Trues xs = Apply (Apply (>>=@#@$) xs) (Apply Lambda_0123456789876543210Sym0 xs) + type CartProd :: [a] -> [b] -> [(a, b)] + type family CartProd (a :: [a]) (a :: [b]) :: [(a, b)] where + CartProd xs ys = Apply (Apply (>>=@#@$) xs) (Apply (Apply Lambda_0123456789876543210Sym0 xs) ys) + type Zip' :: [a] -> [b] -> [(a, b)] + type family Zip' (a :: [a]) (a :: [b]) :: [(a, b)] where + Zip' xs ys = Apply (Apply (>>=@#@$) (Apply (Apply MzipSym0 (Apply (Apply (>>=@#@$) xs) (Apply (Apply Lambda_0123456789876543210Sym0 xs) ys))) (Apply (Apply (>>=@#@$) ys) (Apply (Apply Lambda_0123456789876543210Sym0 xs) ys)))) (Apply (Apply Lambda_0123456789876543210Sym0 xs) ys) + type Boogie :: Maybe a -> Maybe Bool -> Maybe a + type family Boogie (a :: Maybe a) (a :: Maybe Bool) :: Maybe a where + Boogie ma mb = Apply (Apply (>>=@#@$) ma) (Apply (Apply Lambda_0123456789876543210Sym0 ma) mb) + sTrues :: + (forall (t :: [Bool]). + Sing t -> Sing (Apply TruesSym0 t :: [Bool]) :: Type) + sCartProd :: + (forall (t :: [a]) (t :: [b]). + Sing t + -> Sing t + -> Sing (Apply (Apply CartProdSym0 t) t :: [(a, b)]) :: Type) + sZip' :: + (forall (t :: [a]) (t :: [b]). + Sing t + -> Sing t -> Sing (Apply (Apply Zip'Sym0 t) t :: [(a, b)]) :: Type) + sBoogie :: + (forall (t :: Maybe a) (t :: Maybe Bool). + Sing t + -> Sing t + -> Sing (Apply (Apply BoogieSym0 t) t :: Maybe a) :: Type) + sTrues (sXs :: Sing xs) + = applySing + (applySing (singFun2 @(>>=@#@$) (%>>=)) sXs) + (singFun1 + @(Apply Lambda_0123456789876543210Sym0 xs) + (\ sX + -> case sX of + (_ :: Sing x) + -> applySing + (applySing + (singFun2 @(>>@#@$) (%>>)) + (applySing (singFun1 @GuardSym0 sGuard) sX)) + (applySing (singFun1 @ReturnSym0 sReturn) sX))) + sCartProd (sXs :: Sing xs) (sYs :: Sing ys) + = applySing + (applySing (singFun2 @(>>=@#@$) (%>>=)) sXs) + (singFun1 + @(Apply (Apply Lambda_0123456789876543210Sym0 xs) ys) + (\ sX + -> case sX of + (_ :: Sing x) + -> applySing + (applySing (singFun2 @(>>=@#@$) (%>>=)) sYs) + (singFun1 + @(Apply (Apply (Apply Lambda_0123456789876543210Sym0 x) xs) ys) + (\ sY + -> case sY of + (_ :: Sing y) + -> applySing + (singFun1 @ReturnSym0 sReturn) + (applySing + (applySing (singFun2 @Tuple2Sym0 STuple2) sX) + sY))))) + sZip' (sXs :: Sing xs) (sYs :: Sing ys) + = applySing + (applySing + (singFun2 @(>>=@#@$) (%>>=)) + (applySing + (applySing + (singFun2 @MzipSym0 sMzip) + (applySing + (applySing (singFun2 @(>>=@#@$) (%>>=)) sXs) + (singFun1 + @(Apply (Apply Lambda_0123456789876543210Sym0 xs) ys) + (\ sX + -> case sX of + (_ :: Sing x) -> applySing (singFun1 @ReturnSym0 sReturn) sX)))) + (applySing + (applySing (singFun2 @(>>=@#@$) (%>>=)) sYs) + (singFun1 + @(Apply (Apply Lambda_0123456789876543210Sym0 xs) ys) + (\ sY + -> case sY of + (_ :: Sing y) -> applySing (singFun1 @ReturnSym0 sReturn) sY))))) + (singFun1 + @(Apply (Apply Lambda_0123456789876543210Sym0 xs) ys) + (\ sArg_0123456789876543210 + -> case sArg_0123456789876543210 of + (_ :: Sing arg_0123456789876543210) + -> id + @(Sing (Case_0123456789876543210 arg_0123456789876543210 xs ys arg_0123456789876543210)) + (case sArg_0123456789876543210 of + STuple2 (sX :: Sing x) (sY :: Sing y) + -> applySing + (singFun1 @ReturnSym0 sReturn) + (applySing + (applySing (singFun2 @Tuple2Sym0 STuple2) sX) sY)))) + sBoogie (sMa :: Sing ma) (sMb :: Sing mb) + = applySing + (applySing (singFun2 @(>>=@#@$) (%>>=)) sMa) + (singFun1 + @(Apply (Apply Lambda_0123456789876543210Sym0 ma) mb) + (\ sA + -> case sA of + (_ :: Sing a) + -> applySing + (applySing (singFun2 @(>>=@#@$) (%>>=)) sMb) + (singFun1 + @(Apply (Apply (Apply Lambda_0123456789876543210Sym0 a) ma) mb) + (\ sB + -> case sB of + (_ :: Sing b) + -> applySing + (applySing + (singFun2 @(>>@#@$) (%>>)) + (applySing (singFun1 @GuardSym0 sGuard) sB)) + (applySing (singFun1 @ReturnSym0 sReturn) sA))))) + instance SingI (TruesSym0 :: (~>) [Bool] [Bool]) where + sing = singFun1 @TruesSym0 sTrues + instance SingI (CartProdSym0 :: (~>) [a] ((~>) [b] [(a, b)])) where + sing = singFun2 @CartProdSym0 sCartProd + instance SingI d => + SingI (CartProdSym1 (d :: [a]) :: (~>) [b] [(a, b)]) where + sing = singFun1 @(CartProdSym1 (d :: [a])) (sCartProd (sing @d)) + instance SingI1 (CartProdSym1 :: [a] -> (~>) [b] [(a, b)]) where + liftSing (s :: Sing (d :: [a])) + = singFun1 @(CartProdSym1 (d :: [a])) (sCartProd s) + instance SingI (Zip'Sym0 :: (~>) [a] ((~>) [b] [(a, b)])) where + sing = singFun2 @Zip'Sym0 sZip' + instance SingI d => + SingI (Zip'Sym1 (d :: [a]) :: (~>) [b] [(a, b)]) where + sing = singFun1 @(Zip'Sym1 (d :: [a])) (sZip' (sing @d)) + instance SingI1 (Zip'Sym1 :: [a] -> (~>) [b] [(a, b)]) where + liftSing (s :: Sing (d :: [a])) + = singFun1 @(Zip'Sym1 (d :: [a])) (sZip' s) + instance SingI (BoogieSym0 :: (~>) (Maybe a) ((~>) (Maybe Bool) (Maybe a))) where + sing = singFun2 @BoogieSym0 sBoogie + instance SingI d => + SingI (BoogieSym1 (d :: Maybe a) :: (~>) (Maybe Bool) (Maybe a)) where + sing = singFun1 @(BoogieSym1 (d :: Maybe a)) (sBoogie (sing @d)) + instance SingI1 (BoogieSym1 :: Maybe a + -> (~>) (Maybe Bool) (Maybe a)) where + liftSing (s :: Sing (d :: Maybe a)) + = singFun1 @(BoogieSym1 (d :: Maybe a)) (sBoogie s)
tests/compile-and-dump/Singletons/T184.hs view
@@ -1,27 +1,27 @@-{-# LANGUAGE ParallelListComp #-}--module T184 where--import Control.Monad-import Control.Monad.Singletons-import Control.Monad.Zip.Singletons-import Data.Singletons.TH-import Prelude.Singletons--$(singletons [d|- boogie :: Maybe a -> Maybe Bool -> Maybe a- boogie ma mb = do- a <- ma- b <- mb- guard b- return a-- zip' :: [a] -> [b] -> [(a, b)]- zip' xs ys = [(x, y) | x <- xs | y <- ys]-- cartProd :: [a] -> [b] -> [(a, b)]- cartProd xs ys = [(x, y) | x <- xs, y <- ys]-- trues :: [Bool] -> [Bool]- trues xs = [x | x <- xs, x]- |])+{-# LANGUAGE ParallelListComp #-} + +module T184 where + +import Control.Monad +import Control.Monad.Singletons +import Control.Monad.Zip.Singletons +import Data.Singletons.TH +import Prelude.Singletons + +$(singletons [d| + boogie :: Maybe a -> Maybe Bool -> Maybe a + boogie ma mb = do + a <- ma + b <- mb + guard b + return a + + zip' :: [a] -> [b] -> [(a, b)] + zip' xs ys = [(x, y) | x <- xs | y <- ys] + + cartProd :: [a] -> [b] -> [(a, b)] + cartProd xs ys = [(x, y) | x <- xs, y <- ys] + + trues :: [Bool] -> [Bool] + trues xs = [x | x <- xs, x] + |])
tests/compile-and-dump/Singletons/T187.golden view
@@ -1,93 +1,93 @@-Singletons/T187.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| data Empty- - deriving instance Ord Empty- deriving instance Eq Empty |]- ======>- data Empty- deriving instance Eq Empty- deriving instance Ord Empty- type TFHelper_0123456789876543210 :: Empty -> Empty -> Bool- type family TFHelper_0123456789876543210 (a :: Empty) (a :: Empty) :: Bool where- TFHelper_0123456789876543210 _ _ = TrueSym0- type TFHelper_0123456789876543210Sym0 :: (~>) Empty ((~>) Empty Bool)- data TFHelper_0123456789876543210Sym0 :: (~>) Empty ((~>) Empty Bool)- where- TFHelper_0123456789876543210Sym0KindInference :: SameKind (Apply TFHelper_0123456789876543210Sym0 arg) (TFHelper_0123456789876543210Sym1 arg) =>- TFHelper_0123456789876543210Sym0 a0123456789876543210- type instance Apply TFHelper_0123456789876543210Sym0 a0123456789876543210 = TFHelper_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings TFHelper_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) TFHelper_0123456789876543210Sym0KindInference) ())- type TFHelper_0123456789876543210Sym1 :: Empty -> (~>) Empty Bool- data TFHelper_0123456789876543210Sym1 (a0123456789876543210 :: Empty) :: (~>) Empty Bool- where- TFHelper_0123456789876543210Sym1KindInference :: SameKind (Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) arg) (TFHelper_0123456789876543210Sym2 a0123456789876543210 arg) =>- TFHelper_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (TFHelper_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) TFHelper_0123456789876543210Sym1KindInference) ())- type TFHelper_0123456789876543210Sym2 :: Empty -> Empty -> Bool- type family TFHelper_0123456789876543210Sym2 (a0123456789876543210 :: Empty) (a0123456789876543210 :: Empty) :: Bool where- TFHelper_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210- instance PEq Empty where- type (==) a a = Apply (Apply TFHelper_0123456789876543210Sym0 a) a- type Compare_0123456789876543210 :: Empty -> Empty -> Ordering- type family Compare_0123456789876543210 (a :: Empty) (a :: Empty) :: Ordering where- Compare_0123456789876543210 _ _ = EQSym0- type Compare_0123456789876543210Sym0 :: (~>) Empty ((~>) Empty Ordering)- data Compare_0123456789876543210Sym0 :: (~>) Empty ((~>) Empty Ordering)- where- Compare_0123456789876543210Sym0KindInference :: SameKind (Apply Compare_0123456789876543210Sym0 arg) (Compare_0123456789876543210Sym1 arg) =>- Compare_0123456789876543210Sym0 a0123456789876543210- type instance Apply Compare_0123456789876543210Sym0 a0123456789876543210 = Compare_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings Compare_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Compare_0123456789876543210Sym0KindInference) ())- type Compare_0123456789876543210Sym1 :: Empty- -> (~>) Empty Ordering- data Compare_0123456789876543210Sym1 (a0123456789876543210 :: Empty) :: (~>) Empty Ordering- where- Compare_0123456789876543210Sym1KindInference :: SameKind (Apply (Compare_0123456789876543210Sym1 a0123456789876543210) arg) (Compare_0123456789876543210Sym2 a0123456789876543210 arg) =>- Compare_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (Compare_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Compare_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Compare_0123456789876543210Sym1KindInference) ())- type Compare_0123456789876543210Sym2 :: Empty -> Empty -> Ordering- type family Compare_0123456789876543210Sym2 (a0123456789876543210 :: Empty) (a0123456789876543210 :: Empty) :: Ordering where- Compare_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210- instance POrd Empty where- type Compare a a = Apply (Apply Compare_0123456789876543210Sym0 a) a- data SEmpty :: Empty -> Type- type instance Sing @Empty = SEmpty- instance SingKind Empty where- type Demote Empty = Empty- fromSing x = case x of {}- toSing x = SomeSing (case x of {})- instance SEq Empty where- (%==) ::- forall (t1 :: Empty) (t2 :: Empty). Sing t1- -> Sing t2- -> Sing (Apply (Apply ((==@#@$) :: TyFun Empty ((~>) Empty Bool)- -> Type) t1) t2)- (%==) _ _ = STrue- instance SOrd Empty where- sCompare ::- forall (t1 :: Empty) (t2 :: Empty). Sing t1- -> Sing t2- -> Sing (Apply (Apply (CompareSym0 :: TyFun Empty ((~>) Empty Ordering)- -> Type) t1) t2)- sCompare _ _ = SEQ- instance SDecide Empty where- (%~) x _ = Proved (case x of {})- instance Data.Type.Equality.TestEquality (SEmpty :: Empty- -> Type) where- Data.Type.Equality.testEquality- = Data.Singletons.Decide.decideEquality- instance Data.Type.Coercion.TestCoercion (SEmpty :: Empty- -> Type) where- Data.Type.Coercion.testCoercion- = Data.Singletons.Decide.decideCoercion+Singletons/T187.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| data Empty + + deriving instance Ord Empty + deriving instance Eq Empty |] + ======> + data Empty + deriving instance Eq Empty + deriving instance Ord Empty + type TFHelper_0123456789876543210 :: Empty -> Empty -> Bool + type family TFHelper_0123456789876543210 (a :: Empty) (a :: Empty) :: Bool where + TFHelper_0123456789876543210 _ _ = TrueSym0 + type TFHelper_0123456789876543210Sym0 :: (~>) Empty ((~>) Empty Bool) + data TFHelper_0123456789876543210Sym0 :: (~>) Empty ((~>) Empty Bool) + where + TFHelper_0123456789876543210Sym0KindInference :: SameKind (Apply TFHelper_0123456789876543210Sym0 arg) (TFHelper_0123456789876543210Sym1 arg) => + TFHelper_0123456789876543210Sym0 a0123456789876543210 + type instance Apply TFHelper_0123456789876543210Sym0 a0123456789876543210 = TFHelper_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings TFHelper_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) TFHelper_0123456789876543210Sym0KindInference ()) + type TFHelper_0123456789876543210Sym1 :: Empty -> (~>) Empty Bool + data TFHelper_0123456789876543210Sym1 (a0123456789876543210 :: Empty) :: (~>) Empty Bool + where + TFHelper_0123456789876543210Sym1KindInference :: SameKind (Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) arg) (TFHelper_0123456789876543210Sym2 a0123456789876543210 arg) => + TFHelper_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (TFHelper_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) TFHelper_0123456789876543210Sym1KindInference ()) + type TFHelper_0123456789876543210Sym2 :: Empty -> Empty -> Bool + type family TFHelper_0123456789876543210Sym2 (a0123456789876543210 :: Empty) (a0123456789876543210 :: Empty) :: Bool where + TFHelper_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PEq Empty where + type (==) a a = Apply (Apply TFHelper_0123456789876543210Sym0 a) a + type Compare_0123456789876543210 :: Empty -> Empty -> Ordering + type family Compare_0123456789876543210 (a :: Empty) (a :: Empty) :: Ordering where + Compare_0123456789876543210 _ _ = EQSym0 + type Compare_0123456789876543210Sym0 :: (~>) Empty ((~>) Empty Ordering) + data Compare_0123456789876543210Sym0 :: (~>) Empty ((~>) Empty Ordering) + where + Compare_0123456789876543210Sym0KindInference :: SameKind (Apply Compare_0123456789876543210Sym0 arg) (Compare_0123456789876543210Sym1 arg) => + Compare_0123456789876543210Sym0 a0123456789876543210 + type instance Apply Compare_0123456789876543210Sym0 a0123456789876543210 = Compare_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Compare_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Compare_0123456789876543210Sym0KindInference ()) + type Compare_0123456789876543210Sym1 :: Empty + -> (~>) Empty Ordering + data Compare_0123456789876543210Sym1 (a0123456789876543210 :: Empty) :: (~>) Empty Ordering + where + Compare_0123456789876543210Sym1KindInference :: SameKind (Apply (Compare_0123456789876543210Sym1 a0123456789876543210) arg) (Compare_0123456789876543210Sym2 a0123456789876543210 arg) => + Compare_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (Compare_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Compare_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Compare_0123456789876543210Sym1KindInference ()) + type Compare_0123456789876543210Sym2 :: Empty -> Empty -> Ordering + type family Compare_0123456789876543210Sym2 (a0123456789876543210 :: Empty) (a0123456789876543210 :: Empty) :: Ordering where + Compare_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance POrd Empty where + type Compare a a = Apply (Apply Compare_0123456789876543210Sym0 a) a + data SEmpty :: Empty -> Type + type instance Sing @Empty = SEmpty + instance SingKind Empty where + type Demote Empty = Empty + fromSing x = case x of {} + toSing x = SomeSing (case x of {}) + instance SEq Empty where + (%==) :: + forall (t1 :: Empty) (t2 :: Empty). Sing t1 + -> Sing t2 + -> Sing (Apply (Apply ((==@#@$) :: TyFun Empty ((~>) Empty Bool) + -> Type) t1) t2) + (%==) _ _ = STrue + instance SOrd Empty where + sCompare :: + forall (t1 :: Empty) (t2 :: Empty). Sing t1 + -> Sing t2 + -> Sing (Apply (Apply (CompareSym0 :: TyFun Empty ((~>) Empty Ordering) + -> Type) t1) t2) + sCompare _ _ = SEQ + instance SDecide Empty where + (%~) x _ = Proved (case x of {}) + instance Data.Type.Equality.TestEquality (SEmpty :: Empty + -> Type) where + Data.Type.Equality.testEquality + = Data.Singletons.Decide.decideEquality + instance Data.Type.Coercion.TestCoercion (SEmpty :: Empty + -> Type) where + Data.Type.Coercion.testCoercion + = Data.Singletons.Decide.decideCoercion
tests/compile-and-dump/Singletons/T187.hs view
@@ -1,8 +1,8 @@-module T187 where--import Data.Singletons.Base.TH--$(singletons[d| data Empty- deriving instance Eq Empty- deriving instance Ord Empty- |])+module T187 where + +import Data.Singletons.Base.TH + +$(singletons[d| data Empty + deriving instance Eq Empty + deriving instance Ord Empty + |])
tests/compile-and-dump/Singletons/T190.golden view
@@ -1,233 +1,233 @@-Singletons/T190.hs:0:0:: Splicing declarations- singletons- [d| data T- = T- deriving (Eq, Ord, Enum, Bounded, Show) |]- ======>- data T- = T- deriving (Eq, Ord, Enum, Bounded, Show)- type TSym0 :: T- type family TSym0 :: T where- TSym0 = T- type TFHelper_0123456789876543210 :: T -> T -> Bool- type family TFHelper_0123456789876543210 (a :: T) (a :: T) :: Bool where- TFHelper_0123456789876543210 T T = TrueSym0- type TFHelper_0123456789876543210Sym0 :: (~>) T ((~>) T Bool)- data TFHelper_0123456789876543210Sym0 :: (~>) T ((~>) T Bool)- where- TFHelper_0123456789876543210Sym0KindInference :: SameKind (Apply TFHelper_0123456789876543210Sym0 arg) (TFHelper_0123456789876543210Sym1 arg) =>- TFHelper_0123456789876543210Sym0 a0123456789876543210- type instance Apply TFHelper_0123456789876543210Sym0 a0123456789876543210 = TFHelper_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings TFHelper_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) TFHelper_0123456789876543210Sym0KindInference) ())- type TFHelper_0123456789876543210Sym1 :: T -> (~>) T Bool- data TFHelper_0123456789876543210Sym1 (a0123456789876543210 :: T) :: (~>) T Bool- where- TFHelper_0123456789876543210Sym1KindInference :: SameKind (Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) arg) (TFHelper_0123456789876543210Sym2 a0123456789876543210 arg) =>- TFHelper_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (TFHelper_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) TFHelper_0123456789876543210Sym1KindInference) ())- type TFHelper_0123456789876543210Sym2 :: T -> T -> Bool- type family TFHelper_0123456789876543210Sym2 (a0123456789876543210 :: T) (a0123456789876543210 :: T) :: Bool where- TFHelper_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210- instance PEq T where- type (==) a a = Apply (Apply TFHelper_0123456789876543210Sym0 a) a- type Compare_0123456789876543210 :: T -> T -> Ordering- type family Compare_0123456789876543210 (a :: T) (a :: T) :: Ordering where- Compare_0123456789876543210 T T = Apply (Apply (Apply FoldlSym0 ThenCmpSym0) EQSym0) NilSym0- type Compare_0123456789876543210Sym0 :: (~>) T ((~>) T Ordering)- data Compare_0123456789876543210Sym0 :: (~>) T ((~>) T Ordering)- where- Compare_0123456789876543210Sym0KindInference :: SameKind (Apply Compare_0123456789876543210Sym0 arg) (Compare_0123456789876543210Sym1 arg) =>- Compare_0123456789876543210Sym0 a0123456789876543210- type instance Apply Compare_0123456789876543210Sym0 a0123456789876543210 = Compare_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings Compare_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Compare_0123456789876543210Sym0KindInference) ())- type Compare_0123456789876543210Sym1 :: T -> (~>) T Ordering- data Compare_0123456789876543210Sym1 (a0123456789876543210 :: T) :: (~>) T Ordering- where- Compare_0123456789876543210Sym1KindInference :: SameKind (Apply (Compare_0123456789876543210Sym1 a0123456789876543210) arg) (Compare_0123456789876543210Sym2 a0123456789876543210 arg) =>- Compare_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (Compare_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Compare_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Compare_0123456789876543210Sym1KindInference) ())- type Compare_0123456789876543210Sym2 :: T -> T -> Ordering- type family Compare_0123456789876543210Sym2 (a0123456789876543210 :: T) (a0123456789876543210 :: T) :: Ordering where- Compare_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210- instance POrd T where- type Compare a a = Apply (Apply Compare_0123456789876543210Sym0 a) a- type family Case_0123456789876543210 n t where- Case_0123456789876543210 n 'True = TSym0- Case_0123456789876543210 n 'False = Apply ErrorSym0 "toEnum: bad argument"- type ToEnum_0123456789876543210 :: GHC.Num.Natural.Natural -> T- type family ToEnum_0123456789876543210 (a :: GHC.Num.Natural.Natural) :: T where- ToEnum_0123456789876543210 n = Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (FromInteger 0))- type ToEnum_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural T- data ToEnum_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural T- where- ToEnum_0123456789876543210Sym0KindInference :: SameKind (Apply ToEnum_0123456789876543210Sym0 arg) (ToEnum_0123456789876543210Sym1 arg) =>- ToEnum_0123456789876543210Sym0 a0123456789876543210- type instance Apply ToEnum_0123456789876543210Sym0 a0123456789876543210 = ToEnum_0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings ToEnum_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) ToEnum_0123456789876543210Sym0KindInference) ())- type ToEnum_0123456789876543210Sym1 :: GHC.Num.Natural.Natural -> T- type family ToEnum_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Num.Natural.Natural) :: T where- ToEnum_0123456789876543210Sym1 a0123456789876543210 = ToEnum_0123456789876543210 a0123456789876543210- type FromEnum_0123456789876543210 :: T -> GHC.Num.Natural.Natural- type family FromEnum_0123456789876543210 (a :: T) :: GHC.Num.Natural.Natural where- FromEnum_0123456789876543210 T = FromInteger 0- type FromEnum_0123456789876543210Sym0 :: (~>) T GHC.Num.Natural.Natural- data FromEnum_0123456789876543210Sym0 :: (~>) T GHC.Num.Natural.Natural- where- FromEnum_0123456789876543210Sym0KindInference :: SameKind (Apply FromEnum_0123456789876543210Sym0 arg) (FromEnum_0123456789876543210Sym1 arg) =>- FromEnum_0123456789876543210Sym0 a0123456789876543210- type instance Apply FromEnum_0123456789876543210Sym0 a0123456789876543210 = FromEnum_0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings FromEnum_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) FromEnum_0123456789876543210Sym0KindInference) ())- type FromEnum_0123456789876543210Sym1 :: T- -> GHC.Num.Natural.Natural- type family FromEnum_0123456789876543210Sym1 (a0123456789876543210 :: T) :: GHC.Num.Natural.Natural where- FromEnum_0123456789876543210Sym1 a0123456789876543210 = FromEnum_0123456789876543210 a0123456789876543210- instance PEnum T where- type ToEnum a = Apply ToEnum_0123456789876543210Sym0 a- type FromEnum a = Apply FromEnum_0123456789876543210Sym0 a- type MinBound_0123456789876543210 :: T- type family MinBound_0123456789876543210 :: T where- MinBound_0123456789876543210 = TSym0- type MinBound_0123456789876543210Sym0 :: T- type family MinBound_0123456789876543210Sym0 :: T where- MinBound_0123456789876543210Sym0 = MinBound_0123456789876543210- type MaxBound_0123456789876543210 :: T- type family MaxBound_0123456789876543210 :: T where- MaxBound_0123456789876543210 = TSym0- type MaxBound_0123456789876543210Sym0 :: T- type family MaxBound_0123456789876543210Sym0 :: T where- MaxBound_0123456789876543210Sym0 = MaxBound_0123456789876543210- instance PBounded T where- type MinBound = MinBound_0123456789876543210Sym0- type MaxBound = MaxBound_0123456789876543210Sym0- type ShowsPrec_0123456789876543210 :: GHC.Num.Natural.Natural- -> T -> GHC.Types.Symbol -> GHC.Types.Symbol- type family ShowsPrec_0123456789876543210 (a :: GHC.Num.Natural.Natural) (a :: T) (a :: GHC.Types.Symbol) :: GHC.Types.Symbol where- ShowsPrec_0123456789876543210 _ T a_0123456789876543210 = Apply (Apply ShowStringSym0 "T") a_0123456789876543210- type ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) T ((~>) GHC.Types.Symbol GHC.Types.Symbol))- data ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) T ((~>) GHC.Types.Symbol GHC.Types.Symbol))- where- ShowsPrec_0123456789876543210Sym0KindInference :: SameKind (Apply ShowsPrec_0123456789876543210Sym0 arg) (ShowsPrec_0123456789876543210Sym1 arg) =>- ShowsPrec_0123456789876543210Sym0 a0123456789876543210- type instance Apply ShowsPrec_0123456789876543210Sym0 a0123456789876543210 = ShowsPrec_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings ShowsPrec_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym0KindInference) ())- type ShowsPrec_0123456789876543210Sym1 :: GHC.Num.Natural.Natural- -> (~>) T ((~>) GHC.Types.Symbol GHC.Types.Symbol)- data ShowsPrec_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Num.Natural.Natural) :: (~>) T ((~>) GHC.Types.Symbol GHC.Types.Symbol)- where- ShowsPrec_0123456789876543210Sym1KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 arg) =>- ShowsPrec_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym1KindInference) ())- type ShowsPrec_0123456789876543210Sym2 :: GHC.Num.Natural.Natural- -> T -> (~>) GHC.Types.Symbol GHC.Types.Symbol- data ShowsPrec_0123456789876543210Sym2 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: T) :: (~>) GHC.Types.Symbol GHC.Types.Symbol- where- ShowsPrec_0123456789876543210Sym2KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 arg) =>- ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym2KindInference) ())- type ShowsPrec_0123456789876543210Sym3 :: GHC.Num.Natural.Natural- -> T -> GHC.Types.Symbol -> GHC.Types.Symbol- type family ShowsPrec_0123456789876543210Sym3 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: T) (a0123456789876543210 :: GHC.Types.Symbol) :: GHC.Types.Symbol where- ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance PShow T where- type ShowsPrec a a a = Apply (Apply (Apply ShowsPrec_0123456789876543210Sym0 a) a) a- data ST :: T -> Type where ST :: ST (T :: T)- type instance Sing @T = ST- instance SingKind T where- type Demote T = T- fromSing ST = T- toSing T = SomeSing ST- instance SEq T where- (%==) ::- forall (t1 :: T) (t2 :: T). Sing t1- -> Sing t2- -> Sing (Apply (Apply ((==@#@$) :: TyFun T ((~>) T Bool)- -> Type) t1) t2)- (%==) ST ST = STrue- instance SOrd T where- sCompare ::- forall (t1 :: T) (t2 :: T). Sing t1- -> Sing t2- -> Sing (Apply (Apply (CompareSym0 :: TyFun T ((~>) T Ordering)- -> Type) t1) t2)- sCompare ST ST- = (applySing- ((applySing- ((applySing ((singFun3 @FoldlSym0) sFoldl))- ((singFun2 @ThenCmpSym0) sThenCmp)))- SEQ))- SNil- instance SEnum T where- sToEnum ::- forall (t :: GHC.Num.Natural.Natural). Sing t- -> Sing (Apply (Data.Singletons.Base.Enum.ToEnumSym0 :: TyFun GHC.Num.Natural.Natural T- -> Type) t)- sFromEnum ::- forall (t :: T). Sing t- -> Sing (Apply (Data.Singletons.Base.Enum.FromEnumSym0 :: TyFun T GHC.Num.Natural.Natural- -> Type) t)- sToEnum (sN :: Sing n)- = (id- @(Sing (Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (FromInteger 0)))))- (case- (applySing ((applySing ((singFun2 @(==@#@$)) (%==))) sN))- (sFromInteger (sing :: Sing 0))- of- STrue -> ST- SFalse -> sError (sing :: Sing "toEnum: bad argument"))- sFromEnum ST = sFromInteger (sing :: Sing 0)- instance SBounded T where- sMinBound :: Sing (MinBoundSym0 :: T)- sMaxBound :: Sing (MaxBoundSym0 :: T)- sMinBound = ST- sMaxBound = ST- instance SShow T where- sShowsPrec ::- forall (t1 :: GHC.Num.Natural.Natural)- (t2 :: T)- (t3 :: GHC.Types.Symbol). Sing t1- -> Sing t2- -> Sing t3- -> Sing (Apply (Apply (Apply (ShowsPrecSym0 :: TyFun GHC.Num.Natural.Natural ((~>) T ((~>) GHC.Types.Symbol GHC.Types.Symbol))- -> Type) t1) t2) t3)- sShowsPrec- _- ST- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "T")))- sA_0123456789876543210- instance SDecide T where- (%~) ST ST = Proved Refl- instance Data.Type.Equality.TestEquality (ST :: T -> Type) where- Data.Type.Equality.testEquality- = Data.Singletons.Decide.decideEquality- instance Data.Type.Coercion.TestCoercion (ST :: T -> Type) where- Data.Type.Coercion.testCoercion- = Data.Singletons.Decide.decideCoercion- deriving instance Show (ST (z :: T))- instance SingI T where- sing = ST+Singletons/T190.hs:0:0:: Splicing declarations + singletons + [d| data T + = T + deriving (Eq, Ord, Enum, Bounded, Show) |] + ======> + data T + = T + deriving (Eq, Ord, Enum, Bounded, Show) + type TSym0 :: T + type family TSym0 :: T where + TSym0 = T + type TFHelper_0123456789876543210 :: T -> T -> Bool + type family TFHelper_0123456789876543210 (a :: T) (a :: T) :: Bool where + TFHelper_0123456789876543210 T T = TrueSym0 + type TFHelper_0123456789876543210Sym0 :: (~>) T ((~>) T Bool) + data TFHelper_0123456789876543210Sym0 :: (~>) T ((~>) T Bool) + where + TFHelper_0123456789876543210Sym0KindInference :: SameKind (Apply TFHelper_0123456789876543210Sym0 arg) (TFHelper_0123456789876543210Sym1 arg) => + TFHelper_0123456789876543210Sym0 a0123456789876543210 + type instance Apply TFHelper_0123456789876543210Sym0 a0123456789876543210 = TFHelper_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings TFHelper_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) TFHelper_0123456789876543210Sym0KindInference ()) + type TFHelper_0123456789876543210Sym1 :: T -> (~>) T Bool + data TFHelper_0123456789876543210Sym1 (a0123456789876543210 :: T) :: (~>) T Bool + where + TFHelper_0123456789876543210Sym1KindInference :: SameKind (Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) arg) (TFHelper_0123456789876543210Sym2 a0123456789876543210 arg) => + TFHelper_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (TFHelper_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) TFHelper_0123456789876543210Sym1KindInference ()) + type TFHelper_0123456789876543210Sym2 :: T -> T -> Bool + type family TFHelper_0123456789876543210Sym2 (a0123456789876543210 :: T) (a0123456789876543210 :: T) :: Bool where + TFHelper_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PEq T where + type (==) a a = Apply (Apply TFHelper_0123456789876543210Sym0 a) a + type Compare_0123456789876543210 :: T -> T -> Ordering + type family Compare_0123456789876543210 (a :: T) (a :: T) :: Ordering where + Compare_0123456789876543210 T T = Apply (Apply (Apply FoldlSym0 (<>@#@$)) EQSym0) NilSym0 + type Compare_0123456789876543210Sym0 :: (~>) T ((~>) T Ordering) + data Compare_0123456789876543210Sym0 :: (~>) T ((~>) T Ordering) + where + Compare_0123456789876543210Sym0KindInference :: SameKind (Apply Compare_0123456789876543210Sym0 arg) (Compare_0123456789876543210Sym1 arg) => + Compare_0123456789876543210Sym0 a0123456789876543210 + type instance Apply Compare_0123456789876543210Sym0 a0123456789876543210 = Compare_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Compare_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Compare_0123456789876543210Sym0KindInference ()) + type Compare_0123456789876543210Sym1 :: T -> (~>) T Ordering + data Compare_0123456789876543210Sym1 (a0123456789876543210 :: T) :: (~>) T Ordering + where + Compare_0123456789876543210Sym1KindInference :: SameKind (Apply (Compare_0123456789876543210Sym1 a0123456789876543210) arg) (Compare_0123456789876543210Sym2 a0123456789876543210 arg) => + Compare_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (Compare_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Compare_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Compare_0123456789876543210Sym1KindInference ()) + type Compare_0123456789876543210Sym2 :: T -> T -> Ordering + type family Compare_0123456789876543210Sym2 (a0123456789876543210 :: T) (a0123456789876543210 :: T) :: Ordering where + Compare_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance POrd T where + type Compare a a = Apply (Apply Compare_0123456789876543210Sym0 a) a + type family Case_0123456789876543210 n t where + Case_0123456789876543210 n 'True = TSym0 + Case_0123456789876543210 n 'False = Apply ErrorSym0 "toEnum: bad argument" + type ToEnum_0123456789876543210 :: GHC.Num.Natural.Natural -> T + type family ToEnum_0123456789876543210 (a :: GHC.Num.Natural.Natural) :: T where + ToEnum_0123456789876543210 n = Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (FromInteger 0)) + type ToEnum_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural T + data ToEnum_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural T + where + ToEnum_0123456789876543210Sym0KindInference :: SameKind (Apply ToEnum_0123456789876543210Sym0 arg) (ToEnum_0123456789876543210Sym1 arg) => + ToEnum_0123456789876543210Sym0 a0123456789876543210 + type instance Apply ToEnum_0123456789876543210Sym0 a0123456789876543210 = ToEnum_0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings ToEnum_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) ToEnum_0123456789876543210Sym0KindInference ()) + type ToEnum_0123456789876543210Sym1 :: GHC.Num.Natural.Natural -> T + type family ToEnum_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Num.Natural.Natural) :: T where + ToEnum_0123456789876543210Sym1 a0123456789876543210 = ToEnum_0123456789876543210 a0123456789876543210 + type FromEnum_0123456789876543210 :: T -> GHC.Num.Natural.Natural + type family FromEnum_0123456789876543210 (a :: T) :: GHC.Num.Natural.Natural where + FromEnum_0123456789876543210 T = FromInteger 0 + type FromEnum_0123456789876543210Sym0 :: (~>) T GHC.Num.Natural.Natural + data FromEnum_0123456789876543210Sym0 :: (~>) T GHC.Num.Natural.Natural + where + FromEnum_0123456789876543210Sym0KindInference :: SameKind (Apply FromEnum_0123456789876543210Sym0 arg) (FromEnum_0123456789876543210Sym1 arg) => + FromEnum_0123456789876543210Sym0 a0123456789876543210 + type instance Apply FromEnum_0123456789876543210Sym0 a0123456789876543210 = FromEnum_0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings FromEnum_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) FromEnum_0123456789876543210Sym0KindInference ()) + type FromEnum_0123456789876543210Sym1 :: T + -> GHC.Num.Natural.Natural + type family FromEnum_0123456789876543210Sym1 (a0123456789876543210 :: T) :: GHC.Num.Natural.Natural where + FromEnum_0123456789876543210Sym1 a0123456789876543210 = FromEnum_0123456789876543210 a0123456789876543210 + instance PEnum T where + type ToEnum a = Apply ToEnum_0123456789876543210Sym0 a + type FromEnum a = Apply FromEnum_0123456789876543210Sym0 a + type MinBound_0123456789876543210 :: T + type family MinBound_0123456789876543210 :: T where + MinBound_0123456789876543210 = TSym0 + type MinBound_0123456789876543210Sym0 :: T + type family MinBound_0123456789876543210Sym0 :: T where + MinBound_0123456789876543210Sym0 = MinBound_0123456789876543210 + type MaxBound_0123456789876543210 :: T + type family MaxBound_0123456789876543210 :: T where + MaxBound_0123456789876543210 = TSym0 + type MaxBound_0123456789876543210Sym0 :: T + type family MaxBound_0123456789876543210Sym0 :: T where + MaxBound_0123456789876543210Sym0 = MaxBound_0123456789876543210 + instance PBounded T where + type MinBound = MinBound_0123456789876543210Sym0 + type MaxBound = MaxBound_0123456789876543210Sym0 + type ShowsPrec_0123456789876543210 :: GHC.Num.Natural.Natural + -> T -> GHC.Types.Symbol -> GHC.Types.Symbol + type family ShowsPrec_0123456789876543210 (a :: GHC.Num.Natural.Natural) (a :: T) (a :: GHC.Types.Symbol) :: GHC.Types.Symbol where + ShowsPrec_0123456789876543210 _ T a_0123456789876543210 = Apply (Apply ShowStringSym0 "T") a_0123456789876543210 + type ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) T ((~>) GHC.Types.Symbol GHC.Types.Symbol)) + data ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) T ((~>) GHC.Types.Symbol GHC.Types.Symbol)) + where + ShowsPrec_0123456789876543210Sym0KindInference :: SameKind (Apply ShowsPrec_0123456789876543210Sym0 arg) (ShowsPrec_0123456789876543210Sym1 arg) => + ShowsPrec_0123456789876543210Sym0 a0123456789876543210 + type instance Apply ShowsPrec_0123456789876543210Sym0 a0123456789876543210 = ShowsPrec_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings ShowsPrec_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym0KindInference ()) + type ShowsPrec_0123456789876543210Sym1 :: GHC.Num.Natural.Natural + -> (~>) T ((~>) GHC.Types.Symbol GHC.Types.Symbol) + data ShowsPrec_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Num.Natural.Natural) :: (~>) T ((~>) GHC.Types.Symbol GHC.Types.Symbol) + where + ShowsPrec_0123456789876543210Sym1KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 arg) => + ShowsPrec_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym1KindInference ()) + type ShowsPrec_0123456789876543210Sym2 :: GHC.Num.Natural.Natural + -> T -> (~>) GHC.Types.Symbol GHC.Types.Symbol + data ShowsPrec_0123456789876543210Sym2 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: T) :: (~>) GHC.Types.Symbol GHC.Types.Symbol + where + ShowsPrec_0123456789876543210Sym2KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 arg) => + ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym2KindInference ()) + type ShowsPrec_0123456789876543210Sym3 :: GHC.Num.Natural.Natural + -> T -> GHC.Types.Symbol -> GHC.Types.Symbol + type family ShowsPrec_0123456789876543210Sym3 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: T) (a0123456789876543210 :: GHC.Types.Symbol) :: GHC.Types.Symbol where + ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PShow T where + type ShowsPrec a a a = Apply (Apply (Apply ShowsPrec_0123456789876543210Sym0 a) a) a + data ST :: T -> Type where ST :: ST (T :: T) + type instance Sing @T = ST + instance SingKind T where + type Demote T = T + fromSing ST = T + toSing T = SomeSing ST + instance SEq T where + (%==) :: + forall (t1 :: T) (t2 :: T). Sing t1 + -> Sing t2 + -> Sing (Apply (Apply ((==@#@$) :: TyFun T ((~>) T Bool) + -> Type) t1) t2) + (%==) ST ST = STrue + instance SOrd T where + sCompare :: + forall (t1 :: T) (t2 :: T). Sing t1 + -> Sing t2 + -> Sing (Apply (Apply (CompareSym0 :: TyFun T ((~>) T Ordering) + -> Type) t1) t2) + sCompare ST ST + = applySing + (applySing + (applySing (singFun3 @FoldlSym0 sFoldl) (singFun2 @(<>@#@$) (%<>))) + SEQ) + SNil + instance SEnum T where + sToEnum :: + forall (t :: GHC.Num.Natural.Natural). Sing t + -> Sing (Apply (Data.Singletons.Base.Enum.ToEnumSym0 :: TyFun GHC.Num.Natural.Natural T + -> Type) t) + sFromEnum :: + forall (t :: T). Sing t + -> Sing (Apply (Data.Singletons.Base.Enum.FromEnumSym0 :: TyFun T GHC.Num.Natural.Natural + -> Type) t) + sToEnum (sN :: Sing n) + = id + @(Sing (Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (FromInteger 0)))) + (case + applySing + (applySing (singFun2 @(==@#@$) (%==)) sN) + (sFromInteger (sing :: Sing 0)) + of + STrue -> ST + SFalse -> sError (sing :: Sing "toEnum: bad argument")) + sFromEnum ST = sFromInteger (sing :: Sing 0) + instance SBounded T where + sMinBound :: Sing (MinBoundSym0 :: T) + sMaxBound :: Sing (MaxBoundSym0 :: T) + sMinBound = ST + sMaxBound = ST + instance SShow T where + sShowsPrec :: + forall (t1 :: GHC.Num.Natural.Natural) + (t2 :: T) + (t3 :: GHC.Types.Symbol). Sing t1 + -> Sing t2 + -> Sing t3 + -> Sing (Apply (Apply (Apply (ShowsPrecSym0 :: TyFun GHC.Num.Natural.Natural ((~>) T ((~>) GHC.Types.Symbol GHC.Types.Symbol)) + -> Type) t1) t2) t3) + sShowsPrec + _ + ST + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "T")) + sA_0123456789876543210 + instance SDecide T where + (%~) ST ST = Proved Refl + instance Data.Type.Equality.TestEquality (ST :: T -> Type) where + Data.Type.Equality.testEquality + = Data.Singletons.Decide.decideEquality + instance Data.Type.Coercion.TestCoercion (ST :: T -> Type) where + Data.Type.Coercion.testCoercion + = Data.Singletons.Decide.decideCoercion + deriving instance Show (ST (z :: T)) + instance SingI T where + sing = ST
tests/compile-and-dump/Singletons/T190.hs view
@@ -1,5 +1,5 @@-module T190 where--import Data.Singletons.Base.TH--$(singletons [d| data T = T deriving (Eq, Ord, Enum, Bounded, Show) |])+module T190 where + +import Data.Singletons.Base.TH + +$(singletons [d| data T = T deriving (Eq, Ord, Enum, Bounded, Show) |])
tests/compile-and-dump/Singletons/T197.golden view
@@ -1,48 +1,49 @@-Singletons/T197.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| infixl 5 $$:- - ($$:) :: Bool -> Bool -> Bool- _ $$: _ = False |]- ======>- infixl 5 $$:- ($$:) :: Bool -> Bool -> Bool- ($$:) _ _ = False- type ($$:@#@$) :: (~>) Bool ((~>) Bool Bool)- data ($$:@#@$) :: (~>) Bool ((~>) Bool Bool)- where- (:$$:@#@$###) :: SameKind (Apply ($$:@#@$) arg) (($$:@#@$$) arg) =>- ($$:@#@$) a0123456789876543210- type instance Apply ($$:@#@$) a0123456789876543210 = ($$:@#@$$) a0123456789876543210- instance SuppressUnusedWarnings ($$:@#@$) where- suppressUnusedWarnings = snd (((,) (:$$:@#@$###)) ())- infixl 5 $$:@#@$- type ($$:@#@$$) :: Bool -> (~>) Bool Bool- data ($$:@#@$$) (a0123456789876543210 :: Bool) :: (~>) Bool Bool- where- (:$$:@#@$$###) :: SameKind (Apply (($$:@#@$$) a0123456789876543210) arg) (($$:@#@$$$) a0123456789876543210 arg) =>- ($$:@#@$$) a0123456789876543210 a0123456789876543210- type instance Apply (($$:@#@$$) a0123456789876543210) a0123456789876543210 = ($$:) a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (($$:@#@$$) a0123456789876543210) where- suppressUnusedWarnings = snd (((,) (:$$:@#@$$###)) ())- infixl 5 $$:@#@$$- type ($$:@#@$$$) :: Bool -> Bool -> Bool- type family ($$:@#@$$$) (a0123456789876543210 :: Bool) (a0123456789876543210 :: Bool) :: Bool where- ($$:@#@$$$) a0123456789876543210 a0123456789876543210 = ($$:) a0123456789876543210 a0123456789876543210- infixl 5 $$:@#@$$$- type ($$:) :: Bool -> Bool -> Bool- type family ($$:) (a :: Bool) (a :: Bool) :: Bool where- ($$:) _ _ = FalseSym0- infixl 5 %$$:- (%$$:) ::- forall (t :: Bool) (t :: Bool). Sing t- -> Sing t -> Sing (Apply (Apply ($$:@#@$) t) t :: Bool)- (%$$:) _ _ = SFalse- instance SingI (($$:@#@$) :: (~>) Bool ((~>) Bool Bool)) where- sing = (singFun2 @($$:@#@$)) (%$$:)- instance SingI d =>- SingI (($$:@#@$$) (d :: Bool) :: (~>) Bool Bool) where- sing = (singFun1 @(($$:@#@$$) (d :: Bool))) ((%$$:) (sing @d))- instance SingI1 (($$:@#@$$) :: Bool -> (~>) Bool Bool) where- liftSing (s :: Sing (d :: Bool))- = (singFun1 @(($$:@#@$$) (d :: Bool))) ((%$$:) s)+Singletons/T197.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| infixl 5 $$: + + ($$:) :: Bool -> Bool -> Bool + _ $$: _ = False |] + ======> + infixl 5 $$: + ($$:) :: Bool -> Bool -> Bool + ($$:) _ _ = False + type ($$:@#@$) :: (~>) Bool ((~>) Bool Bool) + data ($$:@#@$) :: (~>) Bool ((~>) Bool Bool) + where + (:$$:@#@$###) :: SameKind (Apply ($$:@#@$) arg) (($$:@#@$$) arg) => + ($$:@#@$) a0123456789876543210 + type instance Apply ($$:@#@$) a0123456789876543210 = ($$:@#@$$) a0123456789876543210 + instance SuppressUnusedWarnings ($$:@#@$) where + suppressUnusedWarnings = snd ((,) (:$$:@#@$###) ()) + infixl 5 $$:@#@$ + type ($$:@#@$$) :: Bool -> (~>) Bool Bool + data ($$:@#@$$) (a0123456789876543210 :: Bool) :: (~>) Bool Bool + where + (:$$:@#@$$###) :: SameKind (Apply (($$:@#@$$) a0123456789876543210) arg) (($$:@#@$$$) a0123456789876543210 arg) => + ($$:@#@$$) a0123456789876543210 a0123456789876543210 + type instance Apply (($$:@#@$$) a0123456789876543210) a0123456789876543210 = ($$:) a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (($$:@#@$$) a0123456789876543210) where + suppressUnusedWarnings = snd ((,) (:$$:@#@$$###) ()) + infixl 5 $$:@#@$$ + type ($$:@#@$$$) :: Bool -> Bool -> Bool + type family ($$:@#@$$$) (a0123456789876543210 :: Bool) (a0123456789876543210 :: Bool) :: Bool where + ($$:@#@$$$) a0123456789876543210 a0123456789876543210 = ($$:) a0123456789876543210 a0123456789876543210 + infixl 5 $$:@#@$$$ + type ($$:) :: Bool -> Bool -> Bool + type family ($$:) (a :: Bool) (a :: Bool) :: Bool where + ($$:) _ _ = FalseSym0 + infixl 5 %$$: + (%$$:) :: + (forall (t :: Bool) (t :: Bool). + Sing t + -> Sing t -> Sing (Apply (Apply ($$:@#@$) t) t :: Bool) :: Type) + (%$$:) _ _ = SFalse + instance SingI (($$:@#@$) :: (~>) Bool ((~>) Bool Bool)) where + sing = singFun2 @($$:@#@$) (%$$:) + instance SingI d => + SingI (($$:@#@$$) (d :: Bool) :: (~>) Bool Bool) where + sing = singFun1 @(($$:@#@$$) (d :: Bool)) ((%$$:) (sing @d)) + instance SingI1 (($$:@#@$$) :: Bool -> (~>) Bool Bool) where + liftSing (s :: Sing (d :: Bool)) + = singFun1 @(($$:@#@$$) (d :: Bool)) ((%$$:) s)
tests/compile-and-dump/Singletons/T197.hs view
@@ -1,10 +1,10 @@-module T197 where--import Data.Singletons.TH-import Prelude.Singletons--$(singletons [d|- infixl 5 $$:- ($$:) :: Bool -> Bool -> Bool- _ $$: _ = False- |])+module T197 where + +import Data.Singletons.TH +import Prelude.Singletons + +$(singletons [d| + infixl 5 $$: + ($$:) :: Bool -> Bool -> Bool + _ $$: _ = False + |])
tests/compile-and-dump/Singletons/T197b.golden view
@@ -1,105 +1,105 @@-Singletons/T197b.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| infixr 9 `Pair`, `MkPair`- - data a :*: b = a :*: b- data Pair a b = MkPair a b |]- ======>- data (:*:) a b = a :*: b- data Pair a b = MkPair a b- infixr 9 `Pair`- infixr 9 `MkPair`- type (:*:@#@$) :: forall a b. (~>) a ((~>) b ((:*:) a b))- data (:*:@#@$) :: (~>) a ((~>) b ((:*:) a b))- where- (::*:@#@$###) :: SameKind (Apply (:*:@#@$) arg) ((:*:@#@$$) arg) =>- (:*:@#@$) a0123456789876543210- type instance Apply (:*:@#@$) a0123456789876543210 = (:*:@#@$$) a0123456789876543210- instance SuppressUnusedWarnings (:*:@#@$) where- suppressUnusedWarnings = snd (((,) (::*:@#@$###)) ())- type (:*:@#@$$) :: forall a b. a -> (~>) b ((:*:) a b)- data (:*:@#@$$) (a0123456789876543210 :: a) :: (~>) b ((:*:) a b)- where- (::*:@#@$$###) :: SameKind (Apply ((:*:@#@$$) a0123456789876543210) arg) ((:*:@#@$$$) a0123456789876543210 arg) =>- (:*:@#@$$) a0123456789876543210 a0123456789876543210- type instance Apply ((:*:@#@$$) a0123456789876543210) a0123456789876543210 = (:*:) a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings ((:*:@#@$$) a0123456789876543210) where- suppressUnusedWarnings = snd (((,) (::*:@#@$$###)) ())- type (:*:@#@$$$) :: forall a b. a -> b -> (:*:) a b- type family (:*:@#@$$$) (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: (:*:) a b where- (:*:@#@$$$) a0123456789876543210 a0123456789876543210 = (:*:) a0123456789876543210 a0123456789876543210- type MkPairSym0 :: forall a b. (~>) a ((~>) b (Pair a b))- data MkPairSym0 :: (~>) a ((~>) b (Pair a b))- where- MkPairSym0KindInference :: SameKind (Apply MkPairSym0 arg) (MkPairSym1 arg) =>- MkPairSym0 a0123456789876543210- type instance Apply MkPairSym0 a0123456789876543210 = MkPairSym1 a0123456789876543210- instance SuppressUnusedWarnings MkPairSym0 where- suppressUnusedWarnings = snd (((,) MkPairSym0KindInference) ())- infixr 9 `MkPairSym0`- type MkPairSym1 :: forall a b. a -> (~>) b (Pair a b)- data MkPairSym1 (a0123456789876543210 :: a) :: (~>) b (Pair a b)- where- MkPairSym1KindInference :: SameKind (Apply (MkPairSym1 a0123456789876543210) arg) (MkPairSym2 a0123456789876543210 arg) =>- MkPairSym1 a0123456789876543210 a0123456789876543210- type instance Apply (MkPairSym1 a0123456789876543210) a0123456789876543210 = MkPair a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (MkPairSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) MkPairSym1KindInference) ())- infixr 9 `MkPairSym1`- type MkPairSym2 :: forall a b. a -> b -> Pair a b- type family MkPairSym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: Pair a b where- MkPairSym2 a0123456789876543210 a0123456789876543210 = MkPair a0123456789876543210 a0123456789876543210- infixr 9 `MkPairSym2`- infixr 9 `SMkPair`- data (%:*:) :: forall a b. (:*:) a b -> Type- where- (:%*:) :: forall a b (n :: a) (n :: b).- (Sing n) -> (Sing n) -> (%:*:) ((:*:) n n :: (:*:) a b)- type instance Sing @((:*:) a b) = (%:*:)- instance (SingKind a, SingKind b) => SingKind ((:*:) a b) where- type Demote ((:*:) a b) = (:*:) (Demote a) (Demote b)- fromSing ((:%*:) b b) = ((:*:) (fromSing b)) (fromSing b)- toSing ((:*:) (b :: Demote a) (b :: Demote b))- = case ((,) (toSing b :: SomeSing a)) (toSing b :: SomeSing b) of- (,) (SomeSing c) (SomeSing c) -> SomeSing (((:%*:) c) c)- data SPair :: forall a b. Pair a b -> Type- where- SMkPair :: forall a b (n :: a) (n :: b).- (Sing n) -> (Sing n) -> SPair (MkPair n n :: Pair a b)- type instance Sing @(Pair a b) = SPair- instance (SingKind a, SingKind b) => SingKind (Pair a b) where- type Demote (Pair a b) = Pair (Demote a) (Demote b)- fromSing (SMkPair b b) = (MkPair (fromSing b)) (fromSing b)- toSing (MkPair (b :: Demote a) (b :: Demote b))- = case ((,) (toSing b :: SomeSing a)) (toSing b :: SomeSing b) of- (,) (SomeSing c) (SomeSing c) -> SomeSing ((SMkPair c) c)- instance (SingI n, SingI n) =>- SingI ((:*:) (n :: a) (n :: b)) where- sing = ((:%*:) sing) sing- instance SingI n => SingI1 ((:*:) (n :: a)) where- liftSing = (:%*:) sing- instance SingI2 (:*:) where- liftSing2 = (:%*:)- instance SingI ((:*:@#@$) :: (~>) a ((~>) b ((:*:) a b))) where- sing = (singFun2 @(:*:@#@$)) (:%*:)- instance SingI d =>- SingI ((:*:@#@$$) (d :: a) :: (~>) b ((:*:) a b)) where- sing = (singFun1 @((:*:@#@$$) (d :: a))) ((:%*:) (sing @d))- instance SingI1 ((:*:@#@$$) :: a -> (~>) b ((:*:) a b)) where- liftSing (s :: Sing (d :: a))- = (singFun1 @((:*:@#@$$) (d :: a))) ((:%*:) s)- instance (SingI n, SingI n) =>- SingI (MkPair (n :: a) (n :: b)) where- sing = (SMkPair sing) sing- instance SingI n => SingI1 (MkPair (n :: a)) where- liftSing = SMkPair sing- instance SingI2 MkPair where- liftSing2 = SMkPair- instance SingI (MkPairSym0 :: (~>) a ((~>) b (Pair a b))) where- sing = (singFun2 @MkPairSym0) SMkPair- instance SingI d =>- SingI (MkPairSym1 (d :: a) :: (~>) b (Pair a b)) where- sing = (singFun1 @(MkPairSym1 (d :: a))) (SMkPair (sing @d))- instance SingI1 (MkPairSym1 :: a -> (~>) b (Pair a b)) where- liftSing (s :: Sing (d :: a))- = (singFun1 @(MkPairSym1 (d :: a))) (SMkPair s)+Singletons/T197b.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| infixr 9 `Pair`, `MkPair` + + data a :*: b = a :*: b + data Pair a b = MkPair a b |] + ======> + data (:*:) a b = a :*: b + data Pair a b = MkPair a b + infixr 9 `Pair` + infixr 9 `MkPair` + type (:*:@#@$) :: forall a b. (~>) a ((~>) b ((:*:) a b)) + data (:*:@#@$) :: (~>) a ((~>) b ((:*:) a b)) + where + (::*:@#@$###) :: SameKind (Apply (:*:@#@$) arg) ((:*:@#@$$) arg) => + (:*:@#@$) a0123456789876543210 + type instance Apply (:*:@#@$) a0123456789876543210 = (:*:@#@$$) a0123456789876543210 + instance SuppressUnusedWarnings (:*:@#@$) where + suppressUnusedWarnings = snd ((,) (::*:@#@$###) ()) + type (:*:@#@$$) :: forall a b. a -> (~>) b ((:*:) a b) + data (:*:@#@$$) (a0123456789876543210 :: a) :: (~>) b ((:*:) a b) + where + (::*:@#@$$###) :: SameKind (Apply ((:*:@#@$$) a0123456789876543210) arg) ((:*:@#@$$$) a0123456789876543210 arg) => + (:*:@#@$$) a0123456789876543210 a0123456789876543210 + type instance Apply ((:*:@#@$$) a0123456789876543210) a0123456789876543210 = (:*:) a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings ((:*:@#@$$) a0123456789876543210) where + suppressUnusedWarnings = snd ((,) (::*:@#@$$###) ()) + type (:*:@#@$$$) :: forall a b. a -> b -> (:*:) a b + type family (:*:@#@$$$) (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: (:*:) a b where + (:*:@#@$$$) a0123456789876543210 a0123456789876543210 = (:*:) a0123456789876543210 a0123456789876543210 + type MkPairSym0 :: forall a b. (~>) a ((~>) b (Pair a b)) + data MkPairSym0 :: (~>) a ((~>) b (Pair a b)) + where + MkPairSym0KindInference :: SameKind (Apply MkPairSym0 arg) (MkPairSym1 arg) => + MkPairSym0 a0123456789876543210 + type instance Apply MkPairSym0 a0123456789876543210 = MkPairSym1 a0123456789876543210 + instance SuppressUnusedWarnings MkPairSym0 where + suppressUnusedWarnings = snd ((,) MkPairSym0KindInference ()) + infixr 9 `MkPairSym0` + type MkPairSym1 :: forall a b. a -> (~>) b (Pair a b) + data MkPairSym1 (a0123456789876543210 :: a) :: (~>) b (Pair a b) + where + MkPairSym1KindInference :: SameKind (Apply (MkPairSym1 a0123456789876543210) arg) (MkPairSym2 a0123456789876543210 arg) => + MkPairSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (MkPairSym1 a0123456789876543210) a0123456789876543210 = MkPair a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (MkPairSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) MkPairSym1KindInference ()) + infixr 9 `MkPairSym1` + type MkPairSym2 :: forall a b. a -> b -> Pair a b + type family MkPairSym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: Pair a b where + MkPairSym2 a0123456789876543210 a0123456789876543210 = MkPair a0123456789876543210 a0123456789876543210 + infixr 9 `MkPairSym2` + infixr 9 `SMkPair` + data (%:*:) :: forall a b. (:*:) a b -> Type + where + (:%*:) :: forall a b (n :: a) (n :: b). + (Sing n) -> (Sing n) -> (%:*:) ((:*:) n n :: (:*:) a b) + type instance Sing @((:*:) a b) = (%:*:) + instance (SingKind a, SingKind b) => SingKind ((:*:) a b) where + type Demote ((:*:) a b) = (:*:) (Demote a) (Demote b) + fromSing ((:%*:) b b) = (:*:) (fromSing b) (fromSing b) + toSing ((:*:) (b :: Demote a) (b :: Demote b)) + = case (,) (toSing b :: SomeSing a) (toSing b :: SomeSing b) of + (,) (SomeSing c) (SomeSing c) -> SomeSing ((:%*:) c c) + data SPair :: forall a b. Pair a b -> Type + where + SMkPair :: forall a b (n :: a) (n :: b). + (Sing n) -> (Sing n) -> SPair (MkPair n n :: Pair a b) + type instance Sing @(Pair a b) = SPair + instance (SingKind a, SingKind b) => SingKind (Pair a b) where + type Demote (Pair a b) = Pair (Demote a) (Demote b) + fromSing (SMkPair b b) = MkPair (fromSing b) (fromSing b) + toSing (MkPair (b :: Demote a) (b :: Demote b)) + = case (,) (toSing b :: SomeSing a) (toSing b :: SomeSing b) of + (,) (SomeSing c) (SomeSing c) -> SomeSing (SMkPair c c) + instance (SingI n, SingI n) => + SingI ((:*:) (n :: a) (n :: b)) where + sing = (:%*:) sing sing + instance SingI n => SingI1 ((:*:) (n :: a)) where + liftSing = (:%*:) sing + instance SingI2 (:*:) where + liftSing2 = (:%*:) + instance SingI ((:*:@#@$) :: (~>) a ((~>) b ((:*:) a b))) where + sing = singFun2 @(:*:@#@$) (:%*:) + instance SingI d => + SingI ((:*:@#@$$) (d :: a) :: (~>) b ((:*:) a b)) where + sing = singFun1 @((:*:@#@$$) (d :: a)) ((:%*:) (sing @d)) + instance SingI1 ((:*:@#@$$) :: a -> (~>) b ((:*:) a b)) where + liftSing (s :: Sing (d :: a)) + = singFun1 @((:*:@#@$$) (d :: a)) ((:%*:) s) + instance (SingI n, SingI n) => + SingI (MkPair (n :: a) (n :: b)) where + sing = SMkPair sing sing + instance SingI n => SingI1 (MkPair (n :: a)) where + liftSing = SMkPair sing + instance SingI2 MkPair where + liftSing2 = SMkPair + instance SingI (MkPairSym0 :: (~>) a ((~>) b (Pair a b))) where + sing = singFun2 @MkPairSym0 SMkPair + instance SingI d => + SingI (MkPairSym1 (d :: a) :: (~>) b (Pair a b)) where + sing = singFun1 @(MkPairSym1 (d :: a)) (SMkPair (sing @d)) + instance SingI1 (MkPairSym1 :: a -> (~>) b (Pair a b)) where + liftSing (s :: Sing (d :: a)) + = singFun1 @(MkPairSym1 (d :: a)) (SMkPair s)
tests/compile-and-dump/Singletons/T197b.hs view
@@ -1,10 +1,10 @@-module T197b where--import Data.Singletons.TH--$(singletons- [d| data a :*: b = a :*: b-- data Pair a b = MkPair a b- infixr 9 `Pair`, `MkPair`- |])+module T197b where + +import Data.Singletons.TH + +$(singletons + [d| data a :*: b = a :*: b + + data Pair a b = MkPair a b + infixr 9 `Pair`, `MkPair` + |])
tests/compile-and-dump/Singletons/T200.golden view
@@ -1,216 +1,220 @@-Singletons/T200.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| ($$:) :: ErrorMessage -> ErrorMessage -> ErrorMessage- x $$: y = x :$$: y- (<>:) :: ErrorMessage -> ErrorMessage -> ErrorMessage- x <>: y = x :<>: y- - data ErrorMessage- = ErrorMessage :$$: ErrorMessage |- ErrorMessage :<>: ErrorMessage |- EM [Bool] |]- ======>- data ErrorMessage- = ErrorMessage :$$: ErrorMessage |- ErrorMessage :<>: ErrorMessage |- EM [Bool]- ($$:) :: ErrorMessage -> ErrorMessage -> ErrorMessage- ($$:) x y = (x :$$: y)- (<>:) :: ErrorMessage -> ErrorMessage -> ErrorMessage- (<>:) x y = (x :<>: y)- type (:$$:@#@$) :: (~>) ErrorMessage ((~>) ErrorMessage ErrorMessage)- data (:$$:@#@$) :: (~>) ErrorMessage ((~>) ErrorMessage ErrorMessage)- where- (::$$:@#@$###) :: SameKind (Apply (:$$:@#@$) arg) ((:$$:@#@$$) arg) =>- (:$$:@#@$) a0123456789876543210- type instance Apply (:$$:@#@$) a0123456789876543210 = (:$$:@#@$$) a0123456789876543210- instance SuppressUnusedWarnings (:$$:@#@$) where- suppressUnusedWarnings = snd (((,) (::$$:@#@$###)) ())- type (:$$:@#@$$) :: ErrorMessage -> (~>) ErrorMessage ErrorMessage- data (:$$:@#@$$) (a0123456789876543210 :: ErrorMessage) :: (~>) ErrorMessage ErrorMessage- where- (::$$:@#@$$###) :: SameKind (Apply ((:$$:@#@$$) a0123456789876543210) arg) ((:$$:@#@$$$) a0123456789876543210 arg) =>- (:$$:@#@$$) a0123456789876543210 a0123456789876543210- type instance Apply ((:$$:@#@$$) a0123456789876543210) a0123456789876543210 = (:$$:) a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings ((:$$:@#@$$) a0123456789876543210) where- suppressUnusedWarnings = snd (((,) (::$$:@#@$$###)) ())- type (:$$:@#@$$$) :: ErrorMessage -> ErrorMessage -> ErrorMessage- type family (:$$:@#@$$$) (a0123456789876543210 :: ErrorMessage) (a0123456789876543210 :: ErrorMessage) :: ErrorMessage where- (:$$:@#@$$$) a0123456789876543210 a0123456789876543210 = (:$$:) a0123456789876543210 a0123456789876543210- type (:<>:@#@$) :: (~>) ErrorMessage ((~>) ErrorMessage ErrorMessage)- data (:<>:@#@$) :: (~>) ErrorMessage ((~>) ErrorMessage ErrorMessage)- where- (::<>:@#@$###) :: SameKind (Apply (:<>:@#@$) arg) ((:<>:@#@$$) arg) =>- (:<>:@#@$) a0123456789876543210- type instance Apply (:<>:@#@$) a0123456789876543210 = (:<>:@#@$$) a0123456789876543210- instance SuppressUnusedWarnings (:<>:@#@$) where- suppressUnusedWarnings = snd (((,) (::<>:@#@$###)) ())- type (:<>:@#@$$) :: ErrorMessage -> (~>) ErrorMessage ErrorMessage- data (:<>:@#@$$) (a0123456789876543210 :: ErrorMessage) :: (~>) ErrorMessage ErrorMessage- where- (::<>:@#@$$###) :: SameKind (Apply ((:<>:@#@$$) a0123456789876543210) arg) ((:<>:@#@$$$) a0123456789876543210 arg) =>- (:<>:@#@$$) a0123456789876543210 a0123456789876543210- type instance Apply ((:<>:@#@$$) a0123456789876543210) a0123456789876543210 = (:<>:) a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings ((:<>:@#@$$) a0123456789876543210) where- suppressUnusedWarnings = snd (((,) (::<>:@#@$$###)) ())- type (:<>:@#@$$$) :: ErrorMessage -> ErrorMessage -> ErrorMessage- type family (:<>:@#@$$$) (a0123456789876543210 :: ErrorMessage) (a0123456789876543210 :: ErrorMessage) :: ErrorMessage where- (:<>:@#@$$$) a0123456789876543210 a0123456789876543210 = (:<>:) a0123456789876543210 a0123456789876543210- type EMSym0 :: (~>) [Bool] ErrorMessage- data EMSym0 :: (~>) [Bool] ErrorMessage- where- EMSym0KindInference :: SameKind (Apply EMSym0 arg) (EMSym1 arg) =>- EMSym0 a0123456789876543210- type instance Apply EMSym0 a0123456789876543210 = EM a0123456789876543210- instance SuppressUnusedWarnings EMSym0 where- suppressUnusedWarnings = snd (((,) EMSym0KindInference) ())- type EMSym1 :: [Bool] -> ErrorMessage- type family EMSym1 (a0123456789876543210 :: [Bool]) :: ErrorMessage where- EMSym1 a0123456789876543210 = EM a0123456789876543210- type (<>:@#@$) :: (~>) ErrorMessage ((~>) ErrorMessage ErrorMessage)- data (<>:@#@$) :: (~>) ErrorMessage ((~>) ErrorMessage ErrorMessage)- where- (:<>:@#@$###) :: SameKind (Apply (<>:@#@$) arg) ((<>:@#@$$) arg) =>- (<>:@#@$) a0123456789876543210- type instance Apply (<>:@#@$) a0123456789876543210 = (<>:@#@$$) a0123456789876543210- instance SuppressUnusedWarnings (<>:@#@$) where- suppressUnusedWarnings = snd (((,) (:<>:@#@$###)) ())- type (<>:@#@$$) :: ErrorMessage -> (~>) ErrorMessage ErrorMessage- data (<>:@#@$$) (a0123456789876543210 :: ErrorMessage) :: (~>) ErrorMessage ErrorMessage- where- (:<>:@#@$$###) :: SameKind (Apply ((<>:@#@$$) a0123456789876543210) arg) ((<>:@#@$$$) a0123456789876543210 arg) =>- (<>:@#@$$) a0123456789876543210 a0123456789876543210- type instance Apply ((<>:@#@$$) a0123456789876543210) a0123456789876543210 = (<>:) a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings ((<>:@#@$$) a0123456789876543210) where- suppressUnusedWarnings = snd (((,) (:<>:@#@$$###)) ())- type (<>:@#@$$$) :: ErrorMessage -> ErrorMessage -> ErrorMessage- type family (<>:@#@$$$) (a0123456789876543210 :: ErrorMessage) (a0123456789876543210 :: ErrorMessage) :: ErrorMessage where- (<>:@#@$$$) a0123456789876543210 a0123456789876543210 = (<>:) a0123456789876543210 a0123456789876543210- type ($$:@#@$) :: (~>) ErrorMessage ((~>) ErrorMessage ErrorMessage)- data ($$:@#@$) :: (~>) ErrorMessage ((~>) ErrorMessage ErrorMessage)- where- (:$$:@#@$###) :: SameKind (Apply ($$:@#@$) arg) (($$:@#@$$) arg) =>- ($$:@#@$) a0123456789876543210- type instance Apply ($$:@#@$) a0123456789876543210 = ($$:@#@$$) a0123456789876543210- instance SuppressUnusedWarnings ($$:@#@$) where- suppressUnusedWarnings = snd (((,) (:$$:@#@$###)) ())- type ($$:@#@$$) :: ErrorMessage -> (~>) ErrorMessage ErrorMessage- data ($$:@#@$$) (a0123456789876543210 :: ErrorMessage) :: (~>) ErrorMessage ErrorMessage- where- (:$$:@#@$$###) :: SameKind (Apply (($$:@#@$$) a0123456789876543210) arg) (($$:@#@$$$) a0123456789876543210 arg) =>- ($$:@#@$$) a0123456789876543210 a0123456789876543210- type instance Apply (($$:@#@$$) a0123456789876543210) a0123456789876543210 = ($$:) a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (($$:@#@$$) a0123456789876543210) where- suppressUnusedWarnings = snd (((,) (:$$:@#@$$###)) ())- type ($$:@#@$$$) :: ErrorMessage -> ErrorMessage -> ErrorMessage- type family ($$:@#@$$$) (a0123456789876543210 :: ErrorMessage) (a0123456789876543210 :: ErrorMessage) :: ErrorMessage where- ($$:@#@$$$) a0123456789876543210 a0123456789876543210 = ($$:) a0123456789876543210 a0123456789876543210- type (<>:) :: ErrorMessage -> ErrorMessage -> ErrorMessage- type family (<>:) (a :: ErrorMessage) (a :: ErrorMessage) :: ErrorMessage where- (<>:) x y = Apply (Apply (:<>:@#@$) x) y- type ($$:) :: ErrorMessage -> ErrorMessage -> ErrorMessage- type family ($$:) (a :: ErrorMessage) (a :: ErrorMessage) :: ErrorMessage where- ($$:) x y = Apply (Apply (:$$:@#@$) x) y- (%<>:) ::- forall (t :: ErrorMessage) (t :: ErrorMessage). Sing t- -> Sing t- -> Sing (Apply (Apply (<>:@#@$) t) t :: ErrorMessage)- (%$$:) ::- forall (t :: ErrorMessage) (t :: ErrorMessage). Sing t- -> Sing t- -> Sing (Apply (Apply ($$:@#@$) t) t :: ErrorMessage)- (%<>:) (sX :: Sing x) (sY :: Sing y)- = (applySing ((applySing ((singFun2 @(:<>:@#@$)) (:%<>:))) sX)) sY- (%$$:) (sX :: Sing x) (sY :: Sing y)- = (applySing ((applySing ((singFun2 @(:$$:@#@$)) (:%$$:))) sX)) sY- instance SingI ((<>:@#@$) :: (~>) ErrorMessage ((~>) ErrorMessage ErrorMessage)) where- sing = (singFun2 @(<>:@#@$)) (%<>:)- instance SingI d =>- SingI ((<>:@#@$$) (d :: ErrorMessage) :: (~>) ErrorMessage ErrorMessage) where- sing- = (singFun1 @((<>:@#@$$) (d :: ErrorMessage))) ((%<>:) (sing @d))- instance SingI1 ((<>:@#@$$) :: ErrorMessage- -> (~>) ErrorMessage ErrorMessage) where- liftSing (s :: Sing (d :: ErrorMessage))- = (singFun1 @((<>:@#@$$) (d :: ErrorMessage))) ((%<>:) s)- instance SingI (($$:@#@$) :: (~>) ErrorMessage ((~>) ErrorMessage ErrorMessage)) where- sing = (singFun2 @($$:@#@$)) (%$$:)- instance SingI d =>- SingI (($$:@#@$$) (d :: ErrorMessage) :: (~>) ErrorMessage ErrorMessage) where- sing- = (singFun1 @(($$:@#@$$) (d :: ErrorMessage))) ((%$$:) (sing @d))- instance SingI1 (($$:@#@$$) :: ErrorMessage- -> (~>) ErrorMessage ErrorMessage) where- liftSing (s :: Sing (d :: ErrorMessage))- = (singFun1 @(($$:@#@$$) (d :: ErrorMessage))) ((%$$:) s)- data SErrorMessage :: ErrorMessage -> Type- where- (:%$$:) :: forall (n :: ErrorMessage) (n :: ErrorMessage).- (Sing n) -> (Sing n) -> SErrorMessage ((:$$:) n n :: ErrorMessage)- (:%<>:) :: forall (n :: ErrorMessage) (n :: ErrorMessage).- (Sing n) -> (Sing n) -> SErrorMessage ((:<>:) n n :: ErrorMessage)- SEM :: forall (n :: [Bool]).- (Sing n) -> SErrorMessage (EM n :: ErrorMessage)- type instance Sing @ErrorMessage = SErrorMessage- instance SingKind ErrorMessage where- type Demote ErrorMessage = ErrorMessage- fromSing ((:%$$:) b b) = ((:$$:) (fromSing b)) (fromSing b)- fromSing ((:%<>:) b b) = ((:<>:) (fromSing b)) (fromSing b)- fromSing (SEM b) = EM (fromSing b)- toSing- ((:$$:) (b :: Demote ErrorMessage) (b :: Demote ErrorMessage))- = case- ((,) (toSing b :: SomeSing ErrorMessage))- (toSing b :: SomeSing ErrorMessage)- of- (,) (SomeSing c) (SomeSing c) -> SomeSing (((:%$$:) c) c)- toSing- ((:<>:) (b :: Demote ErrorMessage) (b :: Demote ErrorMessage))- = case- ((,) (toSing b :: SomeSing ErrorMessage))- (toSing b :: SomeSing ErrorMessage)- of- (,) (SomeSing c) (SomeSing c) -> SomeSing (((:%<>:) c) c)- toSing (EM (b :: Demote [Bool]))- = case toSing b :: SomeSing [Bool] of- SomeSing c -> SomeSing (SEM c)- instance (SingI n, SingI n) =>- SingI ((:$$:) (n :: ErrorMessage) (n :: ErrorMessage)) where- sing = ((:%$$:) sing) sing- instance SingI n => SingI1 ((:$$:) (n :: ErrorMessage)) where- liftSing = (:%$$:) sing- instance SingI2 (:$$:) where- liftSing2 = (:%$$:)- instance SingI ((:$$:@#@$) :: (~>) ErrorMessage ((~>) ErrorMessage ErrorMessage)) where- sing = (singFun2 @(:$$:@#@$)) (:%$$:)- instance SingI d =>- SingI ((:$$:@#@$$) (d :: ErrorMessage) :: (~>) ErrorMessage ErrorMessage) where- sing- = (singFun1 @((:$$:@#@$$) (d :: ErrorMessage))) ((:%$$:) (sing @d))- instance SingI1 ((:$$:@#@$$) :: ErrorMessage- -> (~>) ErrorMessage ErrorMessage) where- liftSing (s :: Sing (d :: ErrorMessage))- = (singFun1 @((:$$:@#@$$) (d :: ErrorMessage))) ((:%$$:) s)- instance (SingI n, SingI n) =>- SingI ((:<>:) (n :: ErrorMessage) (n :: ErrorMessage)) where- sing = ((:%<>:) sing) sing- instance SingI n => SingI1 ((:<>:) (n :: ErrorMessage)) where- liftSing = (:%<>:) sing- instance SingI2 (:<>:) where- liftSing2 = (:%<>:)- instance SingI ((:<>:@#@$) :: (~>) ErrorMessage ((~>) ErrorMessage ErrorMessage)) where- sing = (singFun2 @(:<>:@#@$)) (:%<>:)- instance SingI d =>- SingI ((:<>:@#@$$) (d :: ErrorMessage) :: (~>) ErrorMessage ErrorMessage) where- sing- = (singFun1 @((:<>:@#@$$) (d :: ErrorMessage))) ((:%<>:) (sing @d))- instance SingI1 ((:<>:@#@$$) :: ErrorMessage- -> (~>) ErrorMessage ErrorMessage) where- liftSing (s :: Sing (d :: ErrorMessage))- = (singFun1 @((:<>:@#@$$) (d :: ErrorMessage))) ((:%<>:) s)- instance SingI n => SingI (EM (n :: [Bool])) where- sing = SEM sing- instance SingI1 EM where- liftSing = SEM- instance SingI (EMSym0 :: (~>) [Bool] ErrorMessage) where- sing = (singFun1 @EMSym0) SEM+Singletons/T200.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| ($$:) :: ErrorMessage -> ErrorMessage -> ErrorMessage + x $$: y = x :$$: y + (<>:) :: ErrorMessage -> ErrorMessage -> ErrorMessage + x <>: y = x :<>: y + + data ErrorMessage + = ErrorMessage :$$: ErrorMessage | + ErrorMessage :<>: ErrorMessage | + EM [Bool] |] + ======> + data ErrorMessage + = ErrorMessage :$$: ErrorMessage | + ErrorMessage :<>: ErrorMessage | + EM [Bool] + ($$:) :: ErrorMessage -> ErrorMessage -> ErrorMessage + ($$:) x y = (x :$$: y) + (<>:) :: ErrorMessage -> ErrorMessage -> ErrorMessage + (<>:) x y = (x :<>: y) + type (:$$:@#@$) :: (~>) ErrorMessage ((~>) ErrorMessage ErrorMessage) + data (:$$:@#@$) :: (~>) ErrorMessage ((~>) ErrorMessage ErrorMessage) + where + (::$$:@#@$###) :: SameKind (Apply (:$$:@#@$) arg) ((:$$:@#@$$) arg) => + (:$$:@#@$) a0123456789876543210 + type instance Apply (:$$:@#@$) a0123456789876543210 = (:$$:@#@$$) a0123456789876543210 + instance SuppressUnusedWarnings (:$$:@#@$) where + suppressUnusedWarnings = snd ((,) (::$$:@#@$###) ()) + type (:$$:@#@$$) :: ErrorMessage -> (~>) ErrorMessage ErrorMessage + data (:$$:@#@$$) (a0123456789876543210 :: ErrorMessage) :: (~>) ErrorMessage ErrorMessage + where + (::$$:@#@$$###) :: SameKind (Apply ((:$$:@#@$$) a0123456789876543210) arg) ((:$$:@#@$$$) a0123456789876543210 arg) => + (:$$:@#@$$) a0123456789876543210 a0123456789876543210 + type instance Apply ((:$$:@#@$$) a0123456789876543210) a0123456789876543210 = (:$$:) a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings ((:$$:@#@$$) a0123456789876543210) where + suppressUnusedWarnings = snd ((,) (::$$:@#@$$###) ()) + type (:$$:@#@$$$) :: ErrorMessage -> ErrorMessage -> ErrorMessage + type family (:$$:@#@$$$) (a0123456789876543210 :: ErrorMessage) (a0123456789876543210 :: ErrorMessage) :: ErrorMessage where + (:$$:@#@$$$) a0123456789876543210 a0123456789876543210 = (:$$:) a0123456789876543210 a0123456789876543210 + type (:<>:@#@$) :: (~>) ErrorMessage ((~>) ErrorMessage ErrorMessage) + data (:<>:@#@$) :: (~>) ErrorMessage ((~>) ErrorMessage ErrorMessage) + where + (::<>:@#@$###) :: SameKind (Apply (:<>:@#@$) arg) ((:<>:@#@$$) arg) => + (:<>:@#@$) a0123456789876543210 + type instance Apply (:<>:@#@$) a0123456789876543210 = (:<>:@#@$$) a0123456789876543210 + instance SuppressUnusedWarnings (:<>:@#@$) where + suppressUnusedWarnings = snd ((,) (::<>:@#@$###) ()) + type (:<>:@#@$$) :: ErrorMessage -> (~>) ErrorMessage ErrorMessage + data (:<>:@#@$$) (a0123456789876543210 :: ErrorMessage) :: (~>) ErrorMessage ErrorMessage + where + (::<>:@#@$$###) :: SameKind (Apply ((:<>:@#@$$) a0123456789876543210) arg) ((:<>:@#@$$$) a0123456789876543210 arg) => + (:<>:@#@$$) a0123456789876543210 a0123456789876543210 + type instance Apply ((:<>:@#@$$) a0123456789876543210) a0123456789876543210 = (:<>:) a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings ((:<>:@#@$$) a0123456789876543210) where + suppressUnusedWarnings = snd ((,) (::<>:@#@$$###) ()) + type (:<>:@#@$$$) :: ErrorMessage -> ErrorMessage -> ErrorMessage + type family (:<>:@#@$$$) (a0123456789876543210 :: ErrorMessage) (a0123456789876543210 :: ErrorMessage) :: ErrorMessage where + (:<>:@#@$$$) a0123456789876543210 a0123456789876543210 = (:<>:) a0123456789876543210 a0123456789876543210 + type EMSym0 :: (~>) [Bool] ErrorMessage + data EMSym0 :: (~>) [Bool] ErrorMessage + where + EMSym0KindInference :: SameKind (Apply EMSym0 arg) (EMSym1 arg) => + EMSym0 a0123456789876543210 + type instance Apply EMSym0 a0123456789876543210 = EM a0123456789876543210 + instance SuppressUnusedWarnings EMSym0 where + suppressUnusedWarnings = snd ((,) EMSym0KindInference ()) + type EMSym1 :: [Bool] -> ErrorMessage + type family EMSym1 (a0123456789876543210 :: [Bool]) :: ErrorMessage where + EMSym1 a0123456789876543210 = EM a0123456789876543210 + type (<>:@#@$) :: (~>) ErrorMessage ((~>) ErrorMessage ErrorMessage) + data (<>:@#@$) :: (~>) ErrorMessage ((~>) ErrorMessage ErrorMessage) + where + (:<>:@#@$###) :: SameKind (Apply (<>:@#@$) arg) ((<>:@#@$$) arg) => + (<>:@#@$) a0123456789876543210 + type instance Apply (<>:@#@$) a0123456789876543210 = (<>:@#@$$) a0123456789876543210 + instance SuppressUnusedWarnings (<>:@#@$) where + suppressUnusedWarnings = snd ((,) (:<>:@#@$###) ()) + type (<>:@#@$$) :: ErrorMessage -> (~>) ErrorMessage ErrorMessage + data (<>:@#@$$) (a0123456789876543210 :: ErrorMessage) :: (~>) ErrorMessage ErrorMessage + where + (:<>:@#@$$###) :: SameKind (Apply ((<>:@#@$$) a0123456789876543210) arg) ((<>:@#@$$$) a0123456789876543210 arg) => + (<>:@#@$$) a0123456789876543210 a0123456789876543210 + type instance Apply ((<>:@#@$$) a0123456789876543210) a0123456789876543210 = (<>:) a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings ((<>:@#@$$) a0123456789876543210) where + suppressUnusedWarnings = snd ((,) (:<>:@#@$$###) ()) + type (<>:@#@$$$) :: ErrorMessage -> ErrorMessage -> ErrorMessage + type family (<>:@#@$$$) (a0123456789876543210 :: ErrorMessage) (a0123456789876543210 :: ErrorMessage) :: ErrorMessage where + (<>:@#@$$$) a0123456789876543210 a0123456789876543210 = (<>:) a0123456789876543210 a0123456789876543210 + type ($$:@#@$) :: (~>) ErrorMessage ((~>) ErrorMessage ErrorMessage) + data ($$:@#@$) :: (~>) ErrorMessage ((~>) ErrorMessage ErrorMessage) + where + (:$$:@#@$###) :: SameKind (Apply ($$:@#@$) arg) (($$:@#@$$) arg) => + ($$:@#@$) a0123456789876543210 + type instance Apply ($$:@#@$) a0123456789876543210 = ($$:@#@$$) a0123456789876543210 + instance SuppressUnusedWarnings ($$:@#@$) where + suppressUnusedWarnings = snd ((,) (:$$:@#@$###) ()) + type ($$:@#@$$) :: ErrorMessage -> (~>) ErrorMessage ErrorMessage + data ($$:@#@$$) (a0123456789876543210 :: ErrorMessage) :: (~>) ErrorMessage ErrorMessage + where + (:$$:@#@$$###) :: SameKind (Apply (($$:@#@$$) a0123456789876543210) arg) (($$:@#@$$$) a0123456789876543210 arg) => + ($$:@#@$$) a0123456789876543210 a0123456789876543210 + type instance Apply (($$:@#@$$) a0123456789876543210) a0123456789876543210 = ($$:) a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (($$:@#@$$) a0123456789876543210) where + suppressUnusedWarnings = snd ((,) (:$$:@#@$$###) ()) + type ($$:@#@$$$) :: ErrorMessage -> ErrorMessage -> ErrorMessage + type family ($$:@#@$$$) (a0123456789876543210 :: ErrorMessage) (a0123456789876543210 :: ErrorMessage) :: ErrorMessage where + ($$:@#@$$$) a0123456789876543210 a0123456789876543210 = ($$:) a0123456789876543210 a0123456789876543210 + type (<>:) :: ErrorMessage -> ErrorMessage -> ErrorMessage + type family (<>:) (a :: ErrorMessage) (a :: ErrorMessage) :: ErrorMessage where + (<>:) x y = Apply (Apply (:<>:@#@$) x) y + type ($$:) :: ErrorMessage -> ErrorMessage -> ErrorMessage + type family ($$:) (a :: ErrorMessage) (a :: ErrorMessage) :: ErrorMessage where + ($$:) x y = Apply (Apply (:$$:@#@$) x) y + (%<>:) :: + (forall (t :: ErrorMessage) (t :: ErrorMessage). + Sing t + -> Sing t + -> Sing (Apply (Apply (<>:@#@$) t) t :: ErrorMessage) :: Type) + (%$$:) :: + (forall (t :: ErrorMessage) (t :: ErrorMessage). + Sing t + -> Sing t + -> Sing (Apply (Apply ($$:@#@$) t) t :: ErrorMessage) :: Type) + (%<>:) (sX :: Sing x) (sY :: Sing y) + = applySing (applySing (singFun2 @(:<>:@#@$) (:%<>:)) sX) sY + (%$$:) (sX :: Sing x) (sY :: Sing y) + = applySing (applySing (singFun2 @(:$$:@#@$) (:%$$:)) sX) sY + instance SingI ((<>:@#@$) :: (~>) ErrorMessage ((~>) ErrorMessage ErrorMessage)) where + sing = singFun2 @(<>:@#@$) (%<>:) + instance SingI d => + SingI ((<>:@#@$$) (d :: ErrorMessage) :: (~>) ErrorMessage ErrorMessage) where + sing + = singFun1 @((<>:@#@$$) (d :: ErrorMessage)) ((%<>:) (sing @d)) + instance SingI1 ((<>:@#@$$) :: ErrorMessage + -> (~>) ErrorMessage ErrorMessage) where + liftSing (s :: Sing (d :: ErrorMessage)) + = singFun1 @((<>:@#@$$) (d :: ErrorMessage)) ((%<>:) s) + instance SingI (($$:@#@$) :: (~>) ErrorMessage ((~>) ErrorMessage ErrorMessage)) where + sing = singFun2 @($$:@#@$) (%$$:) + instance SingI d => + SingI (($$:@#@$$) (d :: ErrorMessage) :: (~>) ErrorMessage ErrorMessage) where + sing + = singFun1 @(($$:@#@$$) (d :: ErrorMessage)) ((%$$:) (sing @d)) + instance SingI1 (($$:@#@$$) :: ErrorMessage + -> (~>) ErrorMessage ErrorMessage) where + liftSing (s :: Sing (d :: ErrorMessage)) + = singFun1 @(($$:@#@$$) (d :: ErrorMessage)) ((%$$:) s) + data SErrorMessage :: ErrorMessage -> Type + where + (:%$$:) :: forall (n :: ErrorMessage) (n :: ErrorMessage). + (Sing n) -> (Sing n) -> SErrorMessage ((:$$:) n n :: ErrorMessage) + (:%<>:) :: forall (n :: ErrorMessage) (n :: ErrorMessage). + (Sing n) -> (Sing n) -> SErrorMessage ((:<>:) n n :: ErrorMessage) + SEM :: forall (n :: [Bool]). + (Sing n) -> SErrorMessage (EM n :: ErrorMessage) + type instance Sing @ErrorMessage = SErrorMessage + instance SingKind ErrorMessage where + type Demote ErrorMessage = ErrorMessage + fromSing ((:%$$:) b b) = (:$$:) (fromSing b) (fromSing b) + fromSing ((:%<>:) b b) = (:<>:) (fromSing b) (fromSing b) + fromSing (SEM b) = EM (fromSing b) + toSing + ((:$$:) (b :: Demote ErrorMessage) (b :: Demote ErrorMessage)) + = case + (,) + (toSing b :: SomeSing ErrorMessage) + (toSing b :: SomeSing ErrorMessage) + of + (,) (SomeSing c) (SomeSing c) -> SomeSing ((:%$$:) c c) + toSing + ((:<>:) (b :: Demote ErrorMessage) (b :: Demote ErrorMessage)) + = case + (,) + (toSing b :: SomeSing ErrorMessage) + (toSing b :: SomeSing ErrorMessage) + of + (,) (SomeSing c) (SomeSing c) -> SomeSing ((:%<>:) c c) + toSing (EM (b :: Demote [Bool])) + = case toSing b :: SomeSing [Bool] of + SomeSing c -> SomeSing (SEM c) + instance (SingI n, SingI n) => + SingI ((:$$:) (n :: ErrorMessage) (n :: ErrorMessage)) where + sing = (:%$$:) sing sing + instance SingI n => SingI1 ((:$$:) (n :: ErrorMessage)) where + liftSing = (:%$$:) sing + instance SingI2 (:$$:) where + liftSing2 = (:%$$:) + instance SingI ((:$$:@#@$) :: (~>) ErrorMessage ((~>) ErrorMessage ErrorMessage)) where + sing = singFun2 @(:$$:@#@$) (:%$$:) + instance SingI d => + SingI ((:$$:@#@$$) (d :: ErrorMessage) :: (~>) ErrorMessage ErrorMessage) where + sing + = singFun1 @((:$$:@#@$$) (d :: ErrorMessage)) ((:%$$:) (sing @d)) + instance SingI1 ((:$$:@#@$$) :: ErrorMessage + -> (~>) ErrorMessage ErrorMessage) where + liftSing (s :: Sing (d :: ErrorMessage)) + = singFun1 @((:$$:@#@$$) (d :: ErrorMessage)) ((:%$$:) s) + instance (SingI n, SingI n) => + SingI ((:<>:) (n :: ErrorMessage) (n :: ErrorMessage)) where + sing = (:%<>:) sing sing + instance SingI n => SingI1 ((:<>:) (n :: ErrorMessage)) where + liftSing = (:%<>:) sing + instance SingI2 (:<>:) where + liftSing2 = (:%<>:) + instance SingI ((:<>:@#@$) :: (~>) ErrorMessage ((~>) ErrorMessage ErrorMessage)) where + sing = singFun2 @(:<>:@#@$) (:%<>:) + instance SingI d => + SingI ((:<>:@#@$$) (d :: ErrorMessage) :: (~>) ErrorMessage ErrorMessage) where + sing + = singFun1 @((:<>:@#@$$) (d :: ErrorMessage)) ((:%<>:) (sing @d)) + instance SingI1 ((:<>:@#@$$) :: ErrorMessage + -> (~>) ErrorMessage ErrorMessage) where + liftSing (s :: Sing (d :: ErrorMessage)) + = singFun1 @((:<>:@#@$$) (d :: ErrorMessage)) ((:%<>:) s) + instance SingI n => SingI (EM (n :: [Bool])) where + sing = SEM sing + instance SingI1 EM where + liftSing = SEM + instance SingI (EMSym0 :: (~>) [Bool] ErrorMessage) where + sing = singFun1 @EMSym0 SEM
tests/compile-and-dump/Singletons/T200.hs view
@@ -1,15 +1,15 @@-module T200 where--import Data.Singletons.Base.TH--$(singletons [d|- data ErrorMessage = ErrorMessage :$$: ErrorMessage- | ErrorMessage :<>: ErrorMessage- | EM [Bool]-- ($$:) :: ErrorMessage -> ErrorMessage -> ErrorMessage- x $$: y = x :$$: y-- (<>:) :: ErrorMessage -> ErrorMessage -> ErrorMessage- x <>: y = x :<>: y- |])+module T200 where + +import Data.Singletons.Base.TH + +$(singletons [d| + data ErrorMessage = ErrorMessage :$$: ErrorMessage + | ErrorMessage :<>: ErrorMessage + | EM [Bool] + + ($$:) :: ErrorMessage -> ErrorMessage -> ErrorMessage + x $$: y = x :$$: y + + (<>:) :: ErrorMessage -> ErrorMessage -> ErrorMessage + x <>: y = x :<>: y + |])
tests/compile-and-dump/Singletons/T204.golden view
@@ -1,106 +1,106 @@-Singletons/T204.hs:(0,0)-(0,0): Splicing declarations- let- sing_data_con_name :: Name -> Name- sing_data_con_name n- = case nameBase n of- ':' : '%' : rest -> mkName $ ":^%" ++ rest- _ -> singledDataConName defaultOptions n- in- withOptions- defaultOptions {singledDataConName = sing_data_con_name}- $ singletons- $ lift- [d| data Ratio1 a = a :% a- data Ratio2 a = a :%% a |]- ======>- data Ratio1 a = a :% a- data Ratio2 a = a :%% a- type (:%@#@$) :: forall a. (~>) a ((~>) a (Ratio1 a))- data (:%@#@$) :: (~>) a ((~>) a (Ratio1 a))- where- (::%@#@$###) :: SameKind (Apply (:%@#@$) arg) ((:%@#@$$) arg) =>- (:%@#@$) a0123456789876543210- type instance Apply (:%@#@$) a0123456789876543210 = (:%@#@$$) a0123456789876543210- instance SuppressUnusedWarnings (:%@#@$) where- suppressUnusedWarnings = snd (((,) (::%@#@$###)) ())- type (:%@#@$$) :: forall a. a -> (~>) a (Ratio1 a)- data (:%@#@$$) (a0123456789876543210 :: a) :: (~>) a (Ratio1 a)- where- (::%@#@$$###) :: SameKind (Apply ((:%@#@$$) a0123456789876543210) arg) ((:%@#@$$$) a0123456789876543210 arg) =>- (:%@#@$$) a0123456789876543210 a0123456789876543210- type instance Apply ((:%@#@$$) a0123456789876543210) a0123456789876543210 = (:%) a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings ((:%@#@$$) a0123456789876543210) where- suppressUnusedWarnings = snd (((,) (::%@#@$$###)) ())- type (:%@#@$$$) :: forall a. a -> a -> Ratio1 a- type family (:%@#@$$$) (a0123456789876543210 :: a) (a0123456789876543210 :: a) :: Ratio1 a where- (:%@#@$$$) a0123456789876543210 a0123456789876543210 = (:%) a0123456789876543210 a0123456789876543210- type (:%%@#@$) :: forall a. (~>) a ((~>) a (Ratio2 a))- data (:%%@#@$) :: (~>) a ((~>) a (Ratio2 a))- where- (::%%@#@$###) :: SameKind (Apply (:%%@#@$) arg) ((:%%@#@$$) arg) =>- (:%%@#@$) a0123456789876543210- type instance Apply (:%%@#@$) a0123456789876543210 = (:%%@#@$$) a0123456789876543210- instance SuppressUnusedWarnings (:%%@#@$) where- suppressUnusedWarnings = snd (((,) (::%%@#@$###)) ())- type (:%%@#@$$) :: forall a. a -> (~>) a (Ratio2 a)- data (:%%@#@$$) (a0123456789876543210 :: a) :: (~>) a (Ratio2 a)- where- (::%%@#@$$###) :: SameKind (Apply ((:%%@#@$$) a0123456789876543210) arg) ((:%%@#@$$$) a0123456789876543210 arg) =>- (:%%@#@$$) a0123456789876543210 a0123456789876543210- type instance Apply ((:%%@#@$$) a0123456789876543210) a0123456789876543210 = (:%%) a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings ((:%%@#@$$) a0123456789876543210) where- suppressUnusedWarnings = snd (((,) (::%%@#@$$###)) ())- type (:%%@#@$$$) :: forall a. a -> a -> Ratio2 a- type family (:%%@#@$$$) (a0123456789876543210 :: a) (a0123456789876543210 :: a) :: Ratio2 a where- (:%%@#@$$$) a0123456789876543210 a0123456789876543210 = (:%%) a0123456789876543210 a0123456789876543210- data SRatio1 :: forall a. Ratio1 a -> GHC.Types.Type- where- (:^%) :: forall a (n :: a) (n :: a).- (Sing n) -> (Sing n) -> SRatio1 ((:%) n n :: Ratio1 a)- type instance Sing @(Ratio1 a) = SRatio1- instance SingKind a => SingKind (Ratio1 a) where- type Demote (Ratio1 a) = Ratio1 (Demote a)- fromSing ((:^%) b b) = ((:%) (fromSing b)) (fromSing b)- toSing ((:%) (b :: Demote a) (b :: Demote a))- = case ((,) (toSing b :: SomeSing a)) (toSing b :: SomeSing a) of- (,) (SomeSing c) (SomeSing c) -> SomeSing (((:^%) c) c)- data SRatio2 :: forall a. Ratio2 a -> GHC.Types.Type- where- (:^%%) :: forall a (n :: a) (n :: a).- (Sing n) -> (Sing n) -> SRatio2 ((:%%) n n :: Ratio2 a)- type instance Sing @(Ratio2 a) = SRatio2- instance SingKind a => SingKind (Ratio2 a) where- type Demote (Ratio2 a) = Ratio2 (Demote a)- fromSing ((:^%%) b b) = ((:%%) (fromSing b)) (fromSing b)- toSing ((:%%) (b :: Demote a) (b :: Demote a))- = case ((,) (toSing b :: SomeSing a)) (toSing b :: SomeSing a) of- (,) (SomeSing c) (SomeSing c) -> SomeSing (((:^%%) c) c)- instance (SingI n, SingI n) => SingI ((:%) (n :: a) (n :: a)) where- sing = ((:^%) sing) sing- instance SingI n => SingI1 ((:%) (n :: a)) where- liftSing = (:^%) sing- instance SingI2 (:%) where- liftSing2 = (:^%)- instance SingI ((:%@#@$) :: (~>) a ((~>) a (Ratio1 a))) where- sing = (singFun2 @(:%@#@$)) (:^%)- instance SingI d =>- SingI ((:%@#@$$) (d :: a) :: (~>) a (Ratio1 a)) where- sing = (singFun1 @((:%@#@$$) (d :: a))) ((:^%) (sing @d))- instance SingI1 ((:%@#@$$) :: a -> (~>) a (Ratio1 a)) where- liftSing (s :: Sing (d :: a))- = (singFun1 @((:%@#@$$) (d :: a))) ((:^%) s)- instance (SingI n, SingI n) =>- SingI ((:%%) (n :: a) (n :: a)) where- sing = ((:^%%) sing) sing- instance SingI n => SingI1 ((:%%) (n :: a)) where- liftSing = (:^%%) sing- instance SingI2 (:%%) where- liftSing2 = (:^%%)- instance SingI ((:%%@#@$) :: (~>) a ((~>) a (Ratio2 a))) where- sing = (singFun2 @(:%%@#@$)) (:^%%)- instance SingI d =>- SingI ((:%%@#@$$) (d :: a) :: (~>) a (Ratio2 a)) where- sing = (singFun1 @((:%%@#@$$) (d :: a))) ((:^%%) (sing @d))- instance SingI1 ((:%%@#@$$) :: a -> (~>) a (Ratio2 a)) where- liftSing (s :: Sing (d :: a))- = (singFun1 @((:%%@#@$$) (d :: a))) ((:^%%) s)+Singletons/T204.hs:(0,0)-(0,0): Splicing declarations + let + sing_data_con_name :: Name -> Name + sing_data_con_name n + = case nameBase n of + ':' : '%' : rest -> mkName $ ":^%" ++ rest + _ -> singledDataConName defaultOptions n + in + withOptions + defaultOptions {singledDataConName = sing_data_con_name} + $ singletons + $ lift + [d| data Ratio1 a = a :% a + data Ratio2 a = a :%% a |] + ======> + data Ratio1 a = a :% a + data Ratio2 a = a :%% a + type (:%@#@$) :: forall a. (~>) a ((~>) a (Ratio1 a)) + data (:%@#@$) :: (~>) a ((~>) a (Ratio1 a)) + where + (::%@#@$###) :: SameKind (Apply (:%@#@$) arg) ((:%@#@$$) arg) => + (:%@#@$) a0123456789876543210 + type instance Apply (:%@#@$) a0123456789876543210 = (:%@#@$$) a0123456789876543210 + instance SuppressUnusedWarnings (:%@#@$) where + suppressUnusedWarnings = snd ((,) (::%@#@$###) ()) + type (:%@#@$$) :: forall a. a -> (~>) a (Ratio1 a) + data (:%@#@$$) (a0123456789876543210 :: a) :: (~>) a (Ratio1 a) + where + (::%@#@$$###) :: SameKind (Apply ((:%@#@$$) a0123456789876543210) arg) ((:%@#@$$$) a0123456789876543210 arg) => + (:%@#@$$) a0123456789876543210 a0123456789876543210 + type instance Apply ((:%@#@$$) a0123456789876543210) a0123456789876543210 = (:%) a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings ((:%@#@$$) a0123456789876543210) where + suppressUnusedWarnings = snd ((,) (::%@#@$$###) ()) + type (:%@#@$$$) :: forall a. a -> a -> Ratio1 a + type family (:%@#@$$$) (a0123456789876543210 :: a) (a0123456789876543210 :: a) :: Ratio1 a where + (:%@#@$$$) a0123456789876543210 a0123456789876543210 = (:%) a0123456789876543210 a0123456789876543210 + type (:%%@#@$) :: forall a. (~>) a ((~>) a (Ratio2 a)) + data (:%%@#@$) :: (~>) a ((~>) a (Ratio2 a)) + where + (::%%@#@$###) :: SameKind (Apply (:%%@#@$) arg) ((:%%@#@$$) arg) => + (:%%@#@$) a0123456789876543210 + type instance Apply (:%%@#@$) a0123456789876543210 = (:%%@#@$$) a0123456789876543210 + instance SuppressUnusedWarnings (:%%@#@$) where + suppressUnusedWarnings = snd ((,) (::%%@#@$###) ()) + type (:%%@#@$$) :: forall a. a -> (~>) a (Ratio2 a) + data (:%%@#@$$) (a0123456789876543210 :: a) :: (~>) a (Ratio2 a) + where + (::%%@#@$$###) :: SameKind (Apply ((:%%@#@$$) a0123456789876543210) arg) ((:%%@#@$$$) a0123456789876543210 arg) => + (:%%@#@$$) a0123456789876543210 a0123456789876543210 + type instance Apply ((:%%@#@$$) a0123456789876543210) a0123456789876543210 = (:%%) a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings ((:%%@#@$$) a0123456789876543210) where + suppressUnusedWarnings = snd ((,) (::%%@#@$$###) ()) + type (:%%@#@$$$) :: forall a. a -> a -> Ratio2 a + type family (:%%@#@$$$) (a0123456789876543210 :: a) (a0123456789876543210 :: a) :: Ratio2 a where + (:%%@#@$$$) a0123456789876543210 a0123456789876543210 = (:%%) a0123456789876543210 a0123456789876543210 + data SRatio1 :: forall a. Ratio1 a -> GHC.Types.Type + where + (:^%) :: forall a (n :: a) (n :: a). + (Sing n) -> (Sing n) -> SRatio1 ((:%) n n :: Ratio1 a) + type instance Sing @(Ratio1 a) = SRatio1 + instance SingKind a => SingKind (Ratio1 a) where + type Demote (Ratio1 a) = Ratio1 (Demote a) + fromSing ((:^%) b b) = (:%) (fromSing b) (fromSing b) + toSing ((:%) (b :: Demote a) (b :: Demote a)) + = case (,) (toSing b :: SomeSing a) (toSing b :: SomeSing a) of + (,) (SomeSing c) (SomeSing c) -> SomeSing ((:^%) c c) + data SRatio2 :: forall a. Ratio2 a -> GHC.Types.Type + where + (:^%%) :: forall a (n :: a) (n :: a). + (Sing n) -> (Sing n) -> SRatio2 ((:%%) n n :: Ratio2 a) + type instance Sing @(Ratio2 a) = SRatio2 + instance SingKind a => SingKind (Ratio2 a) where + type Demote (Ratio2 a) = Ratio2 (Demote a) + fromSing ((:^%%) b b) = (:%%) (fromSing b) (fromSing b) + toSing ((:%%) (b :: Demote a) (b :: Demote a)) + = case (,) (toSing b :: SomeSing a) (toSing b :: SomeSing a) of + (,) (SomeSing c) (SomeSing c) -> SomeSing ((:^%%) c c) + instance (SingI n, SingI n) => SingI ((:%) (n :: a) (n :: a)) where + sing = (:^%) sing sing + instance SingI n => SingI1 ((:%) (n :: a)) where + liftSing = (:^%) sing + instance SingI2 (:%) where + liftSing2 = (:^%) + instance SingI ((:%@#@$) :: (~>) a ((~>) a (Ratio1 a))) where + sing = singFun2 @(:%@#@$) (:^%) + instance SingI d => + SingI ((:%@#@$$) (d :: a) :: (~>) a (Ratio1 a)) where + sing = singFun1 @((:%@#@$$) (d :: a)) ((:^%) (sing @d)) + instance SingI1 ((:%@#@$$) :: a -> (~>) a (Ratio1 a)) where + liftSing (s :: Sing (d :: a)) + = singFun1 @((:%@#@$$) (d :: a)) ((:^%) s) + instance (SingI n, SingI n) => + SingI ((:%%) (n :: a) (n :: a)) where + sing = (:^%%) sing sing + instance SingI n => SingI1 ((:%%) (n :: a)) where + liftSing = (:^%%) sing + instance SingI2 (:%%) where + liftSing2 = (:^%%) + instance SingI ((:%%@#@$) :: (~>) a ((~>) a (Ratio2 a))) where + sing = singFun2 @(:%%@#@$) (:^%%) + instance SingI d => + SingI ((:%%@#@$$) (d :: a) :: (~>) a (Ratio2 a)) where + sing = singFun1 @((:%%@#@$$) (d :: a)) ((:^%%) (sing @d)) + instance SingI1 ((:%%@#@$$) :: a -> (~>) a (Ratio2 a)) where + liftSing (s :: Sing (d :: a)) + = singFun1 @((:%%@#@$$) (d :: a)) ((:^%%) s)
tests/compile-and-dump/Singletons/T204.hs view
@@ -1,17 +1,17 @@-module T204 where--import Control.Monad.Trans.Class-import Data.Singletons.TH-import Data.Singletons.TH.Options-import Language.Haskell.TH--$(let sing_data_con_name :: Name -> Name- sing_data_con_name n =- case nameBase n of- ':':'%':rest -> mkName $ ":^%" ++ rest- _ -> singledDataConName defaultOptions n in- withOptions defaultOptions{singledDataConName = sing_data_con_name} $- singletons $ lift- [d| data Ratio1 a = a :% a- data Ratio2 a = a :%% a- |])+module T204 where + +import Control.Monad.Trans.Class +import Data.Singletons.TH +import Data.Singletons.TH.Options +import Language.Haskell.TH + +$(let sing_data_con_name :: Name -> Name + sing_data_con_name n = + case nameBase n of + ':':'%':rest -> mkName $ ":^%" ++ rest + _ -> singledDataConName defaultOptions n in + withOptions defaultOptions{singledDataConName = sing_data_con_name} $ + singletons $ lift + [d| data Ratio1 a = a :% a + data Ratio2 a = a :%% a + |])
tests/compile-and-dump/Singletons/T206.hs view
@@ -1,5 +1,5 @@-module T206 where--import Prelude.Singletons--x = SCons @Bool @True @'[False]+module T206 where + +import Prelude.Singletons + +x = SCons @Bool @True @'[False]
tests/compile-and-dump/Singletons/T209.golden view
@@ -1,90 +1,90 @@-Singletons/T209.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| m :: a -> b -> Bool -> Bool- m _ _ x = x- - class C a b- data Hm- = Hm- deriving anyclass (C Bool)- - deriving anyclass instance C a a => C a (Maybe a) |]- ======>- class C a b- m :: a -> b -> Bool -> Bool- m _ _ x = x- data Hm- = Hm- deriving anyclass (C Bool)- deriving anyclass instance C a a => C a (Maybe a)- type HmSym0 :: Hm- type family HmSym0 :: Hm where- HmSym0 = Hm- type MSym0 :: (~>) a ((~>) b ((~>) Bool Bool))- data MSym0 :: (~>) a ((~>) b ((~>) Bool Bool))- where- MSym0KindInference :: SameKind (Apply MSym0 arg) (MSym1 arg) =>- MSym0 a0123456789876543210- type instance Apply MSym0 a0123456789876543210 = MSym1 a0123456789876543210- instance SuppressUnusedWarnings MSym0 where- suppressUnusedWarnings = snd (((,) MSym0KindInference) ())- type MSym1 :: a -> (~>) b ((~>) Bool Bool)- data MSym1 (a0123456789876543210 :: a) :: (~>) b ((~>) Bool Bool)- where- MSym1KindInference :: SameKind (Apply (MSym1 a0123456789876543210) arg) (MSym2 a0123456789876543210 arg) =>- MSym1 a0123456789876543210 a0123456789876543210- type instance Apply (MSym1 a0123456789876543210) a0123456789876543210 = MSym2 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (MSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) MSym1KindInference) ())- type MSym2 :: a -> b -> (~>) Bool Bool- data MSym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: (~>) Bool Bool- where- MSym2KindInference :: SameKind (Apply (MSym2 a0123456789876543210 a0123456789876543210) arg) (MSym3 a0123456789876543210 a0123456789876543210 arg) =>- MSym2 a0123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply (MSym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = M a0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (MSym2 a0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) MSym2KindInference) ())- type MSym3 :: a -> b -> Bool -> Bool- type family MSym3 (a0123456789876543210 :: a) (a0123456789876543210 :: b) (a0123456789876543210 :: Bool) :: Bool where- MSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = M a0123456789876543210 a0123456789876543210 a0123456789876543210- type M :: a -> b -> Bool -> Bool- type family M (a :: a) (a :: b) (a :: Bool) :: Bool where- M _ _ x = x- class PC a b- instance PC Bool Hm- instance PC a (Maybe a)- sM ::- forall a b (t :: a) (t :: b) (t :: Bool). Sing t- -> Sing t- -> Sing t- -> Sing (Apply (Apply (Apply MSym0 t) t) t :: Bool)- sM _ _ (sX :: Sing x) = sX- instance SingI (MSym0 :: (~>) a ((~>) b ((~>) Bool Bool))) where- sing = (singFun3 @MSym0) sM- instance SingI d =>- SingI (MSym1 (d :: a) :: (~>) b ((~>) Bool Bool)) where- sing = (singFun2 @(MSym1 (d :: a))) (sM (sing @d))- instance SingI1 (MSym1 :: a -> (~>) b ((~>) Bool Bool)) where- liftSing (s :: Sing (d :: a)) = (singFun2 @(MSym1 (d :: a))) (sM s)- instance (SingI d, SingI d) =>- SingI (MSym2 (d :: a) (d :: b) :: (~>) Bool Bool) where- sing- = (singFun1 @(MSym2 (d :: a) (d :: b))) ((sM (sing @d)) (sing @d))- instance SingI d =>- SingI1 (MSym2 (d :: a) :: b -> (~>) Bool Bool) where- liftSing (s :: Sing (d :: b))- = (singFun1 @(MSym2 (d :: a) (d :: b))) ((sM (sing @d)) s)- instance SingI2 (MSym2 :: a -> b -> (~>) Bool Bool) where- liftSing2 (s :: Sing (d :: a)) (s :: Sing (d :: b))- = (singFun1 @(MSym2 (d :: a) (d :: b))) ((sM s) s)- data SHm :: Hm -> Type where SHm :: SHm (Hm :: Hm)- type instance Sing @Hm = SHm- instance SingKind Hm where- type Demote Hm = Hm- fromSing SHm = Hm- toSing Hm = SomeSing SHm- class SC a b- instance SC Bool Hm- instance SC a a => SC a (Maybe a)- instance SingI Hm where- sing = SHm+Singletons/T209.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| m :: a -> b -> Bool -> Bool + m _ _ x = x + + class C a b + data Hm + = Hm + deriving anyclass (C Bool) + + deriving anyclass instance C a a => C a (Maybe a) |] + ======> + class C a b + m :: a -> b -> Bool -> Bool + m _ _ x = x + data Hm + = Hm + deriving anyclass (C Bool) + deriving anyclass instance C a a => C a (Maybe a) + type HmSym0 :: Hm + type family HmSym0 :: Hm where + HmSym0 = Hm + type MSym0 :: (~>) a ((~>) b ((~>) Bool Bool)) + data MSym0 :: (~>) a ((~>) b ((~>) Bool Bool)) + where + MSym0KindInference :: SameKind (Apply MSym0 arg) (MSym1 arg) => + MSym0 a0123456789876543210 + type instance Apply MSym0 a0123456789876543210 = MSym1 a0123456789876543210 + instance SuppressUnusedWarnings MSym0 where + suppressUnusedWarnings = snd ((,) MSym0KindInference ()) + type MSym1 :: a -> (~>) b ((~>) Bool Bool) + data MSym1 (a0123456789876543210 :: a) :: (~>) b ((~>) Bool Bool) + where + MSym1KindInference :: SameKind (Apply (MSym1 a0123456789876543210) arg) (MSym2 a0123456789876543210 arg) => + MSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (MSym1 a0123456789876543210) a0123456789876543210 = MSym2 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (MSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) MSym1KindInference ()) + type MSym2 :: a -> b -> (~>) Bool Bool + data MSym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: (~>) Bool Bool + where + MSym2KindInference :: SameKind (Apply (MSym2 a0123456789876543210 a0123456789876543210) arg) (MSym3 a0123456789876543210 a0123456789876543210 arg) => + MSym2 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply (MSym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = M a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (MSym2 a0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) MSym2KindInference ()) + type MSym3 :: a -> b -> Bool -> Bool + type family MSym3 (a0123456789876543210 :: a) (a0123456789876543210 :: b) (a0123456789876543210 :: Bool) :: Bool where + MSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = M a0123456789876543210 a0123456789876543210 a0123456789876543210 + type M :: a -> b -> Bool -> Bool + type family M (a :: a) (a :: b) (a :: Bool) :: Bool where + M _ _ x = x + class PC a b + instance PC Bool Hm + instance PC a (Maybe a) + sM :: + (forall (t :: a) (t :: b) (t :: Bool). + Sing t + -> Sing t + -> Sing t + -> Sing (Apply (Apply (Apply MSym0 t) t) t :: Bool) :: Type) + sM _ _ (sX :: Sing x) = sX + instance SingI (MSym0 :: (~>) a ((~>) b ((~>) Bool Bool))) where + sing = singFun3 @MSym0 sM + instance SingI d => + SingI (MSym1 (d :: a) :: (~>) b ((~>) Bool Bool)) where + sing = singFun2 @(MSym1 (d :: a)) (sM (sing @d)) + instance SingI1 (MSym1 :: a -> (~>) b ((~>) Bool Bool)) where + liftSing (s :: Sing (d :: a)) = singFun2 @(MSym1 (d :: a)) (sM s) + instance (SingI d, SingI d) => + SingI (MSym2 (d :: a) (d :: b) :: (~>) Bool Bool) where + sing = singFun1 @(MSym2 (d :: a) (d :: b)) (sM (sing @d) (sing @d)) + instance SingI d => + SingI1 (MSym2 (d :: a) :: b -> (~>) Bool Bool) where + liftSing (s :: Sing (d :: b)) + = singFun1 @(MSym2 (d :: a) (d :: b)) (sM (sing @d) s) + instance SingI2 (MSym2 :: a -> b -> (~>) Bool Bool) where + liftSing2 (s :: Sing (d :: a)) (s :: Sing (d :: b)) + = singFun1 @(MSym2 (d :: a) (d :: b)) (sM s s) + data SHm :: Hm -> Type where SHm :: SHm (Hm :: Hm) + type instance Sing @Hm = SHm + instance SingKind Hm where + type Demote Hm = Hm + fromSing SHm = Hm + toSing Hm = SomeSing SHm + class SC a b + instance SC Bool Hm + instance SC a a => SC a (Maybe a) + instance SingI Hm where + sing = SHm
tests/compile-and-dump/Singletons/T209.hs view
@@ -1,17 +1,17 @@-{-# LANGUAGE DeriveAnyClass #-}-{-# LANGUAGE DerivingStrategies #-}--module T209 where--import Data.Singletons.TH--$(singletons- [d| class C a b where- m :: a -> b -> Bool -> Bool- m _ _ x = x-- data Hm = Hm- deriving anyclass (C Bool)-- deriving anyclass instance C a a => C a (Maybe a)- |])+{-# LANGUAGE DeriveAnyClass #-} +{-# LANGUAGE DerivingStrategies #-} + +module T209 where + +import Data.Singletons.TH + +$(singletons + [d| class C a b where + m :: a -> b -> Bool -> Bool + m _ _ x = x + + data Hm = Hm + deriving anyclass (C Bool) + + deriving anyclass instance C a a => C a (Maybe a) + |])
tests/compile-and-dump/Singletons/T216.golden view
@@ -1,42 +1,42 @@-Singletons/T216.hs:0:0:: Splicing declarations- genDefunSymbols [''MyProxy, ''Symmetry]- ======>- data MyProxySym0 :: (~>) Type ((~>) k0123456789876543210 Type)- where- MyProxySym0KindInference :: SameKind (Apply MyProxySym0 arg) (MyProxySym1 arg) =>- MyProxySym0 k0123456789876543210- type instance Apply MyProxySym0 k0123456789876543210 = MyProxySym1 k0123456789876543210- instance SuppressUnusedWarnings MyProxySym0 where- suppressUnusedWarnings = snd (((,) MyProxySym0KindInference) ())- data MyProxySym1 (k0123456789876543210 :: Type) :: (~>) k0123456789876543210 Type- where- MyProxySym1KindInference :: SameKind (Apply (MyProxySym1 k0123456789876543210) arg) (MyProxySym2 k0123456789876543210 arg) =>- MyProxySym1 k0123456789876543210 e0123456789876543210- type instance Apply (MyProxySym1 k0123456789876543210) e0123456789876543210 = MyProxy k0123456789876543210 e0123456789876543210- instance SuppressUnusedWarnings (MyProxySym1 k0123456789876543210) where- suppressUnusedWarnings = snd (((,) MyProxySym1KindInference) ())- type family MyProxySym2 (k0123456789876543210 :: Type) (e0123456789876543210 :: k0123456789876543210) :: Type where- MyProxySym2 k0123456789876543210 e0123456789876543210 = MyProxy k0123456789876543210 e0123456789876543210- data SymmetrySym0 :: (~>) t0123456789876543210 ((~>) t0123456789876543210 ((~>) ((:~:) a0123456789876543210 y0123456789876543210) Type))- where- SymmetrySym0KindInference :: SameKind (Apply SymmetrySym0 arg) (SymmetrySym1 arg) =>- SymmetrySym0 a0123456789876543210- type instance Apply SymmetrySym0 a0123456789876543210 = SymmetrySym1 a0123456789876543210- instance SuppressUnusedWarnings SymmetrySym0 where- suppressUnusedWarnings = snd (((,) SymmetrySym0KindInference) ())- data SymmetrySym1 (a0123456789876543210 :: t0123456789876543210) :: (~>) t0123456789876543210 ((~>) ((:~:) a0123456789876543210 y0123456789876543210) Type)- where- SymmetrySym1KindInference :: SameKind (Apply (SymmetrySym1 a0123456789876543210) arg) (SymmetrySym2 a0123456789876543210 arg) =>- SymmetrySym1 a0123456789876543210 y0123456789876543210- type instance Apply (SymmetrySym1 a0123456789876543210) y0123456789876543210 = SymmetrySym2 a0123456789876543210 y0123456789876543210- instance SuppressUnusedWarnings (SymmetrySym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) SymmetrySym1KindInference) ())- data SymmetrySym2 (a0123456789876543210 :: t0123456789876543210) (y0123456789876543210 :: t0123456789876543210) :: (~>) ((:~:) a0123456789876543210 y0123456789876543210) Type- where- SymmetrySym2KindInference :: SameKind (Apply (SymmetrySym2 a0123456789876543210 y0123456789876543210) arg) (SymmetrySym3 a0123456789876543210 y0123456789876543210 arg) =>- SymmetrySym2 a0123456789876543210 y0123456789876543210 e0123456789876543210- type instance Apply (SymmetrySym2 a0123456789876543210 y0123456789876543210) e0123456789876543210 = Symmetry a0123456789876543210 y0123456789876543210 e0123456789876543210- instance SuppressUnusedWarnings (SymmetrySym2 a0123456789876543210 y0123456789876543210) where- suppressUnusedWarnings = snd (((,) SymmetrySym2KindInference) ())- type family SymmetrySym3 (a0123456789876543210 :: t0123456789876543210) (y0123456789876543210 :: t0123456789876543210) (e0123456789876543210 :: (:~:) a0123456789876543210 y0123456789876543210) :: Type where- SymmetrySym3 a0123456789876543210 y0123456789876543210 e0123456789876543210 = Symmetry a0123456789876543210 y0123456789876543210 e0123456789876543210+Singletons/T216.hs:0:0:: Splicing declarations + genDefunSymbols [''MyProxy, ''Symmetry] + ======> + data MyProxySym0 :: (~>) Type ((~>) k0123456789876543210 Type) + where + MyProxySym0KindInference :: SameKind (Apply MyProxySym0 arg) (MyProxySym1 arg) => + MyProxySym0 k0123456789876543210 + type instance Apply MyProxySym0 k0123456789876543210 = MyProxySym1 k0123456789876543210 + instance SuppressUnusedWarnings MyProxySym0 where + suppressUnusedWarnings = snd ((,) MyProxySym0KindInference ()) + data MyProxySym1 (k0123456789876543210 :: Type) :: (~>) k0123456789876543210 Type + where + MyProxySym1KindInference :: SameKind (Apply (MyProxySym1 k0123456789876543210) arg) (MyProxySym2 k0123456789876543210 arg) => + MyProxySym1 k0123456789876543210 e0123456789876543210 + type instance Apply (MyProxySym1 k0123456789876543210) e0123456789876543210 = MyProxy k0123456789876543210 e0123456789876543210 + instance SuppressUnusedWarnings (MyProxySym1 k0123456789876543210) where + suppressUnusedWarnings = snd ((,) MyProxySym1KindInference ()) + type family MyProxySym2 (k0123456789876543210 :: Type) (e0123456789876543210 :: k0123456789876543210) :: Type where + MyProxySym2 k0123456789876543210 e0123456789876543210 = MyProxy k0123456789876543210 e0123456789876543210 + data SymmetrySym0 :: (~>) t0123456789876543210 ((~>) t0123456789876543210 ((~>) ((:~:) a0123456789876543210 y0123456789876543210) Type)) + where + SymmetrySym0KindInference :: SameKind (Apply SymmetrySym0 arg) (SymmetrySym1 arg) => + SymmetrySym0 a0123456789876543210 + type instance Apply SymmetrySym0 a0123456789876543210 = SymmetrySym1 a0123456789876543210 + instance SuppressUnusedWarnings SymmetrySym0 where + suppressUnusedWarnings = snd ((,) SymmetrySym0KindInference ()) + data SymmetrySym1 (a0123456789876543210 :: t0123456789876543210) :: (~>) t0123456789876543210 ((~>) ((:~:) a0123456789876543210 y0123456789876543210) Type) + where + SymmetrySym1KindInference :: SameKind (Apply (SymmetrySym1 a0123456789876543210) arg) (SymmetrySym2 a0123456789876543210 arg) => + SymmetrySym1 a0123456789876543210 y0123456789876543210 + type instance Apply (SymmetrySym1 a0123456789876543210) y0123456789876543210 = SymmetrySym2 a0123456789876543210 y0123456789876543210 + instance SuppressUnusedWarnings (SymmetrySym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) SymmetrySym1KindInference ()) + data SymmetrySym2 (a0123456789876543210 :: t0123456789876543210) (y0123456789876543210 :: t0123456789876543210) :: (~>) ((:~:) a0123456789876543210 y0123456789876543210) Type + where + SymmetrySym2KindInference :: SameKind (Apply (SymmetrySym2 a0123456789876543210 y0123456789876543210) arg) (SymmetrySym3 a0123456789876543210 y0123456789876543210 arg) => + SymmetrySym2 a0123456789876543210 y0123456789876543210 e0123456789876543210 + type instance Apply (SymmetrySym2 a0123456789876543210 y0123456789876543210) e0123456789876543210 = Symmetry a0123456789876543210 y0123456789876543210 e0123456789876543210 + instance SuppressUnusedWarnings (SymmetrySym2 a0123456789876543210 y0123456789876543210) where + suppressUnusedWarnings = snd ((,) SymmetrySym2KindInference ()) + type family SymmetrySym3 (a0123456789876543210 :: t0123456789876543210) (y0123456789876543210 :: t0123456789876543210) (e0123456789876543210 :: (:~:) a0123456789876543210 y0123456789876543210) :: Type where + SymmetrySym3 a0123456789876543210 y0123456789876543210 e0123456789876543210 = Symmetry a0123456789876543210 y0123456789876543210 e0123456789876543210
tests/compile-and-dump/Singletons/T216.hs view
@@ -1,12 +1,12 @@-module T216 where--import Data.Kind-import Data.Singletons.TH--type family MyProxy k (a :: k) :: Type where- MyProxy _ a = Proxy a--type family Symmetry (a :: t) (y :: t) (e :: a :~: y) :: Type where- Symmetry a y _ = y :~: a--$(genDefunSymbols [''MyProxy, ''Symmetry])+module T216 where + +import Data.Kind +import Data.Singletons.TH + +type family MyProxy k (a :: k) :: Type where + MyProxy _ a = Proxy a + +type family Symmetry (a :: t) (y :: t) (e :: a :~: y) :: Type where + Symmetry a y _ = y :~: a + +$(genDefunSymbols [''MyProxy, ''Symmetry])
tests/compile-and-dump/Singletons/T226.golden view
@@ -1,6 +1,6 @@-Singletons/T226.hs:0:0:: Splicing declarations- singletons [d| class a ~> b |]- ======>- class (~>) a b- class (#~>) a b- class (%~>) a b+Singletons/T226.hs:0:0:: Splicing declarations + singletons [d| class a ~> b |] + ======> + class (~>) a b + class (#~>) a b + class (%~>) a b
tests/compile-and-dump/Singletons/T226.hs view
@@ -1,5 +1,5 @@-module T226 where--import Data.Singletons.TH--$(singletons [d| class a ~> b |])+module T226 where + +import Data.Singletons.TH + +$(singletons [d| class a ~> b |])
tests/compile-and-dump/Singletons/T229.golden view
@@ -1,26 +1,27 @@-Singletons/T229.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| ___foo :: Bool -> Bool- ___foo _ = True |]- ======>- ___foo :: Bool -> Bool- ___foo _ = True- type US___fooSym0 :: (~>) Bool Bool- data US___fooSym0 :: (~>) Bool Bool- where- US___fooSym0KindInference :: SameKind (Apply US___fooSym0 arg) (US___fooSym1 arg) =>- US___fooSym0 a0123456789876543210- type instance Apply US___fooSym0 a0123456789876543210 = US___foo a0123456789876543210- instance SuppressUnusedWarnings US___fooSym0 where- suppressUnusedWarnings = snd (((,) US___fooSym0KindInference) ())- type US___fooSym1 :: Bool -> Bool- type family US___fooSym1 (a0123456789876543210 :: Bool) :: Bool where- US___fooSym1 a0123456789876543210 = US___foo a0123456789876543210- type US___foo :: Bool -> Bool- type family US___foo (a :: Bool) :: Bool where- US___foo _ = TrueSym0- ___sfoo ::- forall (t :: Bool). Sing t -> Sing (Apply US___fooSym0 t :: Bool)- ___sfoo _ = STrue- instance SingI (US___fooSym0 :: (~>) Bool Bool) where- sing = (singFun1 @US___fooSym0) ___sfoo+Singletons/T229.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| ___foo :: Bool -> Bool + ___foo _ = True |] + ======> + ___foo :: Bool -> Bool + ___foo _ = True + type US___fooSym0 :: (~>) Bool Bool + data US___fooSym0 :: (~>) Bool Bool + where + US___fooSym0KindInference :: SameKind (Apply US___fooSym0 arg) (US___fooSym1 arg) => + US___fooSym0 a0123456789876543210 + type instance Apply US___fooSym0 a0123456789876543210 = US___foo a0123456789876543210 + instance SuppressUnusedWarnings US___fooSym0 where + suppressUnusedWarnings = snd ((,) US___fooSym0KindInference ()) + type US___fooSym1 :: Bool -> Bool + type family US___fooSym1 (a0123456789876543210 :: Bool) :: Bool where + US___fooSym1 a0123456789876543210 = US___foo a0123456789876543210 + type US___foo :: Bool -> Bool + type family US___foo (a :: Bool) :: Bool where + US___foo _ = TrueSym0 + ___sfoo :: + (forall (t :: Bool). + Sing t -> Sing (Apply US___fooSym0 t :: Bool) :: Type) + ___sfoo _ = STrue + instance SingI (US___fooSym0 :: (~>) Bool Bool) where + sing = singFun1 @US___fooSym0 ___sfoo
tests/compile-and-dump/Singletons/T229.hs view
@@ -1,6 +1,6 @@-module T229 where--import Data.Singletons.Base.TH--$(singletons [d| ___foo :: Bool -> Bool- ___foo _ = True |])+module T229 where + +import Data.Singletons.Base.TH + +$(singletons [d| ___foo :: Bool -> Bool + ___foo _ = True |])
tests/compile-and-dump/Singletons/T249.golden view
@@ -1,90 +1,90 @@-Singletons/T249.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| data Foo1 a = MkFoo1 a- data Foo2 a where MkFoo2 :: x -> Foo2 x- data Foo3 a where MkFoo3 :: forall x. x -> Foo3 x |]- ======>- data Foo1 a = MkFoo1 a- data Foo2 a where MkFoo2 :: x -> Foo2 x- data Foo3 a where MkFoo3 :: forall x. x -> Foo3 x- type MkFoo1Sym0 :: forall a. (~>) a (Foo1 a)- data MkFoo1Sym0 :: (~>) a (Foo1 a)- where- MkFoo1Sym0KindInference :: SameKind (Apply MkFoo1Sym0 arg) (MkFoo1Sym1 arg) =>- MkFoo1Sym0 a0123456789876543210- type instance Apply MkFoo1Sym0 a0123456789876543210 = MkFoo1 a0123456789876543210- instance SuppressUnusedWarnings MkFoo1Sym0 where- suppressUnusedWarnings = snd (((,) MkFoo1Sym0KindInference) ())- type MkFoo1Sym1 :: forall a. a -> Foo1 a- type family MkFoo1Sym1 (a0123456789876543210 :: a) :: Foo1 a where- MkFoo1Sym1 a0123456789876543210 = MkFoo1 a0123456789876543210- type MkFoo2Sym0 :: (~>) x (Foo2 x)- data MkFoo2Sym0 :: (~>) x (Foo2 x)- where- MkFoo2Sym0KindInference :: SameKind (Apply MkFoo2Sym0 arg) (MkFoo2Sym1 arg) =>- MkFoo2Sym0 a0123456789876543210- type instance Apply MkFoo2Sym0 a0123456789876543210 = MkFoo2 a0123456789876543210- instance SuppressUnusedWarnings MkFoo2Sym0 where- suppressUnusedWarnings = snd (((,) MkFoo2Sym0KindInference) ())- type MkFoo2Sym1 :: x -> Foo2 x- type family MkFoo2Sym1 (a0123456789876543210 :: x) :: Foo2 x where- MkFoo2Sym1 a0123456789876543210 = MkFoo2 a0123456789876543210- type MkFoo3Sym0 :: forall x. (~>) x (Foo3 x)- data MkFoo3Sym0 :: (~>) x (Foo3 x)- where- MkFoo3Sym0KindInference :: SameKind (Apply MkFoo3Sym0 arg) (MkFoo3Sym1 arg) =>- MkFoo3Sym0 a0123456789876543210- type instance Apply MkFoo3Sym0 a0123456789876543210 = MkFoo3 a0123456789876543210- instance SuppressUnusedWarnings MkFoo3Sym0 where- suppressUnusedWarnings = snd (((,) MkFoo3Sym0KindInference) ())- type MkFoo3Sym1 :: forall x. x -> Foo3 x- type family MkFoo3Sym1 (a0123456789876543210 :: x) :: Foo3 x where- MkFoo3Sym1 a0123456789876543210 = MkFoo3 a0123456789876543210- data SFoo1 :: forall a. Foo1 a -> Type- where- SMkFoo1 :: forall a (n :: a).- (Sing n) -> SFoo1 (MkFoo1 n :: Foo1 a)- type instance Sing @(Foo1 a) = SFoo1- instance SingKind a => SingKind (Foo1 a) where- type Demote (Foo1 a) = Foo1 (Demote a)- fromSing (SMkFoo1 b) = MkFoo1 (fromSing b)- toSing (MkFoo1 (b :: Demote a))- = case toSing b :: SomeSing a of SomeSing c -> SomeSing (SMkFoo1 c)- data SFoo2 :: forall a. Foo2 a -> Type- where- SMkFoo2 :: forall x (n :: x).- (Sing n) -> SFoo2 (MkFoo2 n :: Foo2 x)- type instance Sing @(Foo2 a) = SFoo2- instance SingKind a => SingKind (Foo2 a) where- type Demote (Foo2 a) = Foo2 (Demote a)- fromSing (SMkFoo2 b) = MkFoo2 (fromSing b)- toSing (MkFoo2 (b :: Demote x))- = case toSing b :: SomeSing x of SomeSing c -> SomeSing (SMkFoo2 c)- data SFoo3 :: forall a. Foo3 a -> Type- where- SMkFoo3 :: forall x (n :: x).- (Sing n) -> SFoo3 (MkFoo3 n :: Foo3 x)- type instance Sing @(Foo3 a) = SFoo3- instance SingKind a => SingKind (Foo3 a) where- type Demote (Foo3 a) = Foo3 (Demote a)- fromSing (SMkFoo3 b) = MkFoo3 (fromSing b)- toSing (MkFoo3 (b :: Demote x))- = case toSing b :: SomeSing x of SomeSing c -> SomeSing (SMkFoo3 c)- instance SingI n => SingI (MkFoo1 (n :: a)) where- sing = SMkFoo1 sing- instance SingI1 MkFoo1 where- liftSing = SMkFoo1- instance SingI (MkFoo1Sym0 :: (~>) a (Foo1 a)) where- sing = (singFun1 @MkFoo1Sym0) SMkFoo1- instance SingI n => SingI (MkFoo2 (n :: x)) where- sing = SMkFoo2 sing- instance SingI1 MkFoo2 where- liftSing = SMkFoo2- instance SingI (MkFoo2Sym0 :: (~>) x (Foo2 x)) where- sing = (singFun1 @MkFoo2Sym0) SMkFoo2- instance SingI n => SingI (MkFoo3 (n :: x)) where- sing = SMkFoo3 sing- instance SingI1 MkFoo3 where- liftSing = SMkFoo3- instance SingI (MkFoo3Sym0 :: (~>) x (Foo3 x)) where- sing = (singFun1 @MkFoo3Sym0) SMkFoo3+Singletons/T249.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| data Foo1 a = MkFoo1 a + data Foo2 a where MkFoo2 :: x -> Foo2 x + data Foo3 a where MkFoo3 :: forall x. x -> Foo3 x |] + ======> + data Foo1 a = MkFoo1 a + data Foo2 a where MkFoo2 :: x -> Foo2 x + data Foo3 a where MkFoo3 :: forall x. x -> Foo3 x + type MkFoo1Sym0 :: forall a. (~>) a (Foo1 a) + data MkFoo1Sym0 :: (~>) a (Foo1 a) + where + MkFoo1Sym0KindInference :: SameKind (Apply MkFoo1Sym0 arg) (MkFoo1Sym1 arg) => + MkFoo1Sym0 a0123456789876543210 + type instance Apply MkFoo1Sym0 a0123456789876543210 = MkFoo1 a0123456789876543210 + instance SuppressUnusedWarnings MkFoo1Sym0 where + suppressUnusedWarnings = snd ((,) MkFoo1Sym0KindInference ()) + type MkFoo1Sym1 :: forall a. a -> Foo1 a + type family MkFoo1Sym1 (a0123456789876543210 :: a) :: Foo1 a where + MkFoo1Sym1 a0123456789876543210 = MkFoo1 a0123456789876543210 + type MkFoo2Sym0 :: (~>) x (Foo2 x) + data MkFoo2Sym0 :: (~>) x (Foo2 x) + where + MkFoo2Sym0KindInference :: SameKind (Apply MkFoo2Sym0 arg) (MkFoo2Sym1 arg) => + MkFoo2Sym0 a0123456789876543210 + type instance Apply MkFoo2Sym0 a0123456789876543210 = MkFoo2 a0123456789876543210 + instance SuppressUnusedWarnings MkFoo2Sym0 where + suppressUnusedWarnings = snd ((,) MkFoo2Sym0KindInference ()) + type MkFoo2Sym1 :: x -> Foo2 x + type family MkFoo2Sym1 (a0123456789876543210 :: x) :: Foo2 x where + MkFoo2Sym1 a0123456789876543210 = MkFoo2 a0123456789876543210 + type MkFoo3Sym0 :: forall x. (~>) x (Foo3 x) + data MkFoo3Sym0 :: (~>) x (Foo3 x) + where + MkFoo3Sym0KindInference :: SameKind (Apply MkFoo3Sym0 arg) (MkFoo3Sym1 arg) => + MkFoo3Sym0 a0123456789876543210 + type instance Apply MkFoo3Sym0 a0123456789876543210 = MkFoo3 a0123456789876543210 + instance SuppressUnusedWarnings MkFoo3Sym0 where + suppressUnusedWarnings = snd ((,) MkFoo3Sym0KindInference ()) + type MkFoo3Sym1 :: forall x. x -> Foo3 x + type family MkFoo3Sym1 (a0123456789876543210 :: x) :: Foo3 x where + MkFoo3Sym1 a0123456789876543210 = MkFoo3 a0123456789876543210 + data SFoo1 :: forall a. Foo1 a -> Type + where + SMkFoo1 :: forall a (n :: a). + (Sing n) -> SFoo1 (MkFoo1 n :: Foo1 a) + type instance Sing @(Foo1 a) = SFoo1 + instance SingKind a => SingKind (Foo1 a) where + type Demote (Foo1 a) = Foo1 (Demote a) + fromSing (SMkFoo1 b) = MkFoo1 (fromSing b) + toSing (MkFoo1 (b :: Demote a)) + = case toSing b :: SomeSing a of SomeSing c -> SomeSing (SMkFoo1 c) + data SFoo2 :: forall a. Foo2 a -> Type + where + SMkFoo2 :: forall x (n :: x). + (Sing n) -> SFoo2 (MkFoo2 n :: Foo2 x) + type instance Sing @(Foo2 a) = SFoo2 + instance SingKind a => SingKind (Foo2 a) where + type Demote (Foo2 a) = Foo2 (Demote a) + fromSing (SMkFoo2 b) = MkFoo2 (fromSing b) + toSing (MkFoo2 (b :: Demote x)) + = case toSing b :: SomeSing x of SomeSing c -> SomeSing (SMkFoo2 c) + data SFoo3 :: forall a. Foo3 a -> Type + where + SMkFoo3 :: forall x (n :: x). + (Sing n) -> SFoo3 (MkFoo3 n :: Foo3 x) + type instance Sing @(Foo3 a) = SFoo3 + instance SingKind a => SingKind (Foo3 a) where + type Demote (Foo3 a) = Foo3 (Demote a) + fromSing (SMkFoo3 b) = MkFoo3 (fromSing b) + toSing (MkFoo3 (b :: Demote x)) + = case toSing b :: SomeSing x of SomeSing c -> SomeSing (SMkFoo3 c) + instance SingI n => SingI (MkFoo1 (n :: a)) where + sing = SMkFoo1 sing + instance SingI1 MkFoo1 where + liftSing = SMkFoo1 + instance SingI (MkFoo1Sym0 :: (~>) a (Foo1 a)) where + sing = singFun1 @MkFoo1Sym0 SMkFoo1 + instance SingI n => SingI (MkFoo2 (n :: x)) where + sing = SMkFoo2 sing + instance SingI1 MkFoo2 where + liftSing = SMkFoo2 + instance SingI (MkFoo2Sym0 :: (~>) x (Foo2 x)) where + sing = singFun1 @MkFoo2Sym0 SMkFoo2 + instance SingI n => SingI (MkFoo3 (n :: x)) where + sing = SMkFoo3 sing + instance SingI1 MkFoo3 where + liftSing = SMkFoo3 + instance SingI (MkFoo3Sym0 :: (~>) x (Foo3 x)) where + sing = singFun1 @MkFoo3Sym0 SMkFoo3
tests/compile-and-dump/Singletons/T249.hs view
@@ -1,12 +1,12 @@-module T249 where--import Data.Kind-import Data.Singletons.TH--$(singletons- [d| data Foo1 a = MkFoo1 a- data Foo2 a where- MkFoo2 :: x -> Foo2 x- data Foo3 a where- MkFoo3 :: forall x. x -> Foo3 x- |])+module T249 where + +import Data.Kind +import Data.Singletons.TH + +$(singletons + [d| data Foo1 a = MkFoo1 a + data Foo2 a where + MkFoo2 :: x -> Foo2 x + data Foo3 a where + MkFoo3 :: forall x. x -> Foo3 x + |])
tests/compile-and-dump/Singletons/T271.golden view
@@ -1,289 +1,287 @@-Singletons/T271.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| newtype Constant (a :: Type) (b :: Type)- = Constant a- deriving (Eq, Ord)- data Identity :: Type -> Type- where Identity :: a -> Identity a- deriving (Eq, Ord) |]- ======>- newtype Constant (a :: Type) (b :: Type)- = Constant a- deriving (Eq, Ord)- data Identity :: Type -> Type- where Identity :: a -> Identity a- deriving (Eq, Ord)- type ConstantSym0 :: forall (a :: Type)- (b :: Type). (~>) a (Constant (a :: Type) (b :: Type))- data ConstantSym0 :: (~>) a (Constant (a :: Type) (b :: Type))- where- ConstantSym0KindInference :: SameKind (Apply ConstantSym0 arg) (ConstantSym1 arg) =>- ConstantSym0 a0123456789876543210- type instance Apply ConstantSym0 a0123456789876543210 = Constant a0123456789876543210- instance SuppressUnusedWarnings ConstantSym0 where- suppressUnusedWarnings = snd (((,) ConstantSym0KindInference) ())- type ConstantSym1 :: forall (a :: Type) (b :: Type). a- -> Constant (a :: Type) (b :: Type)- type family ConstantSym1 (a0123456789876543210 :: a) :: Constant (a :: Type) (b :: Type) where- ConstantSym1 a0123456789876543210 = Constant a0123456789876543210- type IdentitySym0 :: (~>) a (Identity a)- data IdentitySym0 :: (~>) a (Identity a)- where- IdentitySym0KindInference :: SameKind (Apply IdentitySym0 arg) (IdentitySym1 arg) =>- IdentitySym0 a0123456789876543210- type instance Apply IdentitySym0 a0123456789876543210 = Identity a0123456789876543210- instance SuppressUnusedWarnings IdentitySym0 where- suppressUnusedWarnings = snd (((,) IdentitySym0KindInference) ())- type IdentitySym1 :: a -> Identity a- type family IdentitySym1 (a0123456789876543210 :: a) :: Identity a where- IdentitySym1 a0123456789876543210 = Identity a0123456789876543210- type TFHelper_0123456789876543210 :: Constant a b- -> Constant a b -> Bool- type family TFHelper_0123456789876543210 (a :: Constant a b) (a :: Constant a b) :: Bool where- TFHelper_0123456789876543210 (Constant a_0123456789876543210) (Constant b_0123456789876543210) = Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210- type TFHelper_0123456789876543210Sym0 :: (~>) (Constant a b) ((~>) (Constant a b) Bool)- data TFHelper_0123456789876543210Sym0 :: (~>) (Constant a b) ((~>) (Constant a b) Bool)- where- TFHelper_0123456789876543210Sym0KindInference :: SameKind (Apply TFHelper_0123456789876543210Sym0 arg) (TFHelper_0123456789876543210Sym1 arg) =>- TFHelper_0123456789876543210Sym0 a0123456789876543210- type instance Apply TFHelper_0123456789876543210Sym0 a0123456789876543210 = TFHelper_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings TFHelper_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) TFHelper_0123456789876543210Sym0KindInference) ())- type TFHelper_0123456789876543210Sym1 :: Constant a b- -> (~>) (Constant a b) Bool- data TFHelper_0123456789876543210Sym1 (a0123456789876543210 :: Constant a b) :: (~>) (Constant a b) Bool- where- TFHelper_0123456789876543210Sym1KindInference :: SameKind (Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) arg) (TFHelper_0123456789876543210Sym2 a0123456789876543210 arg) =>- TFHelper_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (TFHelper_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) TFHelper_0123456789876543210Sym1KindInference) ())- type TFHelper_0123456789876543210Sym2 :: Constant a b- -> Constant a b -> Bool- type family TFHelper_0123456789876543210Sym2 (a0123456789876543210 :: Constant a b) (a0123456789876543210 :: Constant a b) :: Bool where- TFHelper_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210- instance PEq (Constant a b) where- type (==) a a = Apply (Apply TFHelper_0123456789876543210Sym0 a) a- type Compare_0123456789876543210 :: Constant a b- -> Constant a b -> Ordering- type family Compare_0123456789876543210 (a :: Constant a b) (a :: Constant a b) :: Ordering where- Compare_0123456789876543210 (Constant a_0123456789876543210) (Constant b_0123456789876543210) = Apply (Apply (Apply FoldlSym0 ThenCmpSym0) EQSym0) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) NilSym0)- type Compare_0123456789876543210Sym0 :: (~>) (Constant a b) ((~>) (Constant a b) Ordering)- data Compare_0123456789876543210Sym0 :: (~>) (Constant a b) ((~>) (Constant a b) Ordering)- where- Compare_0123456789876543210Sym0KindInference :: SameKind (Apply Compare_0123456789876543210Sym0 arg) (Compare_0123456789876543210Sym1 arg) =>- Compare_0123456789876543210Sym0 a0123456789876543210- type instance Apply Compare_0123456789876543210Sym0 a0123456789876543210 = Compare_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings Compare_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Compare_0123456789876543210Sym0KindInference) ())- type Compare_0123456789876543210Sym1 :: Constant a b- -> (~>) (Constant a b) Ordering- data Compare_0123456789876543210Sym1 (a0123456789876543210 :: Constant a b) :: (~>) (Constant a b) Ordering- where- Compare_0123456789876543210Sym1KindInference :: SameKind (Apply (Compare_0123456789876543210Sym1 a0123456789876543210) arg) (Compare_0123456789876543210Sym2 a0123456789876543210 arg) =>- Compare_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (Compare_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Compare_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Compare_0123456789876543210Sym1KindInference) ())- type Compare_0123456789876543210Sym2 :: Constant a b- -> Constant a b -> Ordering- type family Compare_0123456789876543210Sym2 (a0123456789876543210 :: Constant a b) (a0123456789876543210 :: Constant a b) :: Ordering where- Compare_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210- instance POrd (Constant a b) where- type Compare a a = Apply (Apply Compare_0123456789876543210Sym0 a) a- type TFHelper_0123456789876543210 :: Identity a- -> Identity a -> Bool- type family TFHelper_0123456789876543210 (a :: Identity a) (a :: Identity a) :: Bool where- TFHelper_0123456789876543210 (Identity a_0123456789876543210) (Identity b_0123456789876543210) = Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210- type TFHelper_0123456789876543210Sym0 :: (~>) (Identity a) ((~>) (Identity a) Bool)- data TFHelper_0123456789876543210Sym0 :: (~>) (Identity a) ((~>) (Identity a) Bool)- where- TFHelper_0123456789876543210Sym0KindInference :: SameKind (Apply TFHelper_0123456789876543210Sym0 arg) (TFHelper_0123456789876543210Sym1 arg) =>- TFHelper_0123456789876543210Sym0 a0123456789876543210- type instance Apply TFHelper_0123456789876543210Sym0 a0123456789876543210 = TFHelper_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings TFHelper_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) TFHelper_0123456789876543210Sym0KindInference) ())- type TFHelper_0123456789876543210Sym1 :: Identity a- -> (~>) (Identity a) Bool- data TFHelper_0123456789876543210Sym1 (a0123456789876543210 :: Identity a) :: (~>) (Identity a) Bool- where- TFHelper_0123456789876543210Sym1KindInference :: SameKind (Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) arg) (TFHelper_0123456789876543210Sym2 a0123456789876543210 arg) =>- TFHelper_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (TFHelper_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) TFHelper_0123456789876543210Sym1KindInference) ())- type TFHelper_0123456789876543210Sym2 :: Identity a- -> Identity a -> Bool- type family TFHelper_0123456789876543210Sym2 (a0123456789876543210 :: Identity a) (a0123456789876543210 :: Identity a) :: Bool where- TFHelper_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210- instance PEq (Identity a) where- type (==) a a = Apply (Apply TFHelper_0123456789876543210Sym0 a) a- type Compare_0123456789876543210 :: Identity a- -> Identity a -> Ordering- type family Compare_0123456789876543210 (a :: Identity a) (a :: Identity a) :: Ordering where- Compare_0123456789876543210 (Identity a_0123456789876543210) (Identity b_0123456789876543210) = Apply (Apply (Apply FoldlSym0 ThenCmpSym0) EQSym0) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) NilSym0)- type Compare_0123456789876543210Sym0 :: (~>) (Identity a) ((~>) (Identity a) Ordering)- data Compare_0123456789876543210Sym0 :: (~>) (Identity a) ((~>) (Identity a) Ordering)- where- Compare_0123456789876543210Sym0KindInference :: SameKind (Apply Compare_0123456789876543210Sym0 arg) (Compare_0123456789876543210Sym1 arg) =>- Compare_0123456789876543210Sym0 a0123456789876543210- type instance Apply Compare_0123456789876543210Sym0 a0123456789876543210 = Compare_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings Compare_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Compare_0123456789876543210Sym0KindInference) ())- type Compare_0123456789876543210Sym1 :: Identity a- -> (~>) (Identity a) Ordering- data Compare_0123456789876543210Sym1 (a0123456789876543210 :: Identity a) :: (~>) (Identity a) Ordering- where- Compare_0123456789876543210Sym1KindInference :: SameKind (Apply (Compare_0123456789876543210Sym1 a0123456789876543210) arg) (Compare_0123456789876543210Sym2 a0123456789876543210 arg) =>- Compare_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (Compare_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Compare_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Compare_0123456789876543210Sym1KindInference) ())- type Compare_0123456789876543210Sym2 :: Identity a- -> Identity a -> Ordering- type family Compare_0123456789876543210Sym2 (a0123456789876543210 :: Identity a) (a0123456789876543210 :: Identity a) :: Ordering where- Compare_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210- instance POrd (Identity a) where- type Compare a a = Apply (Apply Compare_0123456789876543210Sym0 a) a- data SConstant :: forall (a :: Type) (b :: Type).- Constant a b -> Type- where- SConstant :: forall (a :: Type) (b :: Type) (n :: a).- (Sing n) ->- SConstant (Constant n :: Constant (a :: Type) (b :: Type))- type instance Sing @(Constant a b) = SConstant- instance (SingKind a, SingKind b) => SingKind (Constant a b) where- type Demote (Constant a b) = Constant (Demote a) (Demote b)- fromSing (SConstant b) = Constant (fromSing b)- toSing (Constant (b :: Demote a))- = case toSing b :: SomeSing a of- SomeSing c -> SomeSing (SConstant c)- data SIdentity :: forall (a :: Type). Identity a -> Type- where- SIdentity :: forall a (n :: a).- (Sing n) -> SIdentity (Identity n :: Identity a)- type instance Sing @(Identity a) = SIdentity- instance SingKind a => SingKind (Identity a) where- type Demote (Identity a) = Identity (Demote a)- fromSing (SIdentity b) = Identity (fromSing b)- toSing (Identity (b :: Demote a))- = case toSing b :: SomeSing a of- SomeSing c -> SomeSing (SIdentity c)- instance SEq a => SEq (Constant a b) where- (%==) ::- forall (t1 :: Constant a b) (t2 :: Constant a b). Sing t1- -> Sing t2- -> Sing (Apply (Apply ((==@#@$) :: TyFun (Constant a b) ((~>) (Constant a b) Bool)- -> Type) t1) t2)- (%==)- (SConstant (sA_0123456789876543210 :: Sing a_0123456789876543210))- (SConstant (sB_0123456789876543210 :: Sing b_0123456789876543210))- = (applySing- ((applySing ((singFun2 @(==@#@$)) (%==))) sA_0123456789876543210))- sB_0123456789876543210- instance SOrd a => SOrd (Constant a b) where- sCompare ::- forall (t1 :: Constant a b) (t2 :: Constant a b). Sing t1- -> Sing t2- -> Sing (Apply (Apply (CompareSym0 :: TyFun (Constant a b) ((~>) (Constant a b) Ordering)- -> Type) t1) t2)- sCompare- (SConstant (sA_0123456789876543210 :: Sing a_0123456789876543210))- (SConstant (sB_0123456789876543210 :: Sing b_0123456789876543210))- = (applySing- ((applySing- ((applySing ((singFun3 @FoldlSym0) sFoldl))- ((singFun2 @ThenCmpSym0) sThenCmp)))- SEQ))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing- ((applySing ((singFun2 @CompareSym0) sCompare))- sA_0123456789876543210))- sB_0123456789876543210)))- SNil)- instance SEq a => SEq (Identity a) where- (%==) ::- forall (t1 :: Identity a) (t2 :: Identity a). Sing t1- -> Sing t2- -> Sing (Apply (Apply ((==@#@$) :: TyFun (Identity a) ((~>) (Identity a) Bool)- -> Type) t1) t2)- (%==)- (SIdentity (sA_0123456789876543210 :: Sing a_0123456789876543210))- (SIdentity (sB_0123456789876543210 :: Sing b_0123456789876543210))- = (applySing- ((applySing ((singFun2 @(==@#@$)) (%==))) sA_0123456789876543210))- sB_0123456789876543210- instance SOrd a => SOrd (Identity a) where- sCompare ::- forall (t1 :: Identity a) (t2 :: Identity a). Sing t1- -> Sing t2- -> Sing (Apply (Apply (CompareSym0 :: TyFun (Identity a) ((~>) (Identity a) Ordering)- -> Type) t1) t2)- sCompare- (SIdentity (sA_0123456789876543210 :: Sing a_0123456789876543210))- (SIdentity (sB_0123456789876543210 :: Sing b_0123456789876543210))- = (applySing- ((applySing- ((applySing ((singFun3 @FoldlSym0) sFoldl))- ((singFun2 @ThenCmpSym0) sThenCmp)))- SEQ))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing- ((applySing ((singFun2 @CompareSym0) sCompare))- sA_0123456789876543210))- sB_0123456789876543210)))- SNil)- instance SDecide a => SDecide (Constant a b) where- (%~) (SConstant a) (SConstant b)- = case ((%~) a) b of- Proved Refl -> Proved Refl- Disproved contra- -> Disproved (\ refl -> case refl of Refl -> contra Refl)- instance SDecide a =>- Data.Type.Equality.TestEquality (SConstant :: Constant a b- -> Type) where- Data.Type.Equality.testEquality- = Data.Singletons.Decide.decideEquality- instance SDecide a =>- Data.Type.Coercion.TestCoercion (SConstant :: Constant a b- -> Type) where- Data.Type.Coercion.testCoercion- = Data.Singletons.Decide.decideCoercion- instance SDecide a => SDecide (Identity a) where- (%~) (SIdentity a) (SIdentity b)- = case ((%~) a) b of- Proved Refl -> Proved Refl- Disproved contra- -> Disproved (\ refl -> case refl of Refl -> contra Refl)- instance SDecide a =>- Data.Type.Equality.TestEquality (SIdentity :: Identity a- -> Type) where- Data.Type.Equality.testEquality- = Data.Singletons.Decide.decideEquality- instance SDecide a =>- Data.Type.Coercion.TestCoercion (SIdentity :: Identity a- -> Type) where- Data.Type.Coercion.testCoercion- = Data.Singletons.Decide.decideCoercion- instance SingI n => SingI (Constant (n :: a)) where- sing = SConstant sing- instance SingI1 Constant where- liftSing = SConstant- instance SingI (ConstantSym0 :: (~>) a (Constant (a :: Type) (b :: Type))) where- sing = (singFun1 @ConstantSym0) SConstant- instance SingI n => SingI (Identity (n :: a)) where- sing = SIdentity sing- instance SingI1 Identity where- liftSing = SIdentity- instance SingI (IdentitySym0 :: (~>) a (Identity a)) where- sing = (singFun1 @IdentitySym0) SIdentity+Singletons/T271.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| newtype Constant (a :: Type) (b :: Type) + = Constant a + deriving (Eq, Ord) + data Identity :: Type -> Type + where Identity :: a -> Identity a + deriving (Eq, Ord) |] + ======> + newtype Constant (a :: Type) (b :: Type) + = Constant a + deriving (Eq, Ord) + data Identity :: Type -> Type + where Identity :: a -> Identity a + deriving (Eq, Ord) + type ConstantSym0 :: forall (a :: Type) + (b :: Type). (~>) a (Constant (a :: Type) (b :: Type)) + data ConstantSym0 :: (~>) a (Constant (a :: Type) (b :: Type)) + where + ConstantSym0KindInference :: SameKind (Apply ConstantSym0 arg) (ConstantSym1 arg) => + ConstantSym0 a0123456789876543210 + type instance Apply ConstantSym0 a0123456789876543210 = Constant a0123456789876543210 + instance SuppressUnusedWarnings ConstantSym0 where + suppressUnusedWarnings = snd ((,) ConstantSym0KindInference ()) + type ConstantSym1 :: forall (a :: Type) (b :: Type). a + -> Constant (a :: Type) (b :: Type) + type family ConstantSym1 (a0123456789876543210 :: a) :: Constant (a :: Type) (b :: Type) where + ConstantSym1 a0123456789876543210 = Constant a0123456789876543210 + type IdentitySym0 :: (~>) a (Identity a) + data IdentitySym0 :: (~>) a (Identity a) + where + IdentitySym0KindInference :: SameKind (Apply IdentitySym0 arg) (IdentitySym1 arg) => + IdentitySym0 a0123456789876543210 + type instance Apply IdentitySym0 a0123456789876543210 = Identity a0123456789876543210 + instance SuppressUnusedWarnings IdentitySym0 where + suppressUnusedWarnings = snd ((,) IdentitySym0KindInference ()) + type IdentitySym1 :: a -> Identity a + type family IdentitySym1 (a0123456789876543210 :: a) :: Identity a where + IdentitySym1 a0123456789876543210 = Identity a0123456789876543210 + type TFHelper_0123456789876543210 :: Constant a b + -> Constant a b -> Bool + type family TFHelper_0123456789876543210 (a :: Constant a b) (a :: Constant a b) :: Bool where + TFHelper_0123456789876543210 (Constant a_0123456789876543210) (Constant b_0123456789876543210) = Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210 + type TFHelper_0123456789876543210Sym0 :: (~>) (Constant a b) ((~>) (Constant a b) Bool) + data TFHelper_0123456789876543210Sym0 :: (~>) (Constant a b) ((~>) (Constant a b) Bool) + where + TFHelper_0123456789876543210Sym0KindInference :: SameKind (Apply TFHelper_0123456789876543210Sym0 arg) (TFHelper_0123456789876543210Sym1 arg) => + TFHelper_0123456789876543210Sym0 a0123456789876543210 + type instance Apply TFHelper_0123456789876543210Sym0 a0123456789876543210 = TFHelper_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings TFHelper_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) TFHelper_0123456789876543210Sym0KindInference ()) + type TFHelper_0123456789876543210Sym1 :: Constant a b + -> (~>) (Constant a b) Bool + data TFHelper_0123456789876543210Sym1 (a0123456789876543210 :: Constant a b) :: (~>) (Constant a b) Bool + where + TFHelper_0123456789876543210Sym1KindInference :: SameKind (Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) arg) (TFHelper_0123456789876543210Sym2 a0123456789876543210 arg) => + TFHelper_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (TFHelper_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) TFHelper_0123456789876543210Sym1KindInference ()) + type TFHelper_0123456789876543210Sym2 :: Constant a b + -> Constant a b -> Bool + type family TFHelper_0123456789876543210Sym2 (a0123456789876543210 :: Constant a b) (a0123456789876543210 :: Constant a b) :: Bool where + TFHelper_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PEq (Constant a b) where + type (==) a a = Apply (Apply TFHelper_0123456789876543210Sym0 a) a + type Compare_0123456789876543210 :: Constant a b + -> Constant a b -> Ordering + type family Compare_0123456789876543210 (a :: Constant a b) (a :: Constant a b) :: Ordering where + Compare_0123456789876543210 (Constant a_0123456789876543210) (Constant b_0123456789876543210) = Apply (Apply (Apply FoldlSym0 (<>@#@$)) EQSym0) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) NilSym0) + type Compare_0123456789876543210Sym0 :: (~>) (Constant a b) ((~>) (Constant a b) Ordering) + data Compare_0123456789876543210Sym0 :: (~>) (Constant a b) ((~>) (Constant a b) Ordering) + where + Compare_0123456789876543210Sym0KindInference :: SameKind (Apply Compare_0123456789876543210Sym0 arg) (Compare_0123456789876543210Sym1 arg) => + Compare_0123456789876543210Sym0 a0123456789876543210 + type instance Apply Compare_0123456789876543210Sym0 a0123456789876543210 = Compare_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Compare_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Compare_0123456789876543210Sym0KindInference ()) + type Compare_0123456789876543210Sym1 :: Constant a b + -> (~>) (Constant a b) Ordering + data Compare_0123456789876543210Sym1 (a0123456789876543210 :: Constant a b) :: (~>) (Constant a b) Ordering + where + Compare_0123456789876543210Sym1KindInference :: SameKind (Apply (Compare_0123456789876543210Sym1 a0123456789876543210) arg) (Compare_0123456789876543210Sym2 a0123456789876543210 arg) => + Compare_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (Compare_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Compare_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Compare_0123456789876543210Sym1KindInference ()) + type Compare_0123456789876543210Sym2 :: Constant a b + -> Constant a b -> Ordering + type family Compare_0123456789876543210Sym2 (a0123456789876543210 :: Constant a b) (a0123456789876543210 :: Constant a b) :: Ordering where + Compare_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance POrd (Constant a b) where + type Compare a a = Apply (Apply Compare_0123456789876543210Sym0 a) a + type TFHelper_0123456789876543210 :: Identity a + -> Identity a -> Bool + type family TFHelper_0123456789876543210 (a :: Identity a) (a :: Identity a) :: Bool where + TFHelper_0123456789876543210 (Identity a_0123456789876543210) (Identity b_0123456789876543210) = Apply (Apply (==@#@$) a_0123456789876543210) b_0123456789876543210 + type TFHelper_0123456789876543210Sym0 :: (~>) (Identity a) ((~>) (Identity a) Bool) + data TFHelper_0123456789876543210Sym0 :: (~>) (Identity a) ((~>) (Identity a) Bool) + where + TFHelper_0123456789876543210Sym0KindInference :: SameKind (Apply TFHelper_0123456789876543210Sym0 arg) (TFHelper_0123456789876543210Sym1 arg) => + TFHelper_0123456789876543210Sym0 a0123456789876543210 + type instance Apply TFHelper_0123456789876543210Sym0 a0123456789876543210 = TFHelper_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings TFHelper_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) TFHelper_0123456789876543210Sym0KindInference ()) + type TFHelper_0123456789876543210Sym1 :: Identity a + -> (~>) (Identity a) Bool + data TFHelper_0123456789876543210Sym1 (a0123456789876543210 :: Identity a) :: (~>) (Identity a) Bool + where + TFHelper_0123456789876543210Sym1KindInference :: SameKind (Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) arg) (TFHelper_0123456789876543210Sym2 a0123456789876543210 arg) => + TFHelper_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (TFHelper_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) TFHelper_0123456789876543210Sym1KindInference ()) + type TFHelper_0123456789876543210Sym2 :: Identity a + -> Identity a -> Bool + type family TFHelper_0123456789876543210Sym2 (a0123456789876543210 :: Identity a) (a0123456789876543210 :: Identity a) :: Bool where + TFHelper_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PEq (Identity a) where + type (==) a a = Apply (Apply TFHelper_0123456789876543210Sym0 a) a + type Compare_0123456789876543210 :: Identity a + -> Identity a -> Ordering + type family Compare_0123456789876543210 (a :: Identity a) (a :: Identity a) :: Ordering where + Compare_0123456789876543210 (Identity a_0123456789876543210) (Identity b_0123456789876543210) = Apply (Apply (Apply FoldlSym0 (<>@#@$)) EQSym0) (Apply (Apply (:@#@$) (Apply (Apply CompareSym0 a_0123456789876543210) b_0123456789876543210)) NilSym0) + type Compare_0123456789876543210Sym0 :: (~>) (Identity a) ((~>) (Identity a) Ordering) + data Compare_0123456789876543210Sym0 :: (~>) (Identity a) ((~>) (Identity a) Ordering) + where + Compare_0123456789876543210Sym0KindInference :: SameKind (Apply Compare_0123456789876543210Sym0 arg) (Compare_0123456789876543210Sym1 arg) => + Compare_0123456789876543210Sym0 a0123456789876543210 + type instance Apply Compare_0123456789876543210Sym0 a0123456789876543210 = Compare_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Compare_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Compare_0123456789876543210Sym0KindInference ()) + type Compare_0123456789876543210Sym1 :: Identity a + -> (~>) (Identity a) Ordering + data Compare_0123456789876543210Sym1 (a0123456789876543210 :: Identity a) :: (~>) (Identity a) Ordering + where + Compare_0123456789876543210Sym1KindInference :: SameKind (Apply (Compare_0123456789876543210Sym1 a0123456789876543210) arg) (Compare_0123456789876543210Sym2 a0123456789876543210 arg) => + Compare_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (Compare_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Compare_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Compare_0123456789876543210Sym1KindInference ()) + type Compare_0123456789876543210Sym2 :: Identity a + -> Identity a -> Ordering + type family Compare_0123456789876543210Sym2 (a0123456789876543210 :: Identity a) (a0123456789876543210 :: Identity a) :: Ordering where + Compare_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance POrd (Identity a) where + type Compare a a = Apply (Apply Compare_0123456789876543210Sym0 a) a + data SConstant :: forall (a :: Type) (b :: Type). + Constant a b -> Type + where + SConstant :: forall (a :: Type) (b :: Type) (n :: a). + (Sing n) -> + SConstant (Constant n :: Constant (a :: Type) (b :: Type)) + type instance Sing @(Constant a b) = SConstant + instance (SingKind a, SingKind b) => SingKind (Constant a b) where + type Demote (Constant a b) = Constant (Demote a) (Demote b) + fromSing (SConstant b) = Constant (fromSing b) + toSing (Constant (b :: Demote a)) + = case toSing b :: SomeSing a of + SomeSing c -> SomeSing (SConstant c) + data SIdentity :: forall (a :: Type). Identity a -> Type + where + SIdentity :: forall a (n :: a). + (Sing n) -> SIdentity (Identity n :: Identity a) + type instance Sing @(Identity a) = SIdentity + instance SingKind a => SingKind (Identity a) where + type Demote (Identity a) = Identity (Demote a) + fromSing (SIdentity b) = Identity (fromSing b) + toSing (Identity (b :: Demote a)) + = case toSing b :: SomeSing a of + SomeSing c -> SomeSing (SIdentity c) + instance SEq a => SEq (Constant a b) where + (%==) :: + forall (t1 :: Constant a b) (t2 :: Constant a b). Sing t1 + -> Sing t2 + -> Sing (Apply (Apply ((==@#@$) :: TyFun (Constant a b) ((~>) (Constant a b) Bool) + -> Type) t1) t2) + (%==) + (SConstant (sA_0123456789876543210 :: Sing a_0123456789876543210)) + (SConstant (sB_0123456789876543210 :: Sing b_0123456789876543210)) + = applySing + (applySing (singFun2 @(==@#@$) (%==)) sA_0123456789876543210) + sB_0123456789876543210 + instance SOrd a => SOrd (Constant a b) where + sCompare :: + forall (t1 :: Constant a b) (t2 :: Constant a b). Sing t1 + -> Sing t2 + -> Sing (Apply (Apply (CompareSym0 :: TyFun (Constant a b) ((~>) (Constant a b) Ordering) + -> Type) t1) t2) + sCompare + (SConstant (sA_0123456789876543210 :: Sing a_0123456789876543210)) + (SConstant (sB_0123456789876543210 :: Sing b_0123456789876543210)) + = applySing + (applySing + (applySing (singFun3 @FoldlSym0 sFoldl) (singFun2 @(<>@#@$) (%<>))) + SEQ) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing + (applySing (singFun2 @CompareSym0 sCompare) sA_0123456789876543210) + sB_0123456789876543210)) + SNil) + instance SEq a => SEq (Identity a) where + (%==) :: + forall (t1 :: Identity a) (t2 :: Identity a). Sing t1 + -> Sing t2 + -> Sing (Apply (Apply ((==@#@$) :: TyFun (Identity a) ((~>) (Identity a) Bool) + -> Type) t1) t2) + (%==) + (SIdentity (sA_0123456789876543210 :: Sing a_0123456789876543210)) + (SIdentity (sB_0123456789876543210 :: Sing b_0123456789876543210)) + = applySing + (applySing (singFun2 @(==@#@$) (%==)) sA_0123456789876543210) + sB_0123456789876543210 + instance SOrd a => SOrd (Identity a) where + sCompare :: + forall (t1 :: Identity a) (t2 :: Identity a). Sing t1 + -> Sing t2 + -> Sing (Apply (Apply (CompareSym0 :: TyFun (Identity a) ((~>) (Identity a) Ordering) + -> Type) t1) t2) + sCompare + (SIdentity (sA_0123456789876543210 :: Sing a_0123456789876543210)) + (SIdentity (sB_0123456789876543210 :: Sing b_0123456789876543210)) + = applySing + (applySing + (applySing (singFun3 @FoldlSym0 sFoldl) (singFun2 @(<>@#@$) (%<>))) + SEQ) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing + (applySing (singFun2 @CompareSym0 sCompare) sA_0123456789876543210) + sB_0123456789876543210)) + SNil) + instance SDecide a => SDecide (Constant a b) where + (%~) (SConstant a) (SConstant b) + = case (%~) a b of + Proved Refl -> Proved Refl + Disproved contra + -> Disproved (\ refl -> case refl of Refl -> contra Refl) + instance SDecide a => + Data.Type.Equality.TestEquality (SConstant :: Constant a b + -> Type) where + Data.Type.Equality.testEquality + = Data.Singletons.Decide.decideEquality + instance SDecide a => + Data.Type.Coercion.TestCoercion (SConstant :: Constant a b + -> Type) where + Data.Type.Coercion.testCoercion + = Data.Singletons.Decide.decideCoercion + instance SDecide a => SDecide (Identity a) where + (%~) (SIdentity a) (SIdentity b) + = case (%~) a b of + Proved Refl -> Proved Refl + Disproved contra + -> Disproved (\ refl -> case refl of Refl -> contra Refl) + instance SDecide a => + Data.Type.Equality.TestEquality (SIdentity :: Identity a + -> Type) where + Data.Type.Equality.testEquality + = Data.Singletons.Decide.decideEquality + instance SDecide a => + Data.Type.Coercion.TestCoercion (SIdentity :: Identity a + -> Type) where + Data.Type.Coercion.testCoercion + = Data.Singletons.Decide.decideCoercion + instance SingI n => SingI (Constant (n :: a)) where + sing = SConstant sing + instance SingI1 Constant where + liftSing = SConstant + instance SingI (ConstantSym0 :: (~>) a (Constant (a :: Type) (b :: Type))) where + sing = singFun1 @ConstantSym0 SConstant + instance SingI n => SingI (Identity (n :: a)) where + sing = SIdentity sing + instance SingI1 Identity where + liftSing = SIdentity + instance SingI (IdentitySym0 :: (~>) a (Identity a)) where + sing = singFun1 @IdentitySym0 SIdentity
tests/compile-and-dump/Singletons/T271.hs view
@@ -1,13 +1,13 @@-module T271 where--import Data.Kind (Type)-import Data.Singletons.Base.TH--$(singletons- [d| newtype Constant (a :: Type) (b :: Type) =- Constant a deriving (Eq, Ord)-- data Identity :: Type -> Type where- Identity :: a -> Identity a- deriving (Eq, Ord)- |])+module T271 where + +import Data.Kind (Type) +import Data.Singletons.Base.TH + +$(singletons + [d| newtype Constant (a :: Type) (b :: Type) = + Constant a deriving (Eq, Ord) + + data Identity :: Type -> Type where + Identity :: a -> Identity a + deriving (Eq, Ord) + |])
tests/compile-and-dump/Singletons/T287.golden view
@@ -1,115 +1,118 @@-Singletons/T287.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| class S a where- (<<>>) :: a -> a -> a- - instance S b => S (a -> b) where- f <<>> g = \ x -> f x <<>> g x |]- ======>- class S a where- (<<>>) :: a -> a -> a- instance S b => S (a -> b) where- (<<>>) f g = \ x -> (f x <<>> g x)- type (<<>>@#@$) :: forall a. (~>) a ((~>) a a)- data (<<>>@#@$) :: (~>) a ((~>) a a)- where- (:<<>>@#@$###) :: SameKind (Apply (<<>>@#@$) arg) ((<<>>@#@$$) arg) =>- (<<>>@#@$) a0123456789876543210- type instance Apply (<<>>@#@$) a0123456789876543210 = (<<>>@#@$$) a0123456789876543210- instance SuppressUnusedWarnings (<<>>@#@$) where- suppressUnusedWarnings = snd (((,) (:<<>>@#@$###)) ())- type (<<>>@#@$$) :: forall a. a -> (~>) a a- data (<<>>@#@$$) (a0123456789876543210 :: a) :: (~>) a a- where- (:<<>>@#@$$###) :: SameKind (Apply ((<<>>@#@$$) a0123456789876543210) arg) ((<<>>@#@$$$) a0123456789876543210 arg) =>- (<<>>@#@$$) a0123456789876543210 a0123456789876543210- type instance Apply ((<<>>@#@$$) a0123456789876543210) a0123456789876543210 = (<<>>) a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings ((<<>>@#@$$) a0123456789876543210) where- suppressUnusedWarnings = snd (((,) (:<<>>@#@$$###)) ())- type (<<>>@#@$$$) :: forall a. a -> a -> a- type family (<<>>@#@$$$) (a0123456789876543210 :: a) (a0123456789876543210 :: a) :: a where- (<<>>@#@$$$) a0123456789876543210 a0123456789876543210 = (<<>>) a0123456789876543210 a0123456789876543210- class PS a where- type family (<<>>) (arg :: a) (arg :: a) :: a- type family Lambda_0123456789876543210 f g x where- Lambda_0123456789876543210 f g x = Apply (Apply (<<>>@#@$) (Apply f x)) (Apply g x)- data Lambda_0123456789876543210Sym0 f0123456789876543210- where- Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) =>- Lambda_0123456789876543210Sym0 f0123456789876543210- type instance Apply Lambda_0123456789876543210Sym0 f0123456789876543210 = Lambda_0123456789876543210Sym1 f0123456789876543210- instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym0KindInference) ())- data Lambda_0123456789876543210Sym1 f0123456789876543210 g0123456789876543210- where- Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 f0123456789876543210) arg) (Lambda_0123456789876543210Sym2 f0123456789876543210 arg) =>- Lambda_0123456789876543210Sym1 f0123456789876543210 g0123456789876543210- type instance Apply (Lambda_0123456789876543210Sym1 f0123456789876543210) g0123456789876543210 = Lambda_0123456789876543210Sym2 f0123456789876543210 g0123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 f0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym1KindInference) ())- data Lambda_0123456789876543210Sym2 f0123456789876543210 g0123456789876543210 x0123456789876543210- where- Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 f0123456789876543210 g0123456789876543210) arg) (Lambda_0123456789876543210Sym3 f0123456789876543210 g0123456789876543210 arg) =>- Lambda_0123456789876543210Sym2 f0123456789876543210 g0123456789876543210 x0123456789876543210- type instance Apply (Lambda_0123456789876543210Sym2 f0123456789876543210 g0123456789876543210) x0123456789876543210 = Lambda_0123456789876543210 f0123456789876543210 g0123456789876543210 x0123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 f0123456789876543210 g0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym2KindInference) ())- type family Lambda_0123456789876543210Sym3 f0123456789876543210 g0123456789876543210 x0123456789876543210 where- Lambda_0123456789876543210Sym3 f0123456789876543210 g0123456789876543210 x0123456789876543210 = Lambda_0123456789876543210 f0123456789876543210 g0123456789876543210 x0123456789876543210- type TFHelper_0123456789876543210 :: (~>) a b- -> (~>) a b -> (~>) a b- type family TFHelper_0123456789876543210 (a :: (~>) a b) (a :: (~>) a b) :: (~>) a b where- TFHelper_0123456789876543210 f g = Apply (Apply Lambda_0123456789876543210Sym0 f) g- type TFHelper_0123456789876543210Sym0 :: (~>) ((~>) a b) ((~>) ((~>) a b) ((~>) a b))- data TFHelper_0123456789876543210Sym0 :: (~>) ((~>) a b) ((~>) ((~>) a b) ((~>) a b))- where- TFHelper_0123456789876543210Sym0KindInference :: SameKind (Apply TFHelper_0123456789876543210Sym0 arg) (TFHelper_0123456789876543210Sym1 arg) =>- TFHelper_0123456789876543210Sym0 a0123456789876543210- type instance Apply TFHelper_0123456789876543210Sym0 a0123456789876543210 = TFHelper_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings TFHelper_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) TFHelper_0123456789876543210Sym0KindInference) ())- type TFHelper_0123456789876543210Sym1 :: (~>) a b- -> (~>) ((~>) a b) ((~>) a b)- data TFHelper_0123456789876543210Sym1 (a0123456789876543210 :: (~>) a b) :: (~>) ((~>) a b) ((~>) a b)- where- TFHelper_0123456789876543210Sym1KindInference :: SameKind (Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) arg) (TFHelper_0123456789876543210Sym2 a0123456789876543210 arg) =>- TFHelper_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (TFHelper_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) TFHelper_0123456789876543210Sym1KindInference) ())- type TFHelper_0123456789876543210Sym2 :: (~>) a b- -> (~>) a b -> (~>) a b- type family TFHelper_0123456789876543210Sym2 (a0123456789876543210 :: (~>) a b) (a0123456789876543210 :: (~>) a b) :: (~>) a b where- TFHelper_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210- instance PS ((~>) a b) where- type (<<>>) a a = Apply (Apply TFHelper_0123456789876543210Sym0 a) a- class SS a where- (%<<>>) ::- forall (t :: a) (t :: a). Sing t- -> Sing t -> Sing (Apply (Apply (<<>>@#@$) t) t :: a)- instance SS b => SS ((~>) a b) where- (%<<>>) ::- forall (t :: (~>) a b) (t :: (~>) a b). Sing t- -> Sing t- -> Sing (Apply (Apply (<<>>@#@$) t) t :: (~>) a b)- (%<<>>) (sF :: Sing f) (sG :: Sing g)- = (singFun1 @(Apply (Apply Lambda_0123456789876543210Sym0 f) g))- (\ sX- -> case sX of- (_ :: Sing x)- -> (applySing- ((applySing ((singFun2 @(<<>>@#@$)) (%<<>>))) ((applySing sF) sX)))- ((applySing sG) sX))- instance SS a => SingI ((<<>>@#@$) :: (~>) a ((~>) a a)) where- sing = (singFun2 @(<<>>@#@$)) (%<<>>)- instance (SS a, SingI d) =>- SingI ((<<>>@#@$$) (d :: a) :: (~>) a a) where- sing = (singFun1 @((<<>>@#@$$) (d :: a))) ((%<<>>) (sing @d))- instance SS a => SingI1 ((<<>>@#@$$) :: a -> (~>) a a) where- liftSing (s :: Sing (d :: a))- = (singFun1 @((<<>>@#@$$) (d :: a))) ((%<<>>) s)+Singletons/T287.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| class S a where + (<<>>) :: a -> a -> a + + instance S b => S (a -> b) where + f <<>> g = \ x -> f x <<>> g x |] + ======> + class S a where + (<<>>) :: a -> a -> a + instance S b => S (a -> b) where + (<<>>) f g = \ x -> (f x <<>> g x) + type (<<>>@#@$) :: forall a. (~>) a ((~>) a a) + data (<<>>@#@$) :: (~>) a ((~>) a a) + where + (:<<>>@#@$###) :: SameKind (Apply (<<>>@#@$) arg) ((<<>>@#@$$) arg) => + (<<>>@#@$) a0123456789876543210 + type instance Apply (<<>>@#@$) a0123456789876543210 = (<<>>@#@$$) a0123456789876543210 + instance SuppressUnusedWarnings (<<>>@#@$) where + suppressUnusedWarnings = snd ((,) (:<<>>@#@$###) ()) + type (<<>>@#@$$) :: forall a. a -> (~>) a a + data (<<>>@#@$$) (a0123456789876543210 :: a) :: (~>) a a + where + (:<<>>@#@$$###) :: SameKind (Apply ((<<>>@#@$$) a0123456789876543210) arg) ((<<>>@#@$$$) a0123456789876543210 arg) => + (<<>>@#@$$) a0123456789876543210 a0123456789876543210 + type instance Apply ((<<>>@#@$$) a0123456789876543210) a0123456789876543210 = (<<>>) a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings ((<<>>@#@$$) a0123456789876543210) where + suppressUnusedWarnings = snd ((,) (:<<>>@#@$$###) ()) + type (<<>>@#@$$$) :: forall a. a -> a -> a + type family (<<>>@#@$$$) (a0123456789876543210 :: a) (a0123456789876543210 :: a) :: a where + (<<>>@#@$$$) a0123456789876543210 a0123456789876543210 = (<<>>) a0123456789876543210 a0123456789876543210 + class PS a where + type family (<<>>) (arg :: a) (arg :: a) :: a + type family Lambda_0123456789876543210 f g x where + Lambda_0123456789876543210 f g x = Apply (Apply (<<>>@#@$) (Apply f x)) (Apply g x) + data Lambda_0123456789876543210Sym0 f0123456789876543210 + where + Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) => + Lambda_0123456789876543210Sym0 f0123456789876543210 + type instance Apply Lambda_0123456789876543210Sym0 f0123456789876543210 = Lambda_0123456789876543210Sym1 f0123456789876543210 + instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym0KindInference ()) + data Lambda_0123456789876543210Sym1 f0123456789876543210 g0123456789876543210 + where + Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 f0123456789876543210) arg) (Lambda_0123456789876543210Sym2 f0123456789876543210 arg) => + Lambda_0123456789876543210Sym1 f0123456789876543210 g0123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym1 f0123456789876543210) g0123456789876543210 = Lambda_0123456789876543210Sym2 f0123456789876543210 g0123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 f0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym1KindInference ()) + data Lambda_0123456789876543210Sym2 f0123456789876543210 g0123456789876543210 x0123456789876543210 + where + Lambda_0123456789876543210Sym2KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym2 f0123456789876543210 g0123456789876543210) arg) (Lambda_0123456789876543210Sym3 f0123456789876543210 g0123456789876543210 arg) => + Lambda_0123456789876543210Sym2 f0123456789876543210 g0123456789876543210 x0123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym2 f0123456789876543210 g0123456789876543210) x0123456789876543210 = Lambda_0123456789876543210 f0123456789876543210 g0123456789876543210 x0123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym2 f0123456789876543210 g0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym2KindInference ()) + type family Lambda_0123456789876543210Sym3 f0123456789876543210 g0123456789876543210 x0123456789876543210 where + Lambda_0123456789876543210Sym3 f0123456789876543210 g0123456789876543210 x0123456789876543210 = Lambda_0123456789876543210 f0123456789876543210 g0123456789876543210 x0123456789876543210 + type TFHelper_0123456789876543210 :: (~>) a b + -> (~>) a b -> (~>) a b + type family TFHelper_0123456789876543210 (a :: (~>) a b) (a :: (~>) a b) :: (~>) a b where + TFHelper_0123456789876543210 f g = Apply (Apply Lambda_0123456789876543210Sym0 f) g + type TFHelper_0123456789876543210Sym0 :: (~>) ((~>) a b) ((~>) ((~>) a b) ((~>) a b)) + data TFHelper_0123456789876543210Sym0 :: (~>) ((~>) a b) ((~>) ((~>) a b) ((~>) a b)) + where + TFHelper_0123456789876543210Sym0KindInference :: SameKind (Apply TFHelper_0123456789876543210Sym0 arg) (TFHelper_0123456789876543210Sym1 arg) => + TFHelper_0123456789876543210Sym0 a0123456789876543210 + type instance Apply TFHelper_0123456789876543210Sym0 a0123456789876543210 = TFHelper_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings TFHelper_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) TFHelper_0123456789876543210Sym0KindInference ()) + type TFHelper_0123456789876543210Sym1 :: (~>) a b + -> (~>) ((~>) a b) ((~>) a b) + data TFHelper_0123456789876543210Sym1 (a0123456789876543210 :: (~>) a b) :: (~>) ((~>) a b) ((~>) a b) + where + TFHelper_0123456789876543210Sym1KindInference :: SameKind (Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) arg) (TFHelper_0123456789876543210Sym2 a0123456789876543210 arg) => + TFHelper_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (TFHelper_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) TFHelper_0123456789876543210Sym1KindInference ()) + type TFHelper_0123456789876543210Sym2 :: (~>) a b + -> (~>) a b -> (~>) a b + type family TFHelper_0123456789876543210Sym2 (a0123456789876543210 :: (~>) a b) (a0123456789876543210 :: (~>) a b) :: (~>) a b where + TFHelper_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PS ((~>) a b) where + type (<<>>) a a = Apply (Apply TFHelper_0123456789876543210Sym0 a) a + class SS a where + (%<<>>) :: + (forall (t :: a) (t :: a). + Sing t + -> Sing t -> Sing (Apply (Apply (<<>>@#@$) t) t :: a) :: Type) + instance SS b => SS ((~>) a b) where + (%<<>>) :: + (forall (t :: (~>) a b) (t :: (~>) a b). + Sing t + -> Sing t + -> Sing (Apply (Apply (<<>>@#@$) t) t :: (~>) a b) :: Type) + (%<<>>) (sF :: Sing f) (sG :: Sing g) + = singFun1 + @(Apply (Apply Lambda_0123456789876543210Sym0 f) g) + (\ sX + -> case sX of + (_ :: Sing x) + -> applySing + (applySing (singFun2 @(<<>>@#@$) (%<<>>)) (applySing sF sX)) + (applySing sG sX)) + instance SS a => SingI ((<<>>@#@$) :: (~>) a ((~>) a a)) where + sing = singFun2 @(<<>>@#@$) (%<<>>) + instance (SS a, SingI d) => + SingI ((<<>>@#@$$) (d :: a) :: (~>) a a) where + sing = singFun1 @((<<>>@#@$$) (d :: a)) ((%<<>>) (sing @d)) + instance SS a => SingI1 ((<<>>@#@$$) :: a -> (~>) a a) where + liftSing (s :: Sing (d :: a)) + = singFun1 @((<<>>@#@$$) (d :: a)) ((%<<>>) s)
tests/compile-and-dump/Singletons/T287.hs view
@@ -1,11 +1,11 @@-module T287 where--import Data.Singletons.TH--$(singletons [d|- class S a where- (<<>>) :: a -> a -> a-- instance S b => S (a -> b) where- f <<>> g = \x -> f x <<>> g x- |])+module T287 where + +import Data.Singletons.TH + +$(singletons [d| + class S a where + (<<>>) :: a -> a -> a + + instance S b => S (a -> b) where + f <<>> g = \x -> f x <<>> g x + |])
tests/compile-and-dump/Singletons/T29.golden view
@@ -1,123 +1,121 @@-Singletons/T29.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| foo :: Bool -> Bool- foo x = not $ x- bar :: Bool -> Bool- bar x = not . not . not $ x- baz :: Bool -> Bool- baz x = not $! x- ban :: Bool -> Bool- ban x = not . not . not $! x |]- ======>- foo :: Bool -> Bool- foo x = (not $ x)- bar :: Bool -> Bool- bar x = ((not . (not . not)) $ x)- baz :: Bool -> Bool- baz x = (not $! x)- ban :: Bool -> Bool- ban x = ((not . (not . not)) $! x)- type BanSym0 :: (~>) Bool Bool- data BanSym0 :: (~>) Bool Bool- where- BanSym0KindInference :: SameKind (Apply BanSym0 arg) (BanSym1 arg) =>- BanSym0 a0123456789876543210- type instance Apply BanSym0 a0123456789876543210 = Ban a0123456789876543210- instance SuppressUnusedWarnings BanSym0 where- suppressUnusedWarnings = snd (((,) BanSym0KindInference) ())- type BanSym1 :: Bool -> Bool- type family BanSym1 (a0123456789876543210 :: Bool) :: Bool where- BanSym1 a0123456789876543210 = Ban a0123456789876543210- type BazSym0 :: (~>) Bool Bool- data BazSym0 :: (~>) Bool Bool- where- BazSym0KindInference :: SameKind (Apply BazSym0 arg) (BazSym1 arg) =>- BazSym0 a0123456789876543210- type instance Apply BazSym0 a0123456789876543210 = Baz a0123456789876543210- instance SuppressUnusedWarnings BazSym0 where- suppressUnusedWarnings = snd (((,) BazSym0KindInference) ())- type BazSym1 :: Bool -> Bool- type family BazSym1 (a0123456789876543210 :: Bool) :: Bool where- BazSym1 a0123456789876543210 = Baz a0123456789876543210- type BarSym0 :: (~>) Bool Bool- data BarSym0 :: (~>) Bool Bool- where- BarSym0KindInference :: SameKind (Apply BarSym0 arg) (BarSym1 arg) =>- BarSym0 a0123456789876543210- type instance Apply BarSym0 a0123456789876543210 = Bar a0123456789876543210- instance SuppressUnusedWarnings BarSym0 where- suppressUnusedWarnings = snd (((,) BarSym0KindInference) ())- type BarSym1 :: Bool -> Bool- type family BarSym1 (a0123456789876543210 :: Bool) :: Bool where- BarSym1 a0123456789876543210 = Bar a0123456789876543210- type FooSym0 :: (~>) Bool Bool- data FooSym0 :: (~>) Bool Bool- where- FooSym0KindInference :: SameKind (Apply FooSym0 arg) (FooSym1 arg) =>- FooSym0 a0123456789876543210- type instance Apply FooSym0 a0123456789876543210 = Foo a0123456789876543210- instance SuppressUnusedWarnings FooSym0 where- suppressUnusedWarnings = snd (((,) FooSym0KindInference) ())- type FooSym1 :: Bool -> Bool- type family FooSym1 (a0123456789876543210 :: Bool) :: Bool where- FooSym1 a0123456789876543210 = Foo a0123456789876543210- type Ban :: Bool -> Bool- type family Ban (a :: Bool) :: Bool where- Ban x = Apply (Apply ($!@#@$) (Apply (Apply (.@#@$) NotSym0) (Apply (Apply (.@#@$) NotSym0) NotSym0))) x- type Baz :: Bool -> Bool- type family Baz (a :: Bool) :: Bool where- Baz x = Apply (Apply ($!@#@$) NotSym0) x- type Bar :: Bool -> Bool- type family Bar (a :: Bool) :: Bool where- Bar x = Apply (Apply ($@#@$) (Apply (Apply (.@#@$) NotSym0) (Apply (Apply (.@#@$) NotSym0) NotSym0))) x- type Foo :: Bool -> Bool- type family Foo (a :: Bool) :: Bool where- Foo x = Apply (Apply ($@#@$) NotSym0) x- sBan ::- forall (t :: Bool). Sing t -> Sing (Apply BanSym0 t :: Bool)- sBaz ::- forall (t :: Bool). Sing t -> Sing (Apply BazSym0 t :: Bool)- sBar ::- forall (t :: Bool). Sing t -> Sing (Apply BarSym0 t :: Bool)- sFoo ::- forall (t :: Bool). Sing t -> Sing (Apply FooSym0 t :: Bool)- sBan (sX :: Sing x)- = (applySing- ((applySing ((singFun2 @($!@#@$)) (%$!)))- ((applySing- ((applySing ((singFun3 @(.@#@$)) (%.)))- ((singFun1 @NotSym0) sNot)))- ((applySing- ((applySing ((singFun3 @(.@#@$)) (%.)))- ((singFun1 @NotSym0) sNot)))- ((singFun1 @NotSym0) sNot)))))- sX- sBaz (sX :: Sing x)- = (applySing- ((applySing ((singFun2 @($!@#@$)) (%$!)))- ((singFun1 @NotSym0) sNot)))- sX- sBar (sX :: Sing x)- = (applySing- ((applySing ((singFun2 @($@#@$)) (%$)))- ((applySing- ((applySing ((singFun3 @(.@#@$)) (%.)))- ((singFun1 @NotSym0) sNot)))- ((applySing- ((applySing ((singFun3 @(.@#@$)) (%.)))- ((singFun1 @NotSym0) sNot)))- ((singFun1 @NotSym0) sNot)))))- sX- sFoo (sX :: Sing x)- = (applySing- ((applySing ((singFun2 @($@#@$)) (%$)))- ((singFun1 @NotSym0) sNot)))- sX- instance SingI (BanSym0 :: (~>) Bool Bool) where- sing = (singFun1 @BanSym0) sBan- instance SingI (BazSym0 :: (~>) Bool Bool) where- sing = (singFun1 @BazSym0) sBaz- instance SingI (BarSym0 :: (~>) Bool Bool) where- sing = (singFun1 @BarSym0) sBar- instance SingI (FooSym0 :: (~>) Bool Bool) where- sing = (singFun1 @FooSym0) sFoo+Singletons/T29.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| foo :: Bool -> Bool + foo x = not $ x + bar :: Bool -> Bool + bar x = not . not . not $ x + baz :: Bool -> Bool + baz x = not $! x + ban :: Bool -> Bool + ban x = not . not . not $! x |] + ======> + foo :: Bool -> Bool + foo x = (not $ x) + bar :: Bool -> Bool + bar x = ((not . (not . not)) $ x) + baz :: Bool -> Bool + baz x = (not $! x) + ban :: Bool -> Bool + ban x = ((not . (not . not)) $! x) + type BanSym0 :: (~>) Bool Bool + data BanSym0 :: (~>) Bool Bool + where + BanSym0KindInference :: SameKind (Apply BanSym0 arg) (BanSym1 arg) => + BanSym0 a0123456789876543210 + type instance Apply BanSym0 a0123456789876543210 = Ban a0123456789876543210 + instance SuppressUnusedWarnings BanSym0 where + suppressUnusedWarnings = snd ((,) BanSym0KindInference ()) + type BanSym1 :: Bool -> Bool + type family BanSym1 (a0123456789876543210 :: Bool) :: Bool where + BanSym1 a0123456789876543210 = Ban a0123456789876543210 + type BazSym0 :: (~>) Bool Bool + data BazSym0 :: (~>) Bool Bool + where + BazSym0KindInference :: SameKind (Apply BazSym0 arg) (BazSym1 arg) => + BazSym0 a0123456789876543210 + type instance Apply BazSym0 a0123456789876543210 = Baz a0123456789876543210 + instance SuppressUnusedWarnings BazSym0 where + suppressUnusedWarnings = snd ((,) BazSym0KindInference ()) + type BazSym1 :: Bool -> Bool + type family BazSym1 (a0123456789876543210 :: Bool) :: Bool where + BazSym1 a0123456789876543210 = Baz a0123456789876543210 + type BarSym0 :: (~>) Bool Bool + data BarSym0 :: (~>) Bool Bool + where + BarSym0KindInference :: SameKind (Apply BarSym0 arg) (BarSym1 arg) => + BarSym0 a0123456789876543210 + type instance Apply BarSym0 a0123456789876543210 = Bar a0123456789876543210 + instance SuppressUnusedWarnings BarSym0 where + suppressUnusedWarnings = snd ((,) BarSym0KindInference ()) + type BarSym1 :: Bool -> Bool + type family BarSym1 (a0123456789876543210 :: Bool) :: Bool where + BarSym1 a0123456789876543210 = Bar a0123456789876543210 + type FooSym0 :: (~>) Bool Bool + data FooSym0 :: (~>) Bool Bool + where + FooSym0KindInference :: SameKind (Apply FooSym0 arg) (FooSym1 arg) => + FooSym0 a0123456789876543210 + type instance Apply FooSym0 a0123456789876543210 = Foo a0123456789876543210 + instance SuppressUnusedWarnings FooSym0 where + suppressUnusedWarnings = snd ((,) FooSym0KindInference ()) + type FooSym1 :: Bool -> Bool + type family FooSym1 (a0123456789876543210 :: Bool) :: Bool where + FooSym1 a0123456789876543210 = Foo a0123456789876543210 + type Ban :: Bool -> Bool + type family Ban (a :: Bool) :: Bool where + Ban x = Apply (Apply ($!@#@$) (Apply (Apply (.@#@$) NotSym0) (Apply (Apply (.@#@$) NotSym0) NotSym0))) x + type Baz :: Bool -> Bool + type family Baz (a :: Bool) :: Bool where + Baz x = Apply (Apply ($!@#@$) NotSym0) x + type Bar :: Bool -> Bool + type family Bar (a :: Bool) :: Bool where + Bar x = Apply (Apply ($@#@$) (Apply (Apply (.@#@$) NotSym0) (Apply (Apply (.@#@$) NotSym0) NotSym0))) x + type Foo :: Bool -> Bool + type family Foo (a :: Bool) :: Bool where + Foo x = Apply (Apply ($@#@$) NotSym0) x + sBan :: + (forall (t :: Bool). + Sing t -> Sing (Apply BanSym0 t :: Bool) :: Type) + sBaz :: + (forall (t :: Bool). + Sing t -> Sing (Apply BazSym0 t :: Bool) :: Type) + sBar :: + (forall (t :: Bool). + Sing t -> Sing (Apply BarSym0 t :: Bool) :: Type) + sFoo :: + (forall (t :: Bool). + Sing t -> Sing (Apply FooSym0 t :: Bool) :: Type) + sBan (sX :: Sing x) + = applySing + (applySing + (singFun2 @($!@#@$) (%$!)) + (applySing + (applySing (singFun3 @(.@#@$) (%.)) (singFun1 @NotSym0 sNot)) + (applySing + (applySing (singFun3 @(.@#@$) (%.)) (singFun1 @NotSym0 sNot)) + (singFun1 @NotSym0 sNot)))) + sX + sBaz (sX :: Sing x) + = applySing + (applySing (singFun2 @($!@#@$) (%$!)) (singFun1 @NotSym0 sNot)) sX + sBar (sX :: Sing x) + = applySing + (applySing + (singFun2 @($@#@$) (%$)) + (applySing + (applySing (singFun3 @(.@#@$) (%.)) (singFun1 @NotSym0 sNot)) + (applySing + (applySing (singFun3 @(.@#@$) (%.)) (singFun1 @NotSym0 sNot)) + (singFun1 @NotSym0 sNot)))) + sX + sFoo (sX :: Sing x) + = applySing + (applySing (singFun2 @($@#@$) (%$)) (singFun1 @NotSym0 sNot)) sX + instance SingI (BanSym0 :: (~>) Bool Bool) where + sing = singFun1 @BanSym0 sBan + instance SingI (BazSym0 :: (~>) Bool Bool) where + sing = singFun1 @BazSym0 sBaz + instance SingI (BarSym0 :: (~>) Bool Bool) where + sing = singFun1 @BarSym0 sBar + instance SingI (FooSym0 :: (~>) Bool Bool) where + sing = singFun1 @FooSym0 sFoo
tests/compile-and-dump/Singletons/T29.hs view
@@ -1,44 +1,44 @@-module Singletons.T29 where--import Data.Singletons.TH-import Prelude.Singletons--$(singletons [d|- foo :: Bool -> Bool- foo x = not $ x-- -- test that $ works with function composition- bar :: Bool -> Bool- bar x = not . not . not $ x-- baz :: Bool -> Bool- baz x = not $! x-- -- test that $! works with function composition- ban :: Bool -> Bool- ban x = not . not . not $! x- |])--foo1a :: Proxy (Foo True)-foo1a = Proxy--foo1b :: Proxy False-foo1b = foo1b--bar1a :: Proxy (Bar True)-bar1a = Proxy--bar1b :: Proxy False-bar1b = bar1b--baz1a :: Proxy (Baz True)-baz1a = Proxy--baz1b :: Proxy False-baz1b = baz1b--ban1a :: Proxy (Ban True)-ban1a = Proxy--ban1b :: Proxy False-ban1b = ban1b+module Singletons.T29 where + +import Data.Singletons.TH +import Prelude.Singletons + +$(singletons [d| + foo :: Bool -> Bool + foo x = not $ x + + -- test that $ works with function composition + bar :: Bool -> Bool + bar x = not . not . not $ x + + baz :: Bool -> Bool + baz x = not $! x + + -- test that $! works with function composition + ban :: Bool -> Bool + ban x = not . not . not $! x + |]) + +foo1a :: Proxy (Foo True) +foo1a = Proxy + +foo1b :: Proxy False +foo1b = foo1b + +bar1a :: Proxy (Bar True) +bar1a = Proxy + +bar1b :: Proxy False +bar1b = bar1b + +baz1a :: Proxy (Baz True) +baz1a = Proxy + +baz1b :: Proxy False +baz1b = baz1b + +ban1a :: Proxy (Ban True) +ban1a = Proxy + +ban1b :: Proxy False +ban1b = ban1b
tests/compile-and-dump/Singletons/T296.golden view
@@ -1,74 +1,74 @@-Singletons/T296.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| f :: forall a. MyProxy a -> MyProxy a- f MyProxy- = let- x = let- z :: MyProxy a- z = MyProxy- in z- in x- - data MyProxy (a :: Type) = MyProxy |]- ======>- data MyProxy (a :: Type) = MyProxy- f :: forall a. MyProxy a -> MyProxy a- f MyProxy- = let- x = let- z :: MyProxy a- z = MyProxy- in z- in x- type MyProxySym0 :: forall (a :: Type). MyProxy (a :: Type)- type family MyProxySym0 :: MyProxy (a :: Type) where- MyProxySym0 = MyProxy- type Let0123456789876543210ZSym0 :: MyProxy a- type family Let0123456789876543210ZSym0 :: MyProxy a where- Let0123456789876543210ZSym0 = Let0123456789876543210Z- type Let0123456789876543210Z :: MyProxy a- type family Let0123456789876543210Z :: MyProxy a where- Let0123456789876543210Z = MyProxySym0- type family Let0123456789876543210XSym0 where- Let0123456789876543210XSym0 = Let0123456789876543210X- type family Let0123456789876543210X where- Let0123456789876543210X = Let0123456789876543210ZSym0- type FSym0 :: forall a. (~>) (MyProxy a) (MyProxy a)- data FSym0 :: (~>) (MyProxy a) (MyProxy a)- where- FSym0KindInference :: SameKind (Apply FSym0 arg) (FSym1 arg) =>- FSym0 a0123456789876543210- type instance Apply FSym0 a0123456789876543210 = F a0123456789876543210- instance SuppressUnusedWarnings FSym0 where- suppressUnusedWarnings = snd (((,) FSym0KindInference) ())- type FSym1 :: forall a. MyProxy a -> MyProxy a- type family FSym1 (a0123456789876543210 :: MyProxy a) :: MyProxy a where- FSym1 a0123456789876543210 = F a0123456789876543210- type F :: forall a. MyProxy a -> MyProxy a- type family F (a :: MyProxy a) :: MyProxy a where- F MyProxy = Let0123456789876543210XSym0- sF ::- forall a (t :: MyProxy a). Sing t- -> Sing (Apply FSym0 t :: MyProxy a)- sF SMyProxy- = let- sX :: Sing @_ Let0123456789876543210XSym0- sX- = let- sZ :: Sing (Let0123456789876543210ZSym0 :: MyProxy a)- sZ = SMyProxy- in sZ- in sX- instance SingI (FSym0 :: (~>) (MyProxy a) (MyProxy a)) where- sing = (singFun1 @FSym0) sF- data SMyProxy :: forall (a :: Type). MyProxy a -> Type- where- SMyProxy :: forall (a :: Type).- SMyProxy (MyProxy :: MyProxy (a :: Type))- type instance Sing @(MyProxy a) = SMyProxy- instance SingKind a => SingKind (MyProxy a) where- type Demote (MyProxy a) = MyProxy (Demote a)- fromSing SMyProxy = MyProxy- toSing MyProxy = SomeSing SMyProxy- instance SingI MyProxy where- sing = SMyProxy+Singletons/T296.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| f :: forall a. MyProxy a -> MyProxy a + f MyProxy + = let + x = let + z :: MyProxy a + z = MyProxy + in z + in x + + data MyProxy (a :: Type) = MyProxy |] + ======> + data MyProxy (a :: Type) = MyProxy + f :: forall a. MyProxy a -> MyProxy a + f MyProxy + = let + x = let + z :: MyProxy a + z = MyProxy + in z + in x + type MyProxySym0 :: forall (a :: Type). MyProxy (a :: Type) + type family MyProxySym0 :: MyProxy (a :: Type) where + MyProxySym0 = MyProxy + type Let0123456789876543210ZSym0 :: MyProxy a + type family Let0123456789876543210ZSym0 :: MyProxy a where + Let0123456789876543210ZSym0 = Let0123456789876543210Z + type Let0123456789876543210Z :: MyProxy a + type family Let0123456789876543210Z :: MyProxy a where + Let0123456789876543210Z = MyProxySym0 + type family Let0123456789876543210XSym0 where + Let0123456789876543210XSym0 = Let0123456789876543210X + type family Let0123456789876543210X where + Let0123456789876543210X = Let0123456789876543210ZSym0 + type FSym0 :: forall a. (~>) (MyProxy a) (MyProxy a) + data FSym0 :: (~>) (MyProxy a) (MyProxy a) + where + FSym0KindInference :: SameKind (Apply FSym0 arg) (FSym1 arg) => + FSym0 a0123456789876543210 + type instance Apply FSym0 a0123456789876543210 = F a0123456789876543210 + instance SuppressUnusedWarnings FSym0 where + suppressUnusedWarnings = snd ((,) FSym0KindInference ()) + type FSym1 :: forall a. MyProxy a -> MyProxy a + type family FSym1 (a0123456789876543210 :: MyProxy a) :: MyProxy a where + FSym1 a0123456789876543210 = F a0123456789876543210 + type F :: forall a. MyProxy a -> MyProxy a + type family F (a :: MyProxy a) :: MyProxy a where + F MyProxy = Let0123456789876543210XSym0 + sF :: + forall a (t :: MyProxy a). Sing t + -> Sing (Apply FSym0 t :: MyProxy a) + sF SMyProxy + = let + sX :: Sing @_ Let0123456789876543210XSym0 + sX + = let + sZ :: (Sing (Let0123456789876543210ZSym0 :: MyProxy a) :: Type) + sZ = SMyProxy + in sZ + in sX + instance SingI (FSym0 :: (~>) (MyProxy a) (MyProxy a)) where + sing = singFun1 @FSym0 sF + data SMyProxy :: forall (a :: Type). MyProxy a -> Type + where + SMyProxy :: forall (a :: Type). + SMyProxy (MyProxy :: MyProxy (a :: Type)) + type instance Sing @(MyProxy a) = SMyProxy + instance SingKind a => SingKind (MyProxy a) where + type Demote (MyProxy a) = MyProxy (Demote a) + fromSing SMyProxy = MyProxy + toSing MyProxy = SomeSing SMyProxy + instance SingI MyProxy where + sing = SMyProxy
tests/compile-and-dump/Singletons/T296.hs view
@@ -1,14 +1,14 @@-module T296 where--import Data.Kind-import Data.Singletons.TH--$(singletons [d|- data MyProxy (a :: Type) = MyProxy-- f :: forall a. MyProxy a -> MyProxy a- f MyProxy =- let x = let z :: MyProxy a- z = MyProxy in z- in x- |])+module T296 where + +import Data.Kind +import Data.Singletons.TH + +$(singletons [d| + data MyProxy (a :: Type) = MyProxy + + f :: forall a. MyProxy a -> MyProxy a + f MyProxy = + let x = let z :: MyProxy a + z = MyProxy in z + in x + |])
tests/compile-and-dump/Singletons/T297.golden view
@@ -1,67 +1,67 @@-Singletons/T297.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| f MyProxy- = let- x = let- z :: MyProxy a- z = MyProxy- in z- in x- - data MyProxy (a :: Type) = MyProxy |]- ======>- data MyProxy (a :: Type) = MyProxy- f MyProxy- = let- x = let- z :: MyProxy a- z = MyProxy- in z- in x- type MyProxySym0 :: forall (a :: Type). MyProxy (a :: Type)- type family MyProxySym0 :: MyProxy (a :: Type) where- MyProxySym0 = MyProxy- type Let0123456789876543210ZSym0 :: MyProxy a- type family Let0123456789876543210ZSym0 :: MyProxy a where- Let0123456789876543210ZSym0 = Let0123456789876543210Z- type Let0123456789876543210Z :: MyProxy a- type family Let0123456789876543210Z :: MyProxy a where- Let0123456789876543210Z = MyProxySym0- type family Let0123456789876543210XSym0 where- Let0123456789876543210XSym0 = Let0123456789876543210X- type family Let0123456789876543210X where- Let0123456789876543210X = Let0123456789876543210ZSym0- data FSym0 a0123456789876543210- where- FSym0KindInference :: SameKind (Apply FSym0 arg) (FSym1 arg) =>- FSym0 a0123456789876543210- type instance Apply FSym0 a0123456789876543210 = F a0123456789876543210- instance SuppressUnusedWarnings FSym0 where- suppressUnusedWarnings = snd (((,) FSym0KindInference) ())- type family FSym1 a0123456789876543210 where- FSym1 a0123456789876543210 = F a0123456789876543210- type family F a where- F MyProxy = Let0123456789876543210XSym0- sF :: forall arg. Sing arg -> Sing (Apply FSym0 arg)- sF SMyProxy- = let- sX :: Sing @_ Let0123456789876543210XSym0- sX- = let- sZ :: forall a. Sing (Let0123456789876543210ZSym0 :: MyProxy a)- sZ = SMyProxy- in sZ- in sX- instance SingI FSym0 where- sing = (singFun1 @FSym0) sF- data SMyProxy :: forall (a :: Type). MyProxy a -> Type- where- SMyProxy :: forall (a :: Type).- SMyProxy (MyProxy :: MyProxy (a :: Type))- type instance Sing @(MyProxy a) = SMyProxy- instance SingKind a => SingKind (MyProxy a) where- type Demote (MyProxy a) = MyProxy (Demote a)- fromSing SMyProxy = MyProxy- toSing MyProxy = SomeSing SMyProxy- instance SingI MyProxy where- sing = SMyProxy+Singletons/T297.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| f MyProxy + = let + x = let + z :: MyProxy a + z = MyProxy + in z + in x + + data MyProxy (a :: Type) = MyProxy |] + ======> + data MyProxy (a :: Type) = MyProxy + f MyProxy + = let + x = let + z :: MyProxy a + z = MyProxy + in z + in x + type MyProxySym0 :: forall (a :: Type). MyProxy (a :: Type) + type family MyProxySym0 :: MyProxy (a :: Type) where + MyProxySym0 = MyProxy + type Let0123456789876543210ZSym0 :: MyProxy a + type family Let0123456789876543210ZSym0 :: MyProxy a where + Let0123456789876543210ZSym0 = Let0123456789876543210Z + type Let0123456789876543210Z :: MyProxy a + type family Let0123456789876543210Z :: MyProxy a where + Let0123456789876543210Z = MyProxySym0 + type family Let0123456789876543210XSym0 where + Let0123456789876543210XSym0 = Let0123456789876543210X + type family Let0123456789876543210X where + Let0123456789876543210X = Let0123456789876543210ZSym0 + data FSym0 a0123456789876543210 + where + FSym0KindInference :: SameKind (Apply FSym0 arg) (FSym1 arg) => + FSym0 a0123456789876543210 + type instance Apply FSym0 a0123456789876543210 = F a0123456789876543210 + instance SuppressUnusedWarnings FSym0 where + suppressUnusedWarnings = snd ((,) FSym0KindInference ()) + type family FSym1 a0123456789876543210 where + FSym1 a0123456789876543210 = F a0123456789876543210 + type family F a where + F MyProxy = Let0123456789876543210XSym0 + sF :: forall arg. Sing arg -> Sing (Apply FSym0 arg) + sF SMyProxy + = let + sX :: Sing @_ Let0123456789876543210XSym0 + sX + = let + sZ :: (Sing (Let0123456789876543210ZSym0 :: MyProxy a) :: Type) + sZ = SMyProxy + in sZ + in sX + instance SingI FSym0 where + sing = singFun1 @FSym0 sF + data SMyProxy :: forall (a :: Type). MyProxy a -> Type + where + SMyProxy :: forall (a :: Type). + SMyProxy (MyProxy :: MyProxy (a :: Type)) + type instance Sing @(MyProxy a) = SMyProxy + instance SingKind a => SingKind (MyProxy a) where + type Demote (MyProxy a) = MyProxy (Demote a) + fromSing SMyProxy = MyProxy + toSing MyProxy = SomeSing SMyProxy + instance SingI MyProxy where + sing = SMyProxy
tests/compile-and-dump/Singletons/T297.hs view
@@ -1,13 +1,13 @@-module T297 where--import Data.Kind-import Data.Singletons.TH--$(singletons [d|- data MyProxy (a :: Type) = MyProxy-- f MyProxy =- let x = let z :: MyProxy a -- When singled, this `a` should be explicitly quantified- z = MyProxy in z- in x- |])+module T297 where + +import Data.Kind +import Data.Singletons.TH + +$(singletons [d| + data MyProxy (a :: Type) = MyProxy + + f MyProxy = + let x = let z :: MyProxy a -- When singled, this `a` should be explicitly quantified + z = MyProxy in z + in x + |])
tests/compile-and-dump/Singletons/T312.golden view
@@ -1,199 +1,199 @@-Singletons/T312.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| class Foo a where- bar :: a -> b -> b- bar _ x = x- baz :: forall b. a -> b -> b- baz- = h- where- h :: forall c. c -> b -> b- h _ x = x |]- ======>- class Foo a where- bar :: a -> b -> b- baz :: forall b. a -> b -> b- bar _ x = x- baz- = h- where- h :: forall c. c -> b -> b- h _ x = x- type BarSym0 :: forall a b. (~>) a ((~>) b b)- data BarSym0 :: (~>) a ((~>) b b)- where- BarSym0KindInference :: SameKind (Apply BarSym0 arg) (BarSym1 arg) =>- BarSym0 a0123456789876543210- type instance Apply BarSym0 a0123456789876543210 = BarSym1 a0123456789876543210- instance SuppressUnusedWarnings BarSym0 where- suppressUnusedWarnings = snd (((,) BarSym0KindInference) ())- type BarSym1 :: forall a b. a -> (~>) b b- data BarSym1 (a0123456789876543210 :: a) :: (~>) b b- where- BarSym1KindInference :: SameKind (Apply (BarSym1 a0123456789876543210) arg) (BarSym2 a0123456789876543210 arg) =>- BarSym1 a0123456789876543210 a0123456789876543210- type instance Apply (BarSym1 a0123456789876543210) a0123456789876543210 = Bar a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (BarSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) BarSym1KindInference) ())- type BarSym2 :: forall a b. a -> b -> b- type family BarSym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: b where- BarSym2 a0123456789876543210 a0123456789876543210 = Bar a0123456789876543210 a0123456789876543210- type BazSym0 :: forall a b. (~>) a ((~>) b b)- data BazSym0 :: (~>) a ((~>) b b)- where- BazSym0KindInference :: SameKind (Apply BazSym0 arg) (BazSym1 arg) =>- BazSym0 a0123456789876543210- type instance Apply BazSym0 a0123456789876543210 = BazSym1 a0123456789876543210- instance SuppressUnusedWarnings BazSym0 where- suppressUnusedWarnings = snd (((,) BazSym0KindInference) ())- type BazSym1 :: forall a b. a -> (~>) b b- data BazSym1 (a0123456789876543210 :: a) :: (~>) b b- where- BazSym1KindInference :: SameKind (Apply (BazSym1 a0123456789876543210) arg) (BazSym2 a0123456789876543210 arg) =>- BazSym1 a0123456789876543210 a0123456789876543210- type instance Apply (BazSym1 a0123456789876543210) a0123456789876543210 = Baz a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (BazSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) BazSym1KindInference) ())- type BazSym2 :: forall a b. a -> b -> b- type family BazSym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: b where- BazSym2 a0123456789876543210 a0123456789876543210 = Baz a0123456789876543210 a0123456789876543210- type Bar_0123456789876543210 :: a -> b -> b- type family Bar_0123456789876543210 (a :: a) (a :: b) :: b where- Bar_0123456789876543210 _ x = x- type Bar_0123456789876543210Sym0 :: (~>) a ((~>) b b)- data Bar_0123456789876543210Sym0 :: (~>) a ((~>) b b)- where- Bar_0123456789876543210Sym0KindInference :: SameKind (Apply Bar_0123456789876543210Sym0 arg) (Bar_0123456789876543210Sym1 arg) =>- Bar_0123456789876543210Sym0 a0123456789876543210- type instance Apply Bar_0123456789876543210Sym0 a0123456789876543210 = Bar_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings Bar_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Bar_0123456789876543210Sym0KindInference) ())- type Bar_0123456789876543210Sym1 :: a -> (~>) b b- data Bar_0123456789876543210Sym1 (a0123456789876543210 :: a) :: (~>) b b- where- Bar_0123456789876543210Sym1KindInference :: SameKind (Apply (Bar_0123456789876543210Sym1 a0123456789876543210) arg) (Bar_0123456789876543210Sym2 a0123456789876543210 arg) =>- Bar_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (Bar_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Bar_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Bar_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Bar_0123456789876543210Sym1KindInference) ())- type Bar_0123456789876543210Sym2 :: a -> b -> b- type family Bar_0123456789876543210Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: b where- Bar_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Bar_0123456789876543210 a0123456789876543210 a0123456789876543210- data Let0123456789876543210HSym0 a_01234567898765432100123456789876543210- where- Let0123456789876543210HSym0KindInference :: SameKind (Apply Let0123456789876543210HSym0 arg) (Let0123456789876543210HSym1 arg) =>- Let0123456789876543210HSym0 a_01234567898765432100123456789876543210- type instance Apply Let0123456789876543210HSym0 a_01234567898765432100123456789876543210 = Let0123456789876543210HSym1 a_01234567898765432100123456789876543210- instance SuppressUnusedWarnings Let0123456789876543210HSym0 where- suppressUnusedWarnings- = snd (((,) Let0123456789876543210HSym0KindInference) ())- data Let0123456789876543210HSym1 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- where- Let0123456789876543210HSym1KindInference :: SameKind (Apply (Let0123456789876543210HSym1 a_01234567898765432100123456789876543210) arg) (Let0123456789876543210HSym2 a_01234567898765432100123456789876543210 arg) =>- Let0123456789876543210HSym1 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- type instance Apply (Let0123456789876543210HSym1 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Let0123456789876543210HSym2 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210- instance SuppressUnusedWarnings (Let0123456789876543210HSym1 a_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Let0123456789876543210HSym1KindInference) ())- data Let0123456789876543210HSym2 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 :: (~>) c0123456789876543210 ((~>) b0123456789876543210 b0123456789876543210)- where- Let0123456789876543210HSym2KindInference :: SameKind (Apply (Let0123456789876543210HSym2 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Let0123456789876543210HSym3 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) =>- Let0123456789876543210HSym2 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a0123456789876543210- type instance Apply (Let0123456789876543210HSym2 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a0123456789876543210 = Let0123456789876543210HSym3 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Let0123456789876543210HSym2 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Let0123456789876543210HSym2KindInference) ())- data Let0123456789876543210HSym3 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 (a0123456789876543210 :: c0123456789876543210) :: (~>) b0123456789876543210 b0123456789876543210- where- Let0123456789876543210HSym3KindInference :: SameKind (Apply (Let0123456789876543210HSym3 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a0123456789876543210) arg) (Let0123456789876543210HSym4 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a0123456789876543210 arg) =>- Let0123456789876543210HSym3 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply (Let0123456789876543210HSym3 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a0123456789876543210) a0123456789876543210 = Let0123456789876543210H a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Let0123456789876543210HSym3 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Let0123456789876543210HSym3KindInference) ())- type family Let0123456789876543210HSym4 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 (a0123456789876543210 :: c0123456789876543210) (a0123456789876543210 :: b0123456789876543210) :: b0123456789876543210 where- Let0123456789876543210HSym4 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a0123456789876543210 a0123456789876543210 = Let0123456789876543210H a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a0123456789876543210 a0123456789876543210- type family Let0123456789876543210H a_0123456789876543210 a_0123456789876543210 (a :: c) (a :: b) :: b where- Let0123456789876543210H a_0123456789876543210 a_0123456789876543210 _ x = x- type Baz_0123456789876543210 :: a -> b -> b- type family Baz_0123456789876543210 (a :: a) (a :: b) :: b where- Baz_0123456789876543210 a_0123456789876543210 a_0123456789876543210 = Apply (Apply (Let0123456789876543210HSym2 a_0123456789876543210 a_0123456789876543210) a_0123456789876543210) a_0123456789876543210- type Baz_0123456789876543210Sym0 :: (~>) a ((~>) b b)- data Baz_0123456789876543210Sym0 :: (~>) a ((~>) b b)- where- Baz_0123456789876543210Sym0KindInference :: SameKind (Apply Baz_0123456789876543210Sym0 arg) (Baz_0123456789876543210Sym1 arg) =>- Baz_0123456789876543210Sym0 a0123456789876543210- type instance Apply Baz_0123456789876543210Sym0 a0123456789876543210 = Baz_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings Baz_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Baz_0123456789876543210Sym0KindInference) ())- type Baz_0123456789876543210Sym1 :: a -> (~>) b b- data Baz_0123456789876543210Sym1 (a0123456789876543210 :: a) :: (~>) b b- where- Baz_0123456789876543210Sym1KindInference :: SameKind (Apply (Baz_0123456789876543210Sym1 a0123456789876543210) arg) (Baz_0123456789876543210Sym2 a0123456789876543210 arg) =>- Baz_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (Baz_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Baz_0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (Baz_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) Baz_0123456789876543210Sym1KindInference) ())- type Baz_0123456789876543210Sym2 :: a -> b -> b- type family Baz_0123456789876543210Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: b where- Baz_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Baz_0123456789876543210 a0123456789876543210 a0123456789876543210- class PFoo a where- type family Bar (arg :: a) (arg :: b) :: b- type family Baz (arg :: a) (arg :: b) :: b- type Bar a a = Apply (Apply Bar_0123456789876543210Sym0 a) a- type Baz a a = Apply (Apply Baz_0123456789876543210Sym0 a) a- class SFoo a where- sBar ::- forall b (t :: a) (t :: b). Sing t- -> Sing t -> Sing (Apply (Apply BarSym0 t) t :: b)- sBaz ::- forall b (t :: a) (t :: b). Sing t- -> Sing t -> Sing (Apply (Apply BazSym0 t) t :: b)- default sBar ::- forall b (t :: a) (t :: b). ((Apply (Apply BarSym0 t) t :: b)- ~ Apply (Apply Bar_0123456789876543210Sym0 t) t) =>- Sing t- -> Sing t -> Sing (Apply (Apply BarSym0 t) t :: b)- default sBaz ::- forall b (t :: a) (t :: b). ((Apply (Apply BazSym0 t) t :: b)- ~ Apply (Apply Baz_0123456789876543210Sym0 t) t) =>- Sing t- -> Sing t -> Sing (Apply (Apply BazSym0 t) t :: b)- sBar _ (sX :: Sing x) = sX- sBaz- (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing- (let- sH ::- forall c (t :: c) (t :: b). Sing t- -> Sing t- -> Sing (Apply (Apply (Let0123456789876543210HSym2 a_0123456789876543210 a_0123456789876543210) t) t :: b)- sH _ (sX :: Sing x) = sX- in- (singFun2- @(Let0123456789876543210HSym2 a_0123456789876543210 a_0123456789876543210))- sH))- sA_0123456789876543210))- sA_0123456789876543210- instance SFoo a => SingI (BarSym0 :: (~>) a ((~>) b b)) where- sing = (singFun2 @BarSym0) sBar- instance (SFoo a, SingI d) =>- SingI (BarSym1 (d :: a) :: (~>) b b) where- sing = (singFun1 @(BarSym1 (d :: a))) (sBar (sing @d))- instance SFoo a => SingI1 (BarSym1 :: a -> (~>) b b) where- liftSing (s :: Sing (d :: a))- = (singFun1 @(BarSym1 (d :: a))) (sBar s)- instance SFoo a => SingI (BazSym0 :: (~>) a ((~>) b b)) where- sing = (singFun2 @BazSym0) sBaz- instance (SFoo a, SingI d) =>- SingI (BazSym1 (d :: a) :: (~>) b b) where- sing = (singFun1 @(BazSym1 (d :: a))) (sBaz (sing @d))- instance SFoo a => SingI1 (BazSym1 :: a -> (~>) b b) where- liftSing (s :: Sing (d :: a))- = (singFun1 @(BazSym1 (d :: a))) (sBaz s)+Singletons/T312.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| class Foo a where + bar :: a -> b -> b + bar _ x = x + baz :: forall b. a -> b -> b + baz + = h + where + h :: forall c. c -> b -> b + h _ x = x |] + ======> + class Foo a where + bar :: a -> b -> b + baz :: forall b. a -> b -> b + bar _ x = x + baz + = h + where + h :: forall c. c -> b -> b + h _ x = x + type BarSym0 :: forall a b. (~>) a ((~>) b b) + data BarSym0 :: (~>) a ((~>) b b) + where + BarSym0KindInference :: SameKind (Apply BarSym0 arg) (BarSym1 arg) => + BarSym0 a0123456789876543210 + type instance Apply BarSym0 a0123456789876543210 = BarSym1 a0123456789876543210 + instance SuppressUnusedWarnings BarSym0 where + suppressUnusedWarnings = snd ((,) BarSym0KindInference ()) + type BarSym1 :: forall a b. a -> (~>) b b + data BarSym1 (a0123456789876543210 :: a) :: (~>) b b + where + BarSym1KindInference :: SameKind (Apply (BarSym1 a0123456789876543210) arg) (BarSym2 a0123456789876543210 arg) => + BarSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (BarSym1 a0123456789876543210) a0123456789876543210 = Bar a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (BarSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) BarSym1KindInference ()) + type BarSym2 :: forall a b. a -> b -> b + type family BarSym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: b where + BarSym2 a0123456789876543210 a0123456789876543210 = Bar a0123456789876543210 a0123456789876543210 + type BazSym0 :: forall a b. (~>) a ((~>) b b) + data BazSym0 :: (~>) a ((~>) b b) + where + BazSym0KindInference :: SameKind (Apply BazSym0 arg) (BazSym1 arg) => + BazSym0 a0123456789876543210 + type instance Apply BazSym0 a0123456789876543210 = BazSym1 a0123456789876543210 + instance SuppressUnusedWarnings BazSym0 where + suppressUnusedWarnings = snd ((,) BazSym0KindInference ()) + type BazSym1 :: forall a b. a -> (~>) b b + data BazSym1 (a0123456789876543210 :: a) :: (~>) b b + where + BazSym1KindInference :: SameKind (Apply (BazSym1 a0123456789876543210) arg) (BazSym2 a0123456789876543210 arg) => + BazSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (BazSym1 a0123456789876543210) a0123456789876543210 = Baz a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (BazSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) BazSym1KindInference ()) + type BazSym2 :: forall a b. a -> b -> b + type family BazSym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: b where + BazSym2 a0123456789876543210 a0123456789876543210 = Baz a0123456789876543210 a0123456789876543210 + type Bar_0123456789876543210 :: a -> b -> b + type family Bar_0123456789876543210 (a :: a) (a :: b) :: b where + Bar_0123456789876543210 _ x = x + type Bar_0123456789876543210Sym0 :: (~>) a ((~>) b b) + data Bar_0123456789876543210Sym0 :: (~>) a ((~>) b b) + where + Bar_0123456789876543210Sym0KindInference :: SameKind (Apply Bar_0123456789876543210Sym0 arg) (Bar_0123456789876543210Sym1 arg) => + Bar_0123456789876543210Sym0 a0123456789876543210 + type instance Apply Bar_0123456789876543210Sym0 a0123456789876543210 = Bar_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Bar_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Bar_0123456789876543210Sym0KindInference ()) + type Bar_0123456789876543210Sym1 :: a -> (~>) b b + data Bar_0123456789876543210Sym1 (a0123456789876543210 :: a) :: (~>) b b + where + Bar_0123456789876543210Sym1KindInference :: SameKind (Apply (Bar_0123456789876543210Sym1 a0123456789876543210) arg) (Bar_0123456789876543210Sym2 a0123456789876543210 arg) => + Bar_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (Bar_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Bar_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Bar_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Bar_0123456789876543210Sym1KindInference ()) + type Bar_0123456789876543210Sym2 :: a -> b -> b + type family Bar_0123456789876543210Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: b where + Bar_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Bar_0123456789876543210 a0123456789876543210 a0123456789876543210 + data Let0123456789876543210HSym0 a_01234567898765432100123456789876543210 + where + Let0123456789876543210HSym0KindInference :: SameKind (Apply Let0123456789876543210HSym0 arg) (Let0123456789876543210HSym1 arg) => + Let0123456789876543210HSym0 a_01234567898765432100123456789876543210 + type instance Apply Let0123456789876543210HSym0 a_01234567898765432100123456789876543210 = Let0123456789876543210HSym1 a_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings Let0123456789876543210HSym0 where + suppressUnusedWarnings + = snd ((,) Let0123456789876543210HSym0KindInference ()) + data Let0123456789876543210HSym1 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + where + Let0123456789876543210HSym1KindInference :: SameKind (Apply (Let0123456789876543210HSym1 a_01234567898765432100123456789876543210) arg) (Let0123456789876543210HSym2 a_01234567898765432100123456789876543210 arg) => + Let0123456789876543210HSym1 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + type instance Apply (Let0123456789876543210HSym1 a_01234567898765432100123456789876543210) a_01234567898765432100123456789876543210 = Let0123456789876543210HSym2 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings (Let0123456789876543210HSym1 a_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Let0123456789876543210HSym1KindInference ()) + data Let0123456789876543210HSym2 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 :: (~>) c0123456789876543210 ((~>) b0123456789876543210 b0123456789876543210) + where + Let0123456789876543210HSym2KindInference :: SameKind (Apply (Let0123456789876543210HSym2 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) arg) (Let0123456789876543210HSym3 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 arg) => + Let0123456789876543210HSym2 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a0123456789876543210 + type instance Apply (Let0123456789876543210HSym2 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) a0123456789876543210 = Let0123456789876543210HSym3 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Let0123456789876543210HSym2 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Let0123456789876543210HSym2KindInference ()) + data Let0123456789876543210HSym3 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 (a0123456789876543210 :: c0123456789876543210) :: (~>) b0123456789876543210 b0123456789876543210 + where + Let0123456789876543210HSym3KindInference :: SameKind (Apply (Let0123456789876543210HSym3 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a0123456789876543210) arg) (Let0123456789876543210HSym4 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a0123456789876543210 arg) => + Let0123456789876543210HSym3 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply (Let0123456789876543210HSym3 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a0123456789876543210) a0123456789876543210 = Let0123456789876543210H a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Let0123456789876543210HSym3 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Let0123456789876543210HSym3KindInference ()) + type family Let0123456789876543210HSym4 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 (a0123456789876543210 :: c0123456789876543210) (a0123456789876543210 :: b0123456789876543210) :: b0123456789876543210 where + Let0123456789876543210HSym4 a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a0123456789876543210 a0123456789876543210 = Let0123456789876543210H a_01234567898765432100123456789876543210 a_01234567898765432100123456789876543210 a0123456789876543210 a0123456789876543210 + type family Let0123456789876543210H a_0123456789876543210 a_0123456789876543210 (a :: c) (a :: b) :: b where + Let0123456789876543210H a_0123456789876543210 a_0123456789876543210 _ x = x + type Baz_0123456789876543210 :: a -> b -> b + type family Baz_0123456789876543210 (a :: a) (a :: b) :: b where + Baz_0123456789876543210 a_0123456789876543210 a_0123456789876543210 = Apply (Apply (Let0123456789876543210HSym2 a_0123456789876543210 a_0123456789876543210) a_0123456789876543210) a_0123456789876543210 + type Baz_0123456789876543210Sym0 :: (~>) a ((~>) b b) + data Baz_0123456789876543210Sym0 :: (~>) a ((~>) b b) + where + Baz_0123456789876543210Sym0KindInference :: SameKind (Apply Baz_0123456789876543210Sym0 arg) (Baz_0123456789876543210Sym1 arg) => + Baz_0123456789876543210Sym0 a0123456789876543210 + type instance Apply Baz_0123456789876543210Sym0 a0123456789876543210 = Baz_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Baz_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Baz_0123456789876543210Sym0KindInference ()) + type Baz_0123456789876543210Sym1 :: a -> (~>) b b + data Baz_0123456789876543210Sym1 (a0123456789876543210 :: a) :: (~>) b b + where + Baz_0123456789876543210Sym1KindInference :: SameKind (Apply (Baz_0123456789876543210Sym1 a0123456789876543210) arg) (Baz_0123456789876543210Sym2 a0123456789876543210 arg) => + Baz_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (Baz_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Baz_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Baz_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Baz_0123456789876543210Sym1KindInference ()) + type Baz_0123456789876543210Sym2 :: a -> b -> b + type family Baz_0123456789876543210Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: b where + Baz_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Baz_0123456789876543210 a0123456789876543210 a0123456789876543210 + class PFoo a where + type family Bar (arg :: a) (arg :: b) :: b + type family Baz (arg :: a) (arg :: b) :: b + type Bar a a = Apply (Apply Bar_0123456789876543210Sym0 a) a + type Baz a a = Apply (Apply Baz_0123456789876543210Sym0 a) a + class SFoo a where + sBar :: + (forall (t :: a) (t :: b). + Sing t -> Sing t -> Sing (Apply (Apply BarSym0 t) t :: b) :: Type) + sBaz :: + forall b (t :: a) (t :: b). Sing t + -> Sing t -> Sing (Apply (Apply BazSym0 t) t :: b) + default sBar :: + (forall (t :: a) (t :: b). + ((Apply (Apply BarSym0 t) t :: b) + ~ Apply (Apply Bar_0123456789876543210Sym0 t) t) => + Sing t -> Sing t -> Sing (Apply (Apply BarSym0 t) t :: b) :: Type) + default sBaz :: + forall b (t :: a) (t :: b). ((Apply (Apply BazSym0 t) t :: b) + ~ Apply (Apply Baz_0123456789876543210Sym0 t) t) => + Sing t + -> Sing t -> Sing (Apply (Apply BazSym0 t) t :: b) + sBar _ (sX :: Sing x) = sX + sBaz + (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (let + sH :: + forall c (t :: c) (t :: b). Sing t + -> Sing t + -> Sing (Apply (Apply (Let0123456789876543210HSym2 a_0123456789876543210 a_0123456789876543210) t) t :: b) + sH _ (sX :: Sing x) = sX + in + singFun2 + @(Let0123456789876543210HSym2 a_0123456789876543210 a_0123456789876543210) + sH) + sA_0123456789876543210) + sA_0123456789876543210 + instance SFoo a => SingI (BarSym0 :: (~>) a ((~>) b b)) where + sing = singFun2 @BarSym0 sBar + instance (SFoo a, SingI d) => + SingI (BarSym1 (d :: a) :: (~>) b b) where + sing = singFun1 @(BarSym1 (d :: a)) (sBar (sing @d)) + instance SFoo a => SingI1 (BarSym1 :: a -> (~>) b b) where + liftSing (s :: Sing (d :: a)) + = singFun1 @(BarSym1 (d :: a)) (sBar s) + instance SFoo a => SingI (BazSym0 :: (~>) a ((~>) b b)) where + sing = singFun2 @BazSym0 sBaz + instance (SFoo a, SingI d) => + SingI (BazSym1 (d :: a) :: (~>) b b) where + sing = singFun1 @(BazSym1 (d :: a)) (sBaz (sing @d)) + instance SFoo a => SingI1 (BazSym1 :: a -> (~>) b b) where + liftSing (s :: Sing (d :: a)) + = singFun1 @(BazSym1 (d :: a)) (sBaz s)
tests/compile-and-dump/Singletons/T312.hs view
@@ -1,14 +1,14 @@-module T312 where--import Data.Singletons.TH--$(singletons [d|- class Foo a where- bar :: a -> b -> b- bar _ x = x-- baz :: forall b. a -> b -> b- baz = h where- h :: forall c. c -> b -> b- h _ x = x- |])+module T312 where + +import Data.Singletons.TH + +$(singletons [d| + class Foo a where + bar :: a -> b -> b + bar _ x = x + + baz :: forall b. a -> b -> b + baz = h where + h :: forall c. c -> b -> b + h _ x = x + |])
tests/compile-and-dump/Singletons/T313.golden view
@@ -1,126 +1,126 @@-Singletons/T313.hs:(0,0)-(0,0): Splicing declarations- promote- [d| type PFoo1 a = Maybe a- type family PFoo2 a- type family PFoo3 a where- PFoo3 a = Maybe a- class PC (a :: Type) where- type PFoo4 a- type PFoo4 a = Maybe a- - type instance PFoo2 a = Maybe a- instance PC a where- type PFoo4 a = Maybe a |]- ======>- type PFoo1 a = Maybe a- type family PFoo2 a- type instance PFoo2 a = Maybe a- type family PFoo3 a where- PFoo3 a = Maybe a- class PC (a :: Type) where- type family PFoo4 a- type PFoo4 a = Maybe a- instance PC a where- type PFoo4 a = Maybe a- data PFoo1Sym0 a0123456789876543210- where- PFoo1Sym0KindInference :: SameKind (Apply PFoo1Sym0 arg) (PFoo1Sym1 arg) =>- PFoo1Sym0 a0123456789876543210- type instance Apply PFoo1Sym0 a0123456789876543210 = PFoo1 a0123456789876543210- instance SuppressUnusedWarnings PFoo1Sym0 where- suppressUnusedWarnings = snd (((,) PFoo1Sym0KindInference) ())- type family PFoo1Sym1 a0123456789876543210 where- PFoo1Sym1 a0123456789876543210 = PFoo1 a0123456789876543210- data PFoo3Sym0 a0123456789876543210- where- PFoo3Sym0KindInference :: SameKind (Apply PFoo3Sym0 arg) (PFoo3Sym1 arg) =>- PFoo3Sym0 a0123456789876543210- type instance Apply PFoo3Sym0 a0123456789876543210 = PFoo3 a0123456789876543210- instance SuppressUnusedWarnings PFoo3Sym0 where- suppressUnusedWarnings = snd (((,) PFoo3Sym0KindInference) ())- type family PFoo3Sym1 a0123456789876543210 where- PFoo3Sym1 a0123456789876543210 = PFoo3 a0123456789876543210- data PFoo2Sym0 :: (~>) Type Type- where- PFoo2Sym0KindInference :: SameKind (Apply PFoo2Sym0 arg) (PFoo2Sym1 arg) =>- PFoo2Sym0 a0123456789876543210- type instance Apply PFoo2Sym0 a0123456789876543210 = PFoo2 a0123456789876543210- instance SuppressUnusedWarnings PFoo2Sym0 where- suppressUnusedWarnings = snd (((,) PFoo2Sym0KindInference) ())- type family PFoo2Sym1 (a0123456789876543210 :: Type) :: Type where- PFoo2Sym1 a0123456789876543210 = PFoo2 a0123456789876543210- data PFoo4Sym0 a0123456789876543210- where- PFoo4Sym0KindInference :: SameKind (Apply PFoo4Sym0 arg) (PFoo4Sym1 arg) =>- PFoo4Sym0 a0123456789876543210- type instance Apply PFoo4Sym0 a0123456789876543210 = PFoo4 a0123456789876543210- instance SuppressUnusedWarnings PFoo4Sym0 where- suppressUnusedWarnings = snd (((,) PFoo4Sym0KindInference) ())- type family PFoo4Sym1 (a0123456789876543210 :: Type) where- PFoo4Sym1 a0123456789876543210 = PFoo4 a0123456789876543210- class PPC (a :: Type)- instance PPC a-Singletons/T313.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| type SFoo1 a = Maybe a- type family SFoo2 a- type family SFoo3 a where- SFoo3 a = Maybe a- class SC (a :: Type) where- type SFoo4 a- type SFoo4 a = Maybe a- - type instance SFoo2 a = Maybe a- instance SC a where- type SFoo4 a = Maybe a |]- ======>- type SFoo1 a = Maybe a- type family SFoo2 a- type instance SFoo2 a = Maybe a- type family SFoo3 a where- SFoo3 a = Maybe a- class SC (a :: Type) where- type family SFoo4 a- type SFoo4 a = Maybe a- instance SC a where- type SFoo4 a = Maybe a- data SFoo1Sym0 a0123456789876543210- where- SFoo1Sym0KindInference :: SameKind (Apply SFoo1Sym0 arg) (SFoo1Sym1 arg) =>- SFoo1Sym0 a0123456789876543210- type instance Apply SFoo1Sym0 a0123456789876543210 = SFoo1 a0123456789876543210- instance SuppressUnusedWarnings SFoo1Sym0 where- suppressUnusedWarnings = snd (((,) SFoo1Sym0KindInference) ())- type family SFoo1Sym1 a0123456789876543210 where- SFoo1Sym1 a0123456789876543210 = SFoo1 a0123456789876543210- data SFoo3Sym0 a0123456789876543210- where- SFoo3Sym0KindInference :: SameKind (Apply SFoo3Sym0 arg) (SFoo3Sym1 arg) =>- SFoo3Sym0 a0123456789876543210- type instance Apply SFoo3Sym0 a0123456789876543210 = SFoo3 a0123456789876543210- instance SuppressUnusedWarnings SFoo3Sym0 where- suppressUnusedWarnings = snd (((,) SFoo3Sym0KindInference) ())- type family SFoo3Sym1 a0123456789876543210 where- SFoo3Sym1 a0123456789876543210 = SFoo3 a0123456789876543210- data SFoo2Sym0 :: (~>) Type Type- where- SFoo2Sym0KindInference :: SameKind (Apply SFoo2Sym0 arg) (SFoo2Sym1 arg) =>- SFoo2Sym0 a0123456789876543210- type instance Apply SFoo2Sym0 a0123456789876543210 = SFoo2 a0123456789876543210- instance SuppressUnusedWarnings SFoo2Sym0 where- suppressUnusedWarnings = snd (((,) SFoo2Sym0KindInference) ())- type family SFoo2Sym1 (a0123456789876543210 :: Type) :: Type where- SFoo2Sym1 a0123456789876543210 = SFoo2 a0123456789876543210- data SFoo4Sym0 a0123456789876543210- where- SFoo4Sym0KindInference :: SameKind (Apply SFoo4Sym0 arg) (SFoo4Sym1 arg) =>- SFoo4Sym0 a0123456789876543210- type instance Apply SFoo4Sym0 a0123456789876543210 = SFoo4 a0123456789876543210- instance SuppressUnusedWarnings SFoo4Sym0 where- suppressUnusedWarnings = snd (((,) SFoo4Sym0KindInference) ())- type family SFoo4Sym1 (a0123456789876543210 :: Type) where- SFoo4Sym1 a0123456789876543210 = SFoo4 a0123456789876543210- class PSC (a :: Type)- instance PSC a- class SSC (a :: Type)- instance SSC a+Singletons/T313.hs:(0,0)-(0,0): Splicing declarations + promote + [d| type PFoo1 a = Maybe a + type family PFoo2 a + type family PFoo3 a where + PFoo3 a = Maybe a + class PC (a :: Type) where + type PFoo4 a + type PFoo4 a = Maybe a + + type instance PFoo2 a = Maybe a + instance PC a where + type PFoo4 a = Maybe a |] + ======> + type PFoo1 a = Maybe a + type family PFoo2 a + type instance PFoo2 a = Maybe a + type family PFoo3 a where + PFoo3 a = Maybe a + class PC (a :: Type) where + type family PFoo4 a + type PFoo4 a = Maybe a + instance PC a where + type PFoo4 a = Maybe a + data PFoo1Sym0 a0123456789876543210 + where + PFoo1Sym0KindInference :: SameKind (Apply PFoo1Sym0 arg) (PFoo1Sym1 arg) => + PFoo1Sym0 a0123456789876543210 + type instance Apply PFoo1Sym0 a0123456789876543210 = PFoo1 a0123456789876543210 + instance SuppressUnusedWarnings PFoo1Sym0 where + suppressUnusedWarnings = snd ((,) PFoo1Sym0KindInference ()) + type family PFoo1Sym1 a0123456789876543210 where + PFoo1Sym1 a0123456789876543210 = PFoo1 a0123456789876543210 + data PFoo3Sym0 a0123456789876543210 + where + PFoo3Sym0KindInference :: SameKind (Apply PFoo3Sym0 arg) (PFoo3Sym1 arg) => + PFoo3Sym0 a0123456789876543210 + type instance Apply PFoo3Sym0 a0123456789876543210 = PFoo3 a0123456789876543210 + instance SuppressUnusedWarnings PFoo3Sym0 where + suppressUnusedWarnings = snd ((,) PFoo3Sym0KindInference ()) + type family PFoo3Sym1 a0123456789876543210 where + PFoo3Sym1 a0123456789876543210 = PFoo3 a0123456789876543210 + data PFoo2Sym0 :: (~>) Type Type + where + PFoo2Sym0KindInference :: SameKind (Apply PFoo2Sym0 arg) (PFoo2Sym1 arg) => + PFoo2Sym0 a0123456789876543210 + type instance Apply PFoo2Sym0 a0123456789876543210 = PFoo2 a0123456789876543210 + instance SuppressUnusedWarnings PFoo2Sym0 where + suppressUnusedWarnings = snd ((,) PFoo2Sym0KindInference ()) + type family PFoo2Sym1 (a0123456789876543210 :: Type) :: Type where + PFoo2Sym1 a0123456789876543210 = PFoo2 a0123456789876543210 + data PFoo4Sym0 a0123456789876543210 + where + PFoo4Sym0KindInference :: SameKind (Apply PFoo4Sym0 arg) (PFoo4Sym1 arg) => + PFoo4Sym0 a0123456789876543210 + type instance Apply PFoo4Sym0 a0123456789876543210 = PFoo4 a0123456789876543210 + instance SuppressUnusedWarnings PFoo4Sym0 where + suppressUnusedWarnings = snd ((,) PFoo4Sym0KindInference ()) + type family PFoo4Sym1 (a0123456789876543210 :: Type) where + PFoo4Sym1 a0123456789876543210 = PFoo4 a0123456789876543210 + class PPC (a :: Type) + instance PPC a +Singletons/T313.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| type SFoo1 a = Maybe a + type family SFoo2 a + type family SFoo3 a where + SFoo3 a = Maybe a + class SC (a :: Type) where + type SFoo4 a + type SFoo4 a = Maybe a + + type instance SFoo2 a = Maybe a + instance SC a where + type SFoo4 a = Maybe a |] + ======> + type SFoo1 a = Maybe a + type family SFoo2 a + type instance SFoo2 a = Maybe a + type family SFoo3 a where + SFoo3 a = Maybe a + class SC (a :: Type) where + type family SFoo4 a + type SFoo4 a = Maybe a + instance SC a where + type SFoo4 a = Maybe a + data SFoo1Sym0 a0123456789876543210 + where + SFoo1Sym0KindInference :: SameKind (Apply SFoo1Sym0 arg) (SFoo1Sym1 arg) => + SFoo1Sym0 a0123456789876543210 + type instance Apply SFoo1Sym0 a0123456789876543210 = SFoo1 a0123456789876543210 + instance SuppressUnusedWarnings SFoo1Sym0 where + suppressUnusedWarnings = snd ((,) SFoo1Sym0KindInference ()) + type family SFoo1Sym1 a0123456789876543210 where + SFoo1Sym1 a0123456789876543210 = SFoo1 a0123456789876543210 + data SFoo3Sym0 a0123456789876543210 + where + SFoo3Sym0KindInference :: SameKind (Apply SFoo3Sym0 arg) (SFoo3Sym1 arg) => + SFoo3Sym0 a0123456789876543210 + type instance Apply SFoo3Sym0 a0123456789876543210 = SFoo3 a0123456789876543210 + instance SuppressUnusedWarnings SFoo3Sym0 where + suppressUnusedWarnings = snd ((,) SFoo3Sym0KindInference ()) + type family SFoo3Sym1 a0123456789876543210 where + SFoo3Sym1 a0123456789876543210 = SFoo3 a0123456789876543210 + data SFoo2Sym0 :: (~>) Type Type + where + SFoo2Sym0KindInference :: SameKind (Apply SFoo2Sym0 arg) (SFoo2Sym1 arg) => + SFoo2Sym0 a0123456789876543210 + type instance Apply SFoo2Sym0 a0123456789876543210 = SFoo2 a0123456789876543210 + instance SuppressUnusedWarnings SFoo2Sym0 where + suppressUnusedWarnings = snd ((,) SFoo2Sym0KindInference ()) + type family SFoo2Sym1 (a0123456789876543210 :: Type) :: Type where + SFoo2Sym1 a0123456789876543210 = SFoo2 a0123456789876543210 + data SFoo4Sym0 a0123456789876543210 + where + SFoo4Sym0KindInference :: SameKind (Apply SFoo4Sym0 arg) (SFoo4Sym1 arg) => + SFoo4Sym0 a0123456789876543210 + type instance Apply SFoo4Sym0 a0123456789876543210 = SFoo4 a0123456789876543210 + instance SuppressUnusedWarnings SFoo4Sym0 where + suppressUnusedWarnings = snd ((,) SFoo4Sym0KindInference ()) + type family SFoo4Sym1 (a0123456789876543210 :: Type) where + SFoo4Sym1 a0123456789876543210 = SFoo4 a0123456789876543210 + class PSC (a :: Type) + instance PSC a + class SSC (a :: Type) + instance SSC a
tests/compile-and-dump/Singletons/T313.hs view
@@ -1,38 +1,38 @@-module T313 where--import Data.Kind-import Data.Singletons.TH--$(promote [d|- type PFoo1 a = Maybe a-- type family PFoo2 a- type instance PFoo2 a = Maybe a-- type family PFoo3 a where- PFoo3 a = Maybe a-- class PC (a :: Type) where- type PFoo4 a- type PFoo4 a = Maybe a-- instance PC a where- type PFoo4 a = Maybe a- |])--$(singletons [d|- type SFoo1 a = Maybe a-- type family SFoo2 a- type instance SFoo2 a = Maybe a-- type family SFoo3 a where- SFoo3 a = Maybe a-- class SC (a :: Type) where- type SFoo4 a- type SFoo4 a = Maybe a-- instance SC a where- type SFoo4 a = Maybe a- |])+module T313 where + +import Data.Kind +import Data.Singletons.TH + +$(promote [d| + type PFoo1 a = Maybe a + + type family PFoo2 a + type instance PFoo2 a = Maybe a + + type family PFoo3 a where + PFoo3 a = Maybe a + + class PC (a :: Type) where + type PFoo4 a + type PFoo4 a = Maybe a + + instance PC a where + type PFoo4 a = Maybe a + |]) + +$(singletons [d| + type SFoo1 a = Maybe a + + type family SFoo2 a + type instance SFoo2 a = Maybe a + + type family SFoo3 a where + SFoo3 a = Maybe a + + class SC (a :: Type) where + type SFoo4 a + type SFoo4 a = Maybe a + + instance SC a where + type SFoo4 a = Maybe a + |])
tests/compile-and-dump/Singletons/T316.golden view
@@ -1,42 +1,42 @@-Singletons/T316.hs:(0,0)-(0,0): Splicing declarations- promoteOnly- [d| replaceAllGTypes :: (a -> Type -> a) -> [Type] -> [a] -> [a]- replaceAllGTypes f types as = zipWith f as types |]- ======>- type ReplaceAllGTypesSym0 :: (~>) ((~>) a ((~>) Type a)) ((~>) [Type] ((~>) [a] [a]))- data ReplaceAllGTypesSym0 :: (~>) ((~>) a ((~>) Type a)) ((~>) [Type] ((~>) [a] [a]))- where- ReplaceAllGTypesSym0KindInference :: SameKind (Apply ReplaceAllGTypesSym0 arg) (ReplaceAllGTypesSym1 arg) =>- ReplaceAllGTypesSym0 a0123456789876543210- type instance Apply ReplaceAllGTypesSym0 a0123456789876543210 = ReplaceAllGTypesSym1 a0123456789876543210- instance SuppressUnusedWarnings ReplaceAllGTypesSym0 where- suppressUnusedWarnings- = snd (((,) ReplaceAllGTypesSym0KindInference) ())- type ReplaceAllGTypesSym1 :: (~>) a ((~>) Type a)- -> (~>) [Type] ((~>) [a] [a])- data ReplaceAllGTypesSym1 (a0123456789876543210 :: (~>) a ((~>) Type a)) :: (~>) [Type] ((~>) [a] [a])- where- ReplaceAllGTypesSym1KindInference :: SameKind (Apply (ReplaceAllGTypesSym1 a0123456789876543210) arg) (ReplaceAllGTypesSym2 a0123456789876543210 arg) =>- ReplaceAllGTypesSym1 a0123456789876543210 a0123456789876543210- type instance Apply (ReplaceAllGTypesSym1 a0123456789876543210) a0123456789876543210 = ReplaceAllGTypesSym2 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ReplaceAllGTypesSym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) ReplaceAllGTypesSym1KindInference) ())- type ReplaceAllGTypesSym2 :: (~>) a ((~>) Type a)- -> [Type] -> (~>) [a] [a]- data ReplaceAllGTypesSym2 (a0123456789876543210 :: (~>) a ((~>) Type a)) (a0123456789876543210 :: [Type]) :: (~>) [a] [a]- where- ReplaceAllGTypesSym2KindInference :: SameKind (Apply (ReplaceAllGTypesSym2 a0123456789876543210 a0123456789876543210) arg) (ReplaceAllGTypesSym3 a0123456789876543210 a0123456789876543210 arg) =>- ReplaceAllGTypesSym2 a0123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply (ReplaceAllGTypesSym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = ReplaceAllGTypes a0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ReplaceAllGTypesSym2 a0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) ReplaceAllGTypesSym2KindInference) ())- type ReplaceAllGTypesSym3 :: (~>) a ((~>) Type a)- -> [Type] -> [a] -> [a]- type family ReplaceAllGTypesSym3 (a0123456789876543210 :: (~>) a ((~>) Type a)) (a0123456789876543210 :: [Type]) (a0123456789876543210 :: [a]) :: [a] where- ReplaceAllGTypesSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = ReplaceAllGTypes a0123456789876543210 a0123456789876543210 a0123456789876543210- type ReplaceAllGTypes :: (~>) a ((~>) Type a)- -> [Type] -> [a] -> [a]- type family ReplaceAllGTypes (a :: (~>) a ((~>) Type a)) (a :: [Type]) (a :: [a]) :: [a] where- ReplaceAllGTypes f types as = Apply (Apply (Apply ZipWithSym0 f) as) types+Singletons/T316.hs:(0,0)-(0,0): Splicing declarations + promoteOnly + [d| replaceAllGTypes :: (a -> Type -> a) -> [Type] -> [a] -> [a] + replaceAllGTypes f types as = zipWith f as types |] + ======> + type ReplaceAllGTypesSym0 :: (~>) ((~>) a ((~>) Type a)) ((~>) [Type] ((~>) [a] [a])) + data ReplaceAllGTypesSym0 :: (~>) ((~>) a ((~>) Type a)) ((~>) [Type] ((~>) [a] [a])) + where + ReplaceAllGTypesSym0KindInference :: SameKind (Apply ReplaceAllGTypesSym0 arg) (ReplaceAllGTypesSym1 arg) => + ReplaceAllGTypesSym0 a0123456789876543210 + type instance Apply ReplaceAllGTypesSym0 a0123456789876543210 = ReplaceAllGTypesSym1 a0123456789876543210 + instance SuppressUnusedWarnings ReplaceAllGTypesSym0 where + suppressUnusedWarnings + = snd ((,) ReplaceAllGTypesSym0KindInference ()) + type ReplaceAllGTypesSym1 :: (~>) a ((~>) Type a) + -> (~>) [Type] ((~>) [a] [a]) + data ReplaceAllGTypesSym1 (a0123456789876543210 :: (~>) a ((~>) Type a)) :: (~>) [Type] ((~>) [a] [a]) + where + ReplaceAllGTypesSym1KindInference :: SameKind (Apply (ReplaceAllGTypesSym1 a0123456789876543210) arg) (ReplaceAllGTypesSym2 a0123456789876543210 arg) => + ReplaceAllGTypesSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (ReplaceAllGTypesSym1 a0123456789876543210) a0123456789876543210 = ReplaceAllGTypesSym2 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ReplaceAllGTypesSym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) ReplaceAllGTypesSym1KindInference ()) + type ReplaceAllGTypesSym2 :: (~>) a ((~>) Type a) + -> [Type] -> (~>) [a] [a] + data ReplaceAllGTypesSym2 (a0123456789876543210 :: (~>) a ((~>) Type a)) (a0123456789876543210 :: [Type]) :: (~>) [a] [a] + where + ReplaceAllGTypesSym2KindInference :: SameKind (Apply (ReplaceAllGTypesSym2 a0123456789876543210 a0123456789876543210) arg) (ReplaceAllGTypesSym3 a0123456789876543210 a0123456789876543210 arg) => + ReplaceAllGTypesSym2 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply (ReplaceAllGTypesSym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = ReplaceAllGTypes a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ReplaceAllGTypesSym2 a0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) ReplaceAllGTypesSym2KindInference ()) + type ReplaceAllGTypesSym3 :: (~>) a ((~>) Type a) + -> [Type] -> [a] -> [a] + type family ReplaceAllGTypesSym3 (a0123456789876543210 :: (~>) a ((~>) Type a)) (a0123456789876543210 :: [Type]) (a0123456789876543210 :: [a]) :: [a] where + ReplaceAllGTypesSym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = ReplaceAllGTypes a0123456789876543210 a0123456789876543210 a0123456789876543210 + type ReplaceAllGTypes :: (~>) a ((~>) Type a) + -> [Type] -> [a] -> [a] + type family ReplaceAllGTypes (a :: (~>) a ((~>) Type a)) (a :: [Type]) (a :: [a]) :: [a] where + ReplaceAllGTypes f types as = Apply (Apply (Apply ZipWithSym0 f) as) types
tests/compile-and-dump/Singletons/T316.hs view
@@ -1,10 +1,10 @@-module T316 where--import Data.Kind-import Data.Singletons.TH-import Prelude.Singletons--$(promoteOnly [d|- replaceAllGTypes :: (a -> Type -> a) -> [Type] -> [a] -> [a]- replaceAllGTypes f types as = zipWith f as types- |])+module T316 where + +import Data.Kind +import Data.Singletons.TH +import Prelude.Singletons + +$(promoteOnly [d| + replaceAllGTypes :: (a -> Type -> a) -> [Type] -> [a] -> [a] + replaceAllGTypes f types as = zipWith f as types + |])
tests/compile-and-dump/Singletons/T322.golden view
@@ -1,53 +1,54 @@-Singletons/T322.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| infixr 2 !- - (!) :: Bool -> Bool -> Bool- (!) = (||) |]- ======>- (!) :: Bool -> Bool -> Bool- (!) = (||)- infixr 2 !- type (!@#@$) :: (~>) Bool ((~>) Bool Bool)- data (!@#@$) :: (~>) Bool ((~>) Bool Bool)- where- (:!@#@$###) :: SameKind (Apply (!@#@$) arg) ((!@#@$$) arg) =>- (!@#@$) a0123456789876543210- type instance Apply (!@#@$) a0123456789876543210 = (!@#@$$) a0123456789876543210- instance SuppressUnusedWarnings (!@#@$) where- suppressUnusedWarnings = snd (((,) (:!@#@$###)) ())- infixr 2 !@#@$- type (!@#@$$) :: Bool -> (~>) Bool Bool- data (!@#@$$) (a0123456789876543210 :: Bool) :: (~>) Bool Bool- where- (:!@#@$$###) :: SameKind (Apply ((!@#@$$) a0123456789876543210) arg) ((!@#@$$$) a0123456789876543210 arg) =>- (!@#@$$) a0123456789876543210 a0123456789876543210- type instance Apply ((!@#@$$) a0123456789876543210) a0123456789876543210 = (!) a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings ((!@#@$$) a0123456789876543210) where- suppressUnusedWarnings = snd (((,) (:!@#@$$###)) ())- infixr 2 !@#@$$- type (!@#@$$$) :: Bool -> Bool -> Bool- type family (!@#@$$$) (a0123456789876543210 :: Bool) (a0123456789876543210 :: Bool) :: Bool where- (!@#@$$$) a0123456789876543210 a0123456789876543210 = (!) a0123456789876543210 a0123456789876543210- infixr 2 !@#@$$$- type (!) :: Bool -> Bool -> Bool- type family (!) (a :: Bool) (a :: Bool) :: Bool where- (!) a_0123456789876543210 a_0123456789876543210 = Apply (Apply (||@#@$) a_0123456789876543210) a_0123456789876543210- infixr 2 %!- (%!) ::- forall (t :: Bool) (t :: Bool). Sing t- -> Sing t -> Sing (Apply (Apply (!@#@$) t) t :: Bool)- (%!)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing ((singFun2 @(||@#@$)) (%||))) sA_0123456789876543210))- sA_0123456789876543210- instance SingI ((!@#@$) :: (~>) Bool ((~>) Bool Bool)) where- sing = (singFun2 @(!@#@$)) (%!)- instance SingI d =>- SingI ((!@#@$$) (d :: Bool) :: (~>) Bool Bool) where- sing = (singFun1 @((!@#@$$) (d :: Bool))) ((%!) (sing @d))- instance SingI1 ((!@#@$$) :: Bool -> (~>) Bool Bool) where- liftSing (s :: Sing (d :: Bool))- = (singFun1 @((!@#@$$) (d :: Bool))) ((%!) s)+Singletons/T322.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| infixr 2 ! + + (!) :: Bool -> Bool -> Bool + (!) = (||) |] + ======> + (!) :: Bool -> Bool -> Bool + (!) = (||) + infixr 2 ! + type (!@#@$) :: (~>) Bool ((~>) Bool Bool) + data (!@#@$) :: (~>) Bool ((~>) Bool Bool) + where + (:!@#@$###) :: SameKind (Apply (!@#@$) arg) ((!@#@$$) arg) => + (!@#@$) a0123456789876543210 + type instance Apply (!@#@$) a0123456789876543210 = (!@#@$$) a0123456789876543210 + instance SuppressUnusedWarnings (!@#@$) where + suppressUnusedWarnings = snd ((,) (:!@#@$###) ()) + infixr 2 !@#@$ + type (!@#@$$) :: Bool -> (~>) Bool Bool + data (!@#@$$) (a0123456789876543210 :: Bool) :: (~>) Bool Bool + where + (:!@#@$$###) :: SameKind (Apply ((!@#@$$) a0123456789876543210) arg) ((!@#@$$$) a0123456789876543210 arg) => + (!@#@$$) a0123456789876543210 a0123456789876543210 + type instance Apply ((!@#@$$) a0123456789876543210) a0123456789876543210 = (!) a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings ((!@#@$$) a0123456789876543210) where + suppressUnusedWarnings = snd ((,) (:!@#@$$###) ()) + infixr 2 !@#@$$ + type (!@#@$$$) :: Bool -> Bool -> Bool + type family (!@#@$$$) (a0123456789876543210 :: Bool) (a0123456789876543210 :: Bool) :: Bool where + (!@#@$$$) a0123456789876543210 a0123456789876543210 = (!) a0123456789876543210 a0123456789876543210 + infixr 2 !@#@$$$ + type (!) :: Bool -> Bool -> Bool + type family (!) (a :: Bool) (a :: Bool) :: Bool where + (!) a_0123456789876543210 a_0123456789876543210 = Apply (Apply (||@#@$) a_0123456789876543210) a_0123456789876543210 + infixr 2 %! + (%!) :: + (forall (t :: Bool) (t :: Bool). + Sing t + -> Sing t -> Sing (Apply (Apply (!@#@$) t) t :: Bool) :: Type) + (%!) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing (singFun2 @(||@#@$) (%||)) sA_0123456789876543210) + sA_0123456789876543210 + instance SingI ((!@#@$) :: (~>) Bool ((~>) Bool Bool)) where + sing = singFun2 @(!@#@$) (%!) + instance SingI d => + SingI ((!@#@$$) (d :: Bool) :: (~>) Bool Bool) where + sing = singFun1 @((!@#@$$) (d :: Bool)) ((%!) (sing @d)) + instance SingI1 ((!@#@$$) :: Bool -> (~>) Bool Bool) where + liftSing (s :: Sing (d :: Bool)) + = singFun1 @((!@#@$$) (d :: Bool)) ((%!) s)
tests/compile-and-dump/Singletons/T322.hs view
@@ -1,13 +1,13 @@-module T322 where--import Data.Singletons.TH-import Prelude.Singletons--$(singletons [d|- (!) :: Bool -> Bool -> Bool- (!) = (||)- infixr 2 !- |])--f1 :: (False && True ! True) :~: True-f1 = Refl+module T322 where + +import Data.Singletons.TH +import Prelude.Singletons + +$(singletons [d| + (!) :: Bool -> Bool -> Bool + (!) = (||) + infixr 2 ! + |]) + +f1 :: (False && True ! True) :~: True +f1 = Refl
tests/compile-and-dump/Singletons/T323.hs view
@@ -1,7 +1,7 @@-module T323 where--import Data.Type.Equality-import Prelude.Singletons--test :: f .@#@$$$ (g .@#@$$$ h) :~: f .@#@$$$ g .@#@$$$ h-test = Refl+module T323 where + +import Data.Type.Equality +import Prelude.Singletons + +test :: f .@#@$$$ (g .@#@$$$ h) :~: f .@#@$$$ g .@#@$$$ h +test = Refl
tests/compile-and-dump/Singletons/T326.golden view
@@ -1,72 +1,73 @@-Singletons/T326.hs:0:0:: Splicing declarations- genPromotions [''C1]- ======>- type (<%>@#@$) :: forall a. (~>) a ((~>) a a)- data (<%>@#@$) :: (~>) a ((~>) a a)- where- (:<%>@#@$###) :: SameKind (Apply (<%>@#@$) arg) ((<%>@#@$$) arg) =>- (<%>@#@$) a0123456789876543210- type instance Apply (<%>@#@$) a0123456789876543210 = (<%>@#@$$) a0123456789876543210- instance SuppressUnusedWarnings (<%>@#@$) where- suppressUnusedWarnings = snd (((,) (:<%>@#@$###)) ())- infixl 9 <%>@#@$- type (<%>@#@$$) :: forall a. a -> (~>) a a- data (<%>@#@$$) (a0123456789876543210 :: a) :: (~>) a a- where- (:<%>@#@$$###) :: SameKind (Apply ((<%>@#@$$) a0123456789876543210) arg) ((<%>@#@$$$) a0123456789876543210 arg) =>- (<%>@#@$$) a0123456789876543210 a0123456789876543210- type instance Apply ((<%>@#@$$) a0123456789876543210) a0123456789876543210 = (<%>) a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings ((<%>@#@$$) a0123456789876543210) where- suppressUnusedWarnings = snd (((,) (:<%>@#@$$###)) ())- infixl 9 <%>@#@$$- type (<%>@#@$$$) :: forall a. a -> a -> a- type family (<%>@#@$$$) (a0123456789876543210 :: a) (a0123456789876543210 :: a) :: a where- (<%>@#@$$$) a0123456789876543210 a0123456789876543210 = (<%>) a0123456789876543210 a0123456789876543210- infixl 9 <%>@#@$$$- type PC1 :: Type -> Constraint- class PC1 (a :: Type) where- type family (<%>) (arg :: a) (arg :: a) :: a- infixl 9 <%>-Singletons/T326.hs:0:0:: Splicing declarations- genSingletons [''C2]- ======>- type (<%%>@#@$) :: forall a. (~>) a ((~>) a a)- data (<%%>@#@$) :: (~>) a ((~>) a a)- where- (:<%%>@#@$###) :: SameKind (Apply (<%%>@#@$) arg) ((<%%>@#@$$) arg) =>- (<%%>@#@$) a0123456789876543210- type instance Apply (<%%>@#@$) a0123456789876543210 = (<%%>@#@$$) a0123456789876543210- instance SuppressUnusedWarnings (<%%>@#@$) where- suppressUnusedWarnings = snd (((,) (:<%%>@#@$###)) ())- infixl 9 <%%>@#@$- type (<%%>@#@$$) :: forall a. a -> (~>) a a- data (<%%>@#@$$) (a0123456789876543210 :: a) :: (~>) a a- where- (:<%%>@#@$$###) :: SameKind (Apply ((<%%>@#@$$) a0123456789876543210) arg) ((<%%>@#@$$$) a0123456789876543210 arg) =>- (<%%>@#@$$) a0123456789876543210 a0123456789876543210- type instance Apply ((<%%>@#@$$) a0123456789876543210) a0123456789876543210 = (<%%>) a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings ((<%%>@#@$$) a0123456789876543210) where- suppressUnusedWarnings = snd (((,) (:<%%>@#@$$###)) ())- infixl 9 <%%>@#@$$- type (<%%>@#@$$$) :: forall a. a -> a -> a- type family (<%%>@#@$$$) (a0123456789876543210 :: a) (a0123456789876543210 :: a) :: a where- (<%%>@#@$$$) a0123456789876543210 a0123456789876543210 = (<%%>) a0123456789876543210 a0123456789876543210- infixl 9 <%%>@#@$$$- type PC2 :: Type -> Constraint- class PC2 (a :: Type) where- type family (<%%>) (arg :: a) (arg :: a) :: a- infixl 9 <%%>- class SC2 (a :: Type) where- (%<%%>) ::- forall (t :: a) (t :: a). Sing t- -> Sing t -> Sing (Apply (Apply (<%%>@#@$) t) t :: a)- type SC2 :: Type -> Constraint- infixl 9 %<%%>- instance SC2 a => SingI ((<%%>@#@$) :: (~>) a ((~>) a a)) where- sing = (singFun2 @(<%%>@#@$)) (%<%%>)- instance (SC2 a, SingI d) =>- SingI ((<%%>@#@$$) (d :: a) :: (~>) a a) where- sing = (singFun1 @((<%%>@#@$$) (d :: a))) ((%<%%>) (sing @d))- instance SC2 a => SingI1 ((<%%>@#@$$) :: a -> (~>) a a) where- liftSing (s :: Sing (d :: a))- = (singFun1 @((<%%>@#@$$) (d :: a))) ((%<%%>) s)+Singletons/T326.hs:0:0:: Splicing declarations + genPromotions [''C1] + ======> + type (<%>@#@$) :: forall a. (~>) a ((~>) a a) + data (<%>@#@$) :: (~>) a ((~>) a a) + where + (:<%>@#@$###) :: SameKind (Apply (<%>@#@$) arg) ((<%>@#@$$) arg) => + (<%>@#@$) a0123456789876543210 + type instance Apply (<%>@#@$) a0123456789876543210 = (<%>@#@$$) a0123456789876543210 + instance SuppressUnusedWarnings (<%>@#@$) where + suppressUnusedWarnings = snd ((,) (:<%>@#@$###) ()) + infixl 9 <%>@#@$ + type (<%>@#@$$) :: forall a. a -> (~>) a a + data (<%>@#@$$) (a0123456789876543210 :: a) :: (~>) a a + where + (:<%>@#@$$###) :: SameKind (Apply ((<%>@#@$$) a0123456789876543210) arg) ((<%>@#@$$$) a0123456789876543210 arg) => + (<%>@#@$$) a0123456789876543210 a0123456789876543210 + type instance Apply ((<%>@#@$$) a0123456789876543210) a0123456789876543210 = (<%>) a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings ((<%>@#@$$) a0123456789876543210) where + suppressUnusedWarnings = snd ((,) (:<%>@#@$$###) ()) + infixl 9 <%>@#@$$ + type (<%>@#@$$$) :: forall a. a -> a -> a + type family (<%>@#@$$$) (a0123456789876543210 :: a) (a0123456789876543210 :: a) :: a where + (<%>@#@$$$) a0123456789876543210 a0123456789876543210 = (<%>) a0123456789876543210 a0123456789876543210 + infixl 9 <%>@#@$$$ + type PC1 :: Type -> Constraint + class PC1 (a :: Type) where + type family (<%>) (arg :: a) (arg :: a) :: a + infixl 9 <%> +Singletons/T326.hs:0:0:: Splicing declarations + genSingletons [''C2] + ======> + type (<%%>@#@$) :: forall a. (~>) a ((~>) a a) + data (<%%>@#@$) :: (~>) a ((~>) a a) + where + (:<%%>@#@$###) :: SameKind (Apply (<%%>@#@$) arg) ((<%%>@#@$$) arg) => + (<%%>@#@$) a0123456789876543210 + type instance Apply (<%%>@#@$) a0123456789876543210 = (<%%>@#@$$) a0123456789876543210 + instance SuppressUnusedWarnings (<%%>@#@$) where + suppressUnusedWarnings = snd ((,) (:<%%>@#@$###) ()) + infixl 9 <%%>@#@$ + type (<%%>@#@$$) :: forall a. a -> (~>) a a + data (<%%>@#@$$) (a0123456789876543210 :: a) :: (~>) a a + where + (:<%%>@#@$$###) :: SameKind (Apply ((<%%>@#@$$) a0123456789876543210) arg) ((<%%>@#@$$$) a0123456789876543210 arg) => + (<%%>@#@$$) a0123456789876543210 a0123456789876543210 + type instance Apply ((<%%>@#@$$) a0123456789876543210) a0123456789876543210 = (<%%>) a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings ((<%%>@#@$$) a0123456789876543210) where + suppressUnusedWarnings = snd ((,) (:<%%>@#@$$###) ()) + infixl 9 <%%>@#@$$ + type (<%%>@#@$$$) :: forall a. a -> a -> a + type family (<%%>@#@$$$) (a0123456789876543210 :: a) (a0123456789876543210 :: a) :: a where + (<%%>@#@$$$) a0123456789876543210 a0123456789876543210 = (<%%>) a0123456789876543210 a0123456789876543210 + infixl 9 <%%>@#@$$$ + type PC2 :: Type -> Constraint + class PC2 (a :: Type) where + type family (<%%>) (arg :: a) (arg :: a) :: a + infixl 9 <%%> + class SC2 (a :: Type) where + (%<%%>) :: + (forall (t :: a) (t :: a). + Sing t + -> Sing t -> Sing (Apply (Apply (<%%>@#@$) t) t :: a) :: Type) + type SC2 :: Type -> Constraint + infixl 9 %<%%> + instance SC2 a => SingI ((<%%>@#@$) :: (~>) a ((~>) a a)) where + sing = singFun2 @(<%%>@#@$) (%<%%>) + instance (SC2 a, SingI d) => + SingI ((<%%>@#@$$) (d :: a) :: (~>) a a) where + sing = singFun1 @((<%%>@#@$$) (d :: a)) ((%<%%>) (sing @d)) + instance SC2 a => SingI1 ((<%%>@#@$$) :: a -> (~>) a a) where + liftSing (s :: Sing (d :: a)) + = singFun1 @((<%%>@#@$$) (d :: a)) ((%<%%>) s)
tests/compile-and-dump/Singletons/T326.hs view
@@ -1,23 +1,23 @@-module T326 where--import Data.Singletons.TH-import Data.Type.Equality--class C1 a where- infixl 9 <%>- (<%>) :: a -> a -> a--class C2 a where- infixl 9 <%%>- (<%%>) :: a -> a -> a--$(genPromotions [''C1])-$(genSingletons [''C2])--test1 :: Proxy f -> Proxy g -> Proxy h- -> (f <%> g) <%> h :~: f <%> g <%> h-test1 _ _ _ = Refl--test2 :: Proxy f -> Proxy g -> Proxy h- -> (f <%%> g) <%%> h :~: f <%%> g <%%> h-test2 _ _ _ = Refl+module T326 where + +import Data.Singletons.TH +import Data.Type.Equality + +class C1 a where + infixl 9 <%> + (<%>) :: a -> a -> a + +class C2 a where + infixl 9 <%%> + (<%%>) :: a -> a -> a + +$(genPromotions [''C1]) +$(genSingletons [''C2]) + +test1 :: Proxy f -> Proxy g -> Proxy h + -> (f <%> g) <%> h :~: f <%> g <%> h +test1 _ _ _ = Refl + +test2 :: Proxy f -> Proxy g -> Proxy h + -> (f <%%> g) <%%> h :~: f <%%> g <%%> h +test2 _ _ _ = Refl
tests/compile-and-dump/Singletons/T33.golden view
@@ -1,39 +1,40 @@-Singletons/T33.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| foo :: (Bool, Bool) -> ()- foo ~(_, _) = () |]- ======>- foo :: (Bool, Bool) -> ()- foo ~(_, _) = ()- type FooSym0 :: (~>) (Bool, Bool) ()- data FooSym0 :: (~>) (Bool, Bool) ()- where- FooSym0KindInference :: SameKind (Apply FooSym0 arg) (FooSym1 arg) =>- FooSym0 a0123456789876543210- type instance Apply FooSym0 a0123456789876543210 = Foo a0123456789876543210- instance SuppressUnusedWarnings FooSym0 where- suppressUnusedWarnings = snd (((,) FooSym0KindInference) ())- type FooSym1 :: (Bool, Bool) -> ()- type family FooSym1 (a0123456789876543210 :: (Bool,- Bool)) :: () where- FooSym1 a0123456789876543210 = Foo a0123456789876543210- type Foo :: (Bool, Bool) -> ()- type family Foo (a :: (Bool, Bool)) :: () where- Foo '(_, _) = Tuple0Sym0- sFoo ::- forall (t :: (Bool, Bool)). Sing t -> Sing (Apply FooSym0 t :: ())- sFoo (STuple2 _ _) = STuple0- instance SingI (FooSym0 :: (~>) (Bool, Bool) ()) where- sing = (singFun1 @FooSym0) sFoo--Singletons/T33.hs:0:0: warning:- Lazy pattern converted into regular pattern during singleton generation.- |-6 | $(singletons [d|- | ^^^^^^^^^^^^^^^...--Singletons/T33.hs:0:0: warning:- Lazy pattern converted into regular pattern in promotion- |-6 | $(singletons [d|- | ^^^^^^^^^^^^^^^...+Singletons/T33.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| foo :: (Bool, Bool) -> () + foo ~(_, _) = () |] + ======> + foo :: (Bool, Bool) -> () + foo ~(_, _) = () + type FooSym0 :: (~>) (Bool, Bool) () + data FooSym0 :: (~>) (Bool, Bool) () + where + FooSym0KindInference :: SameKind (Apply FooSym0 arg) (FooSym1 arg) => + FooSym0 a0123456789876543210 + type instance Apply FooSym0 a0123456789876543210 = Foo a0123456789876543210 + instance SuppressUnusedWarnings FooSym0 where + suppressUnusedWarnings = snd ((,) FooSym0KindInference ()) + type FooSym1 :: (Bool, Bool) -> () + type family FooSym1 (a0123456789876543210 :: (Bool, + Bool)) :: () where + FooSym1 a0123456789876543210 = Foo a0123456789876543210 + type Foo :: (Bool, Bool) -> () + type family Foo (a :: (Bool, Bool)) :: () where + Foo '(_, _) = Tuple0Sym0 + sFoo :: + (forall (t :: (Bool, Bool)). + Sing t -> Sing (Apply FooSym0 t :: ()) :: Type) + sFoo (STuple2 _ _) = STuple0 + instance SingI (FooSym0 :: (~>) (Bool, Bool) ()) where + sing = singFun1 @FooSym0 sFoo + +Singletons/T33.hs:0:0: warning: [GHC-39584] + Lazy pattern converted into regular pattern during singleton generation. + | +6 | $(singletons [d| + | ^^^^^^^^^^^^^^^... + +Singletons/T33.hs:0:0: warning: [GHC-39584] + Lazy pattern converted into regular pattern in promotion + | +6 | $(singletons [d| + | ^^^^^^^^^^^^^^^...
tests/compile-and-dump/Singletons/T33.hs view
@@ -1,9 +1,9 @@-module Singletons.T33 where--import Data.Singletons.TH-import Prelude.Singletons--$(singletons [d|- foo :: (Bool, Bool) -> ()- foo ~(_, _) = ()- |])+module Singletons.T33 where + +import Data.Singletons.TH +import Prelude.Singletons + +$(singletons [d| + foo :: (Bool, Bool) -> () + foo ~(_, _) = () + |])
tests/compile-and-dump/Singletons/T332.golden view
@@ -1,66 +1,67 @@-Singletons/T332.hs:(0,0)-(0,0): Splicing declarations- promote- [d| f :: Foo -> ()- f MkFoo {} = ()- - data Foo = MkFoo |]- ======>- data Foo = MkFoo- f :: Foo -> ()- f MkFoo {} = ()- type MkFooSym0 :: Foo- type family MkFooSym0 :: Foo where- MkFooSym0 = MkFoo- type FSym0 :: (~>) Foo ()- data FSym0 :: (~>) Foo ()- where- FSym0KindInference :: SameKind (Apply FSym0 arg) (FSym1 arg) =>- FSym0 a0123456789876543210- type instance Apply FSym0 a0123456789876543210 = F a0123456789876543210- instance SuppressUnusedWarnings FSym0 where- suppressUnusedWarnings = snd (((,) FSym0KindInference) ())- type FSym1 :: Foo -> ()- type family FSym1 (a0123456789876543210 :: Foo) :: () where- FSym1 a0123456789876543210 = F a0123456789876543210- type F :: Foo -> ()- type family F (a :: Foo) :: () where- F MkFoo = Tuple0Sym0-Singletons/T332.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| b :: Bar -> ()- b MkBar {} = ()- - data Bar = MkBar |]- ======>- data Bar = MkBar- b :: Bar -> ()- b MkBar {} = ()- type MkBarSym0 :: Bar- type family MkBarSym0 :: Bar where- MkBarSym0 = MkBar- type BSym0 :: (~>) Bar ()- data BSym0 :: (~>) Bar ()- where- BSym0KindInference :: SameKind (Apply BSym0 arg) (BSym1 arg) =>- BSym0 a0123456789876543210- type instance Apply BSym0 a0123456789876543210 = B a0123456789876543210- instance SuppressUnusedWarnings BSym0 where- suppressUnusedWarnings = snd (((,) BSym0KindInference) ())- type BSym1 :: Bar -> ()- type family BSym1 (a0123456789876543210 :: Bar) :: () where- BSym1 a0123456789876543210 = B a0123456789876543210- type B :: Bar -> ()- type family B (a :: Bar) :: () where- B MkBar = Tuple0Sym0- sB :: forall (t :: Bar). Sing t -> Sing (Apply BSym0 t :: ())- sB SMkBar = STuple0- instance SingI (BSym0 :: (~>) Bar ()) where- sing = (singFun1 @BSym0) sB- data SBar :: Bar -> Type where SMkBar :: SBar (MkBar :: Bar)- type instance Sing @Bar = SBar- instance SingKind Bar where- type Demote Bar = Bar- fromSing SMkBar = MkBar- toSing MkBar = SomeSing SMkBar- instance SingI MkBar where- sing = SMkBar+Singletons/T332.hs:(0,0)-(0,0): Splicing declarations + promote + [d| f :: Foo -> () + f MkFoo {} = () + + data Foo = MkFoo |] + ======> + data Foo = MkFoo + f :: Foo -> () + f MkFoo {} = () + type MkFooSym0 :: Foo + type family MkFooSym0 :: Foo where + MkFooSym0 = MkFoo + type FSym0 :: (~>) Foo () + data FSym0 :: (~>) Foo () + where + FSym0KindInference :: SameKind (Apply FSym0 arg) (FSym1 arg) => + FSym0 a0123456789876543210 + type instance Apply FSym0 a0123456789876543210 = F a0123456789876543210 + instance SuppressUnusedWarnings FSym0 where + suppressUnusedWarnings = snd ((,) FSym0KindInference ()) + type FSym1 :: Foo -> () + type family FSym1 (a0123456789876543210 :: Foo) :: () where + FSym1 a0123456789876543210 = F a0123456789876543210 + type F :: Foo -> () + type family F (a :: Foo) :: () where + F MkFoo = Tuple0Sym0 +Singletons/T332.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| b :: Bar -> () + b MkBar {} = () + + data Bar = MkBar |] + ======> + data Bar = MkBar + b :: Bar -> () + b MkBar {} = () + type MkBarSym0 :: Bar + type family MkBarSym0 :: Bar where + MkBarSym0 = MkBar + type BSym0 :: (~>) Bar () + data BSym0 :: (~>) Bar () + where + BSym0KindInference :: SameKind (Apply BSym0 arg) (BSym1 arg) => + BSym0 a0123456789876543210 + type instance Apply BSym0 a0123456789876543210 = B a0123456789876543210 + instance SuppressUnusedWarnings BSym0 where + suppressUnusedWarnings = snd ((,) BSym0KindInference ()) + type BSym1 :: Bar -> () + type family BSym1 (a0123456789876543210 :: Bar) :: () where + BSym1 a0123456789876543210 = B a0123456789876543210 + type B :: Bar -> () + type family B (a :: Bar) :: () where + B MkBar = Tuple0Sym0 + sB :: + (forall (t :: Bar). Sing t -> Sing (Apply BSym0 t :: ()) :: Type) + sB SMkBar = STuple0 + instance SingI (BSym0 :: (~>) Bar ()) where + sing = singFun1 @BSym0 sB + data SBar :: Bar -> Type where SMkBar :: SBar (MkBar :: Bar) + type instance Sing @Bar = SBar + instance SingKind Bar where + type Demote Bar = Bar + fromSing SMkBar = MkBar + toSing MkBar = SomeSing SMkBar + instance SingI MkBar where + sing = SMkBar
tests/compile-and-dump/Singletons/T332.hs view
@@ -1,17 +1,17 @@-module T332 where--import Data.Singletons.Base.TH--$(promote [d|- data Foo = MkFoo-- f :: Foo -> ()- f MkFoo{} = ()- |])--$(singletons [d|- data Bar = MkBar-- b :: Bar -> ()- b MkBar{} = ()- |])+module T332 where + +import Data.Singletons.Base.TH + +$(promote [d| + data Foo = MkFoo + + f :: Foo -> () + f MkFoo{} = () + |]) + +$(singletons [d| + data Bar = MkBar + + b :: Bar -> () + b MkBar{} = () + |])
tests/compile-and-dump/Singletons/T342.golden view
@@ -1,18 +1,18 @@-Singletons/T342.hs:(0,0)-(0,0): Splicing declarations- do synName <- newName "MyId"- a <- newName "a"- let dsyn = DTySynD synName [DPlainTV a ()] (DVarT a)- syn = decToTH dsyn- defuns <- withLocalDeclarations [syn] $ genDefunSymbols [synName]- pure $ syn : defuns- ======>- type MyId a = a- data MyIdSym0 a0123456789876543210- where- MyIdSym0KindInference :: SameKind (Apply MyIdSym0 arg) (MyIdSym1 arg) =>- MyIdSym0 a0123456789876543210- type instance Apply MyIdSym0 a0123456789876543210 = MyId a0123456789876543210- instance SuppressUnusedWarnings MyIdSym0 where- suppressUnusedWarnings = snd (((,) MyIdSym0KindInference) ())- type family MyIdSym1 a0123456789876543210 where- MyIdSym1 a0123456789876543210 = MyId a0123456789876543210+Singletons/T342.hs:(0,0)-(0,0): Splicing declarations + do synName <- newName "MyId" + a <- newName "a" + let dsyn = DTySynD synName [DPlainTV a ()] (DVarT a) + syn = decToTH dsyn + defuns <- withLocalDeclarations [syn] $ genDefunSymbols [synName] + pure $ syn : defuns + ======> + type MyId a = a + data MyIdSym0 a0123456789876543210 + where + MyIdSym0KindInference :: SameKind (Apply MyIdSym0 arg) (MyIdSym1 arg) => + MyIdSym0 a0123456789876543210 + type instance Apply MyIdSym0 a0123456789876543210 = MyId a0123456789876543210 + instance SuppressUnusedWarnings MyIdSym0 where + suppressUnusedWarnings = snd ((,) MyIdSym0KindInference ()) + type family MyIdSym1 a0123456789876543210 where + MyIdSym1 a0123456789876543210 = MyId a0123456789876543210
tests/compile-and-dump/Singletons/T342.hs view
@@ -1,13 +1,13 @@-module T342 where--import Data.Singletons.TH-import Language.Haskell.TH-import Language.Haskell.TH.Desugar--$(do synName <- newName "MyId"- a <- newName "a"- let dsyn = DTySynD synName [DPlainTV a ()] (DVarT a)- syn = decToTH dsyn- defuns <- withLocalDeclarations [syn] $- genDefunSymbols [synName]- pure $ syn:defuns)+module T342 where + +import Data.Singletons.TH +import Language.Haskell.TH +import Language.Haskell.TH.Desugar + +$(do synName <- newName "MyId" + a <- newName "a" + let dsyn = DTySynD synName [DPlainTV a ()] (DVarT a) + syn = decToTH dsyn + defuns <- withLocalDeclarations [syn] $ + genDefunSymbols [synName] + pure $ syn:defuns)
tests/compile-and-dump/Singletons/T353.golden view
@@ -1,99 +1,99 @@-Singletons/T353.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| type family Symmetry (a :: Proxy t) (y :: Proxy t) (e :: (a :: Proxy (t :: k))- :~:- (y :: Proxy (t :: k))) :: Type where- Symmetry a y _ = y :~: a |]- ======>- type family Symmetry (a :: Proxy t) (y :: Proxy t) (e :: (:~:) (a :: Proxy (t :: k)) (y :: Proxy (t :: k))) :: Type where- Symmetry a y _ = (:~:) y a- data SymmetrySym0 :: (~>) (Proxy t0123456789876543210) ((~>) (Proxy t0123456789876543210) ((~>) ((:~:) (a0123456789876543210 :: Proxy (t0123456789876543210 :: k0123456789876543210)) (y0123456789876543210 :: Proxy (t0123456789876543210 :: k0123456789876543210))) Type))- where- SymmetrySym0KindInference :: SameKind (Apply SymmetrySym0 arg) (SymmetrySym1 arg) =>- SymmetrySym0 a0123456789876543210- type instance Apply SymmetrySym0 a0123456789876543210 = SymmetrySym1 a0123456789876543210- instance SuppressUnusedWarnings SymmetrySym0 where- suppressUnusedWarnings = snd (((,) SymmetrySym0KindInference) ())- data SymmetrySym1 (a0123456789876543210 :: Proxy t0123456789876543210) :: (~>) (Proxy t0123456789876543210) ((~>) ((:~:) (a0123456789876543210 :: Proxy (t0123456789876543210 :: k0123456789876543210)) (y0123456789876543210 :: Proxy (t0123456789876543210 :: k0123456789876543210))) Type)- where- SymmetrySym1KindInference :: SameKind (Apply (SymmetrySym1 a0123456789876543210) arg) (SymmetrySym2 a0123456789876543210 arg) =>- SymmetrySym1 a0123456789876543210 y0123456789876543210- type instance Apply (SymmetrySym1 a0123456789876543210) y0123456789876543210 = SymmetrySym2 a0123456789876543210 y0123456789876543210- instance SuppressUnusedWarnings (SymmetrySym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) SymmetrySym1KindInference) ())- data SymmetrySym2 (a0123456789876543210 :: Proxy t0123456789876543210) (y0123456789876543210 :: Proxy t0123456789876543210) :: (~>) ((:~:) (a0123456789876543210 :: Proxy (t0123456789876543210 :: k0123456789876543210)) (y0123456789876543210 :: Proxy (t0123456789876543210 :: k0123456789876543210))) Type- where- SymmetrySym2KindInference :: SameKind (Apply (SymmetrySym2 a0123456789876543210 y0123456789876543210) arg) (SymmetrySym3 a0123456789876543210 y0123456789876543210 arg) =>- SymmetrySym2 a0123456789876543210 y0123456789876543210 e0123456789876543210- type instance Apply (SymmetrySym2 a0123456789876543210 y0123456789876543210) e0123456789876543210 = Symmetry a0123456789876543210 y0123456789876543210 e0123456789876543210- instance SuppressUnusedWarnings (SymmetrySym2 a0123456789876543210 y0123456789876543210) where- suppressUnusedWarnings = snd (((,) SymmetrySym2KindInference) ())- type family SymmetrySym3 (a0123456789876543210 :: Proxy t0123456789876543210) (y0123456789876543210 :: Proxy t0123456789876543210) (e0123456789876543210 :: (:~:) (a0123456789876543210 :: Proxy (t0123456789876543210 :: k0123456789876543210)) (y0123456789876543210 :: Proxy (t0123456789876543210 :: k0123456789876543210))) :: Type where- SymmetrySym3 a0123456789876543210 y0123456789876543210 e0123456789876543210 = Symmetry a0123456789876543210 y0123456789876543210 e0123456789876543210-Singletons/T353.hs:0:0:: Splicing declarations- genDefunSymbols [''Prod]- ======>- type MkProdSym0 :: forall k- (f :: k -> Type)- (g :: k -> Type)- (p :: k). (~>) (f p) ((~>) (g p) (Prod (f :: k -> Type) (g :: k- -> Type) (p :: k)))- data MkProdSym0 :: (~>) (f p) ((~>) (g p) (Prod (f :: k- -> Type) (g :: k -> Type) (p :: k)))- where- MkProdSym0KindInference :: SameKind (Apply MkProdSym0 arg) (MkProdSym1 arg) =>- MkProdSym0 a0123456789876543210- type instance Apply MkProdSym0 a0123456789876543210 = MkProdSym1 a0123456789876543210- instance SuppressUnusedWarnings MkProdSym0 where- suppressUnusedWarnings = snd (((,) MkProdSym0KindInference) ())- type MkProdSym1 :: forall k- (f :: k -> Type)- (g :: k -> Type)- (p :: k). f p- -> (~>) (g p) (Prod (f :: k -> Type) (g :: k- -> Type) (p :: k))- data MkProdSym1 (a0123456789876543210 :: f p) :: (~>) (g p) (Prod (f :: k- -> Type) (g :: k- -> Type) (p :: k))- where- MkProdSym1KindInference :: SameKind (Apply (MkProdSym1 a0123456789876543210) arg) (MkProdSym2 a0123456789876543210 arg) =>- MkProdSym1 a0123456789876543210 a0123456789876543210- type instance Apply (MkProdSym1 a0123456789876543210) a0123456789876543210 = 'MkProd a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (MkProdSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) MkProdSym1KindInference) ())- type MkProdSym2 :: forall k- (f :: k -> Type)- (g :: k -> Type)- (p :: k). f p- -> g p -> Prod (f :: k -> Type) (g :: k -> Type) (p :: k)- type family MkProdSym2 (a0123456789876543210 :: f p) (a0123456789876543210 :: g p) :: Prod (f :: k- -> Type) (g :: k- -> Type) (p :: k) where- MkProdSym2 a0123456789876543210 a0123456789876543210 = 'MkProd a0123456789876543210 a0123456789876543210-Singletons/T353.hs:0:0:: Splicing declarations- genDefunSymbols [''Foo]- ======>- type MkFooSym0 :: forall k- k- (a :: k)- (b :: k). (~>) (Proxy a) ((~>) (Proxy b) (Foo (a :: k) (b :: k)))- data MkFooSym0 :: (~>) (Proxy a) ((~>) (Proxy b) (Foo (a :: k) (b :: k)))- where- MkFooSym0KindInference :: SameKind (Apply MkFooSym0 arg) (MkFooSym1 arg) =>- MkFooSym0 a0123456789876543210- type instance Apply MkFooSym0 a0123456789876543210 = MkFooSym1 a0123456789876543210- instance SuppressUnusedWarnings MkFooSym0 where- suppressUnusedWarnings = snd (((,) MkFooSym0KindInference) ())- type MkFooSym1 :: forall k k (a :: k) (b :: k). Proxy a- -> (~>) (Proxy b) (Foo (a :: k) (b :: k))- data MkFooSym1 (a0123456789876543210 :: Proxy a) :: (~>) (Proxy b) (Foo (a :: k) (b :: k))- where- MkFooSym1KindInference :: SameKind (Apply (MkFooSym1 a0123456789876543210) arg) (MkFooSym2 a0123456789876543210 arg) =>- MkFooSym1 a0123456789876543210 a0123456789876543210- type instance Apply (MkFooSym1 a0123456789876543210) a0123456789876543210 = 'MkFoo a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (MkFooSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) MkFooSym1KindInference) ())- type MkFooSym2 :: forall k k (a :: k) (b :: k). Proxy a- -> Proxy b -> Foo (a :: k) (b :: k)- type family MkFooSym2 (a0123456789876543210 :: Proxy a) (a0123456789876543210 :: Proxy b) :: Foo (a :: k) (b :: k) where- MkFooSym2 a0123456789876543210 a0123456789876543210 = 'MkFoo a0123456789876543210 a0123456789876543210+Singletons/T353.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| type family Symmetry (a :: Proxy t) (y :: Proxy t) (e :: (a :: Proxy (t :: k)) + :~: + (y :: Proxy (t :: k))) :: Type where + Symmetry a y _ = y :~: a |] + ======> + type family Symmetry (a :: Proxy t) (y :: Proxy t) (e :: (:~:) (a :: Proxy (t :: k)) (y :: Proxy (t :: k))) :: Type where + Symmetry a y _ = (:~:) y a + data SymmetrySym0 :: (~>) (Proxy t0123456789876543210) ((~>) (Proxy t0123456789876543210) ((~>) ((:~:) (a0123456789876543210 :: Proxy (t0123456789876543210 :: k0123456789876543210)) (y0123456789876543210 :: Proxy (t0123456789876543210 :: k0123456789876543210))) Type)) + where + SymmetrySym0KindInference :: SameKind (Apply SymmetrySym0 arg) (SymmetrySym1 arg) => + SymmetrySym0 a0123456789876543210 + type instance Apply SymmetrySym0 a0123456789876543210 = SymmetrySym1 a0123456789876543210 + instance SuppressUnusedWarnings SymmetrySym0 where + suppressUnusedWarnings = snd ((,) SymmetrySym0KindInference ()) + data SymmetrySym1 (a0123456789876543210 :: Proxy t0123456789876543210) :: (~>) (Proxy t0123456789876543210) ((~>) ((:~:) (a0123456789876543210 :: Proxy (t0123456789876543210 :: k0123456789876543210)) (y0123456789876543210 :: Proxy (t0123456789876543210 :: k0123456789876543210))) Type) + where + SymmetrySym1KindInference :: SameKind (Apply (SymmetrySym1 a0123456789876543210) arg) (SymmetrySym2 a0123456789876543210 arg) => + SymmetrySym1 a0123456789876543210 y0123456789876543210 + type instance Apply (SymmetrySym1 a0123456789876543210) y0123456789876543210 = SymmetrySym2 a0123456789876543210 y0123456789876543210 + instance SuppressUnusedWarnings (SymmetrySym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) SymmetrySym1KindInference ()) + data SymmetrySym2 (a0123456789876543210 :: Proxy t0123456789876543210) (y0123456789876543210 :: Proxy t0123456789876543210) :: (~>) ((:~:) (a0123456789876543210 :: Proxy (t0123456789876543210 :: k0123456789876543210)) (y0123456789876543210 :: Proxy (t0123456789876543210 :: k0123456789876543210))) Type + where + SymmetrySym2KindInference :: SameKind (Apply (SymmetrySym2 a0123456789876543210 y0123456789876543210) arg) (SymmetrySym3 a0123456789876543210 y0123456789876543210 arg) => + SymmetrySym2 a0123456789876543210 y0123456789876543210 e0123456789876543210 + type instance Apply (SymmetrySym2 a0123456789876543210 y0123456789876543210) e0123456789876543210 = Symmetry a0123456789876543210 y0123456789876543210 e0123456789876543210 + instance SuppressUnusedWarnings (SymmetrySym2 a0123456789876543210 y0123456789876543210) where + suppressUnusedWarnings = snd ((,) SymmetrySym2KindInference ()) + type family SymmetrySym3 (a0123456789876543210 :: Proxy t0123456789876543210) (y0123456789876543210 :: Proxy t0123456789876543210) (e0123456789876543210 :: (:~:) (a0123456789876543210 :: Proxy (t0123456789876543210 :: k0123456789876543210)) (y0123456789876543210 :: Proxy (t0123456789876543210 :: k0123456789876543210))) :: Type where + SymmetrySym3 a0123456789876543210 y0123456789876543210 e0123456789876543210 = Symmetry a0123456789876543210 y0123456789876543210 e0123456789876543210 +Singletons/T353.hs:0:0:: Splicing declarations + genDefunSymbols [''Prod] + ======> + type MkProdSym0 :: forall k + (f :: k -> Type) + (g :: k -> Type) + (p :: k). (~>) (f p) ((~>) (g p) (Prod (f :: k -> Type) (g :: k + -> Type) (p :: k))) + data MkProdSym0 :: (~>) (f p) ((~>) (g p) (Prod (f :: k + -> Type) (g :: k -> Type) (p :: k))) + where + MkProdSym0KindInference :: SameKind (Apply MkProdSym0 arg) (MkProdSym1 arg) => + MkProdSym0 a0123456789876543210 + type instance Apply MkProdSym0 a0123456789876543210 = MkProdSym1 a0123456789876543210 + instance SuppressUnusedWarnings MkProdSym0 where + suppressUnusedWarnings = snd ((,) MkProdSym0KindInference ()) + type MkProdSym1 :: forall k + (f :: k -> Type) + (g :: k -> Type) + (p :: k). f p + -> (~>) (g p) (Prod (f :: k -> Type) (g :: k + -> Type) (p :: k)) + data MkProdSym1 (a0123456789876543210 :: f p) :: (~>) (g p) (Prod (f :: k + -> Type) (g :: k + -> Type) (p :: k)) + where + MkProdSym1KindInference :: SameKind (Apply (MkProdSym1 a0123456789876543210) arg) (MkProdSym2 a0123456789876543210 arg) => + MkProdSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (MkProdSym1 a0123456789876543210) a0123456789876543210 = 'MkProd a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (MkProdSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) MkProdSym1KindInference ()) + type MkProdSym2 :: forall k + (f :: k -> Type) + (g :: k -> Type) + (p :: k). f p + -> g p -> Prod (f :: k -> Type) (g :: k -> Type) (p :: k) + type family MkProdSym2 (a0123456789876543210 :: f p) (a0123456789876543210 :: g p) :: Prod (f :: k + -> Type) (g :: k + -> Type) (p :: k) where + MkProdSym2 a0123456789876543210 a0123456789876543210 = 'MkProd a0123456789876543210 a0123456789876543210 +Singletons/T353.hs:0:0:: Splicing declarations + genDefunSymbols [''Foo] + ======> + type MkFooSym0 :: forall k + k + (a :: k) + (b :: k). (~>) (Proxy a) ((~>) (Proxy b) (Foo (a :: k) (b :: k))) + data MkFooSym0 :: (~>) (Proxy a) ((~>) (Proxy b) (Foo (a :: k) (b :: k))) + where + MkFooSym0KindInference :: SameKind (Apply MkFooSym0 arg) (MkFooSym1 arg) => + MkFooSym0 a0123456789876543210 + type instance Apply MkFooSym0 a0123456789876543210 = MkFooSym1 a0123456789876543210 + instance SuppressUnusedWarnings MkFooSym0 where + suppressUnusedWarnings = snd ((,) MkFooSym0KindInference ()) + type MkFooSym1 :: forall k k (a :: k) (b :: k). Proxy a + -> (~>) (Proxy b) (Foo (a :: k) (b :: k)) + data MkFooSym1 (a0123456789876543210 :: Proxy a) :: (~>) (Proxy b) (Foo (a :: k) (b :: k)) + where + MkFooSym1KindInference :: SameKind (Apply (MkFooSym1 a0123456789876543210) arg) (MkFooSym2 a0123456789876543210 arg) => + MkFooSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (MkFooSym1 a0123456789876543210) a0123456789876543210 = 'MkFoo a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (MkFooSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) MkFooSym1KindInference ()) + type MkFooSym2 :: forall k k (a :: k) (b :: k). Proxy a + -> Proxy b -> Foo (a :: k) (b :: k) + type family MkFooSym2 (a0123456789876543210 :: Proxy a) (a0123456789876543210 :: Proxy b) :: Foo (a :: k) (b :: k) where + MkFooSym2 a0123456789876543210 a0123456789876543210 = 'MkFoo a0123456789876543210 a0123456789876543210
tests/compile-and-dump/Singletons/T353.hs view
@@ -1,17 +1,17 @@-module T353 where--import Data.Kind-import Data.Proxy-import Data.Singletons.TH--$(singletons [d|- type family Symmetry (a :: Proxy t) (y :: Proxy t)- (e :: (a :: Proxy (t :: k)) :~: (y :: Proxy (t :: k))) :: Type where- Symmetry a y _ = y :~: a- |])--data Prod f g p = MkProd (f p) (g p)-$(genDefunSymbols [''Prod])--data Foo a b = MkFoo (Proxy a) (Proxy b)-$(genDefunSymbols [''Foo])+module T353 where + +import Data.Kind +import Data.Proxy +import Data.Singletons.TH + +$(singletons [d| + type family Symmetry (a :: Proxy t) (y :: Proxy t) + (e :: (a :: Proxy (t :: k)) :~: (y :: Proxy (t :: k))) :: Type where + Symmetry a y _ = y :~: a + |]) + +data Prod f g p = MkProd (f p) (g p) +$(genDefunSymbols [''Prod]) + +data Foo a b = MkFoo (Proxy a) (Proxy b) +$(genDefunSymbols [''Foo])
tests/compile-and-dump/Singletons/T358.golden view
@@ -1,119 +1,119 @@-Singletons/T358.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| class C1 (f :: k -> Type) where- method1 :: f a- class C2 a where- method2a, method2b :: forall b. b -> a- - instance C1 [] where- method1 :: [a]- method1 = []- instance C2 [a] where- method2a _ = []- method2b :: forall b. b -> [a]- method2b _ = [] |]- ======>- class C1 (f :: k -> Type) where- method1 :: f a- instance C1 [] where- method1 :: [a]- method1 = []- class C2 a where- method2a :: forall b. b -> a- method2b :: forall b. b -> a- instance C2 [a] where- method2b :: forall b. b -> [a]- method2a _ = []- method2b _ = []- type Method1Sym0 :: forall f a. f a- type family Method1Sym0 :: f a where- Method1Sym0 = Method1- class PC1 (f :: k -> Type) where- type family Method1 :: f a- type Method2aSym0 :: forall b a. (~>) b a- data Method2aSym0 :: (~>) b a- where- Method2aSym0KindInference :: SameKind (Apply Method2aSym0 arg) (Method2aSym1 arg) =>- Method2aSym0 a0123456789876543210- type instance Apply Method2aSym0 a0123456789876543210 = Method2a a0123456789876543210- instance SuppressUnusedWarnings Method2aSym0 where- suppressUnusedWarnings = snd (((,) Method2aSym0KindInference) ())- type Method2aSym1 :: forall b a. b -> a- type family Method2aSym1 (a0123456789876543210 :: b) :: a where- Method2aSym1 a0123456789876543210 = Method2a a0123456789876543210- type Method2bSym0 :: forall b a. (~>) b a- data Method2bSym0 :: (~>) b a- where- Method2bSym0KindInference :: SameKind (Apply Method2bSym0 arg) (Method2bSym1 arg) =>- Method2bSym0 a0123456789876543210- type instance Apply Method2bSym0 a0123456789876543210 = Method2b a0123456789876543210- instance SuppressUnusedWarnings Method2bSym0 where- suppressUnusedWarnings = snd (((,) Method2bSym0KindInference) ())- type Method2bSym1 :: forall b a. b -> a- type family Method2bSym1 (a0123456789876543210 :: b) :: a where- Method2bSym1 a0123456789876543210 = Method2b a0123456789876543210- class PC2 a where- type family Method2a (arg :: b) :: a- type family Method2b (arg :: b) :: a- type Method1_0123456789876543210 :: [a]- type family Method1_0123456789876543210 :: [a] where- Method1_0123456789876543210 = NilSym0- type Method1_0123456789876543210Sym0 :: [a]- type family Method1_0123456789876543210Sym0 :: [a] where- Method1_0123456789876543210Sym0 = Method1_0123456789876543210- instance PC1 [] where- type Method1 = Method1_0123456789876543210Sym0- type Method2a_0123456789876543210 :: b -> [a]- type family Method2a_0123456789876543210 (a :: b) :: [a] where- Method2a_0123456789876543210 _ = NilSym0- type Method2a_0123456789876543210Sym0 :: (~>) b [a]- data Method2a_0123456789876543210Sym0 :: (~>) b [a]- where- Method2a_0123456789876543210Sym0KindInference :: SameKind (Apply Method2a_0123456789876543210Sym0 arg) (Method2a_0123456789876543210Sym1 arg) =>- Method2a_0123456789876543210Sym0 a0123456789876543210- type instance Apply Method2a_0123456789876543210Sym0 a0123456789876543210 = Method2a_0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings Method2a_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Method2a_0123456789876543210Sym0KindInference) ())- type Method2a_0123456789876543210Sym1 :: b -> [a]- type family Method2a_0123456789876543210Sym1 (a0123456789876543210 :: b) :: [a] where- Method2a_0123456789876543210Sym1 a0123456789876543210 = Method2a_0123456789876543210 a0123456789876543210- type Method2b_0123456789876543210 :: b -> [a]- type family Method2b_0123456789876543210 (a :: b) :: [a] where- Method2b_0123456789876543210 _ = NilSym0- type Method2b_0123456789876543210Sym0 :: (~>) b [a]- data Method2b_0123456789876543210Sym0 :: (~>) b [a]- where- Method2b_0123456789876543210Sym0KindInference :: SameKind (Apply Method2b_0123456789876543210Sym0 arg) (Method2b_0123456789876543210Sym1 arg) =>- Method2b_0123456789876543210Sym0 a0123456789876543210- type instance Apply Method2b_0123456789876543210Sym0 a0123456789876543210 = Method2b_0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings Method2b_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Method2b_0123456789876543210Sym0KindInference) ())- type Method2b_0123456789876543210Sym1 :: b -> [a]- type family Method2b_0123456789876543210Sym1 (a0123456789876543210 :: b) :: [a] where- Method2b_0123456789876543210Sym1 a0123456789876543210 = Method2b_0123456789876543210 a0123456789876543210- instance PC2 [a] where- type Method2a a = Apply Method2a_0123456789876543210Sym0 a- type Method2b a = Apply Method2b_0123456789876543210Sym0 a- class SC1 (f :: k -> Type) where- sMethod1 :: forall a. Sing (Method1Sym0 :: f a)- class SC2 a where- sMethod2a ::- forall b (t :: b). Sing t -> Sing (Apply Method2aSym0 t :: a)- sMethod2b ::- forall b (t :: b). Sing t -> Sing (Apply Method2bSym0 t :: a)- instance SC1 [] where- sMethod1 :: forall a. Sing (Method1Sym0 :: [a])- sMethod1 = SNil- instance SC2 [a] where- sMethod2a ::- forall b (t :: b). Sing t -> Sing (Apply Method2aSym0 t :: [a])- sMethod2b ::- forall b (t :: b). Sing t -> Sing (Apply Method2bSym0 t :: [a])- sMethod2a _ = SNil- sMethod2b _ = SNil- instance SC2 a => SingI (Method2aSym0 :: (~>) b a) where- sing = (singFun1 @Method2aSym0) sMethod2a- instance SC2 a => SingI (Method2bSym0 :: (~>) b a) where- sing = (singFun1 @Method2bSym0) sMethod2b+Singletons/T358.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| class C1 (f :: k -> Type) where + method1 :: f a + class C2 a where + method2a, method2b :: forall b. b -> a + + instance C1 [] where + method1 :: [a] + method1 = [] + instance C2 [a] where + method2a _ = [] + method2b :: forall b. b -> [a] + method2b _ = [] |] + ======> + class C1 (f :: k -> Type) where + method1 :: f a + instance C1 [] where + method1 :: [a] + method1 = [] + class C2 a where + method2a :: forall b. b -> a + method2b :: forall b. b -> a + instance C2 [a] where + method2b :: forall b. b -> [a] + method2a _ = [] + method2b _ = [] + type Method1Sym0 :: forall f a. f a + type family Method1Sym0 :: f a where + Method1Sym0 = Method1 + class PC1 (f :: k -> Type) where + type family Method1 :: f a + type Method2aSym0 :: forall b a. (~>) b a + data Method2aSym0 :: (~>) b a + where + Method2aSym0KindInference :: SameKind (Apply Method2aSym0 arg) (Method2aSym1 arg) => + Method2aSym0 a0123456789876543210 + type instance Apply Method2aSym0 a0123456789876543210 = Method2a a0123456789876543210 + instance SuppressUnusedWarnings Method2aSym0 where + suppressUnusedWarnings = snd ((,) Method2aSym0KindInference ()) + type Method2aSym1 :: forall b a. b -> a + type family Method2aSym1 (a0123456789876543210 :: b) :: a where + Method2aSym1 a0123456789876543210 = Method2a a0123456789876543210 + type Method2bSym0 :: forall b a. (~>) b a + data Method2bSym0 :: (~>) b a + where + Method2bSym0KindInference :: SameKind (Apply Method2bSym0 arg) (Method2bSym1 arg) => + Method2bSym0 a0123456789876543210 + type instance Apply Method2bSym0 a0123456789876543210 = Method2b a0123456789876543210 + instance SuppressUnusedWarnings Method2bSym0 where + suppressUnusedWarnings = snd ((,) Method2bSym0KindInference ()) + type Method2bSym1 :: forall b a. b -> a + type family Method2bSym1 (a0123456789876543210 :: b) :: a where + Method2bSym1 a0123456789876543210 = Method2b a0123456789876543210 + class PC2 a where + type family Method2a (arg :: b) :: a + type family Method2b (arg :: b) :: a + type Method1_0123456789876543210 :: [a] + type family Method1_0123456789876543210 :: [a] where + Method1_0123456789876543210 = NilSym0 + type Method1_0123456789876543210Sym0 :: [a] + type family Method1_0123456789876543210Sym0 :: [a] where + Method1_0123456789876543210Sym0 = Method1_0123456789876543210 + instance PC1 [] where + type Method1 = Method1_0123456789876543210Sym0 + type Method2a_0123456789876543210 :: b -> [a] + type family Method2a_0123456789876543210 (a :: b) :: [a] where + Method2a_0123456789876543210 _ = NilSym0 + type Method2a_0123456789876543210Sym0 :: (~>) b [a] + data Method2a_0123456789876543210Sym0 :: (~>) b [a] + where + Method2a_0123456789876543210Sym0KindInference :: SameKind (Apply Method2a_0123456789876543210Sym0 arg) (Method2a_0123456789876543210Sym1 arg) => + Method2a_0123456789876543210Sym0 a0123456789876543210 + type instance Apply Method2a_0123456789876543210Sym0 a0123456789876543210 = Method2a_0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings Method2a_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Method2a_0123456789876543210Sym0KindInference ()) + type Method2a_0123456789876543210Sym1 :: b -> [a] + type family Method2a_0123456789876543210Sym1 (a0123456789876543210 :: b) :: [a] where + Method2a_0123456789876543210Sym1 a0123456789876543210 = Method2a_0123456789876543210 a0123456789876543210 + type Method2b_0123456789876543210 :: b -> [a] + type family Method2b_0123456789876543210 (a :: b) :: [a] where + Method2b_0123456789876543210 _ = NilSym0 + type Method2b_0123456789876543210Sym0 :: (~>) b [a] + data Method2b_0123456789876543210Sym0 :: (~>) b [a] + where + Method2b_0123456789876543210Sym0KindInference :: SameKind (Apply Method2b_0123456789876543210Sym0 arg) (Method2b_0123456789876543210Sym1 arg) => + Method2b_0123456789876543210Sym0 a0123456789876543210 + type instance Apply Method2b_0123456789876543210Sym0 a0123456789876543210 = Method2b_0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings Method2b_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Method2b_0123456789876543210Sym0KindInference ()) + type Method2b_0123456789876543210Sym1 :: b -> [a] + type family Method2b_0123456789876543210Sym1 (a0123456789876543210 :: b) :: [a] where + Method2b_0123456789876543210Sym1 a0123456789876543210 = Method2b_0123456789876543210 a0123456789876543210 + instance PC2 [a] where + type Method2a a = Apply Method2a_0123456789876543210Sym0 a + type Method2b a = Apply Method2b_0123456789876543210Sym0 a + class SC1 (f :: k -> Type) where + sMethod1 :: (Sing (Method1Sym0 :: f a) :: Type) + class SC2 a where + sMethod2a :: + forall b (t :: b). Sing t -> Sing (Apply Method2aSym0 t :: a) + sMethod2b :: + forall b (t :: b). Sing t -> Sing (Apply Method2bSym0 t :: a) + instance SC1 [] where + sMethod1 :: (Sing (Method1Sym0 :: [a]) :: Type) + sMethod1 = SNil + instance SC2 [a] where + sMethod2a :: + forall b (t :: b). Sing t -> Sing (Apply Method2aSym0 t :: [a]) + sMethod2b :: + forall b (t :: b). Sing t -> Sing (Apply Method2bSym0 t :: [a]) + sMethod2a _ = SNil + sMethod2b _ = SNil + instance SC2 a => SingI (Method2aSym0 :: (~>) b a) where + sing = singFun1 @Method2aSym0 sMethod2a + instance SC2 a => SingI (Method2bSym0 :: (~>) b a) where + sing = singFun1 @Method2bSym0 sMethod2b
tests/compile-and-dump/Singletons/T358.hs view
@@ -1,24 +1,24 @@-module T358 where--import Data.Kind-import Data.Singletons.Base.TH--$(singletons [d|- class C1 (f :: k -> Type) where- method1 :: f a-- instance C1 [] where- method1 :: [a]- method1 = []-- class C2 a where- method2a, method2b :: forall b. b -> a-- -- Test that variables bound by instance head aren't quantified by the- -- generated InstanceSigs- instance C2 [a] where- method2a _ = []-- method2b :: forall b. b -> [a]- method2b _ = []- |])+module T358 where + +import Data.Kind +import Data.Singletons.Base.TH + +$(singletons [d| + class C1 (f :: k -> Type) where + method1 :: f a + + instance C1 [] where + method1 :: [a] + method1 = [] + + class C2 a where + method2a, method2b :: forall b. b -> a + + -- Test that variables bound by instance head aren't quantified by the + -- generated InstanceSigs + instance C2 [a] where + method2a _ = [] + + method2b :: forall b. b -> [a] + method2b _ = [] + |])
tests/compile-and-dump/Singletons/T367.golden view
@@ -1,40 +1,41 @@-Singletons/T367.hs:(0,0)-(0,0): Splicing declarations- singletonsOnly- [d| const' :: a -> b -> a- const' x _ = x |]- ======>- type Const'Sym0 :: (~>) a ((~>) b a)- data Const'Sym0 :: (~>) a ((~>) b a)- where- Const'Sym0KindInference :: SameKind (Apply Const'Sym0 arg) (Const'Sym1 arg) =>- Const'Sym0 a0123456789876543210- type instance Apply Const'Sym0 a0123456789876543210 = Const'Sym1 a0123456789876543210- instance Data.Singletons.TH.SuppressUnusedWarnings.SuppressUnusedWarnings Const'Sym0 where- Data.Singletons.TH.SuppressUnusedWarnings.suppressUnusedWarnings- = snd (((,) Const'Sym0KindInference) ())- type Const'Sym1 :: a -> (~>) b a- data Const'Sym1 (a0123456789876543210 :: a) :: (~>) b a- where- Const'Sym1KindInference :: SameKind (Apply (Const'Sym1 a0123456789876543210) arg) (Const'Sym2 a0123456789876543210 arg) =>- Const'Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (Const'Sym1 a0123456789876543210) a0123456789876543210 = Const' a0123456789876543210 a0123456789876543210- instance Data.Singletons.TH.SuppressUnusedWarnings.SuppressUnusedWarnings (Const'Sym1 a0123456789876543210) where- Data.Singletons.TH.SuppressUnusedWarnings.suppressUnusedWarnings- = snd (((,) Const'Sym1KindInference) ())- type Const'Sym2 :: a -> b -> a- type family Const'Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: a where- Const'Sym2 a0123456789876543210 a0123456789876543210 = Const' a0123456789876543210 a0123456789876543210- type Const' :: a -> b -> a- type family Const' (a :: a) (a :: b) :: a where- Const' x _ = x- sConst' ::- forall a b (t :: a) (t :: b). Sing t- -> Sing t -> Sing (Apply (Apply Const'Sym0 t) t :: a)- sConst' (sX :: Sing x) _ = sX- instance SingI (Const'Sym0 :: (~>) a ((~>) b a)) where- sing = (singFun2 @Const'Sym0) sConst'- instance SingI d => SingI (Const'Sym1 (d :: a) :: (~>) b a) where- sing = (singFun1 @(Const'Sym1 (d :: a))) (sConst' (sing @d))- instance SingI1 (Const'Sym1 :: a -> (~>) b a) where- liftSing (s :: Sing (d :: a))- = (singFun1 @(Const'Sym1 (d :: a))) (sConst' s)+Singletons/T367.hs:(0,0)-(0,0): Splicing declarations + singletonsOnly + [d| const' :: a -> b -> a + const' x _ = x |] + ======> + type Const'Sym0 :: (~>) a ((~>) b a) + data Const'Sym0 :: (~>) a ((~>) b a) + where + Const'Sym0KindInference :: SameKind (Apply Const'Sym0 arg) (Const'Sym1 arg) => + Const'Sym0 a0123456789876543210 + type instance Apply Const'Sym0 a0123456789876543210 = Const'Sym1 a0123456789876543210 + instance Data.Singletons.TH.SuppressUnusedWarnings.SuppressUnusedWarnings Const'Sym0 where + Data.Singletons.TH.SuppressUnusedWarnings.suppressUnusedWarnings + = snd ((,) Const'Sym0KindInference ()) + type Const'Sym1 :: a -> (~>) b a + data Const'Sym1 (a0123456789876543210 :: a) :: (~>) b a + where + Const'Sym1KindInference :: SameKind (Apply (Const'Sym1 a0123456789876543210) arg) (Const'Sym2 a0123456789876543210 arg) => + Const'Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (Const'Sym1 a0123456789876543210) a0123456789876543210 = Const' a0123456789876543210 a0123456789876543210 + instance Data.Singletons.TH.SuppressUnusedWarnings.SuppressUnusedWarnings (Const'Sym1 a0123456789876543210) where + Data.Singletons.TH.SuppressUnusedWarnings.suppressUnusedWarnings + = snd ((,) Const'Sym1KindInference ()) + type Const'Sym2 :: a -> b -> a + type family Const'Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: a where + Const'Sym2 a0123456789876543210 a0123456789876543210 = Const' a0123456789876543210 a0123456789876543210 + type Const' :: a -> b -> a + type family Const' (a :: a) (a :: b) :: a where + Const' x _ = x + sConst' :: + (forall (t :: a) (t :: b). + Sing t + -> Sing t -> Sing (Apply (Apply Const'Sym0 t) t :: a) :: Type) + sConst' (sX :: Sing x) _ = sX + instance SingI (Const'Sym0 :: (~>) a ((~>) b a)) where + sing = singFun2 @Const'Sym0 sConst' + instance SingI d => SingI (Const'Sym1 (d :: a) :: (~>) b a) where + sing = singFun1 @(Const'Sym1 (d :: a)) (sConst' (sing @d)) + instance SingI1 (Const'Sym1 :: a -> (~>) b a) where + liftSing (s :: Sing (d :: a)) + = singFun1 @(Const'Sym1 (d :: a)) (sConst' s)
tests/compile-and-dump/Singletons/T367.hs view
@@ -1,12 +1,12 @@-module T367 where--import Data.Singletons.TH (singletonsOnly)-import Prelude.Singletons--$(singletonsOnly [d|- const' :: a -> b -> a- const' x _ = x- |])--test :: Sing True-test = sConst' @Bool @() STrue STuple0+module T367 where + +import Data.Singletons.TH (singletonsOnly) +import Prelude.Singletons + +$(singletonsOnly [d| + const' :: a -> b -> a + const' x _ = x + |]) + +test :: Sing True +test = sConst' @Bool @() STrue STuple0
tests/compile-and-dump/Singletons/T371.golden view
@@ -1,241 +1,247 @@-Singletons/T371.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| data Y (a :: Type)- = Y1 | Y2 (X a)- deriving Show- data X (a :: Type)- = X1 | X2 (Y a)- deriving Show |]- ======>- data X (a :: Type)- = X1 | X2 (Y a)- deriving Show- data Y (a :: Type)- = Y1 | Y2 (X a)- deriving Show- type X1Sym0 :: forall (a :: Type). X (a :: Type)- type family X1Sym0 :: X (a :: Type) where- X1Sym0 = X1- type X2Sym0 :: forall (a :: Type). (~>) (Y a) (X (a :: Type))- data X2Sym0 :: (~>) (Y a) (X (a :: Type))- where- X2Sym0KindInference :: SameKind (Apply X2Sym0 arg) (X2Sym1 arg) =>- X2Sym0 a0123456789876543210- type instance Apply X2Sym0 a0123456789876543210 = X2 a0123456789876543210- instance SuppressUnusedWarnings X2Sym0 where- suppressUnusedWarnings = snd (((,) X2Sym0KindInference) ())- type X2Sym1 :: forall (a :: Type). Y a -> X (a :: Type)- type family X2Sym1 (a0123456789876543210 :: Y a) :: X (a :: Type) where- X2Sym1 a0123456789876543210 = X2 a0123456789876543210- type Y1Sym0 :: forall (a :: Type). Y (a :: Type)- type family Y1Sym0 :: Y (a :: Type) where- Y1Sym0 = Y1- type Y2Sym0 :: forall (a :: Type). (~>) (X a) (Y (a :: Type))- data Y2Sym0 :: (~>) (X a) (Y (a :: Type))- where- Y2Sym0KindInference :: SameKind (Apply Y2Sym0 arg) (Y2Sym1 arg) =>- Y2Sym0 a0123456789876543210- type instance Apply Y2Sym0 a0123456789876543210 = Y2 a0123456789876543210- instance SuppressUnusedWarnings Y2Sym0 where- suppressUnusedWarnings = snd (((,) Y2Sym0KindInference) ())- type Y2Sym1 :: forall (a :: Type). X a -> Y (a :: Type)- type family Y2Sym1 (a0123456789876543210 :: X a) :: Y (a :: Type) where- Y2Sym1 a0123456789876543210 = Y2 a0123456789876543210- type ShowsPrec_0123456789876543210 :: GHC.Num.Natural.Natural- -> X a -> GHC.Types.Symbol -> GHC.Types.Symbol- type family ShowsPrec_0123456789876543210 (a :: GHC.Num.Natural.Natural) (a :: X a) (a :: GHC.Types.Symbol) :: GHC.Types.Symbol where- ShowsPrec_0123456789876543210 _ X1 a_0123456789876543210 = Apply (Apply ShowStringSym0 "X1") a_0123456789876543210- ShowsPrec_0123456789876543210 p_0123456789876543210 (X2 arg_0123456789876543210) a_0123456789876543210 = Apply (Apply (Apply ShowParenSym0 (Apply (Apply (>@#@$) p_0123456789876543210) (FromInteger 10))) (Apply (Apply (.@#@$) (Apply ShowStringSym0 "X2 ")) (Apply (Apply ShowsPrecSym0 (FromInteger 11)) arg_0123456789876543210))) a_0123456789876543210- type ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) (X a) ((~>) GHC.Types.Symbol GHC.Types.Symbol))- data ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) (X a) ((~>) GHC.Types.Symbol GHC.Types.Symbol))- where- ShowsPrec_0123456789876543210Sym0KindInference :: SameKind (Apply ShowsPrec_0123456789876543210Sym0 arg) (ShowsPrec_0123456789876543210Sym1 arg) =>- ShowsPrec_0123456789876543210Sym0 a0123456789876543210- type instance Apply ShowsPrec_0123456789876543210Sym0 a0123456789876543210 = ShowsPrec_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings ShowsPrec_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym0KindInference) ())- type ShowsPrec_0123456789876543210Sym1 :: GHC.Num.Natural.Natural- -> (~>) (X a) ((~>) GHC.Types.Symbol GHC.Types.Symbol)- data ShowsPrec_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Num.Natural.Natural) :: (~>) (X a) ((~>) GHC.Types.Symbol GHC.Types.Symbol)- where- ShowsPrec_0123456789876543210Sym1KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 arg) =>- ShowsPrec_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym1KindInference) ())- type ShowsPrec_0123456789876543210Sym2 :: GHC.Num.Natural.Natural- -> X a -> (~>) GHC.Types.Symbol GHC.Types.Symbol- data ShowsPrec_0123456789876543210Sym2 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: X a) :: (~>) GHC.Types.Symbol GHC.Types.Symbol- where- ShowsPrec_0123456789876543210Sym2KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 arg) =>- ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym2KindInference) ())- type ShowsPrec_0123456789876543210Sym3 :: GHC.Num.Natural.Natural- -> X a -> GHC.Types.Symbol -> GHC.Types.Symbol- type family ShowsPrec_0123456789876543210Sym3 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: X a) (a0123456789876543210 :: GHC.Types.Symbol) :: GHC.Types.Symbol where- ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance PShow (X a) where- type ShowsPrec a a a = Apply (Apply (Apply ShowsPrec_0123456789876543210Sym0 a) a) a- type ShowsPrec_0123456789876543210 :: GHC.Num.Natural.Natural- -> Y a -> GHC.Types.Symbol -> GHC.Types.Symbol- type family ShowsPrec_0123456789876543210 (a :: GHC.Num.Natural.Natural) (a :: Y a) (a :: GHC.Types.Symbol) :: GHC.Types.Symbol where- ShowsPrec_0123456789876543210 _ Y1 a_0123456789876543210 = Apply (Apply ShowStringSym0 "Y1") a_0123456789876543210- ShowsPrec_0123456789876543210 p_0123456789876543210 (Y2 arg_0123456789876543210) a_0123456789876543210 = Apply (Apply (Apply ShowParenSym0 (Apply (Apply (>@#@$) p_0123456789876543210) (FromInteger 10))) (Apply (Apply (.@#@$) (Apply ShowStringSym0 "Y2 ")) (Apply (Apply ShowsPrecSym0 (FromInteger 11)) arg_0123456789876543210))) a_0123456789876543210- type ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) (Y a) ((~>) GHC.Types.Symbol GHC.Types.Symbol))- data ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) (Y a) ((~>) GHC.Types.Symbol GHC.Types.Symbol))- where- ShowsPrec_0123456789876543210Sym0KindInference :: SameKind (Apply ShowsPrec_0123456789876543210Sym0 arg) (ShowsPrec_0123456789876543210Sym1 arg) =>- ShowsPrec_0123456789876543210Sym0 a0123456789876543210- type instance Apply ShowsPrec_0123456789876543210Sym0 a0123456789876543210 = ShowsPrec_0123456789876543210Sym1 a0123456789876543210- instance SuppressUnusedWarnings ShowsPrec_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym0KindInference) ())- type ShowsPrec_0123456789876543210Sym1 :: GHC.Num.Natural.Natural- -> (~>) (Y a) ((~>) GHC.Types.Symbol GHC.Types.Symbol)- data ShowsPrec_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Num.Natural.Natural) :: (~>) (Y a) ((~>) GHC.Types.Symbol GHC.Types.Symbol)- where- ShowsPrec_0123456789876543210Sym1KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 arg) =>- ShowsPrec_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym1KindInference) ())- type ShowsPrec_0123456789876543210Sym2 :: GHC.Num.Natural.Natural- -> Y a -> (~>) GHC.Types.Symbol GHC.Types.Symbol- data ShowsPrec_0123456789876543210Sym2 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: Y a) :: (~>) GHC.Types.Symbol GHC.Types.Symbol- where- ShowsPrec_0123456789876543210Sym2KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 arg) =>- ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 a0123456789876543210- type instance Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) ShowsPrec_0123456789876543210Sym2KindInference) ())- type ShowsPrec_0123456789876543210Sym3 :: GHC.Num.Natural.Natural- -> Y a -> GHC.Types.Symbol -> GHC.Types.Symbol- type family ShowsPrec_0123456789876543210Sym3 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: Y a) (a0123456789876543210 :: GHC.Types.Symbol) :: GHC.Types.Symbol where- ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210- instance PShow (Y a) where- type ShowsPrec a a a = Apply (Apply (Apply ShowsPrec_0123456789876543210Sym0 a) a) a- data SX :: forall (a :: Type). X a -> Type- where- SX1 :: forall (a :: Type). SX (X1 :: X (a :: Type))- SX2 :: forall (a :: Type) (n :: Y a).- (Sing n) -> SX (X2 n :: X (a :: Type))- type instance Sing @(X a) = SX- instance SingKind a => SingKind (X a) where- type Demote (X a) = X (Demote a)- fromSing SX1 = X1- fromSing (SX2 b) = X2 (fromSing b)- toSing X1 = SomeSing SX1- toSing (X2 (b :: Demote (Y a)))- = case toSing b :: SomeSing (Y a) of SomeSing c -> SomeSing (SX2 c)- data SY :: forall (a :: Type). Y a -> Type- where- SY1 :: forall (a :: Type). SY (Y1 :: Y (a :: Type))- SY2 :: forall (a :: Type) (n :: X a).- (Sing n) -> SY (Y2 n :: Y (a :: Type))- type instance Sing @(Y a) = SY- instance SingKind a => SingKind (Y a) where- type Demote (Y a) = Y (Demote a)- fromSing SY1 = Y1- fromSing (SY2 b) = Y2 (fromSing b)- toSing Y1 = SomeSing SY1- toSing (Y2 (b :: Demote (X a)))- = case toSing b :: SomeSing (X a) of SomeSing c -> SomeSing (SY2 c)- instance SShow (Y a) => SShow (X a) where- sShowsPrec ::- forall (t1 :: GHC.Num.Natural.Natural)- (t2 :: X a)- (t3 :: GHC.Types.Symbol). Sing t1- -> Sing t2- -> Sing t3- -> Sing (Apply (Apply (Apply (ShowsPrecSym0 :: TyFun GHC.Num.Natural.Natural ((~>) (X a) ((~>) GHC.Types.Symbol GHC.Types.Symbol))- -> Type) t1) t2) t3)- sShowsPrec- _- SX1- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "X1")))- sA_0123456789876543210- sShowsPrec- (sP_0123456789876543210 :: Sing p_0123456789876543210)- (SX2 (sArg_0123456789876543210 :: Sing arg_0123456789876543210))- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing- ((applySing ((singFun3 @ShowParenSym0) sShowParen))- ((applySing- ((applySing ((singFun2 @(>@#@$)) (%>))) sP_0123456789876543210))- (sFromInteger (sing :: Sing 10)))))- ((applySing- ((applySing ((singFun3 @(.@#@$)) (%.)))- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "X2 "))))- ((applySing- ((applySing ((singFun3 @ShowsPrecSym0) sShowsPrec))- (sFromInteger (sing :: Sing 11))))- sArg_0123456789876543210))))- sA_0123456789876543210- instance SShow (X a) => SShow (Y a) where- sShowsPrec ::- forall (t1 :: GHC.Num.Natural.Natural)- (t2 :: Y a)- (t3 :: GHC.Types.Symbol). Sing t1- -> Sing t2- -> Sing t3- -> Sing (Apply (Apply (Apply (ShowsPrecSym0 :: TyFun GHC.Num.Natural.Natural ((~>) (Y a) ((~>) GHC.Types.Symbol GHC.Types.Symbol))- -> Type) t1) t2) t3)- sShowsPrec- _- SY1- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "Y1")))- sA_0123456789876543210- sShowsPrec- (sP_0123456789876543210 :: Sing p_0123456789876543210)- (SY2 (sArg_0123456789876543210 :: Sing arg_0123456789876543210))- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((applySing- ((applySing ((singFun3 @ShowParenSym0) sShowParen))- ((applySing- ((applySing ((singFun2 @(>@#@$)) (%>))) sP_0123456789876543210))- (sFromInteger (sing :: Sing 10)))))- ((applySing- ((applySing ((singFun3 @(.@#@$)) (%.)))- ((applySing ((singFun2 @ShowStringSym0) sShowString))- (sing :: Sing "Y2 "))))- ((applySing- ((applySing ((singFun3 @ShowsPrecSym0) sShowsPrec))- (sFromInteger (sing :: Sing 11))))- sArg_0123456789876543210))))- sA_0123456789876543210- deriving instance Data.Singletons.ShowSing.ShowSing (Y a) =>- Show (SX (z :: X a))- deriving instance Data.Singletons.ShowSing.ShowSing (X a) =>- Show (SY (z :: Y a))- instance SingI X1 where- sing = SX1- instance SingI n => SingI (X2 (n :: Y a)) where- sing = SX2 sing- instance SingI1 X2 where- liftSing = SX2- instance SingI (X2Sym0 :: (~>) (Y a) (X (a :: Type))) where- sing = (singFun1 @X2Sym0) SX2- instance SingI Y1 where- sing = SY1- instance SingI n => SingI (Y2 (n :: X a)) where- sing = SY2 sing- instance SingI1 Y2 where- liftSing = SY2- instance SingI (Y2Sym0 :: (~>) (X a) (Y (a :: Type))) where- sing = (singFun1 @Y2Sym0) SY2+Singletons/T371.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| data Y (a :: Type) + = Y1 | Y2 (X a) + deriving Show + data X (a :: Type) + = X1 | X2 (Y a) + deriving Show |] + ======> + data X (a :: Type) + = X1 | X2 (Y a) + deriving Show + data Y (a :: Type) + = Y1 | Y2 (X a) + deriving Show + type X1Sym0 :: forall (a :: Type). X (a :: Type) + type family X1Sym0 :: X (a :: Type) where + X1Sym0 = X1 + type X2Sym0 :: forall (a :: Type). (~>) (Y a) (X (a :: Type)) + data X2Sym0 :: (~>) (Y a) (X (a :: Type)) + where + X2Sym0KindInference :: SameKind (Apply X2Sym0 arg) (X2Sym1 arg) => + X2Sym0 a0123456789876543210 + type instance Apply X2Sym0 a0123456789876543210 = X2 a0123456789876543210 + instance SuppressUnusedWarnings X2Sym0 where + suppressUnusedWarnings = snd ((,) X2Sym0KindInference ()) + type X2Sym1 :: forall (a :: Type). Y a -> X (a :: Type) + type family X2Sym1 (a0123456789876543210 :: Y a) :: X (a :: Type) where + X2Sym1 a0123456789876543210 = X2 a0123456789876543210 + type Y1Sym0 :: forall (a :: Type). Y (a :: Type) + type family Y1Sym0 :: Y (a :: Type) where + Y1Sym0 = Y1 + type Y2Sym0 :: forall (a :: Type). (~>) (X a) (Y (a :: Type)) + data Y2Sym0 :: (~>) (X a) (Y (a :: Type)) + where + Y2Sym0KindInference :: SameKind (Apply Y2Sym0 arg) (Y2Sym1 arg) => + Y2Sym0 a0123456789876543210 + type instance Apply Y2Sym0 a0123456789876543210 = Y2 a0123456789876543210 + instance SuppressUnusedWarnings Y2Sym0 where + suppressUnusedWarnings = snd ((,) Y2Sym0KindInference ()) + type Y2Sym1 :: forall (a :: Type). X a -> Y (a :: Type) + type family Y2Sym1 (a0123456789876543210 :: X a) :: Y (a :: Type) where + Y2Sym1 a0123456789876543210 = Y2 a0123456789876543210 + type ShowsPrec_0123456789876543210 :: GHC.Num.Natural.Natural + -> X a -> GHC.Types.Symbol -> GHC.Types.Symbol + type family ShowsPrec_0123456789876543210 (a :: GHC.Num.Natural.Natural) (a :: X a) (a :: GHC.Types.Symbol) :: GHC.Types.Symbol where + ShowsPrec_0123456789876543210 _ X1 a_0123456789876543210 = Apply (Apply ShowStringSym0 "X1") a_0123456789876543210 + ShowsPrec_0123456789876543210 p_0123456789876543210 (X2 arg_0123456789876543210) a_0123456789876543210 = Apply (Apply (Apply ShowParenSym0 (Apply (Apply (>@#@$) p_0123456789876543210) (FromInteger 10))) (Apply (Apply (.@#@$) (Apply ShowStringSym0 "X2 ")) (Apply (Apply ShowsPrecSym0 (FromInteger 11)) arg_0123456789876543210))) a_0123456789876543210 + type ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) (X a) ((~>) GHC.Types.Symbol GHC.Types.Symbol)) + data ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) (X a) ((~>) GHC.Types.Symbol GHC.Types.Symbol)) + where + ShowsPrec_0123456789876543210Sym0KindInference :: SameKind (Apply ShowsPrec_0123456789876543210Sym0 arg) (ShowsPrec_0123456789876543210Sym1 arg) => + ShowsPrec_0123456789876543210Sym0 a0123456789876543210 + type instance Apply ShowsPrec_0123456789876543210Sym0 a0123456789876543210 = ShowsPrec_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings ShowsPrec_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym0KindInference ()) + type ShowsPrec_0123456789876543210Sym1 :: GHC.Num.Natural.Natural + -> (~>) (X a) ((~>) GHC.Types.Symbol GHC.Types.Symbol) + data ShowsPrec_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Num.Natural.Natural) :: (~>) (X a) ((~>) GHC.Types.Symbol GHC.Types.Symbol) + where + ShowsPrec_0123456789876543210Sym1KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 arg) => + ShowsPrec_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym1KindInference ()) + type ShowsPrec_0123456789876543210Sym2 :: GHC.Num.Natural.Natural + -> X a -> (~>) GHC.Types.Symbol GHC.Types.Symbol + data ShowsPrec_0123456789876543210Sym2 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: X a) :: (~>) GHC.Types.Symbol GHC.Types.Symbol + where + ShowsPrec_0123456789876543210Sym2KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 arg) => + ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym2KindInference ()) + type ShowsPrec_0123456789876543210Sym3 :: GHC.Num.Natural.Natural + -> X a -> GHC.Types.Symbol -> GHC.Types.Symbol + type family ShowsPrec_0123456789876543210Sym3 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: X a) (a0123456789876543210 :: GHC.Types.Symbol) :: GHC.Types.Symbol where + ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PShow (X a) where + type ShowsPrec a a a = Apply (Apply (Apply ShowsPrec_0123456789876543210Sym0 a) a) a + type ShowsPrec_0123456789876543210 :: GHC.Num.Natural.Natural + -> Y a -> GHC.Types.Symbol -> GHC.Types.Symbol + type family ShowsPrec_0123456789876543210 (a :: GHC.Num.Natural.Natural) (a :: Y a) (a :: GHC.Types.Symbol) :: GHC.Types.Symbol where + ShowsPrec_0123456789876543210 _ Y1 a_0123456789876543210 = Apply (Apply ShowStringSym0 "Y1") a_0123456789876543210 + ShowsPrec_0123456789876543210 p_0123456789876543210 (Y2 arg_0123456789876543210) a_0123456789876543210 = Apply (Apply (Apply ShowParenSym0 (Apply (Apply (>@#@$) p_0123456789876543210) (FromInteger 10))) (Apply (Apply (.@#@$) (Apply ShowStringSym0 "Y2 ")) (Apply (Apply ShowsPrecSym0 (FromInteger 11)) arg_0123456789876543210))) a_0123456789876543210 + type ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) (Y a) ((~>) GHC.Types.Symbol GHC.Types.Symbol)) + data ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) (Y a) ((~>) GHC.Types.Symbol GHC.Types.Symbol)) + where + ShowsPrec_0123456789876543210Sym0KindInference :: SameKind (Apply ShowsPrec_0123456789876543210Sym0 arg) (ShowsPrec_0123456789876543210Sym1 arg) => + ShowsPrec_0123456789876543210Sym0 a0123456789876543210 + type instance Apply ShowsPrec_0123456789876543210Sym0 a0123456789876543210 = ShowsPrec_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings ShowsPrec_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym0KindInference ()) + type ShowsPrec_0123456789876543210Sym1 :: GHC.Num.Natural.Natural + -> (~>) (Y a) ((~>) GHC.Types.Symbol GHC.Types.Symbol) + data ShowsPrec_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Num.Natural.Natural) :: (~>) (Y a) ((~>) GHC.Types.Symbol GHC.Types.Symbol) + where + ShowsPrec_0123456789876543210Sym1KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 arg) => + ShowsPrec_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym1KindInference ()) + type ShowsPrec_0123456789876543210Sym2 :: GHC.Num.Natural.Natural + -> Y a -> (~>) GHC.Types.Symbol GHC.Types.Symbol + data ShowsPrec_0123456789876543210Sym2 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: Y a) :: (~>) GHC.Types.Symbol GHC.Types.Symbol + where + ShowsPrec_0123456789876543210Sym2KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 arg) => + ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym2KindInference ()) + type ShowsPrec_0123456789876543210Sym3 :: GHC.Num.Natural.Natural + -> Y a -> GHC.Types.Symbol -> GHC.Types.Symbol + type family ShowsPrec_0123456789876543210Sym3 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: Y a) (a0123456789876543210 :: GHC.Types.Symbol) :: GHC.Types.Symbol where + ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PShow (Y a) where + type ShowsPrec a a a = Apply (Apply (Apply ShowsPrec_0123456789876543210Sym0 a) a) a + data SX :: forall (a :: Type). X a -> Type + where + SX1 :: forall (a :: Type). SX (X1 :: X (a :: Type)) + SX2 :: forall (a :: Type) (n :: Y a). + (Sing n) -> SX (X2 n :: X (a :: Type)) + type instance Sing @(X a) = SX + instance SingKind a => SingKind (X a) where + type Demote (X a) = X (Demote a) + fromSing SX1 = X1 + fromSing (SX2 b) = X2 (fromSing b) + toSing X1 = SomeSing SX1 + toSing (X2 (b :: Demote (Y a))) + = case toSing b :: SomeSing (Y a) of SomeSing c -> SomeSing (SX2 c) + data SY :: forall (a :: Type). Y a -> Type + where + SY1 :: forall (a :: Type). SY (Y1 :: Y (a :: Type)) + SY2 :: forall (a :: Type) (n :: X a). + (Sing n) -> SY (Y2 n :: Y (a :: Type)) + type instance Sing @(Y a) = SY + instance SingKind a => SingKind (Y a) where + type Demote (Y a) = Y (Demote a) + fromSing SY1 = Y1 + fromSing (SY2 b) = Y2 (fromSing b) + toSing Y1 = SomeSing SY1 + toSing (Y2 (b :: Demote (X a))) + = case toSing b :: SomeSing (X a) of SomeSing c -> SomeSing (SY2 c) + instance SShow (Y a) => SShow (X a) where + sShowsPrec :: + forall (t1 :: GHC.Num.Natural.Natural) + (t2 :: X a) + (t3 :: GHC.Types.Symbol). Sing t1 + -> Sing t2 + -> Sing t3 + -> Sing (Apply (Apply (Apply (ShowsPrecSym0 :: TyFun GHC.Num.Natural.Natural ((~>) (X a) ((~>) GHC.Types.Symbol GHC.Types.Symbol)) + -> Type) t1) t2) t3) + sShowsPrec + _ + SX1 + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "X1")) + sA_0123456789876543210 + sShowsPrec + (sP_0123456789876543210 :: Sing p_0123456789876543210) + (SX2 (sArg_0123456789876543210 :: Sing arg_0123456789876543210)) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (applySing + (singFun3 @ShowParenSym0 sShowParen) + (applySing + (applySing (singFun2 @(>@#@$) (%>)) sP_0123456789876543210) + (sFromInteger (sing :: Sing 10)))) + (applySing + (applySing + (singFun3 @(.@#@$) (%.)) + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "X2 "))) + (applySing + (applySing + (singFun3 @ShowsPrecSym0 sShowsPrec) + (sFromInteger (sing :: Sing 11))) + sArg_0123456789876543210))) + sA_0123456789876543210 + instance SShow (X a) => SShow (Y a) where + sShowsPrec :: + forall (t1 :: GHC.Num.Natural.Natural) + (t2 :: Y a) + (t3 :: GHC.Types.Symbol). Sing t1 + -> Sing t2 + -> Sing t3 + -> Sing (Apply (Apply (Apply (ShowsPrecSym0 :: TyFun GHC.Num.Natural.Natural ((~>) (Y a) ((~>) GHC.Types.Symbol GHC.Types.Symbol)) + -> Type) t1) t2) t3) + sShowsPrec + _ + SY1 + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "Y1")) + sA_0123456789876543210 + sShowsPrec + (sP_0123456789876543210 :: Sing p_0123456789876543210) + (SY2 (sArg_0123456789876543210 :: Sing arg_0123456789876543210)) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (applySing + (singFun3 @ShowParenSym0 sShowParen) + (applySing + (applySing (singFun2 @(>@#@$) (%>)) sP_0123456789876543210) + (sFromInteger (sing :: Sing 10)))) + (applySing + (applySing + (singFun3 @(.@#@$) (%.)) + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "Y2 "))) + (applySing + (applySing + (singFun3 @ShowsPrecSym0 sShowsPrec) + (sFromInteger (sing :: Sing 11))) + sArg_0123456789876543210))) + sA_0123456789876543210 + deriving instance Data.Singletons.ShowSing.ShowSing (Y a) => + Show (SX (z :: X a)) + deriving instance Data.Singletons.ShowSing.ShowSing (X a) => + Show (SY (z :: Y a)) + instance SingI X1 where + sing = SX1 + instance SingI n => SingI (X2 (n :: Y a)) where + sing = SX2 sing + instance SingI1 X2 where + liftSing = SX2 + instance SingI (X2Sym0 :: (~>) (Y a) (X (a :: Type))) where + sing = singFun1 @X2Sym0 SX2 + instance SingI Y1 where + sing = SY1 + instance SingI n => SingI (Y2 (n :: X a)) where + sing = SY2 sing + instance SingI1 Y2 where + liftSing = SY2 + instance SingI (Y2Sym0 :: (~>) (X a) (Y (a :: Type))) where + sing = singFun1 @Y2Sym0 SY2
tests/compile-and-dump/Singletons/T371.hs view
@@ -1,16 +1,16 @@-module T371 where--import Data.Kind-import Data.Singletons.Base.TH--$(singletons [d|- data X (a :: Type) = X1 | X2 (Y a) deriving Show- data Y (a :: Type) = Y1 | Y2 (X a) deriving Show- |])--main :: IO ()-main = do- print (sing :: Sing ('[] :: [Bool]))- print (sing :: Sing '[True])- print (sing :: Sing (X1 :: X Bool))- print (sing :: Sing (Y2 X1 :: Y Bool))+module T371 where + +import Data.Kind +import Data.Singletons.Base.TH + +$(singletons [d| + data X (a :: Type) = X1 | X2 (Y a) deriving Show + data Y (a :: Type) = Y1 | Y2 (X a) deriving Show + |]) + +main :: IO () +main = do + print (sing :: Sing ('[] :: [Bool])) + print (sing :: Sing '[True]) + print (sing :: Sing (X1 :: X Bool)) + print (sing :: Sing (Y2 X1 :: Y Bool))
tests/compile-and-dump/Singletons/T376.golden view
@@ -1,44 +1,44 @@-Singletons/T376.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| f :: (() -> ()) -> (() -> ())- f g = g :: () -> () |]- ======>- f :: (() -> ()) -> () -> ()- f g = g :: () -> ()- type FSym0 :: (~>) ((~>) () ()) ((~>) () ())- data FSym0 :: (~>) ((~>) () ()) ((~>) () ())- where- FSym0KindInference :: SameKind (Apply FSym0 arg) (FSym1 arg) =>- FSym0 a0123456789876543210- type instance Apply FSym0 a0123456789876543210 = FSym1 a0123456789876543210- instance SuppressUnusedWarnings FSym0 where- suppressUnusedWarnings = snd (((,) FSym0KindInference) ())- type FSym1 :: (~>) () () -> (~>) () ()- data FSym1 (a0123456789876543210 :: (~>) () ()) :: (~>) () ()- where- FSym1KindInference :: SameKind (Apply (FSym1 a0123456789876543210) arg) (FSym2 a0123456789876543210 arg) =>- FSym1 a0123456789876543210 a0123456789876543210- type instance Apply (FSym1 a0123456789876543210) a0123456789876543210 = F a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (FSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) FSym1KindInference) ())- type FSym2 :: (~>) () () -> () -> ()- type family FSym2 (a0123456789876543210 :: (~>) () ()) (a0123456789876543210 :: ()) :: () where- FSym2 a0123456789876543210 a0123456789876543210 = F a0123456789876543210 a0123456789876543210- type F :: (~>) () () -> () -> ()- type family F (a :: (~>) () ()) (a :: ()) :: () where- F g a_0123456789876543210 = Apply (g :: (~>) () ()) a_0123456789876543210- sF ::- forall (t :: (~>) () ()) (t :: ()). Sing t- -> Sing t -> Sing (Apply (Apply FSym0 t) t :: ())- sF- (sG :: Sing g)- (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing (sG :: Sing (g :: (~>) () ()))) sA_0123456789876543210- instance SingI (FSym0 :: (~>) ((~>) () ()) ((~>) () ())) where- sing = (singFun2 @FSym0) sF- instance SingI d =>- SingI (FSym1 (d :: (~>) () ()) :: (~>) () ()) where- sing = (singFun1 @(FSym1 (d :: (~>) () ()))) (sF (sing @d))- instance SingI1 (FSym1 :: (~>) () () -> (~>) () ()) where- liftSing (s :: Sing (d :: (~>) () ()))- = (singFun1 @(FSym1 (d :: (~>) () ()))) (sF s)+Singletons/T376.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| f :: (() -> ()) -> (() -> ()) + f g = g :: () -> () |] + ======> + f :: (() -> ()) -> () -> () + f g = g :: () -> () + type FSym0 :: (~>) ((~>) () ()) ((~>) () ()) + data FSym0 :: (~>) ((~>) () ()) ((~>) () ()) + where + FSym0KindInference :: SameKind (Apply FSym0 arg) (FSym1 arg) => + FSym0 a0123456789876543210 + type instance Apply FSym0 a0123456789876543210 = FSym1 a0123456789876543210 + instance SuppressUnusedWarnings FSym0 where + suppressUnusedWarnings = snd ((,) FSym0KindInference ()) + type FSym1 :: (~>) () () -> (~>) () () + data FSym1 (a0123456789876543210 :: (~>) () ()) :: (~>) () () + where + FSym1KindInference :: SameKind (Apply (FSym1 a0123456789876543210) arg) (FSym2 a0123456789876543210 arg) => + FSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (FSym1 a0123456789876543210) a0123456789876543210 = F a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (FSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) FSym1KindInference ()) + type FSym2 :: (~>) () () -> () -> () + type family FSym2 (a0123456789876543210 :: (~>) () ()) (a0123456789876543210 :: ()) :: () where + FSym2 a0123456789876543210 a0123456789876543210 = F a0123456789876543210 a0123456789876543210 + type F :: (~>) () () -> () -> () + type family F (a :: (~>) () ()) (a :: ()) :: () where + F g a_0123456789876543210 = Apply (g :: (~>) () ()) a_0123456789876543210 + sF :: + (forall (t :: (~>) () ()) (t :: ()). + Sing t -> Sing t -> Sing (Apply (Apply FSym0 t) t :: ()) :: Type) + sF + (sG :: Sing g) + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing (sG :: Sing (g :: (~>) () ())) sA_0123456789876543210 + instance SingI (FSym0 :: (~>) ((~>) () ()) ((~>) () ())) where + sing = singFun2 @FSym0 sF + instance SingI d => + SingI (FSym1 (d :: (~>) () ()) :: (~>) () ()) where + sing = singFun1 @(FSym1 (d :: (~>) () ())) (sF (sing @d)) + instance SingI1 (FSym1 :: (~>) () () -> (~>) () ()) where + liftSing (s :: Sing (d :: (~>) () ())) + = singFun1 @(FSym1 (d :: (~>) () ())) (sF s)
tests/compile-and-dump/Singletons/T376.hs view
@@ -1,8 +1,8 @@-module T376 where--import Data.Singletons.TH--$(singletons [d|- f :: (() -> ()) -> (() -> ())- f g = g :: () -> ()- |])+module T376 where + +import Data.Singletons.TH + +$(singletons [d| + f :: (() -> ()) -> (() -> ()) + f g = g :: () -> () + |])
tests/compile-and-dump/Singletons/T378a.golden view
@@ -1,90 +1,90 @@-Singletons/T378a.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| constBA :: forall b a. a -> b -> a- constBA x _ = x- - data Proxy :: forall k. k -> Type- where- Proxy1 :: Proxy a- Proxy2 :: Proxy (a :: k)- Proxy3 :: forall a. Proxy a- Proxy4 :: forall k (a :: k). Proxy a |]- ======>- constBA :: forall b a. a -> b -> a- constBA x _ = x- data Proxy :: forall k. k -> Type- where- Proxy1 :: Proxy a- Proxy2 :: Proxy (a :: k)- Proxy3 :: forall a. Proxy a- Proxy4 :: forall k (a :: k). Proxy a- type Proxy1Sym0 :: Proxy a- type family Proxy1Sym0 :: Proxy a where- Proxy1Sym0 = Proxy1- type Proxy2Sym0 :: Proxy (a :: k)- type family Proxy2Sym0 :: Proxy (a :: k) where- Proxy2Sym0 = Proxy2- type Proxy3Sym0 :: forall a. Proxy a- type family Proxy3Sym0 :: Proxy a where- Proxy3Sym0 = Proxy3- type Proxy4Sym0 :: forall k (a :: k). Proxy a- type family Proxy4Sym0 :: Proxy a where- Proxy4Sym0 = Proxy4- type ConstBASym0 :: forall b a. (~>) a ((~>) b a)- data ConstBASym0 :: (~>) a ((~>) b a)- where- ConstBASym0KindInference :: SameKind (Apply ConstBASym0 arg) (ConstBASym1 arg) =>- ConstBASym0 a0123456789876543210- type instance Apply ConstBASym0 a0123456789876543210 = ConstBASym1 a0123456789876543210- instance SuppressUnusedWarnings ConstBASym0 where- suppressUnusedWarnings = snd (((,) ConstBASym0KindInference) ())- type ConstBASym1 :: forall b a. a -> (~>) b a- data ConstBASym1 (a0123456789876543210 :: a) :: (~>) b a- where- ConstBASym1KindInference :: SameKind (Apply (ConstBASym1 a0123456789876543210) arg) (ConstBASym2 a0123456789876543210 arg) =>- ConstBASym1 a0123456789876543210 a0123456789876543210- type instance Apply (ConstBASym1 a0123456789876543210) a0123456789876543210 = ConstBA a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ConstBASym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) ConstBASym1KindInference) ())- type ConstBASym2 :: forall b a. a -> b -> a- type family ConstBASym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: a where- ConstBASym2 a0123456789876543210 a0123456789876543210 = ConstBA a0123456789876543210 a0123456789876543210- type ConstBA :: forall b a. a -> b -> a- type family ConstBA (a :: a) (a :: b) :: a where- ConstBA x _ = x- sConstBA ::- forall b a (t :: a) (t :: b). Sing t- -> Sing t -> Sing (Apply (Apply ConstBASym0 t) t :: a)- sConstBA (sX :: Sing x) _ = sX- instance SingI (ConstBASym0 :: (~>) a ((~>) b a)) where- sing = (singFun2 @ConstBASym0) sConstBA- instance SingI d => SingI (ConstBASym1 (d :: a) :: (~>) b a) where- sing = (singFun1 @(ConstBASym1 (d :: a))) (sConstBA (sing @d))- instance SingI1 (ConstBASym1 :: a -> (~>) b a) where- liftSing (s :: Sing (d :: a))- = (singFun1 @(ConstBASym1 (d :: a))) (sConstBA s)- data SProxy :: forall k (a :: k). Proxy a -> Type- where- SProxy1 :: forall a. SProxy (Proxy1 :: Proxy a)- SProxy2 :: forall k (a :: k). SProxy (Proxy2 :: Proxy (a :: k))- SProxy3 :: forall a. SProxy (Proxy3 :: Proxy a)- SProxy4 :: forall k (a :: k). SProxy (Proxy4 :: Proxy a)- type instance Sing @(Proxy a) = SProxy- instance SingKind a => SingKind (Proxy a) where- type Demote (Proxy a) = Proxy (Demote a)- fromSing SProxy1 = Proxy1- fromSing SProxy2 = Proxy2- fromSing SProxy3 = Proxy3- fromSing SProxy4 = Proxy4- toSing Proxy1 = SomeSing SProxy1- toSing Proxy2 = SomeSing SProxy2- toSing Proxy3 = SomeSing SProxy3- toSing Proxy4 = SomeSing SProxy4- instance SingI Proxy1 where- sing = SProxy1- instance SingI Proxy2 where- sing = SProxy2- instance SingI Proxy3 where- sing = SProxy3- instance SingI Proxy4 where- sing = SProxy4+Singletons/T378a.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| constBA :: forall b a. a -> b -> a + constBA x _ = x + + data Proxy :: forall k. k -> Type + where + Proxy1 :: Proxy a + Proxy2 :: Proxy (a :: k) + Proxy3 :: forall a. Proxy a + Proxy4 :: forall k (a :: k). Proxy a |] + ======> + constBA :: forall b a. a -> b -> a + constBA x _ = x + data Proxy :: forall k. k -> Type + where + Proxy1 :: Proxy a + Proxy2 :: Proxy (a :: k) + Proxy3 :: forall a. Proxy a + Proxy4 :: forall k (a :: k). Proxy a + type Proxy1Sym0 :: Proxy a + type family Proxy1Sym0 :: Proxy a where + Proxy1Sym0 = Proxy1 + type Proxy2Sym0 :: Proxy (a :: k) + type family Proxy2Sym0 :: Proxy (a :: k) where + Proxy2Sym0 = Proxy2 + type Proxy3Sym0 :: forall a. Proxy a + type family Proxy3Sym0 :: Proxy a where + Proxy3Sym0 = Proxy3 + type Proxy4Sym0 :: forall k (a :: k). Proxy a + type family Proxy4Sym0 :: Proxy a where + Proxy4Sym0 = Proxy4 + type ConstBASym0 :: forall b a. (~>) a ((~>) b a) + data ConstBASym0 :: (~>) a ((~>) b a) + where + ConstBASym0KindInference :: SameKind (Apply ConstBASym0 arg) (ConstBASym1 arg) => + ConstBASym0 a0123456789876543210 + type instance Apply ConstBASym0 a0123456789876543210 = ConstBASym1 a0123456789876543210 + instance SuppressUnusedWarnings ConstBASym0 where + suppressUnusedWarnings = snd ((,) ConstBASym0KindInference ()) + type ConstBASym1 :: forall b a. a -> (~>) b a + data ConstBASym1 (a0123456789876543210 :: a) :: (~>) b a + where + ConstBASym1KindInference :: SameKind (Apply (ConstBASym1 a0123456789876543210) arg) (ConstBASym2 a0123456789876543210 arg) => + ConstBASym1 a0123456789876543210 a0123456789876543210 + type instance Apply (ConstBASym1 a0123456789876543210) a0123456789876543210 = ConstBA a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ConstBASym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) ConstBASym1KindInference ()) + type ConstBASym2 :: forall b a. a -> b -> a + type family ConstBASym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: a where + ConstBASym2 a0123456789876543210 a0123456789876543210 = ConstBA a0123456789876543210 a0123456789876543210 + type ConstBA :: forall b a. a -> b -> a + type family ConstBA (a :: a) (a :: b) :: a where + ConstBA x _ = x + sConstBA :: + forall b a (t :: a) (t :: b). Sing t + -> Sing t -> Sing (Apply (Apply ConstBASym0 t) t :: a) + sConstBA (sX :: Sing x) _ = sX + instance SingI (ConstBASym0 :: (~>) a ((~>) b a)) where + sing = singFun2 @ConstBASym0 sConstBA + instance SingI d => SingI (ConstBASym1 (d :: a) :: (~>) b a) where + sing = singFun1 @(ConstBASym1 (d :: a)) (sConstBA (sing @d)) + instance SingI1 (ConstBASym1 :: a -> (~>) b a) where + liftSing (s :: Sing (d :: a)) + = singFun1 @(ConstBASym1 (d :: a)) (sConstBA s) + data SProxy :: forall k (a :: k). Proxy a -> Type + where + SProxy1 :: forall a. SProxy (Proxy1 :: Proxy a) + SProxy2 :: forall k (a :: k). SProxy (Proxy2 :: Proxy (a :: k)) + SProxy3 :: forall a. SProxy (Proxy3 :: Proxy a) + SProxy4 :: forall k (a :: k). SProxy (Proxy4 :: Proxy a) + type instance Sing @(Proxy a) = SProxy + instance SingKind a => SingKind (Proxy a) where + type Demote (Proxy a) = Proxy (Demote a) + fromSing SProxy1 = Proxy1 + fromSing SProxy2 = Proxy2 + fromSing SProxy3 = Proxy3 + fromSing SProxy4 = Proxy4 + toSing Proxy1 = SomeSing SProxy1 + toSing Proxy2 = SomeSing SProxy2 + toSing Proxy3 = SomeSing SProxy3 + toSing Proxy4 = SomeSing SProxy4 + instance SingI Proxy1 where + sing = SProxy1 + instance SingI Proxy2 where + sing = SProxy2 + instance SingI Proxy3 where + sing = SProxy3 + instance SingI Proxy4 where + sing = SProxy4
tests/compile-and-dump/Singletons/T378a.hs view
@@ -1,64 +1,64 @@-module T378a where--import Data.Kind-import Data.Singletons.TH hiding (Proxy(..))-import Prelude.Singletons hiding (Proxy(..))--$(singletons [d|- constBA :: forall b a. a -> b -> a- constBA x _ = x-- data Proxy :: forall k. k -> Type where- Proxy1 :: Proxy a- Proxy2 :: Proxy (a :: k)- Proxy3 :: forall a. Proxy a- Proxy4 :: forall k (a :: k). Proxy a- |])--ex1 :: [Bool]-ex1 = [] @Bool--type PEx1 :: [Bool]-type PEx1 = '[] @Bool--sEx1 :: SList ('[] @Bool)-sEx1 = SNil @Bool--ex2 :: Bool-ex2 = constBA @Ordering @Bool True LT--type PEx2 :: Bool-type PEx2 = ConstBA @Ordering @Bool True LT--sEx2 :: Sing (ConstBA True LT)-sEx2 = sConstBA @Ordering @Bool STrue SLT--proxyEx1, proxyEx2, proxyEx3, proxyEx4 :: Proxy True-proxyEx1 = Proxy1 @True-proxyEx2 = Proxy2 @Bool @True-proxyEx3 = Proxy3 @True-proxyEx4 = Proxy4 @Bool @True--type ProxyEx1 :: Proxy True-type ProxyEx1 = Proxy1 @True--type ProxyEx2 :: Proxy True-type ProxyEx2 = Proxy2 @Bool @True--type ProxyEx3 :: Proxy True-type ProxyEx3 = Proxy3 @True--type ProxyEx4 :: Proxy True-type ProxyEx4 = Proxy4 @Bool @True--sProxyEx1 :: SProxy (Proxy1 @True)-sProxyEx1 = SProxy1 @True--sProxyEx2 :: SProxy (Proxy2 @Bool @True)-sProxyEx2 = SProxy2 @Bool @True--sProxyEx3 :: SProxy (Proxy3 @True)-sProxyEx3 = SProxy3 @True--sProxyEx4 :: SProxy (Proxy4 @Bool @True)-sProxyEx4 = SProxy4 @Bool @True+module T378a where + +import Data.Kind +import Data.Singletons.TH hiding (Proxy(..)) +import Prelude.Singletons hiding (Proxy(..)) + +$(singletons [d| + constBA :: forall b a. a -> b -> a + constBA x _ = x + + data Proxy :: forall k. k -> Type where + Proxy1 :: Proxy a + Proxy2 :: Proxy (a :: k) + Proxy3 :: forall a. Proxy a + Proxy4 :: forall k (a :: k). Proxy a + |]) + +ex1 :: [Bool] +ex1 = [] @Bool + +type PEx1 :: [Bool] +type PEx1 = '[] @Bool + +sEx1 :: SList ('[] @Bool) +sEx1 = SNil @Bool + +ex2 :: Bool +ex2 = constBA @Ordering @Bool True LT + +type PEx2 :: Bool +type PEx2 = ConstBA @Ordering @Bool True LT + +sEx2 :: Sing (ConstBA True LT) +sEx2 = sConstBA @Ordering @Bool STrue SLT + +proxyEx1, proxyEx2, proxyEx3, proxyEx4 :: Proxy True +proxyEx1 = Proxy1 @True +proxyEx2 = Proxy2 @Bool @True +proxyEx3 = Proxy3 @True +proxyEx4 = Proxy4 @Bool @True + +type ProxyEx1 :: Proxy True +type ProxyEx1 = Proxy1 @True + +type ProxyEx2 :: Proxy True +type ProxyEx2 = Proxy2 @Bool @True + +type ProxyEx3 :: Proxy True +type ProxyEx3 = Proxy3 @True + +type ProxyEx4 :: Proxy True +type ProxyEx4 = Proxy4 @Bool @True + +sProxyEx1 :: SProxy (Proxy1 @True) +sProxyEx1 = SProxy1 @True + +sProxyEx2 :: SProxy (Proxy2 @Bool @True) +sProxyEx2 = SProxy2 @Bool @True + +sProxyEx3 :: SProxy (Proxy3 @True) +sProxyEx3 = SProxy3 @True + +sProxyEx4 :: SProxy (Proxy4 @Bool @True) +sProxyEx4 = SProxy4 @Bool @True
tests/compile-and-dump/Singletons/T378b.golden view
@@ -1,129 +1,127 @@-Singletons/T378b.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| f :: forall b a. a -> b -> ()- f _ _ = ()- natMinus :: Nat -> Nat -> Nat- natMinus Zero _ = Zero- natMinus (Succ a) (Succ b) = natMinus a b- natMinus a@(Succ _) Zero = a- - type C :: forall b a. a -> b -> Constraint- type D :: forall b a. a -> b -> Type- - class C x y- data D x y |]- ======>- type C :: forall b a. a -> b -> Constraint- class C x y- type D :: forall b a. a -> b -> Type- data D x y- f :: forall b a. a -> b -> ()- f _ _ = ()- natMinus :: Nat -> Nat -> Nat- natMinus Zero _ = Zero- natMinus (Succ a) (Succ b) = (natMinus a) b- natMinus a@(Succ _) Zero = a- data Let0123456789876543210ASym0 wild_01234567898765432100123456789876543210- where- Let0123456789876543210ASym0KindInference :: SameKind (Apply Let0123456789876543210ASym0 arg) (Let0123456789876543210ASym1 arg) =>- Let0123456789876543210ASym0 wild_01234567898765432100123456789876543210- type instance Apply Let0123456789876543210ASym0 wild_01234567898765432100123456789876543210 = Let0123456789876543210A wild_01234567898765432100123456789876543210- instance SuppressUnusedWarnings Let0123456789876543210ASym0 where- suppressUnusedWarnings- = snd (((,) Let0123456789876543210ASym0KindInference) ())- type family Let0123456789876543210ASym1 wild_01234567898765432100123456789876543210 where- Let0123456789876543210ASym1 wild_01234567898765432100123456789876543210 = Let0123456789876543210A wild_01234567898765432100123456789876543210- type family Let0123456789876543210A wild_0123456789876543210 where- Let0123456789876543210A wild_0123456789876543210 = Apply SuccSym0 wild_0123456789876543210- type NatMinusSym0 :: (~>) Nat ((~>) Nat Nat)- data NatMinusSym0 :: (~>) Nat ((~>) Nat Nat)- where- NatMinusSym0KindInference :: SameKind (Apply NatMinusSym0 arg) (NatMinusSym1 arg) =>- NatMinusSym0 a0123456789876543210- type instance Apply NatMinusSym0 a0123456789876543210 = NatMinusSym1 a0123456789876543210- instance SuppressUnusedWarnings NatMinusSym0 where- suppressUnusedWarnings = snd (((,) NatMinusSym0KindInference) ())- type NatMinusSym1 :: Nat -> (~>) Nat Nat- data NatMinusSym1 (a0123456789876543210 :: Nat) :: (~>) Nat Nat- where- NatMinusSym1KindInference :: SameKind (Apply (NatMinusSym1 a0123456789876543210) arg) (NatMinusSym2 a0123456789876543210 arg) =>- NatMinusSym1 a0123456789876543210 a0123456789876543210- type instance Apply (NatMinusSym1 a0123456789876543210) a0123456789876543210 = NatMinus a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (NatMinusSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) NatMinusSym1KindInference) ())- type NatMinusSym2 :: Nat -> Nat -> Nat- type family NatMinusSym2 (a0123456789876543210 :: Nat) (a0123456789876543210 :: Nat) :: Nat where- NatMinusSym2 a0123456789876543210 a0123456789876543210 = NatMinus a0123456789876543210 a0123456789876543210- type FSym0 :: forall b a. (~>) a ((~>) b ())- data FSym0 :: (~>) a ((~>) b ())- where- FSym0KindInference :: SameKind (Apply FSym0 arg) (FSym1 arg) =>- FSym0 a0123456789876543210- type instance Apply FSym0 a0123456789876543210 = FSym1 a0123456789876543210- instance SuppressUnusedWarnings FSym0 where- suppressUnusedWarnings = snd (((,) FSym0KindInference) ())- type FSym1 :: forall b a. a -> (~>) b ()- data FSym1 (a0123456789876543210 :: a) :: (~>) b ()- where- FSym1KindInference :: SameKind (Apply (FSym1 a0123456789876543210) arg) (FSym2 a0123456789876543210 arg) =>- FSym1 a0123456789876543210 a0123456789876543210- type instance Apply (FSym1 a0123456789876543210) a0123456789876543210 = F a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (FSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) FSym1KindInference) ())- type FSym2 :: forall b a. a -> b -> ()- type family FSym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: () where- FSym2 a0123456789876543210 a0123456789876543210 = F a0123456789876543210 a0123456789876543210- type NatMinus :: Nat -> Nat -> Nat- type family NatMinus (a :: Nat) (a :: Nat) :: Nat where- NatMinus 'Zero _ = ZeroSym0- NatMinus ('Succ a) ('Succ b) = Apply (Apply NatMinusSym0 a) b- NatMinus ('Succ wild_0123456789876543210) 'Zero = Let0123456789876543210ASym1 wild_0123456789876543210- type F :: forall b a. a -> b -> ()- type family F (a :: a) (a :: b) :: () where- F _ _ = Tuple0Sym0- type PC :: forall b a. a -> b -> Constraint- class PC x y- sNatMinus ::- forall (t :: Nat) (t :: Nat). Sing t- -> Sing t -> Sing (Apply (Apply NatMinusSym0 t) t :: Nat)- sF ::- forall b a (t :: a) (t :: b). Sing t- -> Sing t -> Sing (Apply (Apply FSym0 t) t :: ())- sNatMinus SZero _ = SZero- sNatMinus (SSucc (sA :: Sing a)) (SSucc (sB :: Sing b))- = (applySing ((applySing ((singFun2 @NatMinusSym0) sNatMinus)) sA))- sB- sNatMinus- (SSucc (sWild_0123456789876543210 :: Sing wild_0123456789876543210))- SZero- = let- sA ::- Sing @_ (Let0123456789876543210ASym1 wild_0123456789876543210)- sA- = (applySing ((singFun1 @SuccSym0) SSucc))- sWild_0123456789876543210- in sA- sF _ _ = STuple0- instance SingI (NatMinusSym0 :: (~>) Nat ((~>) Nat Nat)) where- sing = (singFun2 @NatMinusSym0) sNatMinus- instance SingI d =>- SingI (NatMinusSym1 (d :: Nat) :: (~>) Nat Nat) where- sing = (singFun1 @(NatMinusSym1 (d :: Nat))) (sNatMinus (sing @d))- instance SingI1 (NatMinusSym1 :: Nat -> (~>) Nat Nat) where- liftSing (s :: Sing (d :: Nat))- = (singFun1 @(NatMinusSym1 (d :: Nat))) (sNatMinus s)- instance SingI (FSym0 :: (~>) a ((~>) b ())) where- sing = (singFun2 @FSym0) sF- instance SingI d => SingI (FSym1 (d :: a) :: (~>) b ()) where- sing = (singFun1 @(FSym1 (d :: a))) (sF (sing @d))- instance SingI1 (FSym1 :: a -> (~>) b ()) where- liftSing (s :: Sing (d :: a)) = (singFun1 @(FSym1 (d :: a))) (sF s)- type SD :: forall b a (x :: a) (y :: b). D x y -> Type- data SD :: forall b a (x :: a) (y :: b). D x y -> Type- type instance Sing @(D x y) = SD- instance (SingKind x, SingKind y) => SingKind (D x y) where- type Demote (D x y) = D (Demote x) (Demote y)- fromSing x = case x of {}- toSing x = SomeSing (case x of {})- class SC x y- type SC :: forall b a. a -> b -> Constraint+Singletons/T378b.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| f :: forall b a. a -> b -> () + f _ _ = () + natMinus :: Nat -> Nat -> Nat + natMinus Zero _ = Zero + natMinus (Succ a) (Succ b) = natMinus a b + natMinus a@(Succ _) Zero = a + + type C :: forall b a. a -> b -> Constraint + type D :: forall b a. a -> b -> Type + + class C x y + data D x y |] + ======> + type C :: forall b a. a -> b -> Constraint + class C x y + type D :: forall b a. a -> b -> Type + data D x y + f :: forall b a. a -> b -> () + f _ _ = () + natMinus :: Nat -> Nat -> Nat + natMinus Zero _ = Zero + natMinus (Succ a) (Succ b) = natMinus a b + natMinus a@(Succ _) Zero = a + data Let0123456789876543210ASym0 wild_01234567898765432100123456789876543210 + where + Let0123456789876543210ASym0KindInference :: SameKind (Apply Let0123456789876543210ASym0 arg) (Let0123456789876543210ASym1 arg) => + Let0123456789876543210ASym0 wild_01234567898765432100123456789876543210 + type instance Apply Let0123456789876543210ASym0 wild_01234567898765432100123456789876543210 = Let0123456789876543210A wild_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings Let0123456789876543210ASym0 where + suppressUnusedWarnings + = snd ((,) Let0123456789876543210ASym0KindInference ()) + type family Let0123456789876543210ASym1 wild_01234567898765432100123456789876543210 where + Let0123456789876543210ASym1 wild_01234567898765432100123456789876543210 = Let0123456789876543210A wild_01234567898765432100123456789876543210 + type family Let0123456789876543210A wild_0123456789876543210 where + Let0123456789876543210A wild_0123456789876543210 = Apply SuccSym0 wild_0123456789876543210 + type NatMinusSym0 :: (~>) Nat ((~>) Nat Nat) + data NatMinusSym0 :: (~>) Nat ((~>) Nat Nat) + where + NatMinusSym0KindInference :: SameKind (Apply NatMinusSym0 arg) (NatMinusSym1 arg) => + NatMinusSym0 a0123456789876543210 + type instance Apply NatMinusSym0 a0123456789876543210 = NatMinusSym1 a0123456789876543210 + instance SuppressUnusedWarnings NatMinusSym0 where + suppressUnusedWarnings = snd ((,) NatMinusSym0KindInference ()) + type NatMinusSym1 :: Nat -> (~>) Nat Nat + data NatMinusSym1 (a0123456789876543210 :: Nat) :: (~>) Nat Nat + where + NatMinusSym1KindInference :: SameKind (Apply (NatMinusSym1 a0123456789876543210) arg) (NatMinusSym2 a0123456789876543210 arg) => + NatMinusSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (NatMinusSym1 a0123456789876543210) a0123456789876543210 = NatMinus a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (NatMinusSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) NatMinusSym1KindInference ()) + type NatMinusSym2 :: Nat -> Nat -> Nat + type family NatMinusSym2 (a0123456789876543210 :: Nat) (a0123456789876543210 :: Nat) :: Nat where + NatMinusSym2 a0123456789876543210 a0123456789876543210 = NatMinus a0123456789876543210 a0123456789876543210 + type FSym0 :: forall b a. (~>) a ((~>) b ()) + data FSym0 :: (~>) a ((~>) b ()) + where + FSym0KindInference :: SameKind (Apply FSym0 arg) (FSym1 arg) => + FSym0 a0123456789876543210 + type instance Apply FSym0 a0123456789876543210 = FSym1 a0123456789876543210 + instance SuppressUnusedWarnings FSym0 where + suppressUnusedWarnings = snd ((,) FSym0KindInference ()) + type FSym1 :: forall b a. a -> (~>) b () + data FSym1 (a0123456789876543210 :: a) :: (~>) b () + where + FSym1KindInference :: SameKind (Apply (FSym1 a0123456789876543210) arg) (FSym2 a0123456789876543210 arg) => + FSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (FSym1 a0123456789876543210) a0123456789876543210 = F a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (FSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) FSym1KindInference ()) + type FSym2 :: forall b a. a -> b -> () + type family FSym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: () where + FSym2 a0123456789876543210 a0123456789876543210 = F a0123456789876543210 a0123456789876543210 + type NatMinus :: Nat -> Nat -> Nat + type family NatMinus (a :: Nat) (a :: Nat) :: Nat where + NatMinus 'Zero _ = ZeroSym0 + NatMinus ('Succ a) ('Succ b) = Apply (Apply NatMinusSym0 a) b + NatMinus ('Succ wild_0123456789876543210) 'Zero = Let0123456789876543210ASym1 wild_0123456789876543210 + type F :: forall b a. a -> b -> () + type family F (a :: a) (a :: b) :: () where + F _ _ = Tuple0Sym0 + type PC :: forall b a. a -> b -> Constraint + class PC x y + sNatMinus :: + (forall (t :: Nat) (t :: Nat). + Sing t + -> Sing t -> Sing (Apply (Apply NatMinusSym0 t) t :: Nat) :: Type) + sF :: + forall b a (t :: a) (t :: b). Sing t + -> Sing t -> Sing (Apply (Apply FSym0 t) t :: ()) + sNatMinus SZero _ = SZero + sNatMinus (SSucc (sA :: Sing a)) (SSucc (sB :: Sing b)) + = applySing (applySing (singFun2 @NatMinusSym0 sNatMinus) sA) sB + sNatMinus + (SSucc (sWild_0123456789876543210 :: Sing wild_0123456789876543210)) + SZero + = let + sA :: + Sing @_ (Let0123456789876543210ASym1 wild_0123456789876543210) + sA = applySing (singFun1 @SuccSym0 SSucc) sWild_0123456789876543210 + in sA + sF _ _ = STuple0 + instance SingI (NatMinusSym0 :: (~>) Nat ((~>) Nat Nat)) where + sing = singFun2 @NatMinusSym0 sNatMinus + instance SingI d => + SingI (NatMinusSym1 (d :: Nat) :: (~>) Nat Nat) where + sing = singFun1 @(NatMinusSym1 (d :: Nat)) (sNatMinus (sing @d)) + instance SingI1 (NatMinusSym1 :: Nat -> (~>) Nat Nat) where + liftSing (s :: Sing (d :: Nat)) + = singFun1 @(NatMinusSym1 (d :: Nat)) (sNatMinus s) + instance SingI (FSym0 :: (~>) a ((~>) b ())) where + sing = singFun2 @FSym0 sF + instance SingI d => SingI (FSym1 (d :: a) :: (~>) b ()) where + sing = singFun1 @(FSym1 (d :: a)) (sF (sing @d)) + instance SingI1 (FSym1 :: a -> (~>) b ()) where + liftSing (s :: Sing (d :: a)) = singFun1 @(FSym1 (d :: a)) (sF s) + type SD :: forall b a (x :: a) (y :: b). D x y -> Type + data SD :: forall b a (x :: a) (y :: b). D x y -> Type + type instance Sing @(D x y) = SD + instance (SingKind x, SingKind y) => SingKind (D x y) where + type Demote (D x y) = D (Demote x) (Demote y) + fromSing x = case x of {} + toSing x = SomeSing (case x of {}) + class SC x y + type SC :: forall b a. a -> b -> Constraint
tests/compile-and-dump/Singletons/T378b.hs view
@@ -1,40 +1,40 @@-module T378b where--import Data.Kind-import Data.Singletons.Base.TH-import Singletons.Nat--$(singletons [d|- type C :: forall b a. a -> b -> Constraint- class C x y-- type D :: forall b a. a -> b -> Type- data D x y-- f :: forall b a. a -> b -> ()- f _ _ = ()-- natMinus :: Nat -> Nat -> Nat- natMinus Zero _ = Zero- natMinus (Succ a) (Succ b) = natMinus a b- natMinus a@(Succ _) Zero = a- |])---- Test some type variable orderings-type CExP :: Bool -> Ordering -> Constraint-type CExP = PC @Ordering @Bool--type CExS :: Bool -> Ordering -> Constraint-type CExS = SC @Ordering @Bool--type DExS :: D (x :: Bool) (y :: Ordering) -> Type-type DExS = SD @Ordering @Bool--type FEx0 :: Bool ~> Ordering ~> ()-type FEx0 = FSym0 @Ordering @Bool--type FEx1 :: Bool -> Ordering ~> ()-type FEx1 = FSym1 @Ordering @Bool--type FEx2 :: ()-type FEx2 = FSym2 @Ordering @Bool True EQ+module T378b where + +import Data.Kind +import Data.Singletons.Base.TH +import Singletons.Nat + +$(singletons [d| + type C :: forall b a. a -> b -> Constraint + class C x y + + type D :: forall b a. a -> b -> Type + data D x y + + f :: forall b a. a -> b -> () + f _ _ = () + + natMinus :: Nat -> Nat -> Nat + natMinus Zero _ = Zero + natMinus (Succ a) (Succ b) = natMinus a b + natMinus a@(Succ _) Zero = a + |]) + +-- Test some type variable orderings +type CExP :: Bool -> Ordering -> Constraint +type CExP = PC @Ordering @Bool + +type CExS :: Bool -> Ordering -> Constraint +type CExS = SC @Ordering @Bool + +type DExS :: D (x :: Bool) (y :: Ordering) -> Type +type DExS = SD @Ordering @Bool + +type FEx0 :: Bool ~> Ordering ~> () +type FEx0 = FSym0 @Ordering @Bool + +type FEx1 :: Bool -> Ordering ~> () +type FEx1 = FSym1 @Ordering @Bool + +type FEx2 :: () +type FEx2 = FSym2 @Ordering @Bool True EQ
tests/compile-and-dump/Singletons/T401.golden view
@@ -1,13 +1,13 @@--Singletons/T401.hs:0:0: error: Q monad failure- |-5 | $(singletons [d|- | ^^^^^^^^^^^^^^^...--Singletons/T401.hs:0:0: error:- `singletons-th` does not support higher-rank `forall`s-In the type: (forall a_0 . a_0 -> a_0) -> b_1 -> b_1-- |-5 | $(singletons [d|- | ^^^^^^^^^^^^^^^...+ +Singletons/T401.hs:0:0: error: [GHC-39584] Q monad failure + | +5 | $(singletons [d| + | ^^^^^^^^^^^^^^^... + +Singletons/T401.hs:0:0: error: [GHC-39584] + `singletons-th` does not support higher-rank `forall`s +In the type: (forall a_0 . a_0 -> a_0) -> b_1 -> b_1 + + | +5 | $(singletons [d| + | ^^^^^^^^^^^^^^^...
tests/compile-and-dump/Singletons/T401.hs view
@@ -1,8 +1,8 @@-module T401 where--import Data.Singletons.TH--$(singletons [d|- f :: (forall a. a -> a) -> b -> b- f _ x = x- |])+module T401 where + +import Data.Singletons.TH + +$(singletons [d| + f :: (forall a. a -> a) -> b -> b + f _ x = x + |])
tests/compile-and-dump/Singletons/T401b.golden view
@@ -1,13 +1,13 @@--Singletons/T401b.hs:0:0: error: Q monad failure- |-5 | $(singletons [d|- | ^^^^^^^^^^^^^^^...--Singletons/T401b.hs:0:0: error:- `singletons-th` does not support higher-rank `forall`s-In the type: (forall a_0 . a_0) -> T_1-- |-5 | $(singletons [d|- | ^^^^^^^^^^^^^^^...+ +Singletons/T401b.hs:0:0: error: [GHC-39584] Q monad failure + | +5 | $(singletons [d| + | ^^^^^^^^^^^^^^^... + +Singletons/T401b.hs:0:0: error: [GHC-39584] + `singletons-th` does not support higher-rank `forall`s +In the type: (forall a_0 . a_0) -> T_1 + + | +5 | $(singletons [d| + | ^^^^^^^^^^^^^^^...
tests/compile-and-dump/Singletons/T401b.hs view
@@ -1,8 +1,8 @@-module T401b where--import Data.Singletons.TH--$(singletons [d|- newtype T where- MkT :: (forall a. a) -> T- |])+module T401b where + +import Data.Singletons.TH + +$(singletons [d| + newtype T where + MkT :: (forall a. a) -> T + |])
tests/compile-and-dump/Singletons/T402.golden view
@@ -1,13 +1,13 @@-Singletons/T402.hs:0:0:: Splicing declarations- singletons [d| type AnyOfKind (k :: Type) = Any :: k |]- ======>- type AnyOfKind (k :: Type) = Any :: k- data AnyOfKindSym0 :: (~>) Type k0123456789876543210- where- AnyOfKindSym0KindInference :: SameKind (Apply AnyOfKindSym0 arg) (AnyOfKindSym1 arg) =>- AnyOfKindSym0 k0123456789876543210- type instance Apply AnyOfKindSym0 k0123456789876543210 = AnyOfKind k0123456789876543210- instance SuppressUnusedWarnings AnyOfKindSym0 where- suppressUnusedWarnings = snd (((,) AnyOfKindSym0KindInference) ())- type family AnyOfKindSym1 (k0123456789876543210 :: Type) :: k0123456789876543210 where- AnyOfKindSym1 k0123456789876543210 = AnyOfKind k0123456789876543210+Singletons/T402.hs:0:0:: Splicing declarations + singletons [d| type AnyOfKind (k :: Type) = Any :: k |] + ======> + type AnyOfKind (k :: Type) = Any :: k + data AnyOfKindSym0 :: (~>) Type k0123456789876543210 + where + AnyOfKindSym0KindInference :: SameKind (Apply AnyOfKindSym0 arg) (AnyOfKindSym1 arg) => + AnyOfKindSym0 k0123456789876543210 + type instance Apply AnyOfKindSym0 k0123456789876543210 = AnyOfKind k0123456789876543210 + instance SuppressUnusedWarnings AnyOfKindSym0 where + suppressUnusedWarnings = snd ((,) AnyOfKindSym0KindInference ()) + type family AnyOfKindSym1 (k0123456789876543210 :: Type) :: k0123456789876543210 where + AnyOfKindSym1 k0123456789876543210 = AnyOfKind k0123456789876543210
tests/compile-and-dump/Singletons/T402.hs view
@@ -1,7 +1,7 @@-module T402 where--import Data.Kind-import Data.Singletons.TH--type family Any :: k-$(singletons [d| type AnyOfKind (k :: Type) = Any :: k |])+module T402 where + +import Data.Kind +import Data.Singletons.TH + +type family Any :: k +$(singletons [d| type AnyOfKind (k :: Type) = Any :: k |])
tests/compile-and-dump/Singletons/T410.golden view
@@ -1,61 +1,61 @@-Singletons/T410.hs:(0,0)-(0,0): Splicing declarations- promote- [d| class Eq a where- equals :: a -> a -> Bool- - instance Eq () where- equals () () = True |]- ======>- class Eq a where- equals :: a -> a -> Bool- instance Eq () where- equals () () = True- type EqualsSym0 :: forall a. (~>) a ((~>) a Bool)- data EqualsSym0 :: (~>) a ((~>) a Bool)- where- EqualsSym0KindInference :: SameKind (Apply EqualsSym0 arg) (EqualsSym1 arg) =>- EqualsSym0 a0123456789876543210- type instance Apply EqualsSym0 a0123456789876543210 = EqualsSym1 a0123456789876543210- instance Data.Singletons.TH.SuppressUnusedWarnings.SuppressUnusedWarnings EqualsSym0 where- Data.Singletons.TH.SuppressUnusedWarnings.suppressUnusedWarnings- = snd (((,) EqualsSym0KindInference) ())- type EqualsSym1 :: forall a. a -> (~>) a Bool- data EqualsSym1 (a0123456789876543210 :: a) :: (~>) a Bool- where- EqualsSym1KindInference :: SameKind (Apply (EqualsSym1 a0123456789876543210) arg) (EqualsSym2 a0123456789876543210 arg) =>- EqualsSym1 a0123456789876543210 a0123456789876543210- type instance Apply (EqualsSym1 a0123456789876543210) a0123456789876543210 = Equals a0123456789876543210 a0123456789876543210- instance Data.Singletons.TH.SuppressUnusedWarnings.SuppressUnusedWarnings (EqualsSym1 a0123456789876543210) where- Data.Singletons.TH.SuppressUnusedWarnings.suppressUnusedWarnings- = snd (((,) EqualsSym1KindInference) ())- type EqualsSym2 :: forall a. a -> a -> Bool- type family EqualsSym2 (a0123456789876543210 :: a) (a0123456789876543210 :: a) :: Bool where- EqualsSym2 a0123456789876543210 a0123456789876543210 = Equals a0123456789876543210 a0123456789876543210- class PEq a where- type family Equals (arg :: a) (arg :: a) :: Bool- type Equals_0123456789876543210 :: () -> () -> Bool- type family Equals_0123456789876543210 (a :: ()) (a :: ()) :: Bool where- Equals_0123456789876543210 '() '() = TrueSym0- type Equals_0123456789876543210Sym0 :: (~>) () ((~>) () Bool)- data Equals_0123456789876543210Sym0 :: (~>) () ((~>) () Bool)- where- Equals_0123456789876543210Sym0KindInference :: SameKind (Apply Equals_0123456789876543210Sym0 arg) (Equals_0123456789876543210Sym1 arg) =>- Equals_0123456789876543210Sym0 a0123456789876543210- type instance Apply Equals_0123456789876543210Sym0 a0123456789876543210 = Equals_0123456789876543210Sym1 a0123456789876543210- instance Data.Singletons.TH.SuppressUnusedWarnings.SuppressUnusedWarnings Equals_0123456789876543210Sym0 where- Data.Singletons.TH.SuppressUnusedWarnings.suppressUnusedWarnings- = snd (((,) Equals_0123456789876543210Sym0KindInference) ())- type Equals_0123456789876543210Sym1 :: () -> (~>) () Bool- data Equals_0123456789876543210Sym1 (a0123456789876543210 :: ()) :: (~>) () Bool- where- Equals_0123456789876543210Sym1KindInference :: SameKind (Apply (Equals_0123456789876543210Sym1 a0123456789876543210) arg) (Equals_0123456789876543210Sym2 a0123456789876543210 arg) =>- Equals_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (Equals_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Equals_0123456789876543210 a0123456789876543210 a0123456789876543210- instance Data.Singletons.TH.SuppressUnusedWarnings.SuppressUnusedWarnings (Equals_0123456789876543210Sym1 a0123456789876543210) where- Data.Singletons.TH.SuppressUnusedWarnings.suppressUnusedWarnings- = snd (((,) Equals_0123456789876543210Sym1KindInference) ())- type Equals_0123456789876543210Sym2 :: () -> () -> Bool- type family Equals_0123456789876543210Sym2 (a0123456789876543210 :: ()) (a0123456789876543210 :: ()) :: Bool where- Equals_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Equals_0123456789876543210 a0123456789876543210 a0123456789876543210- instance PEq () where- type Equals a a = Apply (Apply Equals_0123456789876543210Sym0 a) a+Singletons/T410.hs:(0,0)-(0,0): Splicing declarations + promote + [d| class Eq a where + equals :: a -> a -> Bool + + instance Eq () where + equals () () = True |] + ======> + class Eq a where + equals :: a -> a -> Bool + instance Eq () where + equals () () = True + type EqualsSym0 :: forall a. (~>) a ((~>) a Bool) + data EqualsSym0 :: (~>) a ((~>) a Bool) + where + EqualsSym0KindInference :: SameKind (Apply EqualsSym0 arg) (EqualsSym1 arg) => + EqualsSym0 a0123456789876543210 + type instance Apply EqualsSym0 a0123456789876543210 = EqualsSym1 a0123456789876543210 + instance Data.Singletons.TH.SuppressUnusedWarnings.SuppressUnusedWarnings EqualsSym0 where + Data.Singletons.TH.SuppressUnusedWarnings.suppressUnusedWarnings + = snd ((,) EqualsSym0KindInference ()) + type EqualsSym1 :: forall a. a -> (~>) a Bool + data EqualsSym1 (a0123456789876543210 :: a) :: (~>) a Bool + where + EqualsSym1KindInference :: SameKind (Apply (EqualsSym1 a0123456789876543210) arg) (EqualsSym2 a0123456789876543210 arg) => + EqualsSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (EqualsSym1 a0123456789876543210) a0123456789876543210 = Equals a0123456789876543210 a0123456789876543210 + instance Data.Singletons.TH.SuppressUnusedWarnings.SuppressUnusedWarnings (EqualsSym1 a0123456789876543210) where + Data.Singletons.TH.SuppressUnusedWarnings.suppressUnusedWarnings + = snd ((,) EqualsSym1KindInference ()) + type EqualsSym2 :: forall a. a -> a -> Bool + type family EqualsSym2 (a0123456789876543210 :: a) (a0123456789876543210 :: a) :: Bool where + EqualsSym2 a0123456789876543210 a0123456789876543210 = Equals a0123456789876543210 a0123456789876543210 + class PEq a where + type family Equals (arg :: a) (arg :: a) :: Bool + type Equals_0123456789876543210 :: () -> () -> Bool + type family Equals_0123456789876543210 (a :: ()) (a :: ()) :: Bool where + Equals_0123456789876543210 '() '() = TrueSym0 + type Equals_0123456789876543210Sym0 :: (~>) () ((~>) () Bool) + data Equals_0123456789876543210Sym0 :: (~>) () ((~>) () Bool) + where + Equals_0123456789876543210Sym0KindInference :: SameKind (Apply Equals_0123456789876543210Sym0 arg) (Equals_0123456789876543210Sym1 arg) => + Equals_0123456789876543210Sym0 a0123456789876543210 + type instance Apply Equals_0123456789876543210Sym0 a0123456789876543210 = Equals_0123456789876543210Sym1 a0123456789876543210 + instance Data.Singletons.TH.SuppressUnusedWarnings.SuppressUnusedWarnings Equals_0123456789876543210Sym0 where + Data.Singletons.TH.SuppressUnusedWarnings.suppressUnusedWarnings + = snd ((,) Equals_0123456789876543210Sym0KindInference ()) + type Equals_0123456789876543210Sym1 :: () -> (~>) () Bool + data Equals_0123456789876543210Sym1 (a0123456789876543210 :: ()) :: (~>) () Bool + where + Equals_0123456789876543210Sym1KindInference :: SameKind (Apply (Equals_0123456789876543210Sym1 a0123456789876543210) arg) (Equals_0123456789876543210Sym2 a0123456789876543210 arg) => + Equals_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (Equals_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Equals_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance Data.Singletons.TH.SuppressUnusedWarnings.SuppressUnusedWarnings (Equals_0123456789876543210Sym1 a0123456789876543210) where + Data.Singletons.TH.SuppressUnusedWarnings.suppressUnusedWarnings + = snd ((,) Equals_0123456789876543210Sym1KindInference ()) + type Equals_0123456789876543210Sym2 :: () -> () -> Bool + type family Equals_0123456789876543210Sym2 (a0123456789876543210 :: ()) (a0123456789876543210 :: ()) :: Bool where + Equals_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Equals_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PEq () where + type Equals a a = Apply (Apply Equals_0123456789876543210Sym0 a) a
tests/compile-and-dump/Singletons/T410.hs view
@@ -1,12 +1,12 @@-module T410 where--import Data.Bool.Singletons-import Data.Singletons-import Data.Singletons.TH (promote)--$(promote [d|- class Eq a where- equals :: a -> a -> Bool- instance Eq () where- equals () () = True- |])+module T410 where + +import Data.Bool.Singletons +import Data.Singletons +import Data.Singletons.TH (promote) + +$(promote [d| + class Eq a where + equals :: a -> a -> Bool + instance Eq () where + equals () () = True + |])
tests/compile-and-dump/Singletons/T412.golden view
@@ -1,399 +1,399 @@-Singletons/T412.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| infixr 5 `D1`, `MkD1`, `d1A`, `d1B`- infixl 5 `T1a`, `T1b`- infix 5 `C1`- - class C1 a b where- infix 6 `m1`- m1 :: a -> b -> Bool- type T1a a b = Either a b- type family T1b a b where- T1b a b = Either a b- data D1 a b = MkD1 {d1A :: a, d1B :: b} |]- ======>- infix 5 `C1`- class C1 a b where- infix 6 `m1`- m1 :: a -> b -> Bool- infixl 5 `T1a`- infixl 5 `T1b`- type T1a a b = Either a b- type family T1b a b where- T1b a b = Either a b- infixr 5 `D1`- infixr 5 `MkD1`- infixr 5 `d1A`- infixr 5 `d1B`- data D1 a b = MkD1 {d1A :: a, d1B :: b}- data T1aSym0 a0123456789876543210- where- T1aSym0KindInference :: SameKind (Apply T1aSym0 arg) (T1aSym1 arg) =>- T1aSym0 a0123456789876543210- type instance Apply T1aSym0 a0123456789876543210 = T1aSym1 a0123456789876543210- instance SuppressUnusedWarnings T1aSym0 where- suppressUnusedWarnings = snd (((,) T1aSym0KindInference) ())- infixl 5 `T1aSym0`- data T1aSym1 a0123456789876543210 b0123456789876543210- where- T1aSym1KindInference :: SameKind (Apply (T1aSym1 a0123456789876543210) arg) (T1aSym2 a0123456789876543210 arg) =>- T1aSym1 a0123456789876543210 b0123456789876543210- type instance Apply (T1aSym1 a0123456789876543210) b0123456789876543210 = T1a a0123456789876543210 b0123456789876543210- instance SuppressUnusedWarnings (T1aSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) T1aSym1KindInference) ())- infixl 5 `T1aSym1`- type family T1aSym2 a0123456789876543210 b0123456789876543210 where- T1aSym2 a0123456789876543210 b0123456789876543210 = T1a a0123456789876543210 b0123456789876543210- infixl 5 `T1aSym2`- data T1bSym0 a0123456789876543210- where- T1bSym0KindInference :: SameKind (Apply T1bSym0 arg) (T1bSym1 arg) =>- T1bSym0 a0123456789876543210- type instance Apply T1bSym0 a0123456789876543210 = T1bSym1 a0123456789876543210- instance SuppressUnusedWarnings T1bSym0 where- suppressUnusedWarnings = snd (((,) T1bSym0KindInference) ())- infixl 5 `T1bSym0`- data T1bSym1 a0123456789876543210 b0123456789876543210- where- T1bSym1KindInference :: SameKind (Apply (T1bSym1 a0123456789876543210) arg) (T1bSym2 a0123456789876543210 arg) =>- T1bSym1 a0123456789876543210 b0123456789876543210- type instance Apply (T1bSym1 a0123456789876543210) b0123456789876543210 = T1b a0123456789876543210 b0123456789876543210- instance SuppressUnusedWarnings (T1bSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) T1bSym1KindInference) ())- infixl 5 `T1bSym1`- type family T1bSym2 a0123456789876543210 b0123456789876543210 where- T1bSym2 a0123456789876543210 b0123456789876543210 = T1b a0123456789876543210 b0123456789876543210- infixl 5 `T1bSym2`- type MkD1Sym0 :: forall a b. (~>) a ((~>) b (D1 a b))- data MkD1Sym0 :: (~>) a ((~>) b (D1 a b))- where- MkD1Sym0KindInference :: SameKind (Apply MkD1Sym0 arg) (MkD1Sym1 arg) =>- MkD1Sym0 a0123456789876543210- type instance Apply MkD1Sym0 a0123456789876543210 = MkD1Sym1 a0123456789876543210- instance SuppressUnusedWarnings MkD1Sym0 where- suppressUnusedWarnings = snd (((,) MkD1Sym0KindInference) ())- infixr 5 `MkD1Sym0`- type MkD1Sym1 :: forall a b. a -> (~>) b (D1 a b)- data MkD1Sym1 (a0123456789876543210 :: a) :: (~>) b (D1 a b)- where- MkD1Sym1KindInference :: SameKind (Apply (MkD1Sym1 a0123456789876543210) arg) (MkD1Sym2 a0123456789876543210 arg) =>- MkD1Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (MkD1Sym1 a0123456789876543210) a0123456789876543210 = MkD1 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (MkD1Sym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) MkD1Sym1KindInference) ())- infixr 5 `MkD1Sym1`- type MkD1Sym2 :: forall a b. a -> b -> D1 a b- type family MkD1Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: D1 a b where- MkD1Sym2 a0123456789876543210 a0123456789876543210 = MkD1 a0123456789876543210 a0123456789876543210- infixr 5 `MkD1Sym2`- type D1BSym0 :: forall a b. (~>) (D1 a b) b- data D1BSym0 :: (~>) (D1 a b) b- where- D1BSym0KindInference :: SameKind (Apply D1BSym0 arg) (D1BSym1 arg) =>- D1BSym0 a0123456789876543210- type instance Apply D1BSym0 a0123456789876543210 = D1B a0123456789876543210- instance SuppressUnusedWarnings D1BSym0 where- suppressUnusedWarnings = snd (((,) D1BSym0KindInference) ())- infixr 5 `D1BSym0`- type D1BSym1 :: forall a b. D1 a b -> b- type family D1BSym1 (a0123456789876543210 :: D1 a b) :: b where- D1BSym1 a0123456789876543210 = D1B a0123456789876543210- infixr 5 `D1BSym1`- type D1ASym0 :: forall a b. (~>) (D1 a b) a- data D1ASym0 :: (~>) (D1 a b) a- where- D1ASym0KindInference :: SameKind (Apply D1ASym0 arg) (D1ASym1 arg) =>- D1ASym0 a0123456789876543210- type instance Apply D1ASym0 a0123456789876543210 = D1A a0123456789876543210- instance SuppressUnusedWarnings D1ASym0 where- suppressUnusedWarnings = snd (((,) D1ASym0KindInference) ())- infixr 5 `D1ASym0`- type D1ASym1 :: forall a b. D1 a b -> a- type family D1ASym1 (a0123456789876543210 :: D1 a b) :: a where- D1ASym1 a0123456789876543210 = D1A a0123456789876543210- infixr 5 `D1ASym1`- type D1B :: forall a b. D1 a b -> b- type family D1B (a :: D1 a b) :: b where- D1B (MkD1 _ field) = field- type D1A :: forall a b. D1 a b -> a- type family D1A (a :: D1 a b) :: a where- D1A (MkD1 field _) = field- infixr 5 `D1B`- infixr 5 `D1A`- infix 5 `PC1`- type M1Sym0 :: forall a b. (~>) a ((~>) b Bool)- data M1Sym0 :: (~>) a ((~>) b Bool)- where- M1Sym0KindInference :: SameKind (Apply M1Sym0 arg) (M1Sym1 arg) =>- M1Sym0 a0123456789876543210- type instance Apply M1Sym0 a0123456789876543210 = M1Sym1 a0123456789876543210- instance SuppressUnusedWarnings M1Sym0 where- suppressUnusedWarnings = snd (((,) M1Sym0KindInference) ())- infix 6 `M1Sym0`- type M1Sym1 :: forall a b. a -> (~>) b Bool- data M1Sym1 (a0123456789876543210 :: a) :: (~>) b Bool- where- M1Sym1KindInference :: SameKind (Apply (M1Sym1 a0123456789876543210) arg) (M1Sym2 a0123456789876543210 arg) =>- M1Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (M1Sym1 a0123456789876543210) a0123456789876543210 = M1 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (M1Sym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) M1Sym1KindInference) ())- infix 6 `M1Sym1`- type M1Sym2 :: forall a b. a -> b -> Bool- type family M1Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: Bool where- M1Sym2 a0123456789876543210 a0123456789876543210 = M1 a0123456789876543210 a0123456789876543210- infix 6 `M1Sym2`- class PC1 a b where- type family M1 (arg :: a) (arg :: b) :: Bool- infix 6 `M1`- infixr 5 `sD1B`- infixr 5 `sD1A`- infixr 5 `SMkD1`- infix 5 `SC1`- sD1B ::- forall a b (t :: D1 a b). Sing t -> Sing (Apply D1BSym0 t :: b)- sD1A ::- forall a b (t :: D1 a b). Sing t -> Sing (Apply D1ASym0 t :: a)- sD1B (SMkD1 _ (sField :: Sing field)) = sField- sD1A (SMkD1 (sField :: Sing field) _) = sField- instance SingI (D1BSym0 :: (~>) (D1 a b) b) where- sing = (singFun1 @D1BSym0) sD1B- instance SingI (D1ASym0 :: (~>) (D1 a b) a) where- sing = (singFun1 @D1ASym0) sD1A- data SD1 :: forall a b. D1 a b -> Type- where- SMkD1 :: forall a b (n :: a) (n :: b).- (Sing n) -> (Sing n) -> SD1 (MkD1 n n :: D1 a b)- type instance Sing @(D1 a b) = SD1- instance (SingKind a, SingKind b) => SingKind (D1 a b) where- type Demote (D1 a b) = D1 (Demote a) (Demote b)- fromSing (SMkD1 b b) = (MkD1 (fromSing b)) (fromSing b)- toSing (MkD1 (b :: Demote a) (b :: Demote b))- = case ((,) (toSing b :: SomeSing a)) (toSing b :: SomeSing b) of- (,) (SomeSing c) (SomeSing c) -> SomeSing ((SMkD1 c) c)- class SC1 a b where- sM1 ::- forall (t :: a) (t :: b). Sing t- -> Sing t -> Sing (Apply (Apply M1Sym0 t) t :: Bool)- infix 6 `sM1`- instance (SingI n, SingI n) => SingI (MkD1 (n :: a) (n :: b)) where- sing = (SMkD1 sing) sing- instance SingI n => SingI1 (MkD1 (n :: a)) where- liftSing = SMkD1 sing- instance SingI2 MkD1 where- liftSing2 = SMkD1- instance SingI (MkD1Sym0 :: (~>) a ((~>) b (D1 a b))) where- sing = (singFun2 @MkD1Sym0) SMkD1- instance SingI d =>- SingI (MkD1Sym1 (d :: a) :: (~>) b (D1 a b)) where- sing = (singFun1 @(MkD1Sym1 (d :: a))) (SMkD1 (sing @d))- instance SingI1 (MkD1Sym1 :: a -> (~>) b (D1 a b)) where- liftSing (s :: Sing (d :: a))- = (singFun1 @(MkD1Sym1 (d :: a))) (SMkD1 s)- instance SC1 a b => SingI (M1Sym0 :: (~>) a ((~>) b Bool)) where- sing = (singFun2 @M1Sym0) sM1- instance (SC1 a b, SingI d) =>- SingI (M1Sym1 (d :: a) :: (~>) b Bool) where- sing = (singFun1 @(M1Sym1 (d :: a))) (sM1 (sing @d))- instance SC1 a b => SingI1 (M1Sym1 :: a -> (~>) b Bool) where- liftSing (s :: Sing (d :: a))- = (singFun1 @(M1Sym1 (d :: a))) (sM1 s)-Singletons/T412.hs:0:0:: Splicing declarations- genSingletons [''C2, ''T2a, ''T2b, ''D2]- ======>- type M2Sym0 :: forall a b. (~>) a ((~>) b Bool)- data M2Sym0 :: (~>) a ((~>) b Bool)- where- M2Sym0KindInference :: SameKind (Apply M2Sym0 arg) (M2Sym1 arg) =>- M2Sym0 a0123456789876543210- type instance Apply M2Sym0 a0123456789876543210 = M2Sym1 a0123456789876543210- instance SuppressUnusedWarnings M2Sym0 where- suppressUnusedWarnings = snd (((,) M2Sym0KindInference) ())- infix 6 `M2Sym0`- type M2Sym1 :: forall a b. a -> (~>) b Bool- data M2Sym1 (a0123456789876543210 :: a) :: (~>) b Bool- where- M2Sym1KindInference :: SameKind (Apply (M2Sym1 a0123456789876543210) arg) (M2Sym2 a0123456789876543210 arg) =>- M2Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (M2Sym1 a0123456789876543210) a0123456789876543210 = M2 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (M2Sym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) M2Sym1KindInference) ())- infix 6 `M2Sym1`- type M2Sym2 :: forall a b. a -> b -> Bool- type family M2Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: Bool where- M2Sym2 a0123456789876543210 a0123456789876543210 = M2 a0123456789876543210 a0123456789876543210- infix 6 `M2Sym2`- type PC2 :: Type -> Type -> Constraint- class PC2 (a :: Type) (b :: Type) where- type family M2 (arg :: a) (arg :: b) :: Bool- infix 5 `PC2`- infix 6 `M2`- class SC2 (a :: Type) (b :: Type) where- sM2 ::- forall (t :: a) (t :: b). Sing t- -> Sing t -> Sing (Apply (Apply M2Sym0 t) t :: Bool)- type SC2 :: Type -> Type -> Constraint- infix 5 `SC2`- infix 6 `sM2`- instance SC2 a b => SingI (M2Sym0 :: (~>) a ((~>) b Bool)) where- sing = (singFun2 @M2Sym0) sM2- instance (SC2 a b, SingI d) =>- SingI (M2Sym1 (d :: a) :: (~>) b Bool) where- sing = (singFun1 @(M2Sym1 (d :: a))) (sM2 (sing @d))- instance SC2 a b => SingI1 (M2Sym1 :: a -> (~>) b Bool) where- liftSing (s :: Sing (d :: a))- = (singFun1 @(M2Sym1 (d :: a))) (sM2 s)- type T2aSym0 :: (~>) Type ((~>) Type Type)- data T2aSym0 :: (~>) Type ((~>) Type Type)- where- T2aSym0KindInference :: SameKind (Apply T2aSym0 arg) (T2aSym1 arg) =>- T2aSym0 a0123456789876543210- type instance Apply T2aSym0 a0123456789876543210 = T2aSym1 a0123456789876543210- instance SuppressUnusedWarnings T2aSym0 where- suppressUnusedWarnings = snd (((,) T2aSym0KindInference) ())- infixl 5 `T2aSym0`- type T2aSym1 :: Type -> (~>) Type Type- data T2aSym1 (a0123456789876543210 :: Type) :: (~>) Type Type- where- T2aSym1KindInference :: SameKind (Apply (T2aSym1 a0123456789876543210) arg) (T2aSym2 a0123456789876543210 arg) =>- T2aSym1 a0123456789876543210 a0123456789876543210- type instance Apply (T2aSym1 a0123456789876543210) a0123456789876543210 = T2a a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (T2aSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) T2aSym1KindInference) ())- infixl 5 `T2aSym1`- type T2aSym2 :: Type -> Type -> Type- type family T2aSym2 (a0123456789876543210 :: Type) (a0123456789876543210 :: Type) :: Type where- T2aSym2 a0123456789876543210 a0123456789876543210 = T2a a0123456789876543210 a0123456789876543210- infixl 5 `T2aSym2`- type T2bSym0 :: (~>) Type ((~>) Type Type)- data T2bSym0 :: (~>) Type ((~>) Type Type)- where- T2bSym0KindInference :: SameKind (Apply T2bSym0 arg) (T2bSym1 arg) =>- T2bSym0 a0123456789876543210- type instance Apply T2bSym0 a0123456789876543210 = T2bSym1 a0123456789876543210- instance SuppressUnusedWarnings T2bSym0 where- suppressUnusedWarnings = snd (((,) T2bSym0KindInference) ())- infixl 5 `T2bSym0`- type T2bSym1 :: Type -> (~>) Type Type- data T2bSym1 (a0123456789876543210 :: Type) :: (~>) Type Type- where- T2bSym1KindInference :: SameKind (Apply (T2bSym1 a0123456789876543210) arg) (T2bSym2 a0123456789876543210 arg) =>- T2bSym1 a0123456789876543210 a0123456789876543210- type instance Apply (T2bSym1 a0123456789876543210) a0123456789876543210 = T2b a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (T2bSym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) T2bSym1KindInference) ())- infixl 5 `T2bSym1`- type T2bSym2 :: Type -> Type -> Type- type family T2bSym2 (a0123456789876543210 :: Type) (a0123456789876543210 :: Type) :: Type where- T2bSym2 a0123456789876543210 a0123456789876543210 = T2b a0123456789876543210 a0123456789876543210- infixl 5 `T2bSym2`- type MkD2Sym0 :: forall (a :: Type)- (b :: Type). (~>) a ((~>) b (D2 (a :: Type) (b :: Type)))- data MkD2Sym0 :: (~>) a ((~>) b (D2 (a :: Type) (b :: Type)))- where- MkD2Sym0KindInference :: SameKind (Apply MkD2Sym0 arg) (MkD2Sym1 arg) =>- MkD2Sym0 a0123456789876543210- type instance Apply MkD2Sym0 a0123456789876543210 = MkD2Sym1 a0123456789876543210- instance SuppressUnusedWarnings MkD2Sym0 where- suppressUnusedWarnings = snd (((,) MkD2Sym0KindInference) ())- infixr 5 `MkD2Sym0`- type MkD2Sym1 :: forall (a :: Type) (b :: Type). a- -> (~>) b (D2 (a :: Type) (b :: Type))- data MkD2Sym1 (a0123456789876543210 :: a) :: (~>) b (D2 (a :: Type) (b :: Type))- where- MkD2Sym1KindInference :: SameKind (Apply (MkD2Sym1 a0123456789876543210) arg) (MkD2Sym2 a0123456789876543210 arg) =>- MkD2Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (MkD2Sym1 a0123456789876543210) a0123456789876543210 = 'MkD2 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (MkD2Sym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) MkD2Sym1KindInference) ())- infixr 5 `MkD2Sym1`- type MkD2Sym2 :: forall (a :: Type) (b :: Type). a- -> b -> D2 (a :: Type) (b :: Type)- type family MkD2Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: D2 (a :: Type) (b :: Type) where- MkD2Sym2 a0123456789876543210 a0123456789876543210 = 'MkD2 a0123456789876543210 a0123456789876543210- infixr 5 `MkD2Sym2`- infixr 5 `D2A`- infixr 5 `D2B`- type D2BSym0 :: forall (a :: Type)- (b :: Type). (~>) (D2 (a :: Type) (b :: Type)) b- data D2BSym0 :: (~>) (D2 (a :: Type) (b :: Type)) b- where- D2BSym0KindInference :: SameKind (Apply D2BSym0 arg) (D2BSym1 arg) =>- D2BSym0 a0123456789876543210- type instance Apply D2BSym0 a0123456789876543210 = D2B a0123456789876543210- instance SuppressUnusedWarnings D2BSym0 where- suppressUnusedWarnings = snd (((,) D2BSym0KindInference) ())- type D2BSym1 :: forall (a :: Type)- (b :: Type). D2 (a :: Type) (b :: Type) -> b- type family D2BSym1 (a0123456789876543210 :: D2 (a :: Type) (b :: Type)) :: b where- D2BSym1 a0123456789876543210 = D2B a0123456789876543210- type D2ASym0 :: forall (a :: Type)- (b :: Type). (~>) (D2 (a :: Type) (b :: Type)) a- data D2ASym0 :: (~>) (D2 (a :: Type) (b :: Type)) a- where- D2ASym0KindInference :: SameKind (Apply D2ASym0 arg) (D2ASym1 arg) =>- D2ASym0 a0123456789876543210- type instance Apply D2ASym0 a0123456789876543210 = D2A a0123456789876543210- instance SuppressUnusedWarnings D2ASym0 where- suppressUnusedWarnings = snd (((,) D2ASym0KindInference) ())- type D2ASym1 :: forall (a :: Type)- (b :: Type). D2 (a :: Type) (b :: Type) -> a- type family D2ASym1 (a0123456789876543210 :: D2 (a :: Type) (b :: Type)) :: a where- D2ASym1 a0123456789876543210 = D2A a0123456789876543210- type D2B :: forall (a :: Type)- (b :: Type). D2 (a :: Type) (b :: Type) -> b- type family D2B (a :: D2 (a :: Type) (b :: Type)) :: b where- D2B ('MkD2 _ field) = field- type D2A :: forall (a :: Type)- (b :: Type). D2 (a :: Type) (b :: Type) -> a- type family D2A (a :: D2 (a :: Type) (b :: Type)) :: a where- D2A ('MkD2 field _) = field- sD2B ::- forall (a :: Type)- (b :: Type)- (t :: D2 (a :: Type) (b :: Type)). Sing t- -> Sing (Apply D2BSym0 t :: b)- sD2A ::- forall (a :: Type)- (b :: Type)- (t :: D2 (a :: Type) (b :: Type)). Sing t- -> Sing (Apply D2ASym0 t :: a)- sD2B (SMkD2 _ (sField :: Sing field)) = sField- sD2A (SMkD2 (sField :: Sing field) _) = sField- instance SingI (D2BSym0 :: (~>) (D2 (a :: Type) (b :: Type)) b) where- sing = (singFun1 @D2BSym0) sD2B- instance SingI (D2ASym0 :: (~>) (D2 (a :: Type) (b :: Type)) a) where- sing = (singFun1 @D2ASym0) sD2A- type SD2 :: forall (a :: Type) (b :: Type). D2 a b -> Type- data SD2 :: forall (a :: Type) (b :: Type). D2 a b -> Type- where- SMkD2 :: forall (a :: Type) (b :: Type) (n :: a) (n :: b).- (Sing n) ->- (Sing n) ->- SD2 ('MkD2 n n :: D2 (a :: Type) (b :: Type))- type instance Sing @(D2 a b) = SD2- instance (SingKind a, SingKind b) => SingKind (D2 a b) where- type Demote (D2 a b) = D2 (Demote a) (Demote b)- fromSing (SMkD2 b b) = (MkD2 (fromSing b)) (fromSing b)- toSing (MkD2 (b :: Demote a) (b :: Demote b))- = case ((,) (toSing b :: SomeSing a)) (toSing b :: SomeSing b) of- (,) (SomeSing c) (SomeSing c) -> SomeSing ((SMkD2 c) c)- infixr 5 `SMkD2`- infixr 5 `sD2A`- infixr 5 `sD2B`- instance (SingI n, SingI n) =>- SingI ('MkD2 (n :: a) (n :: b)) where- sing = (SMkD2 sing) sing- instance SingI n => SingI1 ('MkD2 (n :: a)) where- liftSing = SMkD2 sing- instance SingI2 'MkD2 where- liftSing2 = SMkD2- instance SingI (MkD2Sym0 :: (~>) a ((~>) b (D2 (a :: Type) (b :: Type)))) where- sing = (singFun2 @MkD2Sym0) SMkD2- instance SingI d =>- SingI (MkD2Sym1 (d :: a) :: (~>) b (D2 (a :: Type) (b :: Type))) where- sing = (singFun1 @(MkD2Sym1 (d :: a))) (SMkD2 (sing @d))- instance SingI1 (MkD2Sym1 :: a- -> (~>) b (D2 (a :: Type) (b :: Type))) where- liftSing (s :: Sing (d :: a))- = (singFun1 @(MkD2Sym1 (d :: a))) (SMkD2 s)+Singletons/T412.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| infixr 5 `D1`, `MkD1`, `d1A`, `d1B` + infixl 5 `T1a`, `T1b` + infix 5 `C1` + + class C1 a b where + infix 6 `m1` + m1 :: a -> b -> Bool + type T1a a b = Either a b + type family T1b a b where + T1b a b = Either a b + data D1 a b = MkD1 {d1A :: a, d1B :: b} |] + ======> + infix 5 `C1` + class C1 a b where + infix 6 `m1` + m1 :: a -> b -> Bool + infixl 5 `T1a` + infixl 5 `T1b` + type T1a a b = Either a b + type family T1b a b where + T1b a b = Either a b + infixr 5 `D1` + infixr 5 `MkD1` + infixr 5 `d1A` + infixr 5 `d1B` + data D1 a b = MkD1 {d1A :: a, d1B :: b} + data T1aSym0 a0123456789876543210 + where + T1aSym0KindInference :: SameKind (Apply T1aSym0 arg) (T1aSym1 arg) => + T1aSym0 a0123456789876543210 + type instance Apply T1aSym0 a0123456789876543210 = T1aSym1 a0123456789876543210 + instance SuppressUnusedWarnings T1aSym0 where + suppressUnusedWarnings = snd ((,) T1aSym0KindInference ()) + infixl 5 `T1aSym0` + data T1aSym1 a0123456789876543210 b0123456789876543210 + where + T1aSym1KindInference :: SameKind (Apply (T1aSym1 a0123456789876543210) arg) (T1aSym2 a0123456789876543210 arg) => + T1aSym1 a0123456789876543210 b0123456789876543210 + type instance Apply (T1aSym1 a0123456789876543210) b0123456789876543210 = T1a a0123456789876543210 b0123456789876543210 + instance SuppressUnusedWarnings (T1aSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) T1aSym1KindInference ()) + infixl 5 `T1aSym1` + type family T1aSym2 a0123456789876543210 b0123456789876543210 where + T1aSym2 a0123456789876543210 b0123456789876543210 = T1a a0123456789876543210 b0123456789876543210 + infixl 5 `T1aSym2` + data T1bSym0 a0123456789876543210 + where + T1bSym0KindInference :: SameKind (Apply T1bSym0 arg) (T1bSym1 arg) => + T1bSym0 a0123456789876543210 + type instance Apply T1bSym0 a0123456789876543210 = T1bSym1 a0123456789876543210 + instance SuppressUnusedWarnings T1bSym0 where + suppressUnusedWarnings = snd ((,) T1bSym0KindInference ()) + infixl 5 `T1bSym0` + data T1bSym1 a0123456789876543210 b0123456789876543210 + where + T1bSym1KindInference :: SameKind (Apply (T1bSym1 a0123456789876543210) arg) (T1bSym2 a0123456789876543210 arg) => + T1bSym1 a0123456789876543210 b0123456789876543210 + type instance Apply (T1bSym1 a0123456789876543210) b0123456789876543210 = T1b a0123456789876543210 b0123456789876543210 + instance SuppressUnusedWarnings (T1bSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) T1bSym1KindInference ()) + infixl 5 `T1bSym1` + type family T1bSym2 a0123456789876543210 b0123456789876543210 where + T1bSym2 a0123456789876543210 b0123456789876543210 = T1b a0123456789876543210 b0123456789876543210 + infixl 5 `T1bSym2` + type MkD1Sym0 :: forall a b. (~>) a ((~>) b (D1 a b)) + data MkD1Sym0 :: (~>) a ((~>) b (D1 a b)) + where + MkD1Sym0KindInference :: SameKind (Apply MkD1Sym0 arg) (MkD1Sym1 arg) => + MkD1Sym0 a0123456789876543210 + type instance Apply MkD1Sym0 a0123456789876543210 = MkD1Sym1 a0123456789876543210 + instance SuppressUnusedWarnings MkD1Sym0 where + suppressUnusedWarnings = snd ((,) MkD1Sym0KindInference ()) + infixr 5 `MkD1Sym0` + type MkD1Sym1 :: forall a b. a -> (~>) b (D1 a b) + data MkD1Sym1 (a0123456789876543210 :: a) :: (~>) b (D1 a b) + where + MkD1Sym1KindInference :: SameKind (Apply (MkD1Sym1 a0123456789876543210) arg) (MkD1Sym2 a0123456789876543210 arg) => + MkD1Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (MkD1Sym1 a0123456789876543210) a0123456789876543210 = MkD1 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (MkD1Sym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) MkD1Sym1KindInference ()) + infixr 5 `MkD1Sym1` + type MkD1Sym2 :: forall a b. a -> b -> D1 a b + type family MkD1Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: D1 a b where + MkD1Sym2 a0123456789876543210 a0123456789876543210 = MkD1 a0123456789876543210 a0123456789876543210 + infixr 5 `MkD1Sym2` + type D1BSym0 :: forall a b. (~>) (D1 a b) b + data D1BSym0 :: (~>) (D1 a b) b + where + D1BSym0KindInference :: SameKind (Apply D1BSym0 arg) (D1BSym1 arg) => + D1BSym0 a0123456789876543210 + type instance Apply D1BSym0 a0123456789876543210 = D1B a0123456789876543210 + instance SuppressUnusedWarnings D1BSym0 where + suppressUnusedWarnings = snd ((,) D1BSym0KindInference ()) + infixr 5 `D1BSym0` + type D1BSym1 :: forall a b. D1 a b -> b + type family D1BSym1 (a0123456789876543210 :: D1 a b) :: b where + D1BSym1 a0123456789876543210 = D1B a0123456789876543210 + infixr 5 `D1BSym1` + type D1ASym0 :: forall a b. (~>) (D1 a b) a + data D1ASym0 :: (~>) (D1 a b) a + where + D1ASym0KindInference :: SameKind (Apply D1ASym0 arg) (D1ASym1 arg) => + D1ASym0 a0123456789876543210 + type instance Apply D1ASym0 a0123456789876543210 = D1A a0123456789876543210 + instance SuppressUnusedWarnings D1ASym0 where + suppressUnusedWarnings = snd ((,) D1ASym0KindInference ()) + infixr 5 `D1ASym0` + type D1ASym1 :: forall a b. D1 a b -> a + type family D1ASym1 (a0123456789876543210 :: D1 a b) :: a where + D1ASym1 a0123456789876543210 = D1A a0123456789876543210 + infixr 5 `D1ASym1` + type D1B :: forall a b. D1 a b -> b + type family D1B (a :: D1 a b) :: b where + D1B (MkD1 _ field) = field + type D1A :: forall a b. D1 a b -> a + type family D1A (a :: D1 a b) :: a where + D1A (MkD1 field _) = field + infixr 5 `D1B` + infixr 5 `D1A` + infix 5 `PC1` + type M1Sym0 :: forall a b. (~>) a ((~>) b Bool) + data M1Sym0 :: (~>) a ((~>) b Bool) + where + M1Sym0KindInference :: SameKind (Apply M1Sym0 arg) (M1Sym1 arg) => + M1Sym0 a0123456789876543210 + type instance Apply M1Sym0 a0123456789876543210 = M1Sym1 a0123456789876543210 + instance SuppressUnusedWarnings M1Sym0 where + suppressUnusedWarnings = snd ((,) M1Sym0KindInference ()) + infix 6 `M1Sym0` + type M1Sym1 :: forall a b. a -> (~>) b Bool + data M1Sym1 (a0123456789876543210 :: a) :: (~>) b Bool + where + M1Sym1KindInference :: SameKind (Apply (M1Sym1 a0123456789876543210) arg) (M1Sym2 a0123456789876543210 arg) => + M1Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (M1Sym1 a0123456789876543210) a0123456789876543210 = M1 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (M1Sym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) M1Sym1KindInference ()) + infix 6 `M1Sym1` + type M1Sym2 :: forall a b. a -> b -> Bool + type family M1Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: Bool where + M1Sym2 a0123456789876543210 a0123456789876543210 = M1 a0123456789876543210 a0123456789876543210 + infix 6 `M1Sym2` + class PC1 a b where + type family M1 (arg :: a) (arg :: b) :: Bool + infix 6 `M1` + infixr 5 `sD1B` + infixr 5 `sD1A` + infixr 5 `SMkD1` + infix 5 `SC1` + sD1B :: + forall a b (t :: D1 a b). Sing t -> Sing (Apply D1BSym0 t :: b) + sD1A :: + forall a b (t :: D1 a b). Sing t -> Sing (Apply D1ASym0 t :: a) + sD1B (SMkD1 _ (sField :: Sing field)) = sField + sD1A (SMkD1 (sField :: Sing field) _) = sField + instance SingI (D1BSym0 :: (~>) (D1 a b) b) where + sing = singFun1 @D1BSym0 sD1B + instance SingI (D1ASym0 :: (~>) (D1 a b) a) where + sing = singFun1 @D1ASym0 sD1A + data SD1 :: forall a b. D1 a b -> Type + where + SMkD1 :: forall a b (n :: a) (n :: b). + (Sing n) -> (Sing n) -> SD1 (MkD1 n n :: D1 a b) + type instance Sing @(D1 a b) = SD1 + instance (SingKind a, SingKind b) => SingKind (D1 a b) where + type Demote (D1 a b) = D1 (Demote a) (Demote b) + fromSing (SMkD1 b b) = MkD1 (fromSing b) (fromSing b) + toSing (MkD1 (b :: Demote a) (b :: Demote b)) + = case (,) (toSing b :: SomeSing a) (toSing b :: SomeSing b) of + (,) (SomeSing c) (SomeSing c) -> SomeSing (SMkD1 c c) + class SC1 a b where + sM1 :: + (forall (t :: a) (t :: b). + Sing t + -> Sing t -> Sing (Apply (Apply M1Sym0 t) t :: Bool) :: Type) + infix 6 `sM1` + instance (SingI n, SingI n) => SingI (MkD1 (n :: a) (n :: b)) where + sing = SMkD1 sing sing + instance SingI n => SingI1 (MkD1 (n :: a)) where + liftSing = SMkD1 sing + instance SingI2 MkD1 where + liftSing2 = SMkD1 + instance SingI (MkD1Sym0 :: (~>) a ((~>) b (D1 a b))) where + sing = singFun2 @MkD1Sym0 SMkD1 + instance SingI d => + SingI (MkD1Sym1 (d :: a) :: (~>) b (D1 a b)) where + sing = singFun1 @(MkD1Sym1 (d :: a)) (SMkD1 (sing @d)) + instance SingI1 (MkD1Sym1 :: a -> (~>) b (D1 a b)) where + liftSing (s :: Sing (d :: a)) + = singFun1 @(MkD1Sym1 (d :: a)) (SMkD1 s) + instance SC1 a b => SingI (M1Sym0 :: (~>) a ((~>) b Bool)) where + sing = singFun2 @M1Sym0 sM1 + instance (SC1 a b, SingI d) => + SingI (M1Sym1 (d :: a) :: (~>) b Bool) where + sing = singFun1 @(M1Sym1 (d :: a)) (sM1 (sing @d)) + instance SC1 a b => SingI1 (M1Sym1 :: a -> (~>) b Bool) where + liftSing (s :: Sing (d :: a)) = singFun1 @(M1Sym1 (d :: a)) (sM1 s) +Singletons/T412.hs:0:0:: Splicing declarations + genSingletons [''C2, ''T2a, ''T2b, ''D2] + ======> + type M2Sym0 :: forall a b. (~>) a ((~>) b Bool) + data M2Sym0 :: (~>) a ((~>) b Bool) + where + M2Sym0KindInference :: SameKind (Apply M2Sym0 arg) (M2Sym1 arg) => + M2Sym0 a0123456789876543210 + type instance Apply M2Sym0 a0123456789876543210 = M2Sym1 a0123456789876543210 + instance SuppressUnusedWarnings M2Sym0 where + suppressUnusedWarnings = snd ((,) M2Sym0KindInference ()) + infix 6 `M2Sym0` + type M2Sym1 :: forall a b. a -> (~>) b Bool + data M2Sym1 (a0123456789876543210 :: a) :: (~>) b Bool + where + M2Sym1KindInference :: SameKind (Apply (M2Sym1 a0123456789876543210) arg) (M2Sym2 a0123456789876543210 arg) => + M2Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (M2Sym1 a0123456789876543210) a0123456789876543210 = M2 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (M2Sym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) M2Sym1KindInference ()) + infix 6 `M2Sym1` + type M2Sym2 :: forall a b. a -> b -> Bool + type family M2Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: Bool where + M2Sym2 a0123456789876543210 a0123456789876543210 = M2 a0123456789876543210 a0123456789876543210 + infix 6 `M2Sym2` + type PC2 :: Type -> Type -> Constraint + class PC2 (a :: Type) (b :: Type) where + type family M2 (arg :: a) (arg :: b) :: Bool + infix 5 `PC2` + infix 6 `M2` + class SC2 (a :: Type) (b :: Type) where + sM2 :: + (forall (t :: a) (t :: b). + Sing t + -> Sing t -> Sing (Apply (Apply M2Sym0 t) t :: Bool) :: Type) + type SC2 :: Type -> Type -> Constraint + infix 5 `SC2` + infix 6 `sM2` + instance SC2 a b => SingI (M2Sym0 :: (~>) a ((~>) b Bool)) where + sing = singFun2 @M2Sym0 sM2 + instance (SC2 a b, SingI d) => + SingI (M2Sym1 (d :: a) :: (~>) b Bool) where + sing = singFun1 @(M2Sym1 (d :: a)) (sM2 (sing @d)) + instance SC2 a b => SingI1 (M2Sym1 :: a -> (~>) b Bool) where + liftSing (s :: Sing (d :: a)) = singFun1 @(M2Sym1 (d :: a)) (sM2 s) + type T2aSym0 :: (~>) Type ((~>) Type Type) + data T2aSym0 :: (~>) Type ((~>) Type Type) + where + T2aSym0KindInference :: SameKind (Apply T2aSym0 arg) (T2aSym1 arg) => + T2aSym0 a0123456789876543210 + type instance Apply T2aSym0 a0123456789876543210 = T2aSym1 a0123456789876543210 + instance SuppressUnusedWarnings T2aSym0 where + suppressUnusedWarnings = snd ((,) T2aSym0KindInference ()) + infixl 5 `T2aSym0` + type T2aSym1 :: Type -> (~>) Type Type + data T2aSym1 (a0123456789876543210 :: Type) :: (~>) Type Type + where + T2aSym1KindInference :: SameKind (Apply (T2aSym1 a0123456789876543210) arg) (T2aSym2 a0123456789876543210 arg) => + T2aSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (T2aSym1 a0123456789876543210) a0123456789876543210 = T2a a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (T2aSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) T2aSym1KindInference ()) + infixl 5 `T2aSym1` + type T2aSym2 :: Type -> Type -> Type + type family T2aSym2 (a0123456789876543210 :: Type) (a0123456789876543210 :: Type) :: Type where + T2aSym2 a0123456789876543210 a0123456789876543210 = T2a a0123456789876543210 a0123456789876543210 + infixl 5 `T2aSym2` + type T2bSym0 :: (~>) Type ((~>) Type Type) + data T2bSym0 :: (~>) Type ((~>) Type Type) + where + T2bSym0KindInference :: SameKind (Apply T2bSym0 arg) (T2bSym1 arg) => + T2bSym0 a0123456789876543210 + type instance Apply T2bSym0 a0123456789876543210 = T2bSym1 a0123456789876543210 + instance SuppressUnusedWarnings T2bSym0 where + suppressUnusedWarnings = snd ((,) T2bSym0KindInference ()) + infixl 5 `T2bSym0` + type T2bSym1 :: Type -> (~>) Type Type + data T2bSym1 (a0123456789876543210 :: Type) :: (~>) Type Type + where + T2bSym1KindInference :: SameKind (Apply (T2bSym1 a0123456789876543210) arg) (T2bSym2 a0123456789876543210 arg) => + T2bSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (T2bSym1 a0123456789876543210) a0123456789876543210 = T2b a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (T2bSym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) T2bSym1KindInference ()) + infixl 5 `T2bSym1` + type T2bSym2 :: Type -> Type -> Type + type family T2bSym2 (a0123456789876543210 :: Type) (a0123456789876543210 :: Type) :: Type where + T2bSym2 a0123456789876543210 a0123456789876543210 = T2b a0123456789876543210 a0123456789876543210 + infixl 5 `T2bSym2` + type MkD2Sym0 :: forall (a :: Type) + (b :: Type). (~>) a ((~>) b (D2 (a :: Type) (b :: Type))) + data MkD2Sym0 :: (~>) a ((~>) b (D2 (a :: Type) (b :: Type))) + where + MkD2Sym0KindInference :: SameKind (Apply MkD2Sym0 arg) (MkD2Sym1 arg) => + MkD2Sym0 a0123456789876543210 + type instance Apply MkD2Sym0 a0123456789876543210 = MkD2Sym1 a0123456789876543210 + instance SuppressUnusedWarnings MkD2Sym0 where + suppressUnusedWarnings = snd ((,) MkD2Sym0KindInference ()) + infixr 5 `MkD2Sym0` + type MkD2Sym1 :: forall (a :: Type) (b :: Type). a + -> (~>) b (D2 (a :: Type) (b :: Type)) + data MkD2Sym1 (a0123456789876543210 :: a) :: (~>) b (D2 (a :: Type) (b :: Type)) + where + MkD2Sym1KindInference :: SameKind (Apply (MkD2Sym1 a0123456789876543210) arg) (MkD2Sym2 a0123456789876543210 arg) => + MkD2Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (MkD2Sym1 a0123456789876543210) a0123456789876543210 = 'MkD2 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (MkD2Sym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) MkD2Sym1KindInference ()) + infixr 5 `MkD2Sym1` + type MkD2Sym2 :: forall (a :: Type) (b :: Type). a + -> b -> D2 (a :: Type) (b :: Type) + type family MkD2Sym2 (a0123456789876543210 :: a) (a0123456789876543210 :: b) :: D2 (a :: Type) (b :: Type) where + MkD2Sym2 a0123456789876543210 a0123456789876543210 = 'MkD2 a0123456789876543210 a0123456789876543210 + infixr 5 `MkD2Sym2` + infixr 5 `D2A` + infixr 5 `D2B` + type D2BSym0 :: forall (a :: Type) + (b :: Type). (~>) (D2 (a :: Type) (b :: Type)) b + data D2BSym0 :: (~>) (D2 (a :: Type) (b :: Type)) b + where + D2BSym0KindInference :: SameKind (Apply D2BSym0 arg) (D2BSym1 arg) => + D2BSym0 a0123456789876543210 + type instance Apply D2BSym0 a0123456789876543210 = D2B a0123456789876543210 + instance SuppressUnusedWarnings D2BSym0 where + suppressUnusedWarnings = snd ((,) D2BSym0KindInference ()) + type D2BSym1 :: forall (a :: Type) + (b :: Type). D2 (a :: Type) (b :: Type) -> b + type family D2BSym1 (a0123456789876543210 :: D2 (a :: Type) (b :: Type)) :: b where + D2BSym1 a0123456789876543210 = D2B a0123456789876543210 + type D2ASym0 :: forall (a :: Type) + (b :: Type). (~>) (D2 (a :: Type) (b :: Type)) a + data D2ASym0 :: (~>) (D2 (a :: Type) (b :: Type)) a + where + D2ASym0KindInference :: SameKind (Apply D2ASym0 arg) (D2ASym1 arg) => + D2ASym0 a0123456789876543210 + type instance Apply D2ASym0 a0123456789876543210 = D2A a0123456789876543210 + instance SuppressUnusedWarnings D2ASym0 where + suppressUnusedWarnings = snd ((,) D2ASym0KindInference ()) + type D2ASym1 :: forall (a :: Type) + (b :: Type). D2 (a :: Type) (b :: Type) -> a + type family D2ASym1 (a0123456789876543210 :: D2 (a :: Type) (b :: Type)) :: a where + D2ASym1 a0123456789876543210 = D2A a0123456789876543210 + type D2B :: forall (a :: Type) + (b :: Type). D2 (a :: Type) (b :: Type) -> b + type family D2B (a :: D2 (a :: Type) (b :: Type)) :: b where + D2B ('MkD2 _ field) = field + type D2A :: forall (a :: Type) + (b :: Type). D2 (a :: Type) (b :: Type) -> a + type family D2A (a :: D2 (a :: Type) (b :: Type)) :: a where + D2A ('MkD2 field _) = field + sD2B :: + forall (a :: Type) + (b :: Type) + (t :: D2 (a :: Type) (b :: Type)). Sing t + -> Sing (Apply D2BSym0 t :: b) + sD2A :: + forall (a :: Type) + (b :: Type) + (t :: D2 (a :: Type) (b :: Type)). Sing t + -> Sing (Apply D2ASym0 t :: a) + sD2B (SMkD2 _ (sField :: Sing field)) = sField + sD2A (SMkD2 (sField :: Sing field) _) = sField + instance SingI (D2BSym0 :: (~>) (D2 (a :: Type) (b :: Type)) b) where + sing = singFun1 @D2BSym0 sD2B + instance SingI (D2ASym0 :: (~>) (D2 (a :: Type) (b :: Type)) a) where + sing = singFun1 @D2ASym0 sD2A + type SD2 :: forall (a :: Type) (b :: Type). D2 a b -> Type + data SD2 :: forall (a :: Type) (b :: Type). D2 a b -> Type + where + SMkD2 :: forall (a :: Type) (b :: Type) (n :: a) (n :: b). + (Sing n) -> + (Sing n) -> + SD2 ('MkD2 n n :: D2 (a :: Type) (b :: Type)) + type instance Sing @(D2 a b) = SD2 + instance (SingKind a, SingKind b) => SingKind (D2 a b) where + type Demote (D2 a b) = D2 (Demote a) (Demote b) + fromSing (SMkD2 b b) = MkD2 (fromSing b) (fromSing b) + toSing (MkD2 (b :: Demote a) (b :: Demote b)) + = case (,) (toSing b :: SomeSing a) (toSing b :: SomeSing b) of + (,) (SomeSing c) (SomeSing c) -> SomeSing (SMkD2 c c) + infixr 5 `SMkD2` + infixr 5 `sD2A` + infixr 5 `sD2B` + instance (SingI n, SingI n) => + SingI ('MkD2 (n :: a) (n :: b)) where + sing = SMkD2 sing sing + instance SingI n => SingI1 ('MkD2 (n :: a)) where + liftSing = SMkD2 sing + instance SingI2 'MkD2 where + liftSing2 = SMkD2 + instance SingI (MkD2Sym0 :: (~>) a ((~>) b (D2 (a :: Type) (b :: Type)))) where + sing = singFun2 @MkD2Sym0 SMkD2 + instance SingI d => + SingI (MkD2Sym1 (d :: a) :: (~>) b (D2 (a :: Type) (b :: Type))) where + sing = singFun1 @(MkD2Sym1 (d :: a)) (SMkD2 (sing @d)) + instance SingI1 (MkD2Sym1 :: a + -> (~>) b (D2 (a :: Type) (b :: Type))) where + liftSing (s :: Sing (d :: a)) + = singFun1 @(MkD2Sym1 (d :: a)) (SMkD2 s)
tests/compile-and-dump/Singletons/T412.hs view
@@ -1,33 +1,33 @@-module T412 where--import Data.Singletons.TH--$(singletons [d|- infix 5 `C1`- class C1 a b where- infix 6 `m1`- m1 :: a -> b -> Bool-- infixl 5 `T1a`, `T1b`- type T1a a b = Either a b- type family T1b a b where- T1b a b = Either a b-- infixr 5 `D1`, `MkD1`, `d1A`, `d1B`- data D1 a b = MkD1 { d1A :: a, d1B :: b }- |])--infix 5 `C2`-class C2 a b where- infix 6 `m2`- m2 :: a -> b -> Bool--infixl 5 `T2a`, `T2b`-type T2a a b = Either a b-type family T2b a b where- T2b a b = Either a b--infixr 5 `D2`, `MkD2`, `d2A`, `d2B`-data D2 a b = MkD2 { d2A :: a, d2B :: b }--$(genSingletons [''C2, ''T2a, ''T2b, ''D2])+module T412 where + +import Data.Singletons.TH + +$(singletons [d| + infix 5 `C1` + class C1 a b where + infix 6 `m1` + m1 :: a -> b -> Bool + + infixl 5 `T1a`, `T1b` + type T1a a b = Either a b + type family T1b a b where + T1b a b = Either a b + + infixr 5 `D1`, `MkD1`, `d1A`, `d1B` + data D1 a b = MkD1 { d1A :: a, d1B :: b } + |]) + +infix 5 `C2` +class C2 a b where + infix 6 `m2` + m2 :: a -> b -> Bool + +infixl 5 `T2a`, `T2b` +type T2a a b = Either a b +type family T2b a b where + T2b a b = Either a b + +infixr 5 `D2`, `MkD2`, `d2A`, `d2B` +data D2 a b = MkD2 { d2A :: a, d2B :: b } + +$(genSingletons [''C2, ''T2a, ''T2b, ''D2])
tests/compile-and-dump/Singletons/T414.golden view
@@ -1,77 +1,77 @@-Singletons/T414.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| type C3 :: Bool -> Constraint- - class C1 (a :: Bool) where- type T1 a b- class C2 a where- type T2 a b- class C3 a where- type T3 a b |]- ======>- class C1 (a :: Bool) where- type family T1 a b- class C2 a where- type family T2 a b- type C3 :: Bool -> Constraint- class C3 a where- type family T3 a b- data T1Sym0 a0123456789876543210- where- T1Sym0KindInference :: SameKind (Apply T1Sym0 arg) (T1Sym1 arg) =>- T1Sym0 a0123456789876543210- type instance Apply T1Sym0 a0123456789876543210 = T1Sym1 a0123456789876543210- instance SuppressUnusedWarnings T1Sym0 where- suppressUnusedWarnings = snd (((,) T1Sym0KindInference) ())- data T1Sym1 (a0123456789876543210 :: Bool) b0123456789876543210- where- T1Sym1KindInference :: SameKind (Apply (T1Sym1 a0123456789876543210) arg) (T1Sym2 a0123456789876543210 arg) =>- T1Sym1 a0123456789876543210 b0123456789876543210- type instance Apply (T1Sym1 a0123456789876543210) b0123456789876543210 = T1 a0123456789876543210 b0123456789876543210- instance SuppressUnusedWarnings (T1Sym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) T1Sym1KindInference) ())- type family T1Sym2 (a0123456789876543210 :: Bool) b0123456789876543210 where- T1Sym2 a0123456789876543210 b0123456789876543210 = T1 a0123456789876543210 b0123456789876543210- class PC1 (a :: Bool)- data T2Sym0 a0123456789876543210- where- T2Sym0KindInference :: SameKind (Apply T2Sym0 arg) (T2Sym1 arg) =>- T2Sym0 a0123456789876543210- type instance Apply T2Sym0 a0123456789876543210 = T2Sym1 a0123456789876543210- instance SuppressUnusedWarnings T2Sym0 where- suppressUnusedWarnings = snd (((,) T2Sym0KindInference) ())- data T2Sym1 a0123456789876543210 b0123456789876543210- where- T2Sym1KindInference :: SameKind (Apply (T2Sym1 a0123456789876543210) arg) (T2Sym2 a0123456789876543210 arg) =>- T2Sym1 a0123456789876543210 b0123456789876543210- type instance Apply (T2Sym1 a0123456789876543210) b0123456789876543210 = T2 a0123456789876543210 b0123456789876543210- instance SuppressUnusedWarnings (T2Sym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) T2Sym1KindInference) ())- type family T2Sym2 a0123456789876543210 b0123456789876543210 where- T2Sym2 a0123456789876543210 b0123456789876543210 = T2 a0123456789876543210 b0123456789876543210- class PC2 a- type T3Sym0 :: (~>) Bool ((~>) Type Type)- data T3Sym0 :: (~>) Bool ((~>) Type Type)- where- T3Sym0KindInference :: SameKind (Apply T3Sym0 arg) (T3Sym1 arg) =>- T3Sym0 a0123456789876543210- type instance Apply T3Sym0 a0123456789876543210 = T3Sym1 a0123456789876543210- instance SuppressUnusedWarnings T3Sym0 where- suppressUnusedWarnings = snd (((,) T3Sym0KindInference) ())- type T3Sym1 :: Bool -> (~>) Type Type- data T3Sym1 (a0123456789876543210 :: Bool) :: (~>) Type Type- where- T3Sym1KindInference :: SameKind (Apply (T3Sym1 a0123456789876543210) arg) (T3Sym2 a0123456789876543210 arg) =>- T3Sym1 a0123456789876543210 a0123456789876543210- type instance Apply (T3Sym1 a0123456789876543210) a0123456789876543210 = T3 a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (T3Sym1 a0123456789876543210) where- suppressUnusedWarnings = snd (((,) T3Sym1KindInference) ())- type T3Sym2 :: Bool -> Type -> Type- type family T3Sym2 (a0123456789876543210 :: Bool) (a0123456789876543210 :: Type) :: Type where- T3Sym2 a0123456789876543210 a0123456789876543210 = T3 a0123456789876543210 a0123456789876543210- type PC3 :: Bool -> Constraint- class PC3 a- class SC1 (a :: Bool)- class SC2 a- class SC3 a- type SC3 :: Bool -> Constraint+Singletons/T414.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| type C3 :: Bool -> Constraint + + class C1 (a :: Bool) where + type T1 a b + class C2 a where + type T2 a b + class C3 a where + type T3 a b |] + ======> + class C1 (a :: Bool) where + type family T1 a b + class C2 a where + type family T2 a b + type C3 :: Bool -> Constraint + class C3 a where + type family T3 a b + data T1Sym0 a0123456789876543210 + where + T1Sym0KindInference :: SameKind (Apply T1Sym0 arg) (T1Sym1 arg) => + T1Sym0 a0123456789876543210 + type instance Apply T1Sym0 a0123456789876543210 = T1Sym1 a0123456789876543210 + instance SuppressUnusedWarnings T1Sym0 where + suppressUnusedWarnings = snd ((,) T1Sym0KindInference ()) + data T1Sym1 (a0123456789876543210 :: Bool) b0123456789876543210 + where + T1Sym1KindInference :: SameKind (Apply (T1Sym1 a0123456789876543210) arg) (T1Sym2 a0123456789876543210 arg) => + T1Sym1 a0123456789876543210 b0123456789876543210 + type instance Apply (T1Sym1 a0123456789876543210) b0123456789876543210 = T1 a0123456789876543210 b0123456789876543210 + instance SuppressUnusedWarnings (T1Sym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) T1Sym1KindInference ()) + type family T1Sym2 (a0123456789876543210 :: Bool) b0123456789876543210 where + T1Sym2 a0123456789876543210 b0123456789876543210 = T1 a0123456789876543210 b0123456789876543210 + class PC1 (a :: Bool) + data T2Sym0 a0123456789876543210 + where + T2Sym0KindInference :: SameKind (Apply T2Sym0 arg) (T2Sym1 arg) => + T2Sym0 a0123456789876543210 + type instance Apply T2Sym0 a0123456789876543210 = T2Sym1 a0123456789876543210 + instance SuppressUnusedWarnings T2Sym0 where + suppressUnusedWarnings = snd ((,) T2Sym0KindInference ()) + data T2Sym1 a0123456789876543210 b0123456789876543210 + where + T2Sym1KindInference :: SameKind (Apply (T2Sym1 a0123456789876543210) arg) (T2Sym2 a0123456789876543210 arg) => + T2Sym1 a0123456789876543210 b0123456789876543210 + type instance Apply (T2Sym1 a0123456789876543210) b0123456789876543210 = T2 a0123456789876543210 b0123456789876543210 + instance SuppressUnusedWarnings (T2Sym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) T2Sym1KindInference ()) + type family T2Sym2 a0123456789876543210 b0123456789876543210 where + T2Sym2 a0123456789876543210 b0123456789876543210 = T2 a0123456789876543210 b0123456789876543210 + class PC2 a + type T3Sym0 :: (~>) Bool ((~>) Type Type) + data T3Sym0 :: (~>) Bool ((~>) Type Type) + where + T3Sym0KindInference :: SameKind (Apply T3Sym0 arg) (T3Sym1 arg) => + T3Sym0 a0123456789876543210 + type instance Apply T3Sym0 a0123456789876543210 = T3Sym1 a0123456789876543210 + instance SuppressUnusedWarnings T3Sym0 where + suppressUnusedWarnings = snd ((,) T3Sym0KindInference ()) + type T3Sym1 :: Bool -> (~>) Type Type + data T3Sym1 (a0123456789876543210 :: Bool) :: (~>) Type Type + where + T3Sym1KindInference :: SameKind (Apply (T3Sym1 a0123456789876543210) arg) (T3Sym2 a0123456789876543210 arg) => + T3Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (T3Sym1 a0123456789876543210) a0123456789876543210 = T3 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (T3Sym1 a0123456789876543210) where + suppressUnusedWarnings = snd ((,) T3Sym1KindInference ()) + type T3Sym2 :: Bool -> Type -> Type + type family T3Sym2 (a0123456789876543210 :: Bool) (a0123456789876543210 :: Type) :: Type where + T3Sym2 a0123456789876543210 a0123456789876543210 = T3 a0123456789876543210 a0123456789876543210 + type PC3 :: Bool -> Constraint + class PC3 a + class SC1 (a :: Bool) + class SC2 a + class SC3 a + type SC3 :: Bool -> Constraint
tests/compile-and-dump/Singletons/T414.hs view
@@ -1,16 +1,16 @@-module T414 where--import Data.Kind-import Data.Singletons.TH--$(singletons [d|- class C1 (a :: Bool) where- type T1 a b-- class C2 a where- type T2 a b-- type C3 :: Bool -> Constraint- class C3 a where- type T3 a b- |])+module T414 where + +import Data.Kind +import Data.Singletons.TH + +$(singletons [d| + class C1 (a :: Bool) where + type T1 a b + + class C2 a where + type T2 a b + + type C3 :: Bool -> Constraint + class C3 a where + type T3 a b + |])
tests/compile-and-dump/Singletons/T443.golden view
@@ -1,127 +1,127 @@-Singletons/T443.hs:(0,0)-(0,0): Splicing declarations- withOptions defaultOptions {genSingKindInsts = False}- $ singletons- [d| data Nat = Z | S Nat- data Vec :: Nat -> Type -> Type- where- VNil :: Vec Z a- (:>) :: {head :: a, tail :: Vec n a} -> Vec (S n) a |]- ======>- data Nat = Z | S Nat- data Vec :: Nat -> Type -> Type- where- VNil :: Vec 'Z a- (:>) :: {head :: a, tail :: (Vec n a)} -> Vec ('S n) a- type ZSym0 :: Nat- type family ZSym0 :: Nat where- ZSym0 = Z- type SSym0 :: (~>) Nat Nat- data SSym0 :: (~>) Nat Nat- where- SSym0KindInference :: SameKind (Apply SSym0 arg) (SSym1 arg) =>- SSym0 a0123456789876543210- type instance Apply SSym0 a0123456789876543210 = S a0123456789876543210- instance SuppressUnusedWarnings SSym0 where- suppressUnusedWarnings = snd (((,) SSym0KindInference) ())- type SSym1 :: Nat -> Nat- type family SSym1 (a0123456789876543210 :: Nat) :: Nat where- SSym1 a0123456789876543210 = S a0123456789876543210- type VNilSym0 :: Vec Z a- type family VNilSym0 :: Vec Z a where- VNilSym0 = VNil- type (:>@#@$) :: (~>) a ((~>) (Vec n a) (Vec (S n) a))- data (:>@#@$) :: (~>) a ((~>) (Vec n a) (Vec (S n) a))- where- (::>@#@$###) :: SameKind (Apply (:>@#@$) arg) ((:>@#@$$) arg) =>- (:>@#@$) a0123456789876543210- type instance Apply (:>@#@$) a0123456789876543210 = (:>@#@$$) a0123456789876543210- instance SuppressUnusedWarnings (:>@#@$) where- suppressUnusedWarnings = snd (((,) (::>@#@$###)) ())- type (:>@#@$$) :: a -> (~>) (Vec n a) (Vec (S n) a)- data (:>@#@$$) (a0123456789876543210 :: a) :: (~>) (Vec n a) (Vec (S n) a)- where- (::>@#@$$###) :: SameKind (Apply ((:>@#@$$) a0123456789876543210) arg) ((:>@#@$$$) a0123456789876543210 arg) =>- (:>@#@$$) a0123456789876543210 a0123456789876543210- type instance Apply ((:>@#@$$) a0123456789876543210) a0123456789876543210 = (:>) a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings ((:>@#@$$) a0123456789876543210) where- suppressUnusedWarnings = snd (((,) (::>@#@$$###)) ())- type (:>@#@$$$) :: a -> Vec n a -> Vec (S n) a- type family (:>@#@$$$) (a0123456789876543210 :: a) (a0123456789876543210 :: Vec n a) :: Vec (S n) a where- (:>@#@$$$) a0123456789876543210 a0123456789876543210 = (:>) a0123456789876543210 a0123456789876543210- type TailSym0 :: (~>) (Vec (S n) a) (Vec n a)- data TailSym0 :: (~>) (Vec (S n) a) (Vec n a)- where- TailSym0KindInference :: SameKind (Apply TailSym0 arg) (TailSym1 arg) =>- TailSym0 a0123456789876543210- type instance Apply TailSym0 a0123456789876543210 = Tail a0123456789876543210- instance SuppressUnusedWarnings TailSym0 where- suppressUnusedWarnings = snd (((,) TailSym0KindInference) ())- type TailSym1 :: Vec (S n) a -> Vec n a- type family TailSym1 (a0123456789876543210 :: Vec (S n) a) :: Vec n a where- TailSym1 a0123456789876543210 = Tail a0123456789876543210- type HeadSym0 :: (~>) (Vec (S n) a) a- data HeadSym0 :: (~>) (Vec (S n) a) a- where- HeadSym0KindInference :: SameKind (Apply HeadSym0 arg) (HeadSym1 arg) =>- HeadSym0 a0123456789876543210- type instance Apply HeadSym0 a0123456789876543210 = Head a0123456789876543210- instance SuppressUnusedWarnings HeadSym0 where- suppressUnusedWarnings = snd (((,) HeadSym0KindInference) ())- type HeadSym1 :: Vec (S n) a -> a- type family HeadSym1 (a0123456789876543210 :: Vec (S n) a) :: a where- HeadSym1 a0123456789876543210 = Head a0123456789876543210- type Tail :: Vec (S n) a -> Vec n a- type family Tail (a :: Vec (S n) a) :: Vec n a where- Tail ((:>) _ field) = field- type Head :: Vec (S n) a -> a- type family Head (a :: Vec (S n) a) :: a where- Head ((:>) field _) = field- sTail ::- forall n a (t :: Vec (S n) a). Sing t- -> Sing (Apply TailSym0 t :: Vec n a)- sHead ::- forall n a (t :: Vec (S n) a). Sing t- -> Sing (Apply HeadSym0 t :: a)- sTail ((:%>) _ (sField :: Sing field)) = sField- sHead ((:%>) (sField :: Sing field) _) = sField- instance SingI (TailSym0 :: (~>) (Vec (S n) a) (Vec n a)) where- sing = (singFun1 @TailSym0) sTail- instance SingI (HeadSym0 :: (~>) (Vec (S n) a) a) where- sing = (singFun1 @HeadSym0) sHead- data SNat :: Nat -> Type- where- SZ :: SNat (Z :: Nat)- SS :: forall (n :: Nat). (Sing n) -> SNat (S n :: Nat)- type instance Sing @Nat = SNat- data SVec :: forall (a :: Nat) (a :: Type). Vec a a -> Type- where- SVNil :: forall a. SVec (VNil :: Vec Z a)- (:%>) :: forall a n (n :: a) (n :: Vec n a).- (Sing n) -> (Sing n) -> SVec ((:>) n n :: Vec (S n) a)- type instance Sing @(Vec a a) = SVec- instance SingI Z where- sing = SZ- instance SingI n => SingI (S (n :: Nat)) where- sing = SS sing- instance SingI1 S where- liftSing = SS- instance SingI (SSym0 :: (~>) Nat Nat) where- sing = (singFun1 @SSym0) SS- instance SingI VNil where- sing = SVNil- instance (SingI n, SingI n) =>- SingI ((:>) (n :: a) (n :: Vec n a)) where- sing = ((:%>) sing) sing- instance SingI n => SingI1 ((:>) (n :: a)) where- liftSing = (:%>) sing- instance SingI2 (:>) where- liftSing2 = (:%>)- instance SingI ((:>@#@$) :: (~>) a ((~>) (Vec n a) (Vec (S n) a))) where- sing = (singFun2 @(:>@#@$)) (:%>)- instance SingI d =>- SingI ((:>@#@$$) (d :: a) :: (~>) (Vec n a) (Vec (S n) a)) where- sing = (singFun1 @((:>@#@$$) (d :: a))) ((:%>) (sing @d))- instance SingI1 ((:>@#@$$) :: a- -> (~>) (Vec n a) (Vec (S n) a)) where- liftSing (s :: Sing (d :: a))- = (singFun1 @((:>@#@$$) (d :: a))) ((:%>) s)+Singletons/T443.hs:(0,0)-(0,0): Splicing declarations + withOptions defaultOptions {genSingKindInsts = False} + $ singletons + [d| data Nat = Z | S Nat + data Vec :: Nat -> Type -> Type + where + VNil :: Vec Z a + (:>) :: {head :: a, tail :: Vec n a} -> Vec (S n) a |] + ======> + data Nat = Z | S Nat + data Vec :: Nat -> Type -> Type + where + VNil :: Vec 'Z a + (:>) :: {head :: a, tail :: (Vec n a)} -> Vec ('S n) a + type ZSym0 :: Nat + type family ZSym0 :: Nat where + ZSym0 = Z + type SSym0 :: (~>) Nat Nat + data SSym0 :: (~>) Nat Nat + where + SSym0KindInference :: SameKind (Apply SSym0 arg) (SSym1 arg) => + SSym0 a0123456789876543210 + type instance Apply SSym0 a0123456789876543210 = S a0123456789876543210 + instance SuppressUnusedWarnings SSym0 where + suppressUnusedWarnings = snd ((,) SSym0KindInference ()) + type SSym1 :: Nat -> Nat + type family SSym1 (a0123456789876543210 :: Nat) :: Nat where + SSym1 a0123456789876543210 = S a0123456789876543210 + type VNilSym0 :: Vec Z a + type family VNilSym0 :: Vec Z a where + VNilSym0 = VNil + type (:>@#@$) :: (~>) a ((~>) (Vec n a) (Vec (S n) a)) + data (:>@#@$) :: (~>) a ((~>) (Vec n a) (Vec (S n) a)) + where + (::>@#@$###) :: SameKind (Apply (:>@#@$) arg) ((:>@#@$$) arg) => + (:>@#@$) a0123456789876543210 + type instance Apply (:>@#@$) a0123456789876543210 = (:>@#@$$) a0123456789876543210 + instance SuppressUnusedWarnings (:>@#@$) where + suppressUnusedWarnings = snd ((,) (::>@#@$###) ()) + type (:>@#@$$) :: a -> (~>) (Vec n a) (Vec (S n) a) + data (:>@#@$$) (a0123456789876543210 :: a) :: (~>) (Vec n a) (Vec (S n) a) + where + (::>@#@$$###) :: SameKind (Apply ((:>@#@$$) a0123456789876543210) arg) ((:>@#@$$$) a0123456789876543210 arg) => + (:>@#@$$) a0123456789876543210 a0123456789876543210 + type instance Apply ((:>@#@$$) a0123456789876543210) a0123456789876543210 = (:>) a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings ((:>@#@$$) a0123456789876543210) where + suppressUnusedWarnings = snd ((,) (::>@#@$$###) ()) + type (:>@#@$$$) :: a -> Vec n a -> Vec (S n) a + type family (:>@#@$$$) (a0123456789876543210 :: a) (a0123456789876543210 :: Vec n a) :: Vec (S n) a where + (:>@#@$$$) a0123456789876543210 a0123456789876543210 = (:>) a0123456789876543210 a0123456789876543210 + type TailSym0 :: (~>) (Vec (S n) a) (Vec n a) + data TailSym0 :: (~>) (Vec (S n) a) (Vec n a) + where + TailSym0KindInference :: SameKind (Apply TailSym0 arg) (TailSym1 arg) => + TailSym0 a0123456789876543210 + type instance Apply TailSym0 a0123456789876543210 = Tail a0123456789876543210 + instance SuppressUnusedWarnings TailSym0 where + suppressUnusedWarnings = snd ((,) TailSym0KindInference ()) + type TailSym1 :: Vec (S n) a -> Vec n a + type family TailSym1 (a0123456789876543210 :: Vec (S n) a) :: Vec n a where + TailSym1 a0123456789876543210 = Tail a0123456789876543210 + type HeadSym0 :: (~>) (Vec (S n) a) a + data HeadSym0 :: (~>) (Vec (S n) a) a + where + HeadSym0KindInference :: SameKind (Apply HeadSym0 arg) (HeadSym1 arg) => + HeadSym0 a0123456789876543210 + type instance Apply HeadSym0 a0123456789876543210 = Head a0123456789876543210 + instance SuppressUnusedWarnings HeadSym0 where + suppressUnusedWarnings = snd ((,) HeadSym0KindInference ()) + type HeadSym1 :: Vec (S n) a -> a + type family HeadSym1 (a0123456789876543210 :: Vec (S n) a) :: a where + HeadSym1 a0123456789876543210 = Head a0123456789876543210 + type Tail :: Vec (S n) a -> Vec n a + type family Tail (a :: Vec (S n) a) :: Vec n a where + Tail ((:>) _ field) = field + type Head :: Vec (S n) a -> a + type family Head (a :: Vec (S n) a) :: a where + Head ((:>) field _) = field + sTail :: + (forall (t :: Vec (S n) a). + Sing t -> Sing (Apply TailSym0 t :: Vec n a) :: Type) + sHead :: + (forall (t :: Vec (S n) a). + Sing t -> Sing (Apply HeadSym0 t :: a) :: Type) + sTail ((:%>) _ (sField :: Sing field)) = sField + sHead ((:%>) (sField :: Sing field) _) = sField + instance SingI (TailSym0 :: (~>) (Vec (S n) a) (Vec n a)) where + sing = singFun1 @TailSym0 sTail + instance SingI (HeadSym0 :: (~>) (Vec (S n) a) a) where + sing = singFun1 @HeadSym0 sHead + data SNat :: Nat -> Type + where + SZ :: SNat (Z :: Nat) + SS :: forall (n :: Nat). (Sing n) -> SNat (S n :: Nat) + type instance Sing @Nat = SNat + data SVec :: forall (a :: Nat) (a :: Type). Vec a a -> Type + where + SVNil :: forall a. SVec (VNil :: Vec Z a) + (:%>) :: forall a n (n :: a) (n :: Vec n a). + (Sing n) -> (Sing n) -> SVec ((:>) n n :: Vec (S n) a) + type instance Sing @(Vec a a) = SVec + instance SingI Z where + sing = SZ + instance SingI n => SingI (S (n :: Nat)) where + sing = SS sing + instance SingI1 S where + liftSing = SS + instance SingI (SSym0 :: (~>) Nat Nat) where + sing = singFun1 @SSym0 SS + instance SingI VNil where + sing = SVNil + instance (SingI n, SingI n) => + SingI ((:>) (n :: a) (n :: Vec n a)) where + sing = (:%>) sing sing + instance SingI n => SingI1 ((:>) (n :: a)) where + liftSing = (:%>) sing + instance SingI2 (:>) where + liftSing2 = (:%>) + instance SingI ((:>@#@$) :: (~>) a ((~>) (Vec n a) (Vec (S n) a))) where + sing = singFun2 @(:>@#@$) (:%>) + instance SingI d => + SingI ((:>@#@$$) (d :: a) :: (~>) (Vec n a) (Vec (S n) a)) where + sing = singFun1 @((:>@#@$$) (d :: a)) ((:%>) (sing @d)) + instance SingI1 ((:>@#@$$) :: a + -> (~>) (Vec n a) (Vec (S n) a)) where + liftSing (s :: Sing (d :: a)) + = singFun1 @((:>@#@$$) (d :: a)) ((:%>) s)
tests/compile-and-dump/Singletons/T443.hs view
@@ -1,14 +1,14 @@-module T443 where--import Data.Kind-import Data.Singletons.TH-import Data.Singletons.TH.Options--$(withOptions defaultOptions{genSingKindInsts = False} $- singletons [d|- data Nat = Z | S Nat-- data Vec :: Nat -> Type -> Type where- VNil :: Vec Z a- (:>) :: { head :: a, tail :: Vec n a } -> Vec (S n) a- |])+module T443 where + +import Data.Kind +import Data.Singletons.TH +import Data.Singletons.TH.Options + +$(withOptions defaultOptions{genSingKindInsts = False} $ + singletons [d| + data Nat = Z | S Nat + + data Vec :: Nat -> Type -> Type where + VNil :: Vec Z a + (:>) :: { head :: a, tail :: Vec n a } -> Vec (S n) a + |])
tests/compile-and-dump/Singletons/T445.golden view
@@ -1,74 +1,74 @@-Singletons/T445.hs:0:0:: Splicing declarations- genDefunSymbols [''Lit]- ======>- type LitSym0 :: (~>) Natural Nat- data LitSym0 :: (~>) Natural Nat- where- LitSym0KindInference :: SameKind (Apply LitSym0 arg) (LitSym1 arg) =>- LitSym0 a0123456789876543210- type instance Apply LitSym0 a0123456789876543210 = Lit a0123456789876543210- instance SuppressUnusedWarnings LitSym0 where- suppressUnusedWarnings = snd (((,) LitSym0KindInference) ())- type LitSym1 :: Natural -> Nat- type family LitSym1 (a0123456789876543210 :: Natural) :: Nat where- LitSym1 a0123456789876543210 = Lit a0123456789876543210-Singletons/T445.hs:(0,0)-(0,0): Splicing declarations- promoteOnly- [d| evenb :: Nat -> Bool- evenb Zero = True- evenb (Succ Zero) = False- evenb (Succ (Succ n)) = evenb n- filterEvenGt7 :: [Nat] -> [Nat]- filterEvenGt7 = filter (\ x -> evenb x && x > lit 7) |]- ======>- type family Lambda_0123456789876543210 a_0123456789876543210 x where- Lambda_0123456789876543210 a_0123456789876543210 x = Apply (Apply (&&@#@$) (Apply EvenbSym0 x)) (Apply (Apply (>@#@$) x) (Apply LitSym0 (FromInteger 7)))- data Lambda_0123456789876543210Sym0 a_01234567898765432100123456789876543210- where- Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) =>- Lambda_0123456789876543210Sym0 a_01234567898765432100123456789876543210- type instance Apply Lambda_0123456789876543210Sym0 a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210- instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym0KindInference) ())- data Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210 x0123456789876543210- where- Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 arg) =>- Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210 x0123456789876543210- type instance Apply (Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210) x0123456789876543210 = Lambda_0123456789876543210 a_01234567898765432100123456789876543210 x0123456789876543210- instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210) where- suppressUnusedWarnings- = snd (((,) Lambda_0123456789876543210Sym1KindInference) ())- type family Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 x0123456789876543210 where- Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 x0123456789876543210 = Lambda_0123456789876543210 a_01234567898765432100123456789876543210 x0123456789876543210- type FilterEvenGt7Sym0 :: (~>) [Nat] [Nat]- data FilterEvenGt7Sym0 :: (~>) [Nat] [Nat]- where- FilterEvenGt7Sym0KindInference :: SameKind (Apply FilterEvenGt7Sym0 arg) (FilterEvenGt7Sym1 arg) =>- FilterEvenGt7Sym0 a0123456789876543210- type instance Apply FilterEvenGt7Sym0 a0123456789876543210 = FilterEvenGt7 a0123456789876543210- instance SuppressUnusedWarnings FilterEvenGt7Sym0 where- suppressUnusedWarnings- = snd (((,) FilterEvenGt7Sym0KindInference) ())- type FilterEvenGt7Sym1 :: [Nat] -> [Nat]- type family FilterEvenGt7Sym1 (a0123456789876543210 :: [Nat]) :: [Nat] where- FilterEvenGt7Sym1 a0123456789876543210 = FilterEvenGt7 a0123456789876543210- type EvenbSym0 :: (~>) Nat Bool- data EvenbSym0 :: (~>) Nat Bool- where- EvenbSym0KindInference :: SameKind (Apply EvenbSym0 arg) (EvenbSym1 arg) =>- EvenbSym0 a0123456789876543210- type instance Apply EvenbSym0 a0123456789876543210 = Evenb a0123456789876543210- instance SuppressUnusedWarnings EvenbSym0 where- suppressUnusedWarnings = snd (((,) EvenbSym0KindInference) ())- type EvenbSym1 :: Nat -> Bool- type family EvenbSym1 (a0123456789876543210 :: Nat) :: Bool where- EvenbSym1 a0123456789876543210 = Evenb a0123456789876543210- type FilterEvenGt7 :: [Nat] -> [Nat]- type family FilterEvenGt7 (a :: [Nat]) :: [Nat] where- FilterEvenGt7 a_0123456789876543210 = Apply (Apply FilterSym0 (Apply Lambda_0123456789876543210Sym0 a_0123456789876543210)) a_0123456789876543210- type Evenb :: Nat -> Bool- type family Evenb (a :: Nat) :: Bool where- Evenb 'Zero = TrueSym0- Evenb ('Succ 'Zero) = FalseSym0- Evenb ('Succ ('Succ n)) = Apply EvenbSym0 n+Singletons/T445.hs:0:0:: Splicing declarations + genDefunSymbols [''Lit] + ======> + type LitSym0 :: (~>) Natural Nat + data LitSym0 :: (~>) Natural Nat + where + LitSym0KindInference :: SameKind (Apply LitSym0 arg) (LitSym1 arg) => + LitSym0 a0123456789876543210 + type instance Apply LitSym0 a0123456789876543210 = Lit a0123456789876543210 + instance SuppressUnusedWarnings LitSym0 where + suppressUnusedWarnings = snd ((,) LitSym0KindInference ()) + type LitSym1 :: Natural -> Nat + type family LitSym1 (a0123456789876543210 :: Natural) :: Nat where + LitSym1 a0123456789876543210 = Lit a0123456789876543210 +Singletons/T445.hs:(0,0)-(0,0): Splicing declarations + promoteOnly + [d| evenb :: Nat -> Bool + evenb Zero = True + evenb (Succ Zero) = False + evenb (Succ (Succ n)) = evenb n + filterEvenGt7 :: [Nat] -> [Nat] + filterEvenGt7 = filter (\ x -> evenb x && x > lit 7) |] + ======> + type family Lambda_0123456789876543210 a_0123456789876543210 x where + Lambda_0123456789876543210 a_0123456789876543210 x = Apply (Apply (&&@#@$) (Apply EvenbSym0 x)) (Apply (Apply (>@#@$) x) (Apply LitSym0 (FromInteger 7))) + data Lambda_0123456789876543210Sym0 a_01234567898765432100123456789876543210 + where + Lambda_0123456789876543210Sym0KindInference :: SameKind (Apply Lambda_0123456789876543210Sym0 arg) (Lambda_0123456789876543210Sym1 arg) => + Lambda_0123456789876543210Sym0 a_01234567898765432100123456789876543210 + type instance Apply Lambda_0123456789876543210Sym0 a_01234567898765432100123456789876543210 = Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210 + instance SuppressUnusedWarnings Lambda_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym0KindInference ()) + data Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210 x0123456789876543210 + where + Lambda_0123456789876543210Sym1KindInference :: SameKind (Apply (Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210) arg) (Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 arg) => + Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210 x0123456789876543210 + type instance Apply (Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210) x0123456789876543210 = Lambda_0123456789876543210 a_01234567898765432100123456789876543210 x0123456789876543210 + instance SuppressUnusedWarnings (Lambda_0123456789876543210Sym1 a_01234567898765432100123456789876543210) where + suppressUnusedWarnings + = snd ((,) Lambda_0123456789876543210Sym1KindInference ()) + type family Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 x0123456789876543210 where + Lambda_0123456789876543210Sym2 a_01234567898765432100123456789876543210 x0123456789876543210 = Lambda_0123456789876543210 a_01234567898765432100123456789876543210 x0123456789876543210 + type FilterEvenGt7Sym0 :: (~>) [Nat] [Nat] + data FilterEvenGt7Sym0 :: (~>) [Nat] [Nat] + where + FilterEvenGt7Sym0KindInference :: SameKind (Apply FilterEvenGt7Sym0 arg) (FilterEvenGt7Sym1 arg) => + FilterEvenGt7Sym0 a0123456789876543210 + type instance Apply FilterEvenGt7Sym0 a0123456789876543210 = FilterEvenGt7 a0123456789876543210 + instance SuppressUnusedWarnings FilterEvenGt7Sym0 where + suppressUnusedWarnings + = snd ((,) FilterEvenGt7Sym0KindInference ()) + type FilterEvenGt7Sym1 :: [Nat] -> [Nat] + type family FilterEvenGt7Sym1 (a0123456789876543210 :: [Nat]) :: [Nat] where + FilterEvenGt7Sym1 a0123456789876543210 = FilterEvenGt7 a0123456789876543210 + type EvenbSym0 :: (~>) Nat Bool + data EvenbSym0 :: (~>) Nat Bool + where + EvenbSym0KindInference :: SameKind (Apply EvenbSym0 arg) (EvenbSym1 arg) => + EvenbSym0 a0123456789876543210 + type instance Apply EvenbSym0 a0123456789876543210 = Evenb a0123456789876543210 + instance SuppressUnusedWarnings EvenbSym0 where + suppressUnusedWarnings = snd ((,) EvenbSym0KindInference ()) + type EvenbSym1 :: Nat -> Bool + type family EvenbSym1 (a0123456789876543210 :: Nat) :: Bool where + EvenbSym1 a0123456789876543210 = Evenb a0123456789876543210 + type FilterEvenGt7 :: [Nat] -> [Nat] + type family FilterEvenGt7 (a :: [Nat]) :: [Nat] where + FilterEvenGt7 a_0123456789876543210 = Apply (Apply FilterSym0 (Apply Lambda_0123456789876543210Sym0 a_0123456789876543210)) a_0123456789876543210 + type Evenb :: Nat -> Bool + type family Evenb (a :: Nat) :: Bool where + Evenb 'Zero = TrueSym0 + Evenb ('Succ 'Zero) = FalseSym0 + Evenb ('Succ ('Succ n)) = Apply EvenbSym0 n
tests/compile-and-dump/Singletons/T445.hs view
@@ -1,26 +1,26 @@-module T445 where--import Data.Singletons.TH-import qualified GHC.TypeLits as Lit-import Numeric.Natural (Natural)-import Prelude.Singletons-import Singletons.Nat--type Lit :: Natural -> Nat-type family Lit n where- Lit 0 = Zero- Lit n = Succ (Lit (n Lit.- 1))-$(genDefunSymbols [''Lit])--$(promoteOnly [d|- evenb :: Nat -> Bool- evenb Zero = True- evenb (Succ Zero) = False- evenb (Succ (Succ n)) = evenb n-- filterEvenGt7 :: [Nat] -> [Nat]- filterEvenGt7 = filter (\x -> evenb x && x > lit 7)- |])--testFilterEvenGt7 :: FilterEvenGt7 (Map LitSym0 '[5,2,6,19,129]) :~: '[]-testFilterEvenGt7 = Refl+module T445 where + +import Data.Singletons.TH +import qualified GHC.TypeLits as Lit +import Numeric.Natural (Natural) +import Prelude.Singletons +import Singletons.Nat + +type Lit :: Natural -> Nat +type family Lit n where + Lit 0 = Zero + Lit n = Succ (Lit (n Lit.- 1)) +$(genDefunSymbols [''Lit]) + +$(promoteOnly [d| + evenb :: Nat -> Bool + evenb Zero = True + evenb (Succ Zero) = False + evenb (Succ (Succ n)) = evenb n + + filterEvenGt7 :: [Nat] -> [Nat] + filterEvenGt7 = filter (\x -> evenb x && x > lit 7) + |]) + +testFilterEvenGt7 :: FilterEvenGt7 (Map LitSym0 '[5,2,6,19,129]) :~: '[] +testFilterEvenGt7 = Refl
tests/compile-and-dump/Singletons/T450.golden view
@@ -1,209 +1,212 @@-Singletons/T450.hs:(0,0)-(0,0): Splicing declarations- do let customPromote :: [(Name, Name)] -> Name -> Name- customPromote customs n = fromMaybe n $ lookup n customs- customOptions :: [(Name, Name)] -> Options- customOptions customs- = defaultOptions- {promotedDataTypeOrConName = \ n- -> promotedDataTypeOrConName- defaultOptions (customPromote customs n),- defunctionalizedName = \ n sat- -> defunctionalizedName- defaultOptions (customPromote customs n) sat}- messageDecs <- withOptions- (customOptions- [(''Message, ''PMessage), ('MkMessage, 'PMkMessage),- (''Text, ''Symbol)])- $ do messageDecs1 <- genSingletons [''Message]- messageDecs2 <- singletons- [d| appendMessage :: Message -> Message -> Message- appendMessage- (MkMessage (x :: Text))- (MkMessage (y :: Text))- = MkMessage (x <> y :: Text) |]- pure $ messageDecs1 ++ messageDecs2- functionDecs <- withOptions- (customOptions- [(''Function, ''PFunction), ('MkFunction, 'PMkFunction)])- $ do functionDecs1 <- genSingletons [''Function]- functionDecs2 <- singletons- [d| composeFunction ::- Function b c -> Function a b -> Function a c- composeFunction- (MkFunction (f :: b -> c))- (MkFunction (g :: a -> b))- = MkFunction (f . g :: a -> c) |]- pure $ functionDecs1 ++ functionDecs2- pure $ messageDecs ++ functionDecs- ======>- type PMkMessageSym0 :: (~>) Symbol PMessage- data PMkMessageSym0 :: (~>) Symbol PMessage- where- PMkMessageSym0KindInference :: SameKind (Apply PMkMessageSym0 arg) (PMkMessageSym1 arg) =>- PMkMessageSym0 a0123456789876543210- type instance Apply PMkMessageSym0 a0123456789876543210 = 'PMkMessage a0123456789876543210- instance SuppressUnusedWarnings PMkMessageSym0 where- suppressUnusedWarnings = snd (((,) PMkMessageSym0KindInference) ())- type PMkMessageSym1 :: Symbol -> PMessage- type family PMkMessageSym1 (a0123456789876543210 :: Symbol) :: PMessage where- PMkMessageSym1 a0123456789876543210 = 'PMkMessage a0123456789876543210- type SMessage :: PMessage -> Type- data SMessage :: PMessage -> Type- where- SMkMessage :: forall (n :: Symbol).- (Sing n) -> SMessage ('PMkMessage n :: PMessage)- type instance Sing @PMessage = SMessage- instance SingKind PMessage where- type Demote PMessage = Message- fromSing (SMkMessage b) = MkMessage (fromSing b)- toSing (MkMessage (b :: Demote Symbol))- = case toSing b :: SomeSing Symbol of- SomeSing c -> SomeSing (SMkMessage c)- instance SingI n => SingI ('PMkMessage (n :: Symbol)) where- sing = SMkMessage sing- instance SingI1 'PMkMessage where- liftSing = SMkMessage- instance SingI (PMkMessageSym0 :: (~>) Symbol PMessage) where- sing = (singFun1 @PMkMessageSym0) SMkMessage- appendMessage :: Message -> Message -> Message- appendMessage (MkMessage (x :: Text)) (MkMessage (y :: Text))- = MkMessage ((x <> y) :: Text)- type AppendMessageSym0 :: (~>) PMessage ((~>) PMessage PMessage)- data AppendMessageSym0 :: (~>) PMessage ((~>) PMessage PMessage)- where- AppendMessageSym0KindInference :: SameKind (Apply AppendMessageSym0 arg) (AppendMessageSym1 arg) =>- AppendMessageSym0 a0123456789876543210- type instance Apply AppendMessageSym0 a0123456789876543210 = AppendMessageSym1 a0123456789876543210- instance SuppressUnusedWarnings AppendMessageSym0 where- suppressUnusedWarnings- = snd (((,) AppendMessageSym0KindInference) ())- type AppendMessageSym1 :: PMessage -> (~>) PMessage PMessage- data AppendMessageSym1 (a0123456789876543210 :: PMessage) :: (~>) PMessage PMessage- where- AppendMessageSym1KindInference :: SameKind (Apply (AppendMessageSym1 a0123456789876543210) arg) (AppendMessageSym2 a0123456789876543210 arg) =>- AppendMessageSym1 a0123456789876543210 a0123456789876543210- type instance Apply (AppendMessageSym1 a0123456789876543210) a0123456789876543210 = AppendMessage a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (AppendMessageSym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) AppendMessageSym1KindInference) ())- type AppendMessageSym2 :: PMessage -> PMessage -> PMessage- type family AppendMessageSym2 (a0123456789876543210 :: PMessage) (a0123456789876543210 :: PMessage) :: PMessage where- AppendMessageSym2 a0123456789876543210 a0123456789876543210 = AppendMessage a0123456789876543210 a0123456789876543210- type AppendMessage :: PMessage -> PMessage -> PMessage- type family AppendMessage (a :: PMessage) (a :: PMessage) :: PMessage where- AppendMessage ('PMkMessage (x :: Symbol)) ('PMkMessage (y :: Symbol)) = Apply PMkMessageSym0 (Apply (Apply (<>@#@$) x) y :: Symbol)- sAppendMessage ::- forall (t :: PMessage) (t :: PMessage). Sing t- -> Sing t- -> Sing (Apply (Apply AppendMessageSym0 t) t :: PMessage)- sAppendMessage- (SMkMessage (sX :: Sing x))- (SMkMessage (sY :: Sing y))- = case ((,) (sX :: Sing x)) (sY :: Sing y) of- (,) (_ :: Sing (x :: Symbol)) (_ :: Sing (y :: Symbol))- -> (applySing ((singFun1 @PMkMessageSym0) SMkMessage))- ((applySing ((applySing ((singFun2 @(<>@#@$)) (%<>))) sX)) sY ::- Sing (Apply (Apply (<>@#@$) x) y :: Symbol))- instance SingI (AppendMessageSym0 :: (~>) PMessage ((~>) PMessage PMessage)) where- sing = (singFun2 @AppendMessageSym0) sAppendMessage- instance SingI d =>- SingI (AppendMessageSym1 (d :: PMessage) :: (~>) PMessage PMessage) where- sing- = (singFun1 @(AppendMessageSym1 (d :: PMessage)))- (sAppendMessage (sing @d))- instance SingI1 (AppendMessageSym1 :: PMessage- -> (~>) PMessage PMessage) where- liftSing (s :: Sing (d :: PMessage))- = (singFun1 @(AppendMessageSym1 (d :: PMessage)))- (sAppendMessage s)- type PMkFunctionSym0 :: forall (a :: Type)- (b :: Type). (~>) ((~>) a b) (PFunction (a :: Type) (b :: Type))- data PMkFunctionSym0 :: (~>) ((~>) a b) (PFunction (a :: Type) (b :: Type))- where- PMkFunctionSym0KindInference :: SameKind (Apply PMkFunctionSym0 arg) (PMkFunctionSym1 arg) =>- PMkFunctionSym0 a0123456789876543210- type instance Apply PMkFunctionSym0 a0123456789876543210 = 'PMkFunction a0123456789876543210- instance SuppressUnusedWarnings PMkFunctionSym0 where- suppressUnusedWarnings- = snd (((,) PMkFunctionSym0KindInference) ())- type PMkFunctionSym1 :: forall (a :: Type) (b :: Type). (~>) a b- -> PFunction (a :: Type) (b :: Type)- type family PMkFunctionSym1 (a0123456789876543210 :: (~>) a b) :: PFunction (a :: Type) (b :: Type) where- PMkFunctionSym1 a0123456789876543210 = 'PMkFunction a0123456789876543210- type SFunction :: forall (a :: Type) (b :: Type). PFunction a b- -> Type- data SFunction :: forall (a :: Type) (b :: Type).- PFunction a b -> Type- where- SMkFunction :: forall (a :: Type) (b :: Type) (n :: (~>) a b).- (Sing n) ->- SFunction ('PMkFunction n :: PFunction (a :: Type) (b :: Type))- type instance Sing @(PFunction a b) = SFunction- instance (SingKind a, SingKind b) => SingKind (PFunction a b) where- type Demote (PFunction a b) = Function (Demote a) (Demote b)- fromSing (SMkFunction b) = MkFunction (fromSing b)- toSing (MkFunction (b :: Demote ((~>) a b)))- = case toSing b :: SomeSing ((~>) a b) of- SomeSing c -> SomeSing (SMkFunction c)- instance SingI n => SingI ('PMkFunction (n :: (~>) a b)) where- sing = SMkFunction sing- instance SingI1 'PMkFunction where- liftSing = SMkFunction- instance SingI (PMkFunctionSym0 :: (~>) ((~>) a b) (PFunction (a :: Type) (b :: Type))) where- sing = (singFun1 @PMkFunctionSym0) SMkFunction- composeFunction :: Function b c -> Function a b -> Function a c- composeFunction- (MkFunction (f :: b -> c))- (MkFunction (g :: a -> b))- = MkFunction ((f . g) :: a -> c)- type ComposeFunctionSym0 :: (~>) (PFunction b c) ((~>) (PFunction a b) (PFunction a c))- data ComposeFunctionSym0 :: (~>) (PFunction b c) ((~>) (PFunction a b) (PFunction a c))- where- ComposeFunctionSym0KindInference :: SameKind (Apply ComposeFunctionSym0 arg) (ComposeFunctionSym1 arg) =>- ComposeFunctionSym0 a0123456789876543210- type instance Apply ComposeFunctionSym0 a0123456789876543210 = ComposeFunctionSym1 a0123456789876543210- instance SuppressUnusedWarnings ComposeFunctionSym0 where- suppressUnusedWarnings- = snd (((,) ComposeFunctionSym0KindInference) ())- type ComposeFunctionSym1 :: PFunction b c- -> (~>) (PFunction a b) (PFunction a c)- data ComposeFunctionSym1 (a0123456789876543210 :: PFunction b c) :: (~>) (PFunction a b) (PFunction a c)- where- ComposeFunctionSym1KindInference :: SameKind (Apply (ComposeFunctionSym1 a0123456789876543210) arg) (ComposeFunctionSym2 a0123456789876543210 arg) =>- ComposeFunctionSym1 a0123456789876543210 a0123456789876543210- type instance Apply (ComposeFunctionSym1 a0123456789876543210) a0123456789876543210 = ComposeFunction a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (ComposeFunctionSym1 a0123456789876543210) where- suppressUnusedWarnings- = snd (((,) ComposeFunctionSym1KindInference) ())- type ComposeFunctionSym2 :: PFunction b c- -> PFunction a b -> PFunction a c- type family ComposeFunctionSym2 (a0123456789876543210 :: PFunction b c) (a0123456789876543210 :: PFunction a b) :: PFunction a c where- ComposeFunctionSym2 a0123456789876543210 a0123456789876543210 = ComposeFunction a0123456789876543210 a0123456789876543210- type ComposeFunction :: PFunction b c- -> PFunction a b -> PFunction a c- type family ComposeFunction (a :: PFunction b c) (a :: PFunction a b) :: PFunction a c where- ComposeFunction ('PMkFunction (f :: (~>) b c)) ('PMkFunction (g :: (~>) a b)) = Apply PMkFunctionSym0 (Apply (Apply (.@#@$) f) g :: (~>) a c)- sComposeFunction ::- forall b c a (t :: PFunction b c) (t :: PFunction a b). Sing t- -> Sing t- -> Sing (Apply (Apply ComposeFunctionSym0 t) t :: PFunction a c)- sComposeFunction- (SMkFunction (sF :: Sing f))- (SMkFunction (sG :: Sing g))- = case ((,) (sF :: Sing f)) (sG :: Sing g) of- (,) (_ :: Sing (f :: (~>) b c)) (_ :: Sing (g :: (~>) a b))- -> (applySing ((singFun1 @PMkFunctionSym0) SMkFunction))- ((applySing ((applySing ((singFun3 @(.@#@$)) (%.))) sF)) sG ::- Sing (Apply (Apply (.@#@$) f) g :: (~>) a c))- instance SingI (ComposeFunctionSym0 :: (~>) (PFunction b c) ((~>) (PFunction a b) (PFunction a c))) where- sing = (singFun2 @ComposeFunctionSym0) sComposeFunction- instance SingI d =>- SingI (ComposeFunctionSym1 (d :: PFunction b c) :: (~>) (PFunction a b) (PFunction a c)) where- sing- = (singFun1 @(ComposeFunctionSym1 (d :: PFunction b c)))- (sComposeFunction (sing @d))- instance SingI1 (ComposeFunctionSym1 :: PFunction b c- -> (~>) (PFunction a b) (PFunction a c)) where- liftSing (s :: Sing (d :: PFunction b c))- = (singFun1 @(ComposeFunctionSym1 (d :: PFunction b c)))- (sComposeFunction s)+Singletons/T450.hs:(0,0)-(0,0): Splicing declarations + do let customPromote :: [(Name, Name)] -> Name -> Name + customPromote customs n = fromMaybe n $ lookup n customs + customOptions :: [(Name, Name)] -> Options + customOptions customs + = defaultOptions + {promotedDataTypeOrConName = \ n + -> promotedDataTypeOrConName + defaultOptions (customPromote customs n), + defunctionalizedName = \ n sat + -> defunctionalizedName + defaultOptions (customPromote customs n) sat} + messageDecs <- withOptions + (customOptions + [(''Message, ''PMessage), ('MkMessage, 'PMkMessage), + (''Text, ''Symbol)]) + $ do messageDecs1 <- genSingletons [''Message] + messageDecs2 <- singletons + [d| appendMessage :: Message -> Message -> Message + appendMessage + (MkMessage (x :: Text)) + (MkMessage (y :: Text)) + = MkMessage (x <> y :: Text) |] + pure $ messageDecs1 ++ messageDecs2 + functionDecs <- withOptions + (customOptions + [(''Function, ''PFunction), ('MkFunction, 'PMkFunction)]) + $ do functionDecs1 <- genSingletons [''Function] + functionDecs2 <- singletons + [d| composeFunction :: + Function b c -> Function a b -> Function a c + composeFunction + (MkFunction (f :: b -> c)) + (MkFunction (g :: a -> b)) + = MkFunction (f . g :: a -> c) |] + pure $ functionDecs1 ++ functionDecs2 + pure $ messageDecs ++ functionDecs + ======> + type PMkMessageSym0 :: (~>) Symbol PMessage + data PMkMessageSym0 :: (~>) Symbol PMessage + where + PMkMessageSym0KindInference :: SameKind (Apply PMkMessageSym0 arg) (PMkMessageSym1 arg) => + PMkMessageSym0 a0123456789876543210 + type instance Apply PMkMessageSym0 a0123456789876543210 = 'PMkMessage a0123456789876543210 + instance SuppressUnusedWarnings PMkMessageSym0 where + suppressUnusedWarnings = snd ((,) PMkMessageSym0KindInference ()) + type PMkMessageSym1 :: Symbol -> PMessage + type family PMkMessageSym1 (a0123456789876543210 :: Symbol) :: PMessage where + PMkMessageSym1 a0123456789876543210 = 'PMkMessage a0123456789876543210 + type SMessage :: PMessage -> Type + data SMessage :: PMessage -> Type + where + SMkMessage :: forall (n :: Symbol). + (Sing n) -> SMessage ('PMkMessage n :: PMessage) + type instance Sing @PMessage = SMessage + instance SingKind PMessage where + type Demote PMessage = Message + fromSing (SMkMessage b) = MkMessage (fromSing b) + toSing (MkMessage (b :: Demote Symbol)) + = case toSing b :: SomeSing Symbol of + SomeSing c -> SomeSing (SMkMessage c) + instance SingI n => SingI ('PMkMessage (n :: Symbol)) where + sing = SMkMessage sing + instance SingI1 'PMkMessage where + liftSing = SMkMessage + instance SingI (PMkMessageSym0 :: (~>) Symbol PMessage) where + sing = singFun1 @PMkMessageSym0 SMkMessage + appendMessage :: Message -> Message -> Message + appendMessage (MkMessage (x :: Text)) (MkMessage (y :: Text)) + = MkMessage ((x <> y) :: Text) + type AppendMessageSym0 :: (~>) PMessage ((~>) PMessage PMessage) + data AppendMessageSym0 :: (~>) PMessage ((~>) PMessage PMessage) + where + AppendMessageSym0KindInference :: SameKind (Apply AppendMessageSym0 arg) (AppendMessageSym1 arg) => + AppendMessageSym0 a0123456789876543210 + type instance Apply AppendMessageSym0 a0123456789876543210 = AppendMessageSym1 a0123456789876543210 + instance SuppressUnusedWarnings AppendMessageSym0 where + suppressUnusedWarnings + = snd ((,) AppendMessageSym0KindInference ()) + type AppendMessageSym1 :: PMessage -> (~>) PMessage PMessage + data AppendMessageSym1 (a0123456789876543210 :: PMessage) :: (~>) PMessage PMessage + where + AppendMessageSym1KindInference :: SameKind (Apply (AppendMessageSym1 a0123456789876543210) arg) (AppendMessageSym2 a0123456789876543210 arg) => + AppendMessageSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (AppendMessageSym1 a0123456789876543210) a0123456789876543210 = AppendMessage a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (AppendMessageSym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) AppendMessageSym1KindInference ()) + type AppendMessageSym2 :: PMessage -> PMessage -> PMessage + type family AppendMessageSym2 (a0123456789876543210 :: PMessage) (a0123456789876543210 :: PMessage) :: PMessage where + AppendMessageSym2 a0123456789876543210 a0123456789876543210 = AppendMessage a0123456789876543210 a0123456789876543210 + type AppendMessage :: PMessage -> PMessage -> PMessage + type family AppendMessage (a :: PMessage) (a :: PMessage) :: PMessage where + AppendMessage ('PMkMessage (x :: Symbol)) ('PMkMessage (y :: Symbol)) = Apply PMkMessageSym0 (Apply (Apply (<>@#@$) x) y :: Symbol) + sAppendMessage :: + (forall (t :: PMessage) (t :: PMessage). + Sing t + -> Sing t + -> Sing (Apply (Apply AppendMessageSym0 t) t :: PMessage) :: Type) + sAppendMessage + (SMkMessage (sX :: Sing x)) + (SMkMessage (sY :: Sing y)) + = case (,) (sX :: Sing x) (sY :: Sing y) of + (,) (_ :: Sing (x :: Symbol)) (_ :: Sing (y :: Symbol)) + -> applySing + (singFun1 @PMkMessageSym0 SMkMessage) + (applySing (applySing (singFun2 @(<>@#@$) (%<>)) sX) sY :: + Sing (Apply (Apply (<>@#@$) x) y :: Symbol)) + instance SingI (AppendMessageSym0 :: (~>) PMessage ((~>) PMessage PMessage)) where + sing = singFun2 @AppendMessageSym0 sAppendMessage + instance SingI d => + SingI (AppendMessageSym1 (d :: PMessage) :: (~>) PMessage PMessage) where + sing + = singFun1 + @(AppendMessageSym1 (d :: PMessage)) (sAppendMessage (sing @d)) + instance SingI1 (AppendMessageSym1 :: PMessage + -> (~>) PMessage PMessage) where + liftSing (s :: Sing (d :: PMessage)) + = singFun1 @(AppendMessageSym1 (d :: PMessage)) (sAppendMessage s) + type PMkFunctionSym0 :: forall (a :: Type) + (b :: Type). (~>) ((~>) a b) (PFunction (a :: Type) (b :: Type)) + data PMkFunctionSym0 :: (~>) ((~>) a b) (PFunction (a :: Type) (b :: Type)) + where + PMkFunctionSym0KindInference :: SameKind (Apply PMkFunctionSym0 arg) (PMkFunctionSym1 arg) => + PMkFunctionSym0 a0123456789876543210 + type instance Apply PMkFunctionSym0 a0123456789876543210 = 'PMkFunction a0123456789876543210 + instance SuppressUnusedWarnings PMkFunctionSym0 where + suppressUnusedWarnings = snd ((,) PMkFunctionSym0KindInference ()) + type PMkFunctionSym1 :: forall (a :: Type) (b :: Type). (~>) a b + -> PFunction (a :: Type) (b :: Type) + type family PMkFunctionSym1 (a0123456789876543210 :: (~>) a b) :: PFunction (a :: Type) (b :: Type) where + PMkFunctionSym1 a0123456789876543210 = 'PMkFunction a0123456789876543210 + type SFunction :: forall (a :: Type) (b :: Type). PFunction a b + -> Type + data SFunction :: forall (a :: Type) (b :: Type). + PFunction a b -> Type + where + SMkFunction :: forall (a :: Type) (b :: Type) (n :: (~>) a b). + (Sing n) -> + SFunction ('PMkFunction n :: PFunction (a :: Type) (b :: Type)) + type instance Sing @(PFunction a b) = SFunction + instance (SingKind a, SingKind b) => SingKind (PFunction a b) where + type Demote (PFunction a b) = Function (Demote a) (Demote b) + fromSing (SMkFunction b) = MkFunction (fromSing b) + toSing (MkFunction (b :: Demote ((~>) a b))) + = case toSing b :: SomeSing ((~>) a b) of + SomeSing c -> SomeSing (SMkFunction c) + instance SingI n => SingI ('PMkFunction (n :: (~>) a b)) where + sing = SMkFunction sing + instance SingI1 'PMkFunction where + liftSing = SMkFunction + instance SingI (PMkFunctionSym0 :: (~>) ((~>) a b) (PFunction (a :: Type) (b :: Type))) where + sing = singFun1 @PMkFunctionSym0 SMkFunction + composeFunction :: Function b c -> Function a b -> Function a c + composeFunction + (MkFunction (f :: b -> c)) + (MkFunction (g :: a -> b)) + = MkFunction ((f . g) :: a -> c) + type ComposeFunctionSym0 :: (~>) (PFunction b c) ((~>) (PFunction a b) (PFunction a c)) + data ComposeFunctionSym0 :: (~>) (PFunction b c) ((~>) (PFunction a b) (PFunction a c)) + where + ComposeFunctionSym0KindInference :: SameKind (Apply ComposeFunctionSym0 arg) (ComposeFunctionSym1 arg) => + ComposeFunctionSym0 a0123456789876543210 + type instance Apply ComposeFunctionSym0 a0123456789876543210 = ComposeFunctionSym1 a0123456789876543210 + instance SuppressUnusedWarnings ComposeFunctionSym0 where + suppressUnusedWarnings + = snd ((,) ComposeFunctionSym0KindInference ()) + type ComposeFunctionSym1 :: PFunction b c + -> (~>) (PFunction a b) (PFunction a c) + data ComposeFunctionSym1 (a0123456789876543210 :: PFunction b c) :: (~>) (PFunction a b) (PFunction a c) + where + ComposeFunctionSym1KindInference :: SameKind (Apply (ComposeFunctionSym1 a0123456789876543210) arg) (ComposeFunctionSym2 a0123456789876543210 arg) => + ComposeFunctionSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (ComposeFunctionSym1 a0123456789876543210) a0123456789876543210 = ComposeFunction a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ComposeFunctionSym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) ComposeFunctionSym1KindInference ()) + type ComposeFunctionSym2 :: PFunction b c + -> PFunction a b -> PFunction a c + type family ComposeFunctionSym2 (a0123456789876543210 :: PFunction b c) (a0123456789876543210 :: PFunction a b) :: PFunction a c where + ComposeFunctionSym2 a0123456789876543210 a0123456789876543210 = ComposeFunction a0123456789876543210 a0123456789876543210 + type ComposeFunction :: PFunction b c + -> PFunction a b -> PFunction a c + type family ComposeFunction (a :: PFunction b c) (a :: PFunction a b) :: PFunction a c where + ComposeFunction ('PMkFunction (f :: (~>) b c)) ('PMkFunction (g :: (~>) a b)) = Apply PMkFunctionSym0 (Apply (Apply (.@#@$) f) g :: (~>) a c) + sComposeFunction :: + (forall (t :: PFunction b c) (t :: PFunction a b). + Sing t + -> Sing t + -> Sing (Apply (Apply ComposeFunctionSym0 t) t :: PFunction a c) :: Type) + sComposeFunction + (SMkFunction (sF :: Sing f)) + (SMkFunction (sG :: Sing g)) + = case (,) (sF :: Sing f) (sG :: Sing g) of + (,) (_ :: Sing (f :: (~>) b c)) (_ :: Sing (g :: (~>) a b)) + -> applySing + (singFun1 @PMkFunctionSym0 SMkFunction) + (applySing (applySing (singFun3 @(.@#@$) (%.)) sF) sG :: + Sing (Apply (Apply (.@#@$) f) g :: (~>) a c)) + instance SingI (ComposeFunctionSym0 :: (~>) (PFunction b c) ((~>) (PFunction a b) (PFunction a c))) where + sing = singFun2 @ComposeFunctionSym0 sComposeFunction + instance SingI d => + SingI (ComposeFunctionSym1 (d :: PFunction b c) :: (~>) (PFunction a b) (PFunction a c)) where + sing + = singFun1 + @(ComposeFunctionSym1 (d :: PFunction b c)) + (sComposeFunction (sing @d)) + instance SingI1 (ComposeFunctionSym1 :: PFunction b c + -> (~>) (PFunction a b) (PFunction a c)) where + liftSing (s :: Sing (d :: PFunction b c)) + = singFun1 + @(ComposeFunctionSym1 (d :: PFunction b c)) (sComposeFunction s)
tests/compile-and-dump/Singletons/T450.hs view
@@ -1,53 +1,53 @@-module T450 where--import Data.Maybe-import Data.Singletons.TH-import Data.Singletons.TH.Options-import Data.Text (Text)-import Language.Haskell.TH (Name)-import Prelude.Singletons--newtype Message = MkMessage Text-newtype PMessage = PMkMessage Symbol--newtype Function a b = MkFunction (a -> b)-newtype PFunction a b = PMkFunction (a ~> b)--$(do let customPromote :: [(Name, Name)] -> Name -> Name- customPromote customs n = fromMaybe n $ lookup n customs-- customOptions :: [(Name, Name)] -> Options- customOptions customs =- defaultOptions{ promotedDataTypeOrConName = \n ->- promotedDataTypeOrConName defaultOptions- (customPromote customs n)- , defunctionalizedName = \n sat ->- defunctionalizedName defaultOptions- (customPromote customs n) sat- }-- messageDecs <-- withOptions (customOptions [ (''Message, ''PMessage)- , ('MkMessage, 'PMkMessage)- , (''Text, ''Symbol)- ]) $ do- messageDecs1 <- genSingletons [''Message]- messageDecs2 <- singletons [d|- appendMessage :: Message -> Message -> Message- appendMessage (MkMessage (x :: Text)) (MkMessage (y :: Text)) =- MkMessage (x <> y :: Text)- |]- pure $ messageDecs1 ++ messageDecs2-- functionDecs <-- withOptions (customOptions [ (''Function, ''PFunction)- , ('MkFunction, 'PMkFunction)- ]) $ do- functionDecs1 <- genSingletons [''Function]- functionDecs2 <- singletons [d|- composeFunction :: Function b c -> Function a b -> Function a c- composeFunction (MkFunction (f :: b -> c)) (MkFunction (g :: a -> b)) =- MkFunction (f . g :: a -> c)- |]- pure $ functionDecs1 ++ functionDecs2- pure $ messageDecs ++ functionDecs)+module T450 where + +import Data.Maybe +import Data.Singletons.TH +import Data.Singletons.TH.Options +import Data.Text (Text) +import Language.Haskell.TH (Name) +import Prelude.Singletons + +newtype Message = MkMessage Text +newtype PMessage = PMkMessage Symbol + +newtype Function a b = MkFunction (a -> b) +newtype PFunction a b = PMkFunction (a ~> b) + +$(do let customPromote :: [(Name, Name)] -> Name -> Name + customPromote customs n = fromMaybe n $ lookup n customs + + customOptions :: [(Name, Name)] -> Options + customOptions customs = + defaultOptions{ promotedDataTypeOrConName = \n -> + promotedDataTypeOrConName defaultOptions + (customPromote customs n) + , defunctionalizedName = \n sat -> + defunctionalizedName defaultOptions + (customPromote customs n) sat + } + + messageDecs <- + withOptions (customOptions [ (''Message, ''PMessage) + , ('MkMessage, 'PMkMessage) + , (''Text, ''Symbol) + ]) $ do + messageDecs1 <- genSingletons [''Message] + messageDecs2 <- singletons [d| + appendMessage :: Message -> Message -> Message + appendMessage (MkMessage (x :: Text)) (MkMessage (y :: Text)) = + MkMessage (x <> y :: Text) + |] + pure $ messageDecs1 ++ messageDecs2 + + functionDecs <- + withOptions (customOptions [ (''Function, ''PFunction) + , ('MkFunction, 'PMkFunction) + ]) $ do + functionDecs1 <- genSingletons [''Function] + functionDecs2 <- singletons [d| + composeFunction :: Function b c -> Function a b -> Function a c + composeFunction (MkFunction (f :: b -> c)) (MkFunction (g :: a -> b)) = + MkFunction (f . g :: a -> c) + |] + pure $ functionDecs1 ++ functionDecs2 + pure $ messageDecs ++ functionDecs)
tests/compile-and-dump/Singletons/T453.golden view
@@ -1,19 +1,19 @@-Singletons/T453.hs:(0,0)-(0,0): Splicing declarations- withOptions defaultOptions {genSingKindInsts = False}- $ singletons- [d| type T1 :: forall k. k -> Type- type T2 :: k -> Type- - data T1 a- data T2 a |]- ======>- type T1 :: forall k. k -> Type- data T1 a- type T2 :: k -> Type- data T2 a- type ST1 :: forall k (a :: k). T1 a -> Type- data ST1 :: forall k (a :: k). T1 a -> Type- type instance Sing @(T1 a) = ST1- type ST2 :: forall k (a :: k). T2 a -> Type- data ST2 :: forall k (a :: k). T2 a -> Type- type instance Sing @(T2 a) = ST2+Singletons/T453.hs:(0,0)-(0,0): Splicing declarations + withOptions defaultOptions {genSingKindInsts = False} + $ singletons + [d| type T1 :: forall k. k -> Type + type T2 :: k -> Type + + data T1 a + data T2 a |] + ======> + type T1 :: forall k. k -> Type + data T1 a + type T2 :: k -> Type + data T2 a + type ST1 :: forall k (a :: k). T1 a -> Type + data ST1 :: forall k (a :: k). T1 a -> Type + type instance Sing @(T1 a) = ST1 + type ST2 :: forall k (a :: k). T2 a -> Type + data ST2 :: forall k (a :: k). T2 a -> Type + type instance Sing @(T2 a) = ST2
tests/compile-and-dump/Singletons/T453.hs view
@@ -1,15 +1,15 @@-module T453 where--import Control.Monad.Trans.Class-import Data.Kind-import Data.Singletons.TH-import Data.Singletons.TH.Options--$(withOptions defaultOptions{genSingKindInsts = False} $- singletons [d|- type T1 :: forall k. k -> Type- data T1 a-- type T2 :: k -> Type- data T2 a- |])+module T453 where + +import Control.Monad.Trans.Class +import Data.Kind +import Data.Singletons.TH +import Data.Singletons.TH.Options + +$(withOptions defaultOptions{genSingKindInsts = False} $ + singletons [d| + type T1 :: forall k. k -> Type + data T1 a + + type T2 :: k -> Type + data T2 a + |])
tests/compile-and-dump/Singletons/T470.golden view
@@ -1,96 +1,96 @@-Singletons/T470.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| type T :: Type -> Type- - data T a- where- MkT1 :: a -> T a- MkT2 :: !Void -> T a- data S = MkS {-# UNPACK #-} !Bool |]- ======>- type T :: Type -> Type- data T a- where- MkT1 :: a -> T a- MkT2 :: !Void -> T a- data S = MkS {-# UNPACK #-} !Bool- type MkT1Sym0 :: (~>) a (T a)- data MkT1Sym0 :: (~>) a (T a)- where- MkT1Sym0KindInference :: SameKind (Apply MkT1Sym0 arg) (MkT1Sym1 arg) =>- MkT1Sym0 a0123456789876543210- type instance Apply MkT1Sym0 a0123456789876543210 = MkT1 a0123456789876543210- instance SuppressUnusedWarnings MkT1Sym0 where- suppressUnusedWarnings = snd (((,) MkT1Sym0KindInference) ())- type MkT1Sym1 :: a -> T a- type family MkT1Sym1 (a0123456789876543210 :: a) :: T a where- MkT1Sym1 a0123456789876543210 = MkT1 a0123456789876543210- type MkT2Sym0 :: (~>) Void (T a)- data MkT2Sym0 :: (~>) Void (T a)- where- MkT2Sym0KindInference :: SameKind (Apply MkT2Sym0 arg) (MkT2Sym1 arg) =>- MkT2Sym0 a0123456789876543210- type instance Apply MkT2Sym0 a0123456789876543210 = MkT2 a0123456789876543210- instance SuppressUnusedWarnings MkT2Sym0 where- suppressUnusedWarnings = snd (((,) MkT2Sym0KindInference) ())- type MkT2Sym1 :: Void -> T a- type family MkT2Sym1 (a0123456789876543210 :: Void) :: T a where- MkT2Sym1 a0123456789876543210 = MkT2 a0123456789876543210- type MkSSym0 :: (~>) Bool S- data MkSSym0 :: (~>) Bool S- where- MkSSym0KindInference :: SameKind (Apply MkSSym0 arg) (MkSSym1 arg) =>- MkSSym0 a0123456789876543210- type instance Apply MkSSym0 a0123456789876543210 = MkS a0123456789876543210- instance SuppressUnusedWarnings MkSSym0 where- suppressUnusedWarnings = snd (((,) MkSSym0KindInference) ())- type MkSSym1 :: Bool -> S- type family MkSSym1 (a0123456789876543210 :: Bool) :: S where- MkSSym1 a0123456789876543210 = MkS a0123456789876543210- type ST :: forall (a :: Type). T a -> Type- data ST :: forall (a :: Type). T a -> Type- where- SMkT1 :: forall a (n :: a). (Sing n) -> ST (MkT1 n :: T a)- SMkT2 :: forall a (n :: Void). !(Sing n) -> ST (MkT2 n :: T a)- type instance Sing @(T a) = ST- instance SingKind a => SingKind (T a) where- type Demote (T a) = T (Demote a)- fromSing (SMkT1 b) = MkT1 (fromSing b)- fromSing (SMkT2 b) = MkT2 (fromSing b)- toSing (MkT1 (b :: Demote a))- = case toSing b :: SomeSing a of SomeSing c -> SomeSing (SMkT1 c)- toSing (MkT2 (b :: Demote Void))- = case toSing b :: SomeSing Void of- SomeSing c -> SomeSing (SMkT2 c)- data SS :: S -> Type- where SMkS :: forall (n :: Bool). !(Sing n) -> SS (MkS n :: S)- type instance Sing @S = SS- instance SingKind S where- type Demote S = S- fromSing (SMkS b) = MkS (fromSing b)- toSing (MkS (b :: Demote Bool))- = case toSing b :: SomeSing Bool of SomeSing c -> SomeSing (SMkS c)- instance SingI n => SingI (MkT1 (n :: a)) where- sing = SMkT1 sing- instance SingI1 MkT1 where- liftSing = SMkT1- instance SingI (MkT1Sym0 :: (~>) a (T a)) where- sing = (singFun1 @MkT1Sym0) SMkT1- instance SingI n => SingI (MkT2 (n :: Void)) where- sing = SMkT2 sing- instance SingI1 MkT2 where- liftSing = SMkT2- instance SingI (MkT2Sym0 :: (~>) Void (T a)) where- sing = (singFun1 @MkT2Sym0) SMkT2- instance SingI n => SingI (MkS (n :: Bool)) where- sing = SMkS sing- instance SingI1 MkS where- liftSing = SMkS- instance SingI (MkSSym0 :: (~>) Bool S) where- sing = (singFun1 @MkSSym0) SMkS--Singletons/T470.hs:0:0: warning:- {-# UNPACK #-} pragmas are ignored by `singletons-th`.- |-6 | $(singletons [d|- | ^^^^^^^^^^^^^^^...+Singletons/T470.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| type T :: Type -> Type + + data T a + where + MkT1 :: a -> T a + MkT2 :: !Void -> T a + data S = MkS {-# UNPACK #-} !Bool |] + ======> + type T :: Type -> Type + data T a + where + MkT1 :: a -> T a + MkT2 :: !Void -> T a + data S = MkS {-# UNPACK #-} !Bool + type MkT1Sym0 :: (~>) a (T a) + data MkT1Sym0 :: (~>) a (T a) + where + MkT1Sym0KindInference :: SameKind (Apply MkT1Sym0 arg) (MkT1Sym1 arg) => + MkT1Sym0 a0123456789876543210 + type instance Apply MkT1Sym0 a0123456789876543210 = MkT1 a0123456789876543210 + instance SuppressUnusedWarnings MkT1Sym0 where + suppressUnusedWarnings = snd ((,) MkT1Sym0KindInference ()) + type MkT1Sym1 :: a -> T a + type family MkT1Sym1 (a0123456789876543210 :: a) :: T a where + MkT1Sym1 a0123456789876543210 = MkT1 a0123456789876543210 + type MkT2Sym0 :: (~>) Void (T a) + data MkT2Sym0 :: (~>) Void (T a) + where + MkT2Sym0KindInference :: SameKind (Apply MkT2Sym0 arg) (MkT2Sym1 arg) => + MkT2Sym0 a0123456789876543210 + type instance Apply MkT2Sym0 a0123456789876543210 = MkT2 a0123456789876543210 + instance SuppressUnusedWarnings MkT2Sym0 where + suppressUnusedWarnings = snd ((,) MkT2Sym0KindInference ()) + type MkT2Sym1 :: Void -> T a + type family MkT2Sym1 (a0123456789876543210 :: Void) :: T a where + MkT2Sym1 a0123456789876543210 = MkT2 a0123456789876543210 + type MkSSym0 :: (~>) Bool S + data MkSSym0 :: (~>) Bool S + where + MkSSym0KindInference :: SameKind (Apply MkSSym0 arg) (MkSSym1 arg) => + MkSSym0 a0123456789876543210 + type instance Apply MkSSym0 a0123456789876543210 = MkS a0123456789876543210 + instance SuppressUnusedWarnings MkSSym0 where + suppressUnusedWarnings = snd ((,) MkSSym0KindInference ()) + type MkSSym1 :: Bool -> S + type family MkSSym1 (a0123456789876543210 :: Bool) :: S where + MkSSym1 a0123456789876543210 = MkS a0123456789876543210 + type ST :: forall (a :: Type). T a -> Type + data ST :: forall (a :: Type). T a -> Type + where + SMkT1 :: forall a (n :: a). (Sing n) -> ST (MkT1 n :: T a) + SMkT2 :: forall a (n :: Void). !(Sing n) -> ST (MkT2 n :: T a) + type instance Sing @(T a) = ST + instance SingKind a => SingKind (T a) where + type Demote (T a) = T (Demote a) + fromSing (SMkT1 b) = MkT1 (fromSing b) + fromSing (SMkT2 b) = MkT2 (fromSing b) + toSing (MkT1 (b :: Demote a)) + = case toSing b :: SomeSing a of SomeSing c -> SomeSing (SMkT1 c) + toSing (MkT2 (b :: Demote Void)) + = case toSing b :: SomeSing Void of + SomeSing c -> SomeSing (SMkT2 c) + data SS :: S -> Type + where SMkS :: forall (n :: Bool). !(Sing n) -> SS (MkS n :: S) + type instance Sing @S = SS + instance SingKind S where + type Demote S = S + fromSing (SMkS b) = MkS (fromSing b) + toSing (MkS (b :: Demote Bool)) + = case toSing b :: SomeSing Bool of SomeSing c -> SomeSing (SMkS c) + instance SingI n => SingI (MkT1 (n :: a)) where + sing = SMkT1 sing + instance SingI1 MkT1 where + liftSing = SMkT1 + instance SingI (MkT1Sym0 :: (~>) a (T a)) where + sing = singFun1 @MkT1Sym0 SMkT1 + instance SingI n => SingI (MkT2 (n :: Void)) where + sing = SMkT2 sing + instance SingI1 MkT2 where + liftSing = SMkT2 + instance SingI (MkT2Sym0 :: (~>) Void (T a)) where + sing = singFun1 @MkT2Sym0 SMkT2 + instance SingI n => SingI (MkS (n :: Bool)) where + sing = SMkS sing + instance SingI1 MkS where + liftSing = SMkS + instance SingI (MkSSym0 :: (~>) Bool S) where + sing = singFun1 @MkSSym0 SMkS + +Singletons/T470.hs:0:0: warning: [GHC-39584] + {-# UNPACK #-} pragmas are ignored by `singletons-th`. + | +6 | $(singletons [d| + | ^^^^^^^^^^^^^^^...
tests/compile-and-dump/Singletons/T470.hs view
@@ -1,24 +1,24 @@-module T470 where--import Data.Kind-import Data.Singletons.Base.TH--$(singletons [d|- type T :: Type -> Type- data T a where- MkT1 :: a -> T a- MkT2 :: !Void -> T a-- data S = MkS {-# UNPACK #-} !Bool- |])--f :: T a -> a-f (MkT1 x) = x--type F :: T a -> a-type family F x where- F ('MkT1 x) = x--sF :: forall a (x :: T a).- Sing x -> Sing (F x)-sF (SMkT1 sx) = sx+module T470 where + +import Data.Kind +import Data.Singletons.Base.TH + +$(singletons [d| + type T :: Type -> Type + data T a where + MkT1 :: a -> T a + MkT2 :: !Void -> T a + + data S = MkS {-# UNPACK #-} !Bool + |]) + +f :: T a -> a +f (MkT1 x) = x + +type F :: T a -> a +type family F x where + F ('MkT1 x) = x + +sF :: forall a (x :: T a). + Sing x -> Sing (F x) +sF (SMkT1 sx) = sx
tests/compile-and-dump/Singletons/T480.golden view
@@ -1,14 +1,14 @@--Singletons/T480.hs:0:0: error: Q monad failure- |-5 | $(singletons- | ^^^^^^^^^^^...--Singletons/T480.hs:0:0: error:- `singletons-th` does not support wildcard types- unless they appear in visible type patterns of data constructors- In the type: _-- |-5 | $(singletons- | ^^^^^^^^^^^...+ +Singletons/T480.hs:0:0: error: [GHC-39584] Q monad failure + | +5 | $(singletons + | ^^^^^^^^^^^... + +Singletons/T480.hs:0:0: error: [GHC-39584] + `singletons-th` does not support wildcard types + unless they appear in visible type patterns of data constructors + In the type: _ + + | +5 | $(singletons + | ^^^^^^^^^^^...
tests/compile-and-dump/Singletons/T480.hs view
@@ -1,8 +1,8 @@-module T480 where--import Data.Singletons.TH--$(singletons- [d| f :: _ -> _- f x = x- |])+module T480 where + +import Data.Singletons.TH + +$(singletons + [d| f :: _ -> _ + f x = x + |])
tests/compile-and-dump/Singletons/T487.golden view
@@ -1,73 +1,74 @@-Singletons/T487.hs:(0,0)-(0,0): Splicing declarations- singletonsOnly- [d| exprEx :: Char- exprEx = 'a'- consEx :: Char -> Symbol- consEx x = consSymbol x "bc"- unconsEx :: Maybe (Char, Symbol)- unconsEx = unconsSymbol "abc"- natToCharEx :: Char- natToCharEx = natToChar 97- charToNatEx :: Natural- charToNatEx = charToNat 'a' |]- ======>- type CharToNatExSym0 :: Natural- type family CharToNatExSym0 :: Natural where- CharToNatExSym0 = CharToNatEx- type NatToCharExSym0 :: Char- type family NatToCharExSym0 :: Char where- NatToCharExSym0 = NatToCharEx- type UnconsExSym0 :: Maybe (Char, Symbol)- type family UnconsExSym0 :: Maybe (Char, Symbol) where- UnconsExSym0 = UnconsEx- type ConsExSym0 :: (~>) Char Symbol- data ConsExSym0 :: (~>) Char Symbol- where- ConsExSym0KindInference :: SameKind (Apply ConsExSym0 arg) (ConsExSym1 arg) =>- ConsExSym0 a0123456789876543210- type instance Apply ConsExSym0 a0123456789876543210 = ConsEx a0123456789876543210- instance SuppressUnusedWarnings ConsExSym0 where- suppressUnusedWarnings = snd (((,) ConsExSym0KindInference) ())- type ConsExSym1 :: Char -> Symbol- type family ConsExSym1 (a0123456789876543210 :: Char) :: Symbol where- ConsExSym1 a0123456789876543210 = ConsEx a0123456789876543210- type ExprExSym0 :: Char- type family ExprExSym0 :: Char where- ExprExSym0 = ExprEx- type CharToNatEx :: Natural- type family CharToNatEx :: Natural where- CharToNatEx = Apply CharToNatSym0 'a'- type NatToCharEx :: Char- type family NatToCharEx :: Char where- NatToCharEx = Apply NatToCharSym0 (FromInteger 97)- type UnconsEx :: Maybe (Char, Symbol)- type family UnconsEx :: Maybe (Char, Symbol) where- UnconsEx = Apply UnconsSymbolSym0 "abc"- type ConsEx :: Char -> Symbol- type family ConsEx (a :: Char) :: Symbol where- ConsEx x = Apply (Apply ConsSymbolSym0 x) "bc"- type ExprEx :: Char- type family ExprEx :: Char where- ExprEx = 'a'- sCharToNatEx :: Sing (CharToNatExSym0 :: Natural)- sNatToCharEx :: Sing (NatToCharExSym0 :: Char)- sUnconsEx :: Sing (UnconsExSym0 :: Maybe (Char, Symbol))- sConsEx ::- forall (t :: Char). Sing t -> Sing (Apply ConsExSym0 t :: Symbol)- sExprEx :: Sing (ExprExSym0 :: Char)- sCharToNatEx- = (applySing ((singFun1 @CharToNatSym0) sCharToNat))- (sing :: Sing 'a')- sNatToCharEx- = (applySing ((singFun1 @NatToCharSym0) sNatToChar))- (sFromInteger (sing :: Sing 97))- sUnconsEx- = (applySing ((singFun1 @UnconsSymbolSym0) sUnconsSymbol))- (sing :: Sing "abc")- sConsEx (sX :: Sing x)- = (applySing- ((applySing ((singFun2 @ConsSymbolSym0) sConsSymbol)) sX))- (sing :: Sing "bc")- sExprEx = sing :: Sing 'a'- instance SingI (ConsExSym0 :: (~>) Char Symbol) where- sing = (singFun1 @ConsExSym0) sConsEx+Singletons/T487.hs:(0,0)-(0,0): Splicing declarations + singletonsOnly + [d| exprEx :: Char + exprEx = 'a' + consEx :: Char -> Symbol + consEx x = consSymbol x "bc" + unconsEx :: Maybe (Char, Symbol) + unconsEx = unconsSymbol "abc" + natToCharEx :: Char + natToCharEx = natToChar 97 + charToNatEx :: Natural + charToNatEx = charToNat 'a' |] + ======> + type CharToNatExSym0 :: Natural + type family CharToNatExSym0 :: Natural where + CharToNatExSym0 = CharToNatEx + type NatToCharExSym0 :: Char + type family NatToCharExSym0 :: Char where + NatToCharExSym0 = NatToCharEx + type UnconsExSym0 :: Maybe (Char, Symbol) + type family UnconsExSym0 :: Maybe (Char, Symbol) where + UnconsExSym0 = UnconsEx + type ConsExSym0 :: (~>) Char Symbol + data ConsExSym0 :: (~>) Char Symbol + where + ConsExSym0KindInference :: SameKind (Apply ConsExSym0 arg) (ConsExSym1 arg) => + ConsExSym0 a0123456789876543210 + type instance Apply ConsExSym0 a0123456789876543210 = ConsEx a0123456789876543210 + instance SuppressUnusedWarnings ConsExSym0 where + suppressUnusedWarnings = snd ((,) ConsExSym0KindInference ()) + type ConsExSym1 :: Char -> Symbol + type family ConsExSym1 (a0123456789876543210 :: Char) :: Symbol where + ConsExSym1 a0123456789876543210 = ConsEx a0123456789876543210 + type ExprExSym0 :: Char + type family ExprExSym0 :: Char where + ExprExSym0 = ExprEx + type CharToNatEx :: Natural + type family CharToNatEx :: Natural where + CharToNatEx = Apply CharToNatSym0 'a' + type NatToCharEx :: Char + type family NatToCharEx :: Char where + NatToCharEx = Apply NatToCharSym0 (FromInteger 97) + type UnconsEx :: Maybe (Char, Symbol) + type family UnconsEx :: Maybe (Char, Symbol) where + UnconsEx = Apply UnconsSymbolSym0 "abc" + type ConsEx :: Char -> Symbol + type family ConsEx (a :: Char) :: Symbol where + ConsEx x = Apply (Apply ConsSymbolSym0 x) "bc" + type ExprEx :: Char + type family ExprEx :: Char where + ExprEx = 'a' + sCharToNatEx :: (Sing (CharToNatExSym0 :: Natural) :: Type) + sNatToCharEx :: (Sing (NatToCharExSym0 :: Char) :: Type) + sUnconsEx :: (Sing (UnconsExSym0 :: Maybe (Char, Symbol)) :: Type) + sConsEx :: + (forall (t :: Char). + Sing t -> Sing (Apply ConsExSym0 t :: Symbol) :: Type) + sExprEx :: (Sing (ExprExSym0 :: Char) :: Type) + sCharToNatEx + = applySing (singFun1 @CharToNatSym0 sCharToNat) (sing :: Sing 'a') + sNatToCharEx + = applySing + (singFun1 @NatToCharSym0 sNatToChar) + (sFromInteger (sing :: Sing 97)) + sUnconsEx + = applySing + (singFun1 @UnconsSymbolSym0 sUnconsSymbol) (sing :: Sing "abc") + sConsEx (sX :: Sing x) + = applySing + (applySing (singFun2 @ConsSymbolSym0 sConsSymbol) sX) + (sing :: Sing "bc") + sExprEx = sing :: Sing 'a' + instance SingI (ConsExSym0 :: (~>) Char Symbol) where + sing = singFun1 @ConsExSym0 sConsEx
tests/compile-and-dump/Singletons/T487.hs view
@@ -1,40 +1,40 @@-module T487 where--import Data.Singletons.Base.TH-import GHC.TypeLits.Singletons-import Text.Show.Singletons--$(singletonsOnly [d|- exprEx :: Char- exprEx = 'a'-- consEx :: Char -> Symbol- consEx x = consSymbol x "bc"-- unconsEx :: Maybe (Char, Symbol)- unconsEx = unconsSymbol "abc"-- natToCharEx :: Char- natToCharEx = natToChar 97-- charToNatEx :: Natural- charToNatEx = charToNat 'a'- |])--showCharTest :: Show_ ExprEx :~: "'a'"-showCharTest = Refl--showSymbolTest :: Show_ "Hello, World!" :~: "\"Hello, World!\""-showSymbolTest = Refl--consSymbolTest :: ConsEx 'a' :~: "abc"-consSymbolTest = Refl--unconsSymbolTest :: UnconsEx :~: Just '( 'a', "bc" )-unconsSymbolTest = Refl--natToCharTest :: NatToCharEx :~: 'a'-natToCharTest = Refl--charToNatTest :: CharToNatEx :~: 97-charToNatTest = Refl+module T487 where + +import Data.Singletons.Base.TH +import GHC.TypeLits.Singletons +import Text.Show.Singletons + +$(singletonsOnly [d| + exprEx :: Char + exprEx = 'a' + + consEx :: Char -> Symbol + consEx x = consSymbol x "bc" + + unconsEx :: Maybe (Char, Symbol) + unconsEx = unconsSymbol "abc" + + natToCharEx :: Char + natToCharEx = natToChar 97 + + charToNatEx :: Natural + charToNatEx = charToNat 'a' + |]) + +showCharTest :: Show_ ExprEx :~: "'a'" +showCharTest = Refl + +showSymbolTest :: Show_ "Hello, World!" :~: "\"Hello, World!\"" +showSymbolTest = Refl + +consSymbolTest :: ConsEx 'a' :~: "abc" +consSymbolTest = Refl + +unconsSymbolTest :: UnconsEx :~: Just '( 'a', "bc" ) +unconsSymbolTest = Refl + +natToCharTest :: NatToCharEx :~: 'a' +natToCharTest = Refl + +charToNatTest :: CharToNatEx :~: 97 +charToNatTest = Refl
tests/compile-and-dump/Singletons/T489.golden view
@@ -1,60 +1,61 @@-Singletons/T489.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| blah :: Maybe a -> [a]- blah (Just @a x) = [x :: a]- blah (Nothing @a) = [] :: [a]- flurmp :: Maybe () -> ()- flurmp (Nothing @_) = ()- flurmp (Just ()) = () |]- ======>- blah :: Maybe a -> [a]- blah (Just @a x) = [x :: a]- blah (Nothing @a) = [] :: [a]- flurmp :: Maybe () -> ()- flurmp (Nothing @_) = ()- flurmp (Just ()) = ()- type FlurmpSym0 :: (~>) (Maybe ()) ()- data FlurmpSym0 :: (~>) (Maybe ()) ()- where- FlurmpSym0KindInference :: SameKind (Apply FlurmpSym0 arg) (FlurmpSym1 arg) =>- FlurmpSym0 a0123456789876543210- type instance Apply FlurmpSym0 a0123456789876543210 = Flurmp a0123456789876543210- instance SuppressUnusedWarnings FlurmpSym0 where- suppressUnusedWarnings = snd (((,) FlurmpSym0KindInference) ())- type FlurmpSym1 :: Maybe () -> ()- type family FlurmpSym1 (a0123456789876543210 :: Maybe ()) :: () where- FlurmpSym1 a0123456789876543210 = Flurmp a0123456789876543210- type BlahSym0 :: (~>) (Maybe a) [a]- data BlahSym0 :: (~>) (Maybe a) [a]- where- BlahSym0KindInference :: SameKind (Apply BlahSym0 arg) (BlahSym1 arg) =>- BlahSym0 a0123456789876543210- type instance Apply BlahSym0 a0123456789876543210 = Blah a0123456789876543210- instance SuppressUnusedWarnings BlahSym0 where- suppressUnusedWarnings = snd (((,) BlahSym0KindInference) ())- type BlahSym1 :: Maybe a -> [a]- type family BlahSym1 (a0123456789876543210 :: Maybe a) :: [a] where- BlahSym1 a0123456789876543210 = Blah a0123456789876543210- type Flurmp :: Maybe () -> ()- type family Flurmp (a :: Maybe ()) :: () where- Flurmp ('Nothing @_) = Tuple0Sym0- Flurmp ('Just '()) = Tuple0Sym0- type Blah :: Maybe a -> [a]- type family Blah (a :: Maybe a) :: [a] where- Blah ('Just @a x) = Apply (Apply (:@#@$) (x :: a)) NilSym0- Blah ('Nothing @a) = NilSym0 :: [a]- sFlurmp ::- forall (t :: Maybe ()). Sing t -> Sing (Apply FlurmpSym0 t :: ())- sBlah ::- forall a (t :: Maybe a). Sing t -> Sing (Apply BlahSym0 t :: [a])- sFlurmp (SNothing @_) = STuple0- sFlurmp (SJust STuple0) = STuple0- sBlah (SJust @a (sX :: Sing x))- = (applySing- ((applySing ((singFun2 @(:@#@$)) SCons)) (sX :: Sing (x :: a))))- SNil- sBlah (SNothing @a) = SNil :: Sing (NilSym0 :: [a])- instance SingI (FlurmpSym0 :: (~>) (Maybe ()) ()) where- sing = (singFun1 @FlurmpSym0) sFlurmp- instance SingI (BlahSym0 :: (~>) (Maybe a) [a]) where- sing = (singFun1 @BlahSym0) sBlah+Singletons/T489.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| blah :: Maybe a -> [a] + blah (Just @a x) = [x :: a] + blah (Nothing @a) = [] :: [a] + flurmp :: Maybe () -> () + flurmp (Nothing @_) = () + flurmp (Just ()) = () |] + ======> + blah :: Maybe a -> [a] + blah (Just @a x) = [x :: a] + blah (Nothing @a) = [] :: [a] + flurmp :: Maybe () -> () + flurmp (Nothing @_) = () + flurmp (Just ()) = () + type FlurmpSym0 :: (~>) (Maybe ()) () + data FlurmpSym0 :: (~>) (Maybe ()) () + where + FlurmpSym0KindInference :: SameKind (Apply FlurmpSym0 arg) (FlurmpSym1 arg) => + FlurmpSym0 a0123456789876543210 + type instance Apply FlurmpSym0 a0123456789876543210 = Flurmp a0123456789876543210 + instance SuppressUnusedWarnings FlurmpSym0 where + suppressUnusedWarnings = snd ((,) FlurmpSym0KindInference ()) + type FlurmpSym1 :: Maybe () -> () + type family FlurmpSym1 (a0123456789876543210 :: Maybe ()) :: () where + FlurmpSym1 a0123456789876543210 = Flurmp a0123456789876543210 + type BlahSym0 :: (~>) (Maybe a) [a] + data BlahSym0 :: (~>) (Maybe a) [a] + where + BlahSym0KindInference :: SameKind (Apply BlahSym0 arg) (BlahSym1 arg) => + BlahSym0 a0123456789876543210 + type instance Apply BlahSym0 a0123456789876543210 = Blah a0123456789876543210 + instance SuppressUnusedWarnings BlahSym0 where + suppressUnusedWarnings = snd ((,) BlahSym0KindInference ()) + type BlahSym1 :: Maybe a -> [a] + type family BlahSym1 (a0123456789876543210 :: Maybe a) :: [a] where + BlahSym1 a0123456789876543210 = Blah a0123456789876543210 + type Flurmp :: Maybe () -> () + type family Flurmp (a :: Maybe ()) :: () where + Flurmp ('Nothing @_) = Tuple0Sym0 + Flurmp ('Just '()) = Tuple0Sym0 + type Blah :: Maybe a -> [a] + type family Blah (a :: Maybe a) :: [a] where + Blah ('Just @a x) = Apply (Apply (:@#@$) (x :: a)) NilSym0 + Blah ('Nothing @a) = NilSym0 :: [a] + sFlurmp :: + (forall (t :: Maybe ()). + Sing t -> Sing (Apply FlurmpSym0 t :: ()) :: Type) + sBlah :: + (forall (t :: Maybe a). + Sing t -> Sing (Apply BlahSym0 t :: [a]) :: Type) + sFlurmp (SNothing @_) = STuple0 + sFlurmp (SJust STuple0) = STuple0 + sBlah (SJust @a (sX :: Sing x)) + = applySing + (applySing (singFun2 @(:@#@$) SCons) (sX :: Sing (x :: a))) SNil + sBlah (SNothing @a) = SNil :: Sing (NilSym0 :: [a]) + instance SingI (FlurmpSym0 :: (~>) (Maybe ()) ()) where + sing = singFun1 @FlurmpSym0 sFlurmp + instance SingI (BlahSym0 :: (~>) (Maybe a) [a]) where + sing = singFun1 @BlahSym0 sBlah
tests/compile-and-dump/Singletons/T489.hs view
@@ -1,14 +1,14 @@-module T489 where--import Data.Singletons.Base.TH-import Prelude.Singletons--$(singletons [d|- blah :: Maybe a -> [a]- blah (Just @a x) = [x :: a]- blah (Nothing @a) = [] :: [a]-- flurmp :: Maybe () -> ()- flurmp (Nothing @_) = ()- flurmp (Just ()) = ()- |])+module T489 where + +import Data.Singletons.Base.TH +import Prelude.Singletons + +$(singletons [d| + blah :: Maybe a -> [a] + blah (Just @a x) = [x :: a] + blah (Nothing @a) = [] :: [a] + + flurmp :: Maybe () -> () + flurmp (Nothing @_) = () + flurmp (Just ()) = () + |])
tests/compile-and-dump/Singletons/T492.hs view
@@ -1,25 +1,25 @@-module T492 where--import Data.Functor.Const-import Data.Functor.Const.Singletons-import Data.Proxy-import Data.Proxy.Singletons-import Prelude.Singletons hiding (Const, ConstSym0, ConstSym1)--f :: Const Bool Ordering-f = Const @Bool @Ordering True--sF1 :: SConst ('Const @Bool @Ordering True)-sF1 = SConst @Bool @Ordering STrue--sF2 :: SConst (ConstSym0 @Bool @Ordering @@ True)-sF2 = singFun1 @(ConstSym0 @Bool @Ordering) SConst @@ STrue--sF3 :: SConst (ConstSym1 @Bool @Ordering True)-sF3 = SConst @Bool @Ordering STrue--sP1 :: SProxy ('Proxy @Bool)-sP1 = SProxy @Bool--sP2 :: SProxy (ProxySym0 @Bool)-sP2 = SProxy @Bool+module T492 where + +import Data.Functor.Const +import Data.Functor.Const.Singletons +import Data.Proxy +import Data.Proxy.Singletons +import Prelude.Singletons hiding (Const, ConstSym0, ConstSym1) + +f :: Const Bool Ordering +f = Const @Bool @Ordering True + +sF1 :: SConst ('Const @Bool @Ordering True) +sF1 = SConst @Bool @Ordering STrue + +sF2 :: SConst (ConstSym0 @Bool @Ordering @@ True) +sF2 = singFun1 @(ConstSym0 @Bool @Ordering) SConst @@ STrue + +sF3 :: SConst (ConstSym1 @Bool @Ordering True) +sF3 = SConst @Bool @Ordering STrue + +sP1 :: SProxy ('Proxy @Bool) +sP1 = SProxy @Bool + +sP2 :: SProxy (ProxySym0 @Bool) +sP2 = SProxy @Bool
tests/compile-and-dump/Singletons/T511.golden view
@@ -1,13 +1,13 @@--Singletons/T511.hs:0:0: error: Q monad failure- |-7 | $(singletons [d|- | ^^^^^^^^^^^^^^^...--Singletons/T511.hs:0:0: error:- `singletons-th` does not support partial applications of (->)- In the type: Data.Proxy.Proxy (->)-- |-7 | $(singletons [d|- | ^^^^^^^^^^^^^^^...+ +Singletons/T511.hs:0:0: error: [GHC-39584] Q monad failure + | +7 | $(singletons [d| + | ^^^^^^^^^^^^^^^... + +Singletons/T511.hs:0:0: error: [GHC-39584] + `singletons-th` does not support partial applications of (->) + In the type: Data.Proxy.Proxy (->) + + | +7 | $(singletons [d| + | ^^^^^^^^^^^^^^^...
tests/compile-and-dump/Singletons/T511.hs view
@@ -1,9 +1,9 @@-module T511 where--import Data.Proxy-import Data.Proxy.Singletons-import Data.Singletons.TH--$(singletons [d|- data Foo = MkFoo (Proxy (->))- |])+module T511 where + +import Data.Proxy +import Data.Proxy.Singletons +import Data.Singletons.TH + +$(singletons [d| + data Foo = MkFoo (Proxy (->)) + |])
+ tests/compile-and-dump/Singletons/T536.golden view
@@ -0,0 +1,97 @@+Singletons/T536.hs:(0,0)-(0,0): Splicing declarations + let + customPromote :: Name -> Name + customPromote n + | n == ''Message = ''PMessage + | n == 'MkMessage = 'PMkMessage + | n == ''Text = ''Symbol + | otherwise = promotedDataTypeOrConName defaultOptions n + customDefun :: Name -> Int -> Name + customDefun n sat + = defunctionalizedName defaultOptions (customPromote n) sat + in + withOptions + defaultOptions + {promotedDataTypeOrConName = customPromote, + defunctionalizedName = customDefun} + $ do decs1 <- genSingletons [''Message] + decs2 <- singletons + [d| hello :: Message + hello = MkMessage "hello" |] + decs3 <- singDecideInstances [''Message] + decs4 <- showSingInstances [''Message] + return $ decs1 ++ decs2 ++ decs3 ++ decs4 + ======> + type PMkMessageSym0 :: (Data.Singletons.~>) Symbol PMessage + data PMkMessageSym0 :: (Data.Singletons.~>) Symbol PMessage + where + PMkMessageSym0KindInference :: Data.Singletons.SameKind (Data.Singletons.Apply PMkMessageSym0 arg) (PMkMessageSym1 arg) => + PMkMessageSym0 a0123456789876543210 + type instance Data.Singletons.Apply PMkMessageSym0 a0123456789876543210 = 'PMkMessage a0123456789876543210 + instance Data.Singletons.TH.SuppressUnusedWarnings.SuppressUnusedWarnings PMkMessageSym0 where + Data.Singletons.TH.SuppressUnusedWarnings.suppressUnusedWarnings + = snd ((,) PMkMessageSym0KindInference ()) + type PMkMessageSym1 :: Symbol -> PMessage + type family PMkMessageSym1 (a0123456789876543210 :: Symbol) :: PMessage where + PMkMessageSym1 a0123456789876543210 = 'PMkMessage a0123456789876543210 + type SMessage :: PMessage -> Type + data SMessage :: PMessage -> Type + where + SMkMessage :: forall (n :: Symbol). + (Data.Singletons.Sing n) -> SMessage ('PMkMessage n :: PMessage) + type instance Data.Singletons.Sing @PMessage = SMessage + instance Data.Singletons.SingKind PMessage where + type Data.Singletons.Demote PMessage = Message + Data.Singletons.fromSing (SMkMessage b) + = MkMessage (Data.Singletons.fromSing b) + Data.Singletons.toSing + (MkMessage (b :: Data.Singletons.Demote Symbol)) + = case Data.Singletons.toSing b :: Data.Singletons.SomeSing Symbol + of + Data.Singletons.SomeSing c + -> Data.Singletons.SomeSing (SMkMessage c) + instance Data.Singletons.SingI n => + Data.Singletons.SingI ('PMkMessage (n :: Symbol)) where + Data.Singletons.sing = SMkMessage Data.Singletons.sing + instance Data.Singletons.SingI1 'PMkMessage where + Data.Singletons.liftSing = SMkMessage + instance Data.Singletons.SingI (PMkMessageSym0 :: (Data.Singletons.~>) Symbol PMessage) where + Data.Singletons.sing + = Data.Singletons.singFun1 @PMkMessageSym0 SMkMessage + hello :: Message + hello = MkMessage "hello" + type HelloSym0 :: PMessage + type family HelloSym0 :: PMessage where + HelloSym0 = Hello + type Hello :: PMessage + type family Hello :: PMessage where + Hello = Data.Singletons.Apply PMkMessageSym0 (FromString "hello") + sHello :: (Data.Singletons.Sing (HelloSym0 :: PMessage) :: Type) + sHello + = Data.Singletons.applySing + (Data.Singletons.singFun1 @PMkMessageSym0 SMkMessage) + (sFromString + (Data.Singletons.sing :: Data.Singletons.Sing "hello")) + instance Data.Singletons.Decide.SDecide Text => + Data.Singletons.Decide.SDecide PMessage where + (Data.Singletons.Decide.%~) (SMkMessage a) (SMkMessage b) + = case (Data.Singletons.Decide.%~) a b of + Data.Singletons.Decide.Proved Data.Type.Equality.Refl + -> Data.Singletons.Decide.Proved Data.Type.Equality.Refl + Data.Singletons.Decide.Disproved contra + -> Data.Singletons.Decide.Disproved + (\ refl + -> case refl of + Data.Type.Equality.Refl -> contra Data.Type.Equality.Refl) + instance Data.Singletons.Decide.SDecide Text => + Data.Type.Equality.TestEquality (SMessage :: PMessage + -> Type) where + Data.Type.Equality.testEquality + = Data.Singletons.Decide.decideEquality + instance Data.Singletons.Decide.SDecide Text => + Data.Type.Coercion.TestCoercion (SMessage :: PMessage + -> Type) where + Data.Type.Coercion.testCoercion + = Data.Singletons.Decide.decideCoercion + deriving instance Data.Singletons.ShowSing.ShowSing Text => + Show (SMessage (z :: PMessage))
+ tests/compile-and-dump/Singletons/T536.hs view
@@ -0,0 +1,41 @@+{-# LANGUAGE OverloadedStrings #-} +module T536 where + +import Data.Singletons.TH (genSingletons, showSingInstances, + singDecideInstances, singletons) +import Data.Singletons.TH.Options (defaultOptions, + defunctionalizedName, + promotedDataTypeOrConName, + withOptions) +import Data.String (fromString) +import Data.String.Singletons (FromString, sFromString) +import Data.Text (Text) +import GHC.TypeLits.Singletons (Symbol) +import Language.Haskell.TH (Name) + +-- Term-level +newtype Message = MkMessage Text +-- Type-level +newtype PMessage = PMkMessage Symbol + +$(let customPromote :: Name -> Name + customPromote n + | n == ''Message = ''PMessage + | n == 'MkMessage = 'PMkMessage + | n == ''Text = ''Symbol + | otherwise = promotedDataTypeOrConName defaultOptions n + + customDefun :: Name -> Int -> Name + customDefun n sat = defunctionalizedName defaultOptions (customPromote n) sat in + + withOptions defaultOptions{ promotedDataTypeOrConName = customPromote + , defunctionalizedName = customDefun + } $ do + decs1 <- genSingletons [''Message] + decs2 <- singletons [d| + hello :: Message + hello = MkMessage "hello" + |] + decs3 <- singDecideInstances [''Message] + decs4 <- showSingInstances [''Message] + return $ decs1 ++ decs2 ++ decs3 ++ decs4)
tests/compile-and-dump/Singletons/T54.golden view
@@ -1,57 +1,57 @@-Singletons/T54.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| g :: Bool -> Bool- g e = (case [not] of [_] -> not) e |]- ======>- g :: Bool -> Bool- g e = (case [not] of [_] -> not) e- data Let0123456789876543210Scrutinee_0123456789876543210Sym0 e0123456789876543210- where- Let0123456789876543210Scrutinee_0123456789876543210Sym0KindInference :: SameKind (Apply Let0123456789876543210Scrutinee_0123456789876543210Sym0 arg) (Let0123456789876543210Scrutinee_0123456789876543210Sym1 arg) =>- Let0123456789876543210Scrutinee_0123456789876543210Sym0 e0123456789876543210- type instance Apply Let0123456789876543210Scrutinee_0123456789876543210Sym0 e0123456789876543210 = Let0123456789876543210Scrutinee_0123456789876543210 e0123456789876543210- instance SuppressUnusedWarnings Let0123456789876543210Scrutinee_0123456789876543210Sym0 where- suppressUnusedWarnings- = snd- (((,)- Let0123456789876543210Scrutinee_0123456789876543210Sym0KindInference)- ())- type family Let0123456789876543210Scrutinee_0123456789876543210Sym1 e0123456789876543210 where- Let0123456789876543210Scrutinee_0123456789876543210Sym1 e0123456789876543210 = Let0123456789876543210Scrutinee_0123456789876543210 e0123456789876543210- type family Let0123456789876543210Scrutinee_0123456789876543210 e where- Let0123456789876543210Scrutinee_0123456789876543210 e = Apply (Apply (:@#@$) NotSym0) NilSym0- type family Case_0123456789876543210 e t where- Case_0123456789876543210 e '[_] = NotSym0- type GSym0 :: (~>) Bool Bool- data GSym0 :: (~>) Bool Bool- where- GSym0KindInference :: SameKind (Apply GSym0 arg) (GSym1 arg) =>- GSym0 a0123456789876543210- type instance Apply GSym0 a0123456789876543210 = G a0123456789876543210- instance SuppressUnusedWarnings GSym0 where- suppressUnusedWarnings = snd (((,) GSym0KindInference) ())- type GSym1 :: Bool -> Bool- type family GSym1 (a0123456789876543210 :: Bool) :: Bool where- GSym1 a0123456789876543210 = G a0123456789876543210- type G :: Bool -> Bool- type family G (a :: Bool) :: Bool where- G e = Apply (Case_0123456789876543210 e (Let0123456789876543210Scrutinee_0123456789876543210Sym1 e)) e- sG :: forall (t :: Bool). Sing t -> Sing (Apply GSym0 t :: Bool)- sG (sE :: Sing e)- = (applySing- (let- sScrutinee_0123456789876543210 ::- Sing @_ (Let0123456789876543210Scrutinee_0123456789876543210Sym1 e)- sScrutinee_0123456789876543210- = (applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((singFun1 @NotSym0) sNot)))- SNil- in- (id- @(Sing (Case_0123456789876543210 e (Let0123456789876543210Scrutinee_0123456789876543210Sym1 e))))- (case sScrutinee_0123456789876543210 of- SCons _ SNil -> (singFun1 @NotSym0) sNot)))- sE- instance SingI (GSym0 :: (~>) Bool Bool) where- sing = (singFun1 @GSym0) sG+Singletons/T54.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| g :: Bool -> Bool + g e = (case [not] of [_] -> not) e |] + ======> + g :: Bool -> Bool + g e = (case [not] of [_] -> not) e + data Let0123456789876543210Scrutinee_0123456789876543210Sym0 e0123456789876543210 + where + Let0123456789876543210Scrutinee_0123456789876543210Sym0KindInference :: SameKind (Apply Let0123456789876543210Scrutinee_0123456789876543210Sym0 arg) (Let0123456789876543210Scrutinee_0123456789876543210Sym1 arg) => + Let0123456789876543210Scrutinee_0123456789876543210Sym0 e0123456789876543210 + type instance Apply Let0123456789876543210Scrutinee_0123456789876543210Sym0 e0123456789876543210 = Let0123456789876543210Scrutinee_0123456789876543210 e0123456789876543210 + instance SuppressUnusedWarnings Let0123456789876543210Scrutinee_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd + ((,) + Let0123456789876543210Scrutinee_0123456789876543210Sym0KindInference + ()) + type family Let0123456789876543210Scrutinee_0123456789876543210Sym1 e0123456789876543210 where + Let0123456789876543210Scrutinee_0123456789876543210Sym1 e0123456789876543210 = Let0123456789876543210Scrutinee_0123456789876543210 e0123456789876543210 + type family Let0123456789876543210Scrutinee_0123456789876543210 e where + Let0123456789876543210Scrutinee_0123456789876543210 e = Apply (Apply (:@#@$) NotSym0) NilSym0 + type family Case_0123456789876543210 e t where + Case_0123456789876543210 e '[_] = NotSym0 + type GSym0 :: (~>) Bool Bool + data GSym0 :: (~>) Bool Bool + where + GSym0KindInference :: SameKind (Apply GSym0 arg) (GSym1 arg) => + GSym0 a0123456789876543210 + type instance Apply GSym0 a0123456789876543210 = G a0123456789876543210 + instance SuppressUnusedWarnings GSym0 where + suppressUnusedWarnings = snd ((,) GSym0KindInference ()) + type GSym1 :: Bool -> Bool + type family GSym1 (a0123456789876543210 :: Bool) :: Bool where + GSym1 a0123456789876543210 = G a0123456789876543210 + type G :: Bool -> Bool + type family G (a :: Bool) :: Bool where + G e = Apply (Case_0123456789876543210 e (Let0123456789876543210Scrutinee_0123456789876543210Sym1 e)) e + sG :: + (forall (t :: Bool). + Sing t -> Sing (Apply GSym0 t :: Bool) :: Type) + sG (sE :: Sing e) + = applySing + (let + sScrutinee_0123456789876543210 :: + Sing @_ (Let0123456789876543210Scrutinee_0123456789876543210Sym1 e) + sScrutinee_0123456789876543210 + = applySing + (applySing (singFun2 @(:@#@$) SCons) (singFun1 @NotSym0 sNot)) SNil + in + id + @(Sing (Case_0123456789876543210 e (Let0123456789876543210Scrutinee_0123456789876543210Sym1 e))) + (case sScrutinee_0123456789876543210 of + SCons _ SNil -> singFun1 @NotSym0 sNot)) + sE + instance SingI (GSym0 :: (~>) Bool Bool) where + sing = singFun1 @GSym0 sG
tests/compile-and-dump/Singletons/T54.hs view
@@ -1,12 +1,12 @@-{-# OPTIONS_GHC -Wno-incomplete-patterns #-}--module Singletons.T54 where--import Data.Singletons.TH-import Prelude.Singletons--$(singletons [d|- g :: Bool -> Bool- g e = (case [not] of- [_] -> not) e- |])+{-# OPTIONS_GHC -Wno-incomplete-patterns #-} + +module Singletons.T54 where + +import Data.Singletons.TH +import Prelude.Singletons + +$(singletons [d| + g :: Bool -> Bool + g e = (case [not] of + [_] -> not) e + |])
+ tests/compile-and-dump/Singletons/T555.golden view
@@ -0,0 +1,203 @@+Singletons/T555.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| data MyPropKind + = Location | Quaternion + deriving (Eq, Ord, Show) |] + ======> + data MyPropKind + = Location | Quaternion + deriving (Eq, Ord, Show) + type LocationSym0 :: MyPropKind + type family LocationSym0 :: MyPropKind where + LocationSym0 = Location + type QuaternionSym0 :: MyPropKind + type family QuaternionSym0 :: MyPropKind where + QuaternionSym0 = Quaternion + type TFHelper_0123456789876543210 :: MyPropKind + -> MyPropKind -> Bool + type family TFHelper_0123456789876543210 (a :: MyPropKind) (a :: MyPropKind) :: Bool where + TFHelper_0123456789876543210 Location Location = TrueSym0 + TFHelper_0123456789876543210 Location Quaternion = FalseSym0 + TFHelper_0123456789876543210 Quaternion Location = FalseSym0 + TFHelper_0123456789876543210 Quaternion Quaternion = TrueSym0 + type TFHelper_0123456789876543210Sym0 :: (~>) MyPropKind ((~>) MyPropKind Bool) + data TFHelper_0123456789876543210Sym0 :: (~>) MyPropKind ((~>) MyPropKind Bool) + where + TFHelper_0123456789876543210Sym0KindInference :: SameKind (Apply TFHelper_0123456789876543210Sym0 arg) (TFHelper_0123456789876543210Sym1 arg) => + TFHelper_0123456789876543210Sym0 a0123456789876543210 + type instance Apply TFHelper_0123456789876543210Sym0 a0123456789876543210 = TFHelper_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings TFHelper_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) TFHelper_0123456789876543210Sym0KindInference ()) + type TFHelper_0123456789876543210Sym1 :: MyPropKind + -> (~>) MyPropKind Bool + data TFHelper_0123456789876543210Sym1 (a0123456789876543210 :: MyPropKind) :: (~>) MyPropKind Bool + where + TFHelper_0123456789876543210Sym1KindInference :: SameKind (Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) arg) (TFHelper_0123456789876543210Sym2 a0123456789876543210 arg) => + TFHelper_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (TFHelper_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (TFHelper_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) TFHelper_0123456789876543210Sym1KindInference ()) + type TFHelper_0123456789876543210Sym2 :: MyPropKind + -> MyPropKind -> Bool + type family TFHelper_0123456789876543210Sym2 (a0123456789876543210 :: MyPropKind) (a0123456789876543210 :: MyPropKind) :: Bool where + TFHelper_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = TFHelper_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PEq MyPropKind where + type (==) a a = Apply (Apply TFHelper_0123456789876543210Sym0 a) a + type Compare_0123456789876543210 :: MyPropKind + -> MyPropKind -> Ordering + type family Compare_0123456789876543210 (a :: MyPropKind) (a :: MyPropKind) :: Ordering where + Compare_0123456789876543210 Location Location = Apply (Apply (Apply FoldlSym0 (<>@#@$)) EQSym0) NilSym0 + Compare_0123456789876543210 Quaternion Quaternion = Apply (Apply (Apply FoldlSym0 (<>@#@$)) EQSym0) NilSym0 + Compare_0123456789876543210 Location Quaternion = LTSym0 + Compare_0123456789876543210 Quaternion Location = GTSym0 + type Compare_0123456789876543210Sym0 :: (~>) MyPropKind ((~>) MyPropKind Ordering) + data Compare_0123456789876543210Sym0 :: (~>) MyPropKind ((~>) MyPropKind Ordering) + where + Compare_0123456789876543210Sym0KindInference :: SameKind (Apply Compare_0123456789876543210Sym0 arg) (Compare_0123456789876543210Sym1 arg) => + Compare_0123456789876543210Sym0 a0123456789876543210 + type instance Apply Compare_0123456789876543210Sym0 a0123456789876543210 = Compare_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings Compare_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) Compare_0123456789876543210Sym0KindInference ()) + type Compare_0123456789876543210Sym1 :: MyPropKind + -> (~>) MyPropKind Ordering + data Compare_0123456789876543210Sym1 (a0123456789876543210 :: MyPropKind) :: (~>) MyPropKind Ordering + where + Compare_0123456789876543210Sym1KindInference :: SameKind (Apply (Compare_0123456789876543210Sym1 a0123456789876543210) arg) (Compare_0123456789876543210Sym2 a0123456789876543210 arg) => + Compare_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (Compare_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (Compare_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) Compare_0123456789876543210Sym1KindInference ()) + type Compare_0123456789876543210Sym2 :: MyPropKind + -> MyPropKind -> Ordering + type family Compare_0123456789876543210Sym2 (a0123456789876543210 :: MyPropKind) (a0123456789876543210 :: MyPropKind) :: Ordering where + Compare_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 = Compare_0123456789876543210 a0123456789876543210 a0123456789876543210 + instance POrd MyPropKind where + type Compare a a = Apply (Apply Compare_0123456789876543210Sym0 a) a + type ShowsPrec_0123456789876543210 :: GHC.Num.Natural.Natural + -> MyPropKind -> Symbol -> Symbol + type family ShowsPrec_0123456789876543210 (a :: GHC.Num.Natural.Natural) (a :: MyPropKind) (a :: Symbol) :: Symbol where + ShowsPrec_0123456789876543210 _ Location a_0123456789876543210 = Apply (Apply ShowStringSym0 "Location") a_0123456789876543210 + ShowsPrec_0123456789876543210 _ Quaternion a_0123456789876543210 = Apply (Apply ShowStringSym0 "Quaternion") a_0123456789876543210 + type ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) MyPropKind ((~>) Symbol Symbol)) + data ShowsPrec_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural ((~>) MyPropKind ((~>) Symbol Symbol)) + where + ShowsPrec_0123456789876543210Sym0KindInference :: SameKind (Apply ShowsPrec_0123456789876543210Sym0 arg) (ShowsPrec_0123456789876543210Sym1 arg) => + ShowsPrec_0123456789876543210Sym0 a0123456789876543210 + type instance Apply ShowsPrec_0123456789876543210Sym0 a0123456789876543210 = ShowsPrec_0123456789876543210Sym1 a0123456789876543210 + instance SuppressUnusedWarnings ShowsPrec_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym0KindInference ()) + type ShowsPrec_0123456789876543210Sym1 :: GHC.Num.Natural.Natural + -> (~>) MyPropKind ((~>) Symbol Symbol) + data ShowsPrec_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Num.Natural.Natural) :: (~>) MyPropKind ((~>) Symbol Symbol) + where + ShowsPrec_0123456789876543210Sym1KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 arg) => + ShowsPrec_0123456789876543210Sym1 a0123456789876543210 a0123456789876543210 + type instance Apply (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym1 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym1KindInference ()) + type ShowsPrec_0123456789876543210Sym2 :: GHC.Num.Natural.Natural + -> MyPropKind -> (~>) Symbol Symbol + data ShowsPrec_0123456789876543210Sym2 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: MyPropKind) :: (~>) Symbol Symbol + where + ShowsPrec_0123456789876543210Sym2KindInference :: SameKind (Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) arg) (ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 arg) => + ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210 a0123456789876543210 + type instance Apply (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (ShowsPrec_0123456789876543210Sym2 a0123456789876543210 a0123456789876543210) where + suppressUnusedWarnings + = snd ((,) ShowsPrec_0123456789876543210Sym2KindInference ()) + type ShowsPrec_0123456789876543210Sym3 :: GHC.Num.Natural.Natural + -> MyPropKind -> Symbol -> Symbol + type family ShowsPrec_0123456789876543210Sym3 (a0123456789876543210 :: GHC.Num.Natural.Natural) (a0123456789876543210 :: MyPropKind) (a0123456789876543210 :: Symbol) :: Symbol where + ShowsPrec_0123456789876543210Sym3 a0123456789876543210 a0123456789876543210 a0123456789876543210 = ShowsPrec_0123456789876543210 a0123456789876543210 a0123456789876543210 a0123456789876543210 + instance PShow MyPropKind where + type ShowsPrec a a a = Apply (Apply (Apply ShowsPrec_0123456789876543210Sym0 a) a) a + data SMyPropKind :: MyPropKind -> Type + where + SLocation :: SMyPropKind (Location :: MyPropKind) + SQuaternion :: SMyPropKind (Quaternion :: MyPropKind) + type instance Sing @MyPropKind = SMyPropKind + instance SingKind MyPropKind where + type Demote MyPropKind = MyPropKind + fromSing SLocation = Location + fromSing SQuaternion = Quaternion + toSing Location = SomeSing SLocation + toSing Quaternion = SomeSing SQuaternion + instance SEq MyPropKind where + (%==) :: + forall (t1 :: MyPropKind) (t2 :: MyPropKind). Sing t1 + -> Sing t2 + -> Sing (Apply (Apply ((==@#@$) :: TyFun MyPropKind ((~>) MyPropKind Bool) + -> Type) t1) t2) + (%==) SLocation SLocation = STrue + (%==) SLocation SQuaternion = SFalse + (%==) SQuaternion SLocation = SFalse + (%==) SQuaternion SQuaternion = STrue + instance SOrd MyPropKind where + sCompare :: + forall (t1 :: MyPropKind) (t2 :: MyPropKind). Sing t1 + -> Sing t2 + -> Sing (Apply (Apply (CompareSym0 :: TyFun MyPropKind ((~>) MyPropKind Ordering) + -> Type) t1) t2) + sCompare SLocation SLocation + = applySing + (applySing + (applySing (singFun3 @FoldlSym0 sFoldl) (singFun2 @(<>@#@$) (%<>))) + SEQ) + SNil + sCompare SQuaternion SQuaternion + = applySing + (applySing + (applySing (singFun3 @FoldlSym0 sFoldl) (singFun2 @(<>@#@$) (%<>))) + SEQ) + SNil + sCompare SLocation SQuaternion = SLT + sCompare SQuaternion SLocation = SGT + instance SShow MyPropKind where + sShowsPrec :: + forall (t1 :: GHC.Num.Natural.Natural) + (t2 :: MyPropKind) + (t3 :: Symbol). Sing t1 + -> Sing t2 + -> Sing t3 + -> Sing (Apply (Apply (Apply (ShowsPrecSym0 :: TyFun GHC.Num.Natural.Natural ((~>) MyPropKind ((~>) Symbol Symbol)) + -> Type) t1) t2) t3) + sShowsPrec + _ + SLocation + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "Location")) + sA_0123456789876543210 + sShowsPrec + _ + SQuaternion + (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (applySing + (singFun2 @ShowStringSym0 sShowString) (sing :: Sing "Quaternion")) + sA_0123456789876543210 + instance SDecide MyPropKind where + (%~) SLocation SLocation = Proved Refl + (%~) SLocation SQuaternion = Disproved (\ x -> case x of {}) + (%~) SQuaternion SLocation = Disproved (\ x -> case x of {}) + (%~) SQuaternion SQuaternion = Proved Refl + instance Data.Type.Equality.TestEquality (SMyPropKind :: MyPropKind + -> Type) where + Data.Type.Equality.testEquality + = Data.Singletons.Decide.decideEquality + instance Data.Type.Coercion.TestCoercion (SMyPropKind :: MyPropKind + -> Type) where + Data.Type.Coercion.testCoercion + = Data.Singletons.Decide.decideCoercion + deriving instance Show (SMyPropKind (z :: MyPropKind)) + instance SingI Location where + sing = SLocation + instance SingI Quaternion where + sing = SQuaternion
+ tests/compile-and-dump/Singletons/T555.hs view
@@ -0,0 +1,15 @@+module T555 where + +-- NB: /not/ importing Data.Singletons.Base.TH below, but rather the more +-- restricted Data.Singletons.TH that does not re-export anything from +-- singletons-base. We want to ensure that this code works with only a simple +-- Prelude.Singletons import if possible. +import Data.Singletons.TH +import Prelude.Singletons + +$(singletons [d| + data MyPropKind = Location + | Quaternion + + deriving(Eq,Ord,Show) + |])
+ tests/compile-and-dump/Singletons/T559.golden view
@@ -0,0 +1,11 @@+Singletons/T559.hs:0:0:: Splicing declarations + singletons [d| type data T = MkT |] + ======> + type data T = MkT + type MkTSym0 :: T + type family MkTSym0 :: T where + MkTSym0 = MkT + data ST :: T -> Type where SMkT :: ST (MkT :: T) + type instance Sing @T = ST + instance SingI MkT where + sing = SMkT
+ tests/compile-and-dump/Singletons/T559.hs view
@@ -0,0 +1,6 @@+{-# LANGUAGE TypeData #-} +module T559 where + +import Data.Singletons.TH + +$(singletons [d| type data T = MkT |])
tests/compile-and-dump/Singletons/T78.golden view
@@ -1,34 +1,35 @@-Singletons/T78.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| foo :: MaybeBool -> Bool- foo (Just False) = False- foo (Just True) = True- foo Nothing = False |]- ======>- foo :: MaybeBool -> Bool- foo (Just False) = False- foo (Just True) = True- foo Nothing = False- type FooSym0 :: (~>) (Maybe Bool) Bool- data FooSym0 :: (~>) (Maybe Bool) Bool- where- FooSym0KindInference :: SameKind (Apply FooSym0 arg) (FooSym1 arg) =>- FooSym0 a0123456789876543210- type instance Apply FooSym0 a0123456789876543210 = Foo a0123456789876543210- instance SuppressUnusedWarnings FooSym0 where- suppressUnusedWarnings = snd (((,) FooSym0KindInference) ())- type FooSym1 :: Maybe Bool -> Bool- type family FooSym1 (a0123456789876543210 :: Maybe Bool) :: Bool where- FooSym1 a0123456789876543210 = Foo a0123456789876543210- type Foo :: Maybe Bool -> Bool- type family Foo (a :: Maybe Bool) :: Bool where- Foo ('Just 'False) = FalseSym0- Foo ('Just 'True) = TrueSym0- Foo 'Nothing = FalseSym0- sFoo ::- forall (t :: Maybe Bool). Sing t -> Sing (Apply FooSym0 t :: Bool)- sFoo (SJust SFalse) = SFalse- sFoo (SJust STrue) = STrue- sFoo SNothing = SFalse- instance SingI (FooSym0 :: (~>) (Maybe Bool) Bool) where- sing = (singFun1 @FooSym0) sFoo+Singletons/T78.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| foo :: MaybeBool -> Bool + foo (Just False) = False + foo (Just True) = True + foo Nothing = False |] + ======> + foo :: MaybeBool -> Bool + foo (Just False) = False + foo (Just True) = True + foo Nothing = False + type FooSym0 :: (~>) (Maybe Bool) Bool + data FooSym0 :: (~>) (Maybe Bool) Bool + where + FooSym0KindInference :: SameKind (Apply FooSym0 arg) (FooSym1 arg) => + FooSym0 a0123456789876543210 + type instance Apply FooSym0 a0123456789876543210 = Foo a0123456789876543210 + instance SuppressUnusedWarnings FooSym0 where + suppressUnusedWarnings = snd ((,) FooSym0KindInference ()) + type FooSym1 :: Maybe Bool -> Bool + type family FooSym1 (a0123456789876543210 :: Maybe Bool) :: Bool where + FooSym1 a0123456789876543210 = Foo a0123456789876543210 + type Foo :: Maybe Bool -> Bool + type family Foo (a :: Maybe Bool) :: Bool where + Foo ('Just 'False) = FalseSym0 + Foo ('Just 'True) = TrueSym0 + Foo 'Nothing = FalseSym0 + sFoo :: + (forall (t :: Maybe Bool). + Sing t -> Sing (Apply FooSym0 t :: Bool) :: Type) + sFoo (SJust SFalse) = SFalse + sFoo (SJust STrue) = STrue + sFoo SNothing = SFalse + instance SingI (FooSym0 :: (~>) (Maybe Bool) Bool) where + sing = singFun1 @FooSym0 sFoo
tests/compile-and-dump/Singletons/T78.hs view
@@ -1,13 +1,13 @@-module Singletons.T78 where--import Data.Singletons.TH-import Prelude.Singletons--type MaybeBool = Maybe Bool--$(singletons [d|- foo :: MaybeBool -> Bool- foo (Just False) = False- foo (Just True) = True- foo Nothing = False- |])+module Singletons.T78 where + +import Data.Singletons.TH +import Prelude.Singletons + +type MaybeBool = Maybe Bool + +$(singletons [d| + foo :: MaybeBool -> Bool + foo (Just False) = False + foo (Just True) = True + foo Nothing = False + |])
+ tests/compile-and-dump/Singletons/T89.golden view
@@ -0,0 +1,79 @@+Singletons/T89.hs:0:0:: Splicing declarations + singletons + [d| data Foo + = Foo + deriving (Enum) |] + ======> + data Foo + = Foo + deriving Enum + type FooSym0 :: Foo + type family FooSym0 :: Foo where + FooSym0 = Foo + type family Case_0123456789876543210 n t where + Case_0123456789876543210 n 'True = FooSym0 + Case_0123456789876543210 n 'False = Apply ErrorSym0 (FromString "toEnum: bad argument") + type ToEnum_0123456789876543210 :: GHC.Num.Natural.Natural -> Foo + type family ToEnum_0123456789876543210 (a :: GHC.Num.Natural.Natural) :: Foo where + ToEnum_0123456789876543210 n = Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (FromInteger 0)) + type ToEnum_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural Foo + data ToEnum_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural Foo + where + ToEnum_0123456789876543210Sym0KindInference :: SameKind (Apply ToEnum_0123456789876543210Sym0 arg) (ToEnum_0123456789876543210Sym1 arg) => + ToEnum_0123456789876543210Sym0 a0123456789876543210 + type instance Apply ToEnum_0123456789876543210Sym0 a0123456789876543210 = ToEnum_0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings ToEnum_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) ToEnum_0123456789876543210Sym0KindInference ()) + type ToEnum_0123456789876543210Sym1 :: GHC.Num.Natural.Natural + -> Foo + type family ToEnum_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Num.Natural.Natural) :: Foo where + ToEnum_0123456789876543210Sym1 a0123456789876543210 = ToEnum_0123456789876543210 a0123456789876543210 + type FromEnum_0123456789876543210 :: Foo -> GHC.Num.Natural.Natural + type family FromEnum_0123456789876543210 (a :: Foo) :: GHC.Num.Natural.Natural where + FromEnum_0123456789876543210 Foo = FromInteger 0 + type FromEnum_0123456789876543210Sym0 :: (~>) Foo GHC.Num.Natural.Natural + data FromEnum_0123456789876543210Sym0 :: (~>) Foo GHC.Num.Natural.Natural + where + FromEnum_0123456789876543210Sym0KindInference :: SameKind (Apply FromEnum_0123456789876543210Sym0 arg) (FromEnum_0123456789876543210Sym1 arg) => + FromEnum_0123456789876543210Sym0 a0123456789876543210 + type instance Apply FromEnum_0123456789876543210Sym0 a0123456789876543210 = FromEnum_0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings FromEnum_0123456789876543210Sym0 where + suppressUnusedWarnings + = snd ((,) FromEnum_0123456789876543210Sym0KindInference ()) + type FromEnum_0123456789876543210Sym1 :: Foo + -> GHC.Num.Natural.Natural + type family FromEnum_0123456789876543210Sym1 (a0123456789876543210 :: Foo) :: GHC.Num.Natural.Natural where + FromEnum_0123456789876543210Sym1 a0123456789876543210 = FromEnum_0123456789876543210 a0123456789876543210 + instance PEnum Foo where + type ToEnum a = Apply ToEnum_0123456789876543210Sym0 a + type FromEnum a = Apply FromEnum_0123456789876543210Sym0 a + data SFoo :: Foo -> Type where SFoo :: SFoo (Foo :: Foo) + type instance Sing @Foo = SFoo + instance SingKind Foo where + type Demote Foo = Foo + fromSing SFoo = Foo + toSing Foo = SomeSing SFoo + instance SEnum Foo where + sToEnum :: + forall (t :: GHC.Num.Natural.Natural). Sing t + -> Sing (Apply (Data.Singletons.Base.Enum.ToEnumSym0 :: TyFun GHC.Num.Natural.Natural Foo + -> Type) t) + sFromEnum :: + forall (t :: Foo). Sing t + -> Sing (Apply (Data.Singletons.Base.Enum.FromEnumSym0 :: TyFun Foo GHC.Num.Natural.Natural + -> Type) t) + sToEnum (sN :: Sing n) + = id + @(Sing (Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (FromInteger 0)))) + (case + applySing + (applySing (singFun2 @(==@#@$) (%==)) sN) + (sFromInteger (sing :: Sing 0)) + of + STrue -> SFoo + SFalse + -> sError (sFromString (sing :: Sing "toEnum: bad argument"))) + sFromEnum SFoo = sFromInteger (sing :: Sing 0) + instance SingI Foo where + sing = SFoo
+ tests/compile-and-dump/Singletons/T89.hs view
@@ -0,0 +1,6 @@+{-# LANGUAGE OverloadedStrings #-} +module T89 where + +import Data.Singletons.Base.TH + +$(singletons [d|data Foo = Foo deriving (Enum)|])
tests/compile-and-dump/Singletons/TopLevelPatterns.golden view
@@ -1,396 +1,402 @@-Singletons/TopLevelPatterns.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| data Bool = False | True- data Foo = Bar Bool Bool |]- ======>- data Bool = False | True- data Foo = Bar Bool Bool- type FalseSym0 :: Bool- type family FalseSym0 :: Bool where- FalseSym0 = False- type TrueSym0 :: Bool- type family TrueSym0 :: Bool where- TrueSym0 = True- type BarSym0 :: (~>) Bool ((~>) Bool Foo)- data BarSym0 :: (~>) Bool ((~>) Bool Foo)- where- BarSym0KindInference :: SameKind (Apply BarSym0 arg) (BarSym1 arg) =>- BarSym0 a0123456789876543210- type instance Apply BarSym0 a0123456789876543210 = BarSym1 a0123456789876543210- instance SuppressUnusedWarnings BarSym0 where- suppressUnusedWarnings- = Data.Tuple.snd (((,) BarSym0KindInference) ())- type BarSym1 :: Bool -> (~>) Bool Foo- data BarSym1 (a0123456789876543210 :: Bool) :: (~>) Bool Foo- where- BarSym1KindInference :: SameKind (Apply (BarSym1 a0123456789876543210) arg) (BarSym2 a0123456789876543210 arg) =>- BarSym1 a0123456789876543210 a0123456789876543210- type instance Apply (BarSym1 a0123456789876543210) a0123456789876543210 = Bar a0123456789876543210 a0123456789876543210- instance SuppressUnusedWarnings (BarSym1 a0123456789876543210) where- suppressUnusedWarnings- = Data.Tuple.snd (((,) BarSym1KindInference) ())- type BarSym2 :: Bool -> Bool -> Foo- type family BarSym2 (a0123456789876543210 :: Bool) (a0123456789876543210 :: Bool) :: Foo where- BarSym2 a0123456789876543210 a0123456789876543210 = Bar a0123456789876543210 a0123456789876543210- data SBool :: Bool -> Type- where- SFalse :: SBool (False :: Bool)- STrue :: SBool (True :: Bool)- type instance Sing @Bool = SBool- instance SingKind Bool where- type Demote Bool = Bool- fromSing SFalse = False- fromSing STrue = True- toSing False = SomeSing SFalse- toSing True = SomeSing STrue- data SFoo :: Foo -> Type- where- SBar :: forall (n :: Bool) (n :: Bool).- (Sing n) -> (Sing n) -> SFoo (Bar n n :: Foo)- type instance Sing @Foo = SFoo- instance SingKind Foo where- type Demote Foo = Foo- fromSing (SBar b b) = (Bar (fromSing b)) (fromSing b)- toSing (Bar (b :: Demote Bool) (b :: Demote Bool))- = case- ((,) (toSing b :: SomeSing Bool)) (toSing b :: SomeSing Bool)- of- (,) (SomeSing c) (SomeSing c) -> SomeSing ((SBar c) c)- instance SingI False where- sing = SFalse- instance SingI True where- sing = STrue- instance (SingI n, SingI n) =>- SingI (Bar (n :: Bool) (n :: Bool)) where- sing = (SBar sing) sing- instance SingI n => SingI1 (Bar (n :: Bool)) where- liftSing = SBar sing- instance SingI2 Bar where- liftSing2 = SBar- instance SingI (BarSym0 :: (~>) Bool ((~>) Bool Foo)) where- sing = (singFun2 @BarSym0) SBar- instance SingI d =>- SingI (BarSym1 (d :: Bool) :: (~>) Bool Foo) where- sing = (singFun1 @(BarSym1 (d :: Bool))) (SBar (sing @d))- instance SingI1 (BarSym1 :: Bool -> (~>) Bool Foo) where- liftSing (s :: Sing (d :: Bool))- = (singFun1 @(BarSym1 (d :: Bool))) (SBar s)-Singletons/TopLevelPatterns.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| otherwise :: Bool- otherwise = True- id :: a -> a- id x = x- not :: Bool -> Bool- not True = False- not False = True- false_ = False- f, g :: Bool -> Bool- [f, g] = [not, id]- h, i :: Bool -> Bool- (h, i) = (f, g)- j, k :: Bool- (Bar j k) = Bar True (h False)- l, m :: Bool- [l, m] = [not True, id False] |]- ======>- otherwise :: Bool- otherwise = True- id :: a -> a- id x = x- not :: Bool -> Bool- not True = False- not False = True- false_ = False- f :: Bool -> Bool- g :: Bool -> Bool- [f, g] = [not, id]- h :: Bool -> Bool- i :: Bool -> Bool- (h, i) = (f, g)- j :: Bool- k :: Bool- Bar j k = (Bar True) (h False)- l :: Bool- m :: Bool- [l, m] = [not True, id False]- type family Case_0123456789876543210 t where- Case_0123456789876543210 '[_,- y_0123456789876543210] = y_0123456789876543210- type family Case_0123456789876543210 t where- Case_0123456789876543210 '[y_0123456789876543210,- _] = y_0123456789876543210- type family Case_0123456789876543210 t where- Case_0123456789876543210 ('Bar _ y_0123456789876543210) = y_0123456789876543210- type family Case_0123456789876543210 t where- Case_0123456789876543210 ('Bar y_0123456789876543210 _) = y_0123456789876543210- type family Case_0123456789876543210 a_0123456789876543210 t where- Case_0123456789876543210 a_0123456789876543210 '(_,- y_0123456789876543210) = y_0123456789876543210- type family Case_0123456789876543210 a_0123456789876543210 t where- Case_0123456789876543210 a_0123456789876543210 '(y_0123456789876543210,- _) = y_0123456789876543210- type family Case_0123456789876543210 a_0123456789876543210 t where- Case_0123456789876543210 a_0123456789876543210 '[_,- y_0123456789876543210] = y_0123456789876543210- type family Case_0123456789876543210 a_0123456789876543210 t where- Case_0123456789876543210 a_0123456789876543210 '[y_0123456789876543210,- _] = y_0123456789876543210- type MSym0 :: Bool- type family MSym0 :: Bool where- MSym0 = M- type LSym0 :: Bool- type family LSym0 :: Bool where- LSym0 = L- type family X_0123456789876543210Sym0 where- X_0123456789876543210Sym0 = X_0123456789876543210- type KSym0 :: Bool- type family KSym0 :: Bool where- KSym0 = K- type JSym0 :: Bool- type family JSym0 :: Bool where- JSym0 = J- type family X_0123456789876543210Sym0 where- X_0123456789876543210Sym0 = X_0123456789876543210- type ISym0 :: (~>) Bool Bool- data ISym0 :: (~>) Bool Bool- where- ISym0KindInference :: SameKind (Apply ISym0 arg) (ISym1 arg) =>- ISym0 a0123456789876543210- type instance Apply ISym0 a0123456789876543210 = I a0123456789876543210- instance SuppressUnusedWarnings ISym0 where- suppressUnusedWarnings- = Data.Tuple.snd (((,) ISym0KindInference) ())- type ISym1 :: Bool -> Bool- type family ISym1 (a0123456789876543210 :: Bool) :: Bool where- ISym1 a0123456789876543210 = I a0123456789876543210- type HSym0 :: (~>) Bool Bool- data HSym0 :: (~>) Bool Bool- where- HSym0KindInference :: SameKind (Apply HSym0 arg) (HSym1 arg) =>- HSym0 a0123456789876543210- type instance Apply HSym0 a0123456789876543210 = H a0123456789876543210- instance SuppressUnusedWarnings HSym0 where- suppressUnusedWarnings- = Data.Tuple.snd (((,) HSym0KindInference) ())- type HSym1 :: Bool -> Bool- type family HSym1 (a0123456789876543210 :: Bool) :: Bool where- HSym1 a0123456789876543210 = H a0123456789876543210- type family X_0123456789876543210Sym0 where- X_0123456789876543210Sym0 = X_0123456789876543210- type GSym0 :: (~>) Bool Bool- data GSym0 :: (~>) Bool Bool- where- GSym0KindInference :: SameKind (Apply GSym0 arg) (GSym1 arg) =>- GSym0 a0123456789876543210- type instance Apply GSym0 a0123456789876543210 = G a0123456789876543210- instance SuppressUnusedWarnings GSym0 where- suppressUnusedWarnings- = Data.Tuple.snd (((,) GSym0KindInference) ())- type GSym1 :: Bool -> Bool- type family GSym1 (a0123456789876543210 :: Bool) :: Bool where- GSym1 a0123456789876543210 = G a0123456789876543210- type FSym0 :: (~>) Bool Bool- data FSym0 :: (~>) Bool Bool- where- FSym0KindInference :: SameKind (Apply FSym0 arg) (FSym1 arg) =>- FSym0 a0123456789876543210- type instance Apply FSym0 a0123456789876543210 = F a0123456789876543210- instance SuppressUnusedWarnings FSym0 where- suppressUnusedWarnings- = Data.Tuple.snd (((,) FSym0KindInference) ())- type FSym1 :: Bool -> Bool- type family FSym1 (a0123456789876543210 :: Bool) :: Bool where- FSym1 a0123456789876543210 = F a0123456789876543210- type family X_0123456789876543210Sym0 where- X_0123456789876543210Sym0 = X_0123456789876543210- type family False_Sym0 where- False_Sym0 = False_- type NotSym0 :: (~>) Bool Bool- data NotSym0 :: (~>) Bool Bool- where- NotSym0KindInference :: SameKind (Apply NotSym0 arg) (NotSym1 arg) =>- NotSym0 a0123456789876543210- type instance Apply NotSym0 a0123456789876543210 = Not a0123456789876543210- instance SuppressUnusedWarnings NotSym0 where- suppressUnusedWarnings- = Data.Tuple.snd (((,) NotSym0KindInference) ())- type NotSym1 :: Bool -> Bool- type family NotSym1 (a0123456789876543210 :: Bool) :: Bool where- NotSym1 a0123456789876543210 = Not a0123456789876543210- type IdSym0 :: (~>) a a- data IdSym0 :: (~>) a a- where- IdSym0KindInference :: SameKind (Apply IdSym0 arg) (IdSym1 arg) =>- IdSym0 a0123456789876543210- type instance Apply IdSym0 a0123456789876543210 = Id a0123456789876543210- instance SuppressUnusedWarnings IdSym0 where- suppressUnusedWarnings- = Data.Tuple.snd (((,) IdSym0KindInference) ())- type IdSym1 :: a -> a- type family IdSym1 (a0123456789876543210 :: a) :: a where- IdSym1 a0123456789876543210 = Id a0123456789876543210- type OtherwiseSym0 :: Bool- type family OtherwiseSym0 :: Bool where- OtherwiseSym0 = Otherwise- type M :: Bool- type family M :: Bool where- M = Case_0123456789876543210 X_0123456789876543210Sym0- type L :: Bool- type family L :: Bool where- L = Case_0123456789876543210 X_0123456789876543210Sym0- type family X_0123456789876543210 where- X_0123456789876543210 = Apply (Apply (:@#@$) (Apply NotSym0 TrueSym0)) (Apply (Apply (:@#@$) (Apply IdSym0 FalseSym0)) NilSym0)- type K :: Bool- type family K :: Bool where- K = Case_0123456789876543210 X_0123456789876543210Sym0- type J :: Bool- type family J :: Bool where- J = Case_0123456789876543210 X_0123456789876543210Sym0- type family X_0123456789876543210 where- X_0123456789876543210 = Apply (Apply BarSym0 TrueSym0) (Apply HSym0 FalseSym0)- type I :: Bool -> Bool- type family I (a :: Bool) :: Bool where- I a_0123456789876543210 = Apply (Case_0123456789876543210 a_0123456789876543210 X_0123456789876543210Sym0) a_0123456789876543210- type H :: Bool -> Bool- type family H (a :: Bool) :: Bool where- H a_0123456789876543210 = Apply (Case_0123456789876543210 a_0123456789876543210 X_0123456789876543210Sym0) a_0123456789876543210- type family X_0123456789876543210 where- X_0123456789876543210 = Apply (Apply Tuple2Sym0 FSym0) GSym0- type G :: Bool -> Bool- type family G (a :: Bool) :: Bool where- G a_0123456789876543210 = Apply (Case_0123456789876543210 a_0123456789876543210 X_0123456789876543210Sym0) a_0123456789876543210- type F :: Bool -> Bool- type family F (a :: Bool) :: Bool where- F a_0123456789876543210 = Apply (Case_0123456789876543210 a_0123456789876543210 X_0123456789876543210Sym0) a_0123456789876543210- type family X_0123456789876543210 where- X_0123456789876543210 = Apply (Apply (:@#@$) NotSym0) (Apply (Apply (:@#@$) IdSym0) NilSym0)- type family False_ where- False_ = FalseSym0- type Not :: Bool -> Bool- type family Not (a :: Bool) :: Bool where- Not 'True = FalseSym0- Not 'False = TrueSym0- type Id :: a -> a- type family Id (a :: a) :: a where- Id x = x- type Otherwise :: Bool- type family Otherwise :: Bool where- Otherwise = TrueSym0- sM :: Sing (MSym0 :: Bool)- sL :: Sing (LSym0 :: Bool)- sX_0123456789876543210 :: Sing @_ X_0123456789876543210Sym0- sK :: Sing (KSym0 :: Bool)- sJ :: Sing (JSym0 :: Bool)- sX_0123456789876543210 :: Sing @_ X_0123456789876543210Sym0- sI :: forall (t :: Bool). Sing t -> Sing (Apply ISym0 t :: Bool)- sH :: forall (t :: Bool). Sing t -> Sing (Apply HSym0 t :: Bool)- sX_0123456789876543210 :: Sing @_ X_0123456789876543210Sym0- sG :: forall (t :: Bool). Sing t -> Sing (Apply GSym0 t :: Bool)- sF :: forall (t :: Bool). Sing t -> Sing (Apply FSym0 t :: Bool)- sX_0123456789876543210 :: Sing @_ X_0123456789876543210Sym0- sFalse_ :: Sing @_ False_Sym0- sNot ::- forall (t :: Bool). Sing t -> Sing (Apply NotSym0 t :: Bool)- sId :: forall a (t :: a). Sing t -> Sing (Apply IdSym0 t :: a)- sOtherwise :: Sing (OtherwiseSym0 :: Bool)- sM- = (GHC.Base.id- @(Sing (Case_0123456789876543210 X_0123456789876543210Sym0 :: Bool)))- (case sX_0123456789876543210 of- SCons _- (SCons (sY_0123456789876543210 :: Sing y_0123456789876543210) SNil)- -> sY_0123456789876543210)- sL- = (GHC.Base.id- @(Sing (Case_0123456789876543210 X_0123456789876543210Sym0 :: Bool)))- (case sX_0123456789876543210 of- SCons (sY_0123456789876543210 :: Sing y_0123456789876543210)- (SCons _ SNil)- -> sY_0123456789876543210)- sX_0123456789876543210- = (applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing ((singFun1 @NotSym0) sNot)) STrue)))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((applySing ((singFun1 @IdSym0) sId)) SFalse)))- SNil)- sK- = (GHC.Base.id- @(Sing (Case_0123456789876543210 X_0123456789876543210Sym0 :: Bool)))- (case sX_0123456789876543210 of- SBar _ (sY_0123456789876543210 :: Sing y_0123456789876543210)- -> sY_0123456789876543210)- sJ- = (GHC.Base.id- @(Sing (Case_0123456789876543210 X_0123456789876543210Sym0 :: Bool)))- (case sX_0123456789876543210 of- SBar (sY_0123456789876543210 :: Sing y_0123456789876543210) _- -> sY_0123456789876543210)- sX_0123456789876543210- = (applySing ((applySing ((singFun2 @BarSym0) SBar)) STrue))- ((applySing ((singFun1 @HSym0) sH)) SFalse)- sI (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((GHC.Base.id- @(Sing (Case_0123456789876543210 a_0123456789876543210 X_0123456789876543210Sym0)))- (case sX_0123456789876543210 of- STuple2 _ (sY_0123456789876543210 :: Sing y_0123456789876543210)- -> sY_0123456789876543210)))- sA_0123456789876543210- sH (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((GHC.Base.id- @(Sing (Case_0123456789876543210 a_0123456789876543210 X_0123456789876543210Sym0)))- (case sX_0123456789876543210 of- STuple2 (sY_0123456789876543210 :: Sing y_0123456789876543210) _- -> sY_0123456789876543210)))- sA_0123456789876543210- sX_0123456789876543210- = (applySing- ((applySing ((singFun2 @Tuple2Sym0) STuple2))- ((singFun1 @FSym0) sF)))- ((singFun1 @GSym0) sG)- sG (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((GHC.Base.id- @(Sing (Case_0123456789876543210 a_0123456789876543210 X_0123456789876543210Sym0)))- (case sX_0123456789876543210 of- SCons _- (SCons (sY_0123456789876543210 :: Sing y_0123456789876543210) SNil)- -> sY_0123456789876543210)))- sA_0123456789876543210- sF (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (applySing- ((GHC.Base.id- @(Sing (Case_0123456789876543210 a_0123456789876543210 X_0123456789876543210Sym0)))- (case sX_0123456789876543210 of- SCons (sY_0123456789876543210 :: Sing y_0123456789876543210)- (SCons _ SNil)- -> sY_0123456789876543210)))- sA_0123456789876543210- sX_0123456789876543210- = (applySing- ((applySing ((singFun2 @(:@#@$)) SCons))- ((singFun1 @NotSym0) sNot)))- ((applySing- ((applySing ((singFun2 @(:@#@$)) SCons)) ((singFun1 @IdSym0) sId)))- SNil)- sFalse_ = SFalse- sNot STrue = SFalse- sNot SFalse = STrue- sId (sX :: Sing x) = sX- sOtherwise = STrue- instance SingI (ISym0 :: (~>) Bool Bool) where- sing = (singFun1 @ISym0) sI- instance SingI (HSym0 :: (~>) Bool Bool) where- sing = (singFun1 @HSym0) sH- instance SingI (GSym0 :: (~>) Bool Bool) where- sing = (singFun1 @GSym0) sG- instance SingI (FSym0 :: (~>) Bool Bool) where- sing = (singFun1 @FSym0) sF- instance SingI (NotSym0 :: (~>) Bool Bool) where- sing = (singFun1 @NotSym0) sNot- instance SingI (IdSym0 :: (~>) a a) where- sing = (singFun1 @IdSym0) sId+Singletons/TopLevelPatterns.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| data Bool = False | True + data Foo = Bar Bool Bool |] + ======> + data Bool = False | True + data Foo = Bar Bool Bool + type FalseSym0 :: Bool + type family FalseSym0 :: Bool where + FalseSym0 = False + type TrueSym0 :: Bool + type family TrueSym0 :: Bool where + TrueSym0 = True + type BarSym0 :: (~>) Bool ((~>) Bool Foo) + data BarSym0 :: (~>) Bool ((~>) Bool Foo) + where + BarSym0KindInference :: SameKind (Apply BarSym0 arg) (BarSym1 arg) => + BarSym0 a0123456789876543210 + type instance Apply BarSym0 a0123456789876543210 = BarSym1 a0123456789876543210 + instance SuppressUnusedWarnings BarSym0 where + suppressUnusedWarnings + = Data.Tuple.snd ((,) BarSym0KindInference ()) + type BarSym1 :: Bool -> (~>) Bool Foo + data BarSym1 (a0123456789876543210 :: Bool) :: (~>) Bool Foo + where + BarSym1KindInference :: SameKind (Apply (BarSym1 a0123456789876543210) arg) (BarSym2 a0123456789876543210 arg) => + BarSym1 a0123456789876543210 a0123456789876543210 + type instance Apply (BarSym1 a0123456789876543210) a0123456789876543210 = Bar a0123456789876543210 a0123456789876543210 + instance SuppressUnusedWarnings (BarSym1 a0123456789876543210) where + suppressUnusedWarnings + = Data.Tuple.snd ((,) BarSym1KindInference ()) + type BarSym2 :: Bool -> Bool -> Foo + type family BarSym2 (a0123456789876543210 :: Bool) (a0123456789876543210 :: Bool) :: Foo where + BarSym2 a0123456789876543210 a0123456789876543210 = Bar a0123456789876543210 a0123456789876543210 + data SBool :: Bool -> Type + where + SFalse :: SBool (False :: Bool) + STrue :: SBool (True :: Bool) + type instance Sing @Bool = SBool + instance SingKind Bool where + type Demote Bool = Bool + fromSing SFalse = False + fromSing STrue = True + toSing False = SomeSing SFalse + toSing True = SomeSing STrue + data SFoo :: Foo -> Type + where + SBar :: forall (n :: Bool) (n :: Bool). + (Sing n) -> (Sing n) -> SFoo (Bar n n :: Foo) + type instance Sing @Foo = SFoo + instance SingKind Foo where + type Demote Foo = Foo + fromSing (SBar b b) = Bar (fromSing b) (fromSing b) + toSing (Bar (b :: Demote Bool) (b :: Demote Bool)) + = case + (,) (toSing b :: SomeSing Bool) (toSing b :: SomeSing Bool) + of + (,) (SomeSing c) (SomeSing c) -> SomeSing (SBar c c) + instance SingI False where + sing = SFalse + instance SingI True where + sing = STrue + instance (SingI n, SingI n) => + SingI (Bar (n :: Bool) (n :: Bool)) where + sing = SBar sing sing + instance SingI n => SingI1 (Bar (n :: Bool)) where + liftSing = SBar sing + instance SingI2 Bar where + liftSing2 = SBar + instance SingI (BarSym0 :: (~>) Bool ((~>) Bool Foo)) where + sing = singFun2 @BarSym0 SBar + instance SingI d => + SingI (BarSym1 (d :: Bool) :: (~>) Bool Foo) where + sing = singFun1 @(BarSym1 (d :: Bool)) (SBar (sing @d)) + instance SingI1 (BarSym1 :: Bool -> (~>) Bool Foo) where + liftSing (s :: Sing (d :: Bool)) + = singFun1 @(BarSym1 (d :: Bool)) (SBar s) +Singletons/TopLevelPatterns.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| otherwise :: Bool + otherwise = True + id :: a -> a + id x = x + not :: Bool -> Bool + not True = False + not False = True + false_ = False + f, g :: Bool -> Bool + [f, g] = [not, id] + h, i :: Bool -> Bool + (h, i) = (f, g) + j, k :: Bool + (Bar j k) = Bar True (h False) + l, m :: Bool + [l, m] = [not True, id False] |] + ======> + otherwise :: Bool + otherwise = True + id :: a -> a + id x = x + not :: Bool -> Bool + not True = False + not False = True + false_ = False + f :: Bool -> Bool + g :: Bool -> Bool + [f, g] = [not, id] + h :: Bool -> Bool + i :: Bool -> Bool + (h, i) = (f, g) + j :: Bool + k :: Bool + Bar j k = Bar True (h False) + l :: Bool + m :: Bool + [l, m] = [not True, id False] + type family Case_0123456789876543210 t where + Case_0123456789876543210 '[_, + y_0123456789876543210] = y_0123456789876543210 + type family Case_0123456789876543210 t where + Case_0123456789876543210 '[y_0123456789876543210, + _] = y_0123456789876543210 + type family Case_0123456789876543210 t where + Case_0123456789876543210 ('Bar _ y_0123456789876543210) = y_0123456789876543210 + type family Case_0123456789876543210 t where + Case_0123456789876543210 ('Bar y_0123456789876543210 _) = y_0123456789876543210 + type family Case_0123456789876543210 a_0123456789876543210 t where + Case_0123456789876543210 a_0123456789876543210 '(_, + y_0123456789876543210) = y_0123456789876543210 + type family Case_0123456789876543210 a_0123456789876543210 t where + Case_0123456789876543210 a_0123456789876543210 '(y_0123456789876543210, + _) = y_0123456789876543210 + type family Case_0123456789876543210 a_0123456789876543210 t where + Case_0123456789876543210 a_0123456789876543210 '[_, + y_0123456789876543210] = y_0123456789876543210 + type family Case_0123456789876543210 a_0123456789876543210 t where + Case_0123456789876543210 a_0123456789876543210 '[y_0123456789876543210, + _] = y_0123456789876543210 + type MSym0 :: Bool + type family MSym0 :: Bool where + MSym0 = M + type LSym0 :: Bool + type family LSym0 :: Bool where + LSym0 = L + type family X_0123456789876543210Sym0 where + X_0123456789876543210Sym0 = X_0123456789876543210 + type KSym0 :: Bool + type family KSym0 :: Bool where + KSym0 = K + type JSym0 :: Bool + type family JSym0 :: Bool where + JSym0 = J + type family X_0123456789876543210Sym0 where + X_0123456789876543210Sym0 = X_0123456789876543210 + type ISym0 :: (~>) Bool Bool + data ISym0 :: (~>) Bool Bool + where + ISym0KindInference :: SameKind (Apply ISym0 arg) (ISym1 arg) => + ISym0 a0123456789876543210 + type instance Apply ISym0 a0123456789876543210 = I a0123456789876543210 + instance SuppressUnusedWarnings ISym0 where + suppressUnusedWarnings = Data.Tuple.snd ((,) ISym0KindInference ()) + type ISym1 :: Bool -> Bool + type family ISym1 (a0123456789876543210 :: Bool) :: Bool where + ISym1 a0123456789876543210 = I a0123456789876543210 + type HSym0 :: (~>) Bool Bool + data HSym0 :: (~>) Bool Bool + where + HSym0KindInference :: SameKind (Apply HSym0 arg) (HSym1 arg) => + HSym0 a0123456789876543210 + type instance Apply HSym0 a0123456789876543210 = H a0123456789876543210 + instance SuppressUnusedWarnings HSym0 where + suppressUnusedWarnings = Data.Tuple.snd ((,) HSym0KindInference ()) + type HSym1 :: Bool -> Bool + type family HSym1 (a0123456789876543210 :: Bool) :: Bool where + HSym1 a0123456789876543210 = H a0123456789876543210 + type family X_0123456789876543210Sym0 where + X_0123456789876543210Sym0 = X_0123456789876543210 + type GSym0 :: (~>) Bool Bool + data GSym0 :: (~>) Bool Bool + where + GSym0KindInference :: SameKind (Apply GSym0 arg) (GSym1 arg) => + GSym0 a0123456789876543210 + type instance Apply GSym0 a0123456789876543210 = G a0123456789876543210 + instance SuppressUnusedWarnings GSym0 where + suppressUnusedWarnings = Data.Tuple.snd ((,) GSym0KindInference ()) + type GSym1 :: Bool -> Bool + type family GSym1 (a0123456789876543210 :: Bool) :: Bool where + GSym1 a0123456789876543210 = G a0123456789876543210 + type FSym0 :: (~>) Bool Bool + data FSym0 :: (~>) Bool Bool + where + FSym0KindInference :: SameKind (Apply FSym0 arg) (FSym1 arg) => + FSym0 a0123456789876543210 + type instance Apply FSym0 a0123456789876543210 = F a0123456789876543210 + instance SuppressUnusedWarnings FSym0 where + suppressUnusedWarnings = Data.Tuple.snd ((,) FSym0KindInference ()) + type FSym1 :: Bool -> Bool + type family FSym1 (a0123456789876543210 :: Bool) :: Bool where + FSym1 a0123456789876543210 = F a0123456789876543210 + type family X_0123456789876543210Sym0 where + X_0123456789876543210Sym0 = X_0123456789876543210 + type family False_Sym0 where + False_Sym0 = False_ + type NotSym0 :: (~>) Bool Bool + data NotSym0 :: (~>) Bool Bool + where + NotSym0KindInference :: SameKind (Apply NotSym0 arg) (NotSym1 arg) => + NotSym0 a0123456789876543210 + type instance Apply NotSym0 a0123456789876543210 = Not a0123456789876543210 + instance SuppressUnusedWarnings NotSym0 where + suppressUnusedWarnings + = Data.Tuple.snd ((,) NotSym0KindInference ()) + type NotSym1 :: Bool -> Bool + type family NotSym1 (a0123456789876543210 :: Bool) :: Bool where + NotSym1 a0123456789876543210 = Not a0123456789876543210 + type IdSym0 :: (~>) a a + data IdSym0 :: (~>) a a + where + IdSym0KindInference :: SameKind (Apply IdSym0 arg) (IdSym1 arg) => + IdSym0 a0123456789876543210 + type instance Apply IdSym0 a0123456789876543210 = Id a0123456789876543210 + instance SuppressUnusedWarnings IdSym0 where + suppressUnusedWarnings + = Data.Tuple.snd ((,) IdSym0KindInference ()) + type IdSym1 :: a -> a + type family IdSym1 (a0123456789876543210 :: a) :: a where + IdSym1 a0123456789876543210 = Id a0123456789876543210 + type OtherwiseSym0 :: Bool + type family OtherwiseSym0 :: Bool where + OtherwiseSym0 = Otherwise + type M :: Bool + type family M :: Bool where + M = Case_0123456789876543210 X_0123456789876543210Sym0 + type L :: Bool + type family L :: Bool where + L = Case_0123456789876543210 X_0123456789876543210Sym0 + type family X_0123456789876543210 where + X_0123456789876543210 = Apply (Apply (:@#@$) (Apply NotSym0 TrueSym0)) (Apply (Apply (:@#@$) (Apply IdSym0 FalseSym0)) NilSym0) + type K :: Bool + type family K :: Bool where + K = Case_0123456789876543210 X_0123456789876543210Sym0 + type J :: Bool + type family J :: Bool where + J = Case_0123456789876543210 X_0123456789876543210Sym0 + type family X_0123456789876543210 where + X_0123456789876543210 = Apply (Apply BarSym0 TrueSym0) (Apply HSym0 FalseSym0) + type I :: Bool -> Bool + type family I (a :: Bool) :: Bool where + I a_0123456789876543210 = Apply (Case_0123456789876543210 a_0123456789876543210 X_0123456789876543210Sym0) a_0123456789876543210 + type H :: Bool -> Bool + type family H (a :: Bool) :: Bool where + H a_0123456789876543210 = Apply (Case_0123456789876543210 a_0123456789876543210 X_0123456789876543210Sym0) a_0123456789876543210 + type family X_0123456789876543210 where + X_0123456789876543210 = Apply (Apply Tuple2Sym0 FSym0) GSym0 + type G :: Bool -> Bool + type family G (a :: Bool) :: Bool where + G a_0123456789876543210 = Apply (Case_0123456789876543210 a_0123456789876543210 X_0123456789876543210Sym0) a_0123456789876543210 + type F :: Bool -> Bool + type family F (a :: Bool) :: Bool where + F a_0123456789876543210 = Apply (Case_0123456789876543210 a_0123456789876543210 X_0123456789876543210Sym0) a_0123456789876543210 + type family X_0123456789876543210 where + X_0123456789876543210 = Apply (Apply (:@#@$) NotSym0) (Apply (Apply (:@#@$) IdSym0) NilSym0) + type family False_ where + False_ = FalseSym0 + type Not :: Bool -> Bool + type family Not (a :: Bool) :: Bool where + Not 'True = FalseSym0 + Not 'False = TrueSym0 + type Id :: a -> a + type family Id (a :: a) :: a where + Id x = x + type Otherwise :: Bool + type family Otherwise :: Bool where + Otherwise = TrueSym0 + sM :: (Sing (MSym0 :: Bool) :: Type) + sL :: (Sing (LSym0 :: Bool) :: Type) + sX_0123456789876543210 :: Sing @_ X_0123456789876543210Sym0 + sK :: (Sing (KSym0 :: Bool) :: Type) + sJ :: (Sing (JSym0 :: Bool) :: Type) + sX_0123456789876543210 :: Sing @_ X_0123456789876543210Sym0 + sI :: + (forall (t :: Bool). + Sing t -> Sing (Apply ISym0 t :: Bool) :: Type) + sH :: + (forall (t :: Bool). + Sing t -> Sing (Apply HSym0 t :: Bool) :: Type) + sX_0123456789876543210 :: Sing @_ X_0123456789876543210Sym0 + sG :: + (forall (t :: Bool). + Sing t -> Sing (Apply GSym0 t :: Bool) :: Type) + sF :: + (forall (t :: Bool). + Sing t -> Sing (Apply FSym0 t :: Bool) :: Type) + sX_0123456789876543210 :: Sing @_ X_0123456789876543210Sym0 + sFalse_ :: Sing @_ False_Sym0 + sNot :: + (forall (t :: Bool). + Sing t -> Sing (Apply NotSym0 t :: Bool) :: Type) + sId :: + (forall (t :: a). Sing t -> Sing (Apply IdSym0 t :: a) :: Type) + sOtherwise :: (Sing (OtherwiseSym0 :: Bool) :: Type) + sM + = GHC.Base.id + @(Sing (Case_0123456789876543210 X_0123456789876543210Sym0)) + (case sX_0123456789876543210 of + SCons _ + (SCons (sY_0123456789876543210 :: Sing y_0123456789876543210) SNil) + -> sY_0123456789876543210) + sL + = GHC.Base.id + @(Sing (Case_0123456789876543210 X_0123456789876543210Sym0)) + (case sX_0123456789876543210 of + SCons (sY_0123456789876543210 :: Sing y_0123456789876543210) + (SCons _ SNil) + -> sY_0123456789876543210) + sX_0123456789876543210 + = applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing (singFun1 @NotSym0 sNot) STrue)) + (applySing + (applySing + (singFun2 @(:@#@$) SCons) + (applySing (singFun1 @IdSym0 sId) SFalse)) + SNil) + sK + = GHC.Base.id + @(Sing (Case_0123456789876543210 X_0123456789876543210Sym0)) + (case sX_0123456789876543210 of + SBar _ (sY_0123456789876543210 :: Sing y_0123456789876543210) + -> sY_0123456789876543210) + sJ + = GHC.Base.id + @(Sing (Case_0123456789876543210 X_0123456789876543210Sym0)) + (case sX_0123456789876543210 of + SBar (sY_0123456789876543210 :: Sing y_0123456789876543210) _ + -> sY_0123456789876543210) + sX_0123456789876543210 + = applySing + (applySing (singFun2 @BarSym0 SBar) STrue) + (applySing (singFun1 @HSym0 sH) SFalse) + sI (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (GHC.Base.id + @(Sing (Case_0123456789876543210 a_0123456789876543210 X_0123456789876543210Sym0)) + (case sX_0123456789876543210 of + STuple2 _ (sY_0123456789876543210 :: Sing y_0123456789876543210) + -> sY_0123456789876543210)) + sA_0123456789876543210 + sH (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (GHC.Base.id + @(Sing (Case_0123456789876543210 a_0123456789876543210 X_0123456789876543210Sym0)) + (case sX_0123456789876543210 of + STuple2 (sY_0123456789876543210 :: Sing y_0123456789876543210) _ + -> sY_0123456789876543210)) + sA_0123456789876543210 + sX_0123456789876543210 + = applySing + (applySing (singFun2 @Tuple2Sym0 STuple2) (singFun1 @FSym0 sF)) + (singFun1 @GSym0 sG) + sG (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (GHC.Base.id + @(Sing (Case_0123456789876543210 a_0123456789876543210 X_0123456789876543210Sym0)) + (case sX_0123456789876543210 of + SCons _ + (SCons (sY_0123456789876543210 :: Sing y_0123456789876543210) SNil) + -> sY_0123456789876543210)) + sA_0123456789876543210 + sF (sA_0123456789876543210 :: Sing a_0123456789876543210) + = applySing + (GHC.Base.id + @(Sing (Case_0123456789876543210 a_0123456789876543210 X_0123456789876543210Sym0)) + (case sX_0123456789876543210 of + SCons (sY_0123456789876543210 :: Sing y_0123456789876543210) + (SCons _ SNil) + -> sY_0123456789876543210)) + sA_0123456789876543210 + sX_0123456789876543210 + = applySing + (applySing (singFun2 @(:@#@$) SCons) (singFun1 @NotSym0 sNot)) + (applySing + (applySing (singFun2 @(:@#@$) SCons) (singFun1 @IdSym0 sId)) SNil) + sFalse_ = SFalse + sNot STrue = SFalse + sNot SFalse = STrue + sId (sX :: Sing x) = sX + sOtherwise = STrue + instance SingI (ISym0 :: (~>) Bool Bool) where + sing = singFun1 @ISym0 sI + instance SingI (HSym0 :: (~>) Bool Bool) where + sing = singFun1 @HSym0 sH + instance SingI (GSym0 :: (~>) Bool Bool) where + sing = singFun1 @GSym0 sG + instance SingI (FSym0 :: (~>) Bool Bool) where + sing = singFun1 @FSym0 sF + instance SingI (NotSym0 :: (~>) Bool Bool) where + sing = singFun1 @NotSym0 sNot + instance SingI (IdSym0 :: (~>) a a) where + sing = singFun1 @IdSym0 sId
tests/compile-and-dump/Singletons/TopLevelPatterns.hs view
@@ -1,37 +1,37 @@-{-# LANGUAGE NoImplicitPrelude #-}-{-# OPTIONS_GHC -Wno-incomplete-patterns #-}--module Singletons.TopLevelPatterns where--import Data.Singletons.Base.TH hiding (SBool(..), TrueSym0, FalseSym0)--$(singletons [d|- data Bool = False | True- data Foo = Bar Bool Bool- |])--$(singletons [d|- otherwise :: Bool- otherwise = True-- id :: a -> a- id x = x-- not :: Bool -> Bool- not True = False- not False = True-- false_ = False-- f,g :: Bool -> Bool- [f,g] = [not, id]-- h,i :: Bool -> Bool- (h,i) = (f, g)-- j,k :: Bool- (Bar j k) = Bar True (h False)-- l,m :: Bool- [l,m] = [not True, id False]- |])+{-# LANGUAGE NoImplicitPrelude #-} +{-# OPTIONS_GHC -Wno-incomplete-patterns #-} + +module Singletons.TopLevelPatterns where + +import Data.Singletons.Base.TH hiding (SBool(..), TrueSym0, FalseSym0) + +$(singletons [d| + data Bool = False | True + data Foo = Bar Bool Bool + |]) + +$(singletons [d| + otherwise :: Bool + otherwise = True + + id :: a -> a + id x = x + + not :: Bool -> Bool + not True = False + not False = True + + false_ = False + + f,g :: Bool -> Bool + [f,g] = [not, id] + + h,i :: Bool -> Bool + (h,i) = (f, g) + + j,k :: Bool + (Bar j k) = Bar True (h False) + + l,m :: Bool + [l,m] = [not True, id False] + |])
tests/compile-and-dump/Singletons/TypeRepTYPE.hs view
@@ -1,41 +1,41 @@-{-# LANGUAGE MagicHash #-}--module TypeRepTYPE where--import Data.Kind (Type)-import Data.Singletons.Base.TypeRepTYPE-import Data.Singletons.Decide-import GHC.Exts (Char#, RuntimeRep(..), TYPE, Word#)-import Prelude.Singletons-import Type.Reflection (Typeable, typeRep)--eqTYPETest1 :: (Type == Type) :~: 'True-eqTYPETest1 = Refl--eqTYPETest2 :: (Type == TYPE 'IntRep) :~: 'False-eqTYPETest2 = Refl--f :: Sing (a :: Type) -> Maybe a-f tr- | Proved Refl <- tr %~ sing @Bool- = Just True- | Proved Refl <- tr %~ sing @Ordering- = Just EQ- | otherwise- = Nothing--data MaybeWordRep (a :: TYPE 'WordRep)- = NothingWordRep- | JustWordRep a--g :: Sing (a :: TYPE 'WordRep) -> MaybeWordRep a-g tr- | Proved Refl <- tr %~ sing @Word#- = JustWordRep 42##- | Proved Refl <- tr %~ sing @Char#- = JustWordRep 'j'#- | otherwise- = NothingWordRep--h :: forall (rep :: RuntimeRep) (a :: TYPE rep). Typeable a => Sing a-h = typeRep @a+{-# LANGUAGE MagicHash #-} + +module TypeRepTYPE where + +import Data.Kind (Type) +import Data.Singletons.Base.TypeRepTYPE +import Data.Singletons.Decide +import GHC.Exts (Char#, RuntimeRep(..), TYPE, Word#) +import Prelude.Singletons +import Type.Reflection (Typeable, typeRep) + +eqTYPETest1 :: (Type == Type) :~: 'True +eqTYPETest1 = Refl + +eqTYPETest2 :: (Type == TYPE 'IntRep) :~: 'False +eqTYPETest2 = Refl + +f :: Sing (a :: Type) -> Maybe a +f tr + | Proved Refl <- tr %~ sing @Bool + = Just True + | Proved Refl <- tr %~ sing @Ordering + = Just EQ + | otherwise + = Nothing + +data MaybeWordRep (a :: TYPE 'WordRep) + = NothingWordRep + | JustWordRep a + +g :: Sing (a :: TYPE 'WordRep) -> MaybeWordRep a +g tr + | Proved Refl <- tr %~ sing @Word# + = JustWordRep 42## + | Proved Refl <- tr %~ sing @Char# + = JustWordRep 'j'# + | otherwise + = NothingWordRep + +h :: forall (rep :: RuntimeRep) (a :: TYPE rep). Typeable a => Sing a +h = typeRep @a
tests/compile-and-dump/Singletons/Undef.golden view
@@ -1,51 +1,53 @@-Singletons/Undef.hs:(0,0)-(0,0): Splicing declarations- singletons- [d| foo :: Bool -> Bool- foo = undefined- bar :: Bool -> Bool- bar = error "urk" |]- ======>- foo :: Bool -> Bool- foo = undefined- bar :: Bool -> Bool- bar = error "urk"- type BarSym0 :: (~>) Bool Bool- data BarSym0 :: (~>) Bool Bool- where- BarSym0KindInference :: SameKind (Apply BarSym0 arg) (BarSym1 arg) =>- BarSym0 a0123456789876543210- type instance Apply BarSym0 a0123456789876543210 = Bar a0123456789876543210- instance SuppressUnusedWarnings BarSym0 where- suppressUnusedWarnings = snd (((,) BarSym0KindInference) ())- type BarSym1 :: Bool -> Bool- type family BarSym1 (a0123456789876543210 :: Bool) :: Bool where- BarSym1 a0123456789876543210 = Bar a0123456789876543210- type FooSym0 :: (~>) Bool Bool- data FooSym0 :: (~>) Bool Bool- where- FooSym0KindInference :: SameKind (Apply FooSym0 arg) (FooSym1 arg) =>- FooSym0 a0123456789876543210- type instance Apply FooSym0 a0123456789876543210 = Foo a0123456789876543210- instance SuppressUnusedWarnings FooSym0 where- suppressUnusedWarnings = snd (((,) FooSym0KindInference) ())- type FooSym1 :: Bool -> Bool- type family FooSym1 (a0123456789876543210 :: Bool) :: Bool where- FooSym1 a0123456789876543210 = Foo a0123456789876543210- type Bar :: Bool -> Bool- type family Bar (a :: Bool) :: Bool where- Bar a_0123456789876543210 = Apply (Apply ErrorSym0 "urk") a_0123456789876543210- type Foo :: Bool -> Bool- type family Foo (a :: Bool) :: Bool where- Foo a_0123456789876543210 = Apply UndefinedSym0 a_0123456789876543210- sBar ::- forall (t :: Bool). Sing t -> Sing (Apply BarSym0 t :: Bool)- sFoo ::- forall (t :: Bool). Sing t -> Sing (Apply FooSym0 t :: Bool)- sBar (sA_0123456789876543210 :: Sing a_0123456789876543210)- = (sError (sing :: Sing "urk")) sA_0123456789876543210- sFoo (sA_0123456789876543210 :: Sing a_0123456789876543210)- = sUndefined sA_0123456789876543210- instance SingI (BarSym0 :: (~>) Bool Bool) where- sing = (singFun1 @BarSym0) sBar- instance SingI (FooSym0 :: (~>) Bool Bool) where- sing = (singFun1 @FooSym0) sFoo+Singletons/Undef.hs:(0,0)-(0,0): Splicing declarations + singletons + [d| foo :: Bool -> Bool + foo = undefined + bar :: Bool -> Bool + bar = error "urk" |] + ======> + foo :: Bool -> Bool + foo = undefined + bar :: Bool -> Bool + bar = error "urk" + type BarSym0 :: (~>) Bool Bool + data BarSym0 :: (~>) Bool Bool + where + BarSym0KindInference :: SameKind (Apply BarSym0 arg) (BarSym1 arg) => + BarSym0 a0123456789876543210 + type instance Apply BarSym0 a0123456789876543210 = Bar a0123456789876543210 + instance SuppressUnusedWarnings BarSym0 where + suppressUnusedWarnings = snd ((,) BarSym0KindInference ()) + type BarSym1 :: Bool -> Bool + type family BarSym1 (a0123456789876543210 :: Bool) :: Bool where + BarSym1 a0123456789876543210 = Bar a0123456789876543210 + type FooSym0 :: (~>) Bool Bool + data FooSym0 :: (~>) Bool Bool + where + FooSym0KindInference :: SameKind (Apply FooSym0 arg) (FooSym1 arg) => + FooSym0 a0123456789876543210 + type instance Apply FooSym0 a0123456789876543210 = Foo a0123456789876543210 + instance SuppressUnusedWarnings FooSym0 where + suppressUnusedWarnings = snd ((,) FooSym0KindInference ()) + type FooSym1 :: Bool -> Bool + type family FooSym1 (a0123456789876543210 :: Bool) :: Bool where + FooSym1 a0123456789876543210 = Foo a0123456789876543210 + type Bar :: Bool -> Bool + type family Bar (a :: Bool) :: Bool where + Bar a_0123456789876543210 = Apply (Apply ErrorSym0 "urk") a_0123456789876543210 + type Foo :: Bool -> Bool + type family Foo (a :: Bool) :: Bool where + Foo a_0123456789876543210 = Apply UndefinedSym0 a_0123456789876543210 + sBar :: + (forall (t :: Bool). + Sing t -> Sing (Apply BarSym0 t :: Bool) :: Type) + sFoo :: + (forall (t :: Bool). + Sing t -> Sing (Apply FooSym0 t :: Bool) :: Type) + sBar (sA_0123456789876543210 :: Sing a_0123456789876543210) + = sError (sing :: Sing "urk") sA_0123456789876543210 + sFoo (sA_0123456789876543210 :: Sing a_0123456789876543210) + = sUndefined sA_0123456789876543210 + instance SingI (BarSym0 :: (~>) Bool Bool) where + sing = singFun1 @BarSym0 sBar + instance SingI (FooSym0 :: (~>) Bool Bool) where + sing = singFun1 @FooSym0 sFoo
tests/compile-and-dump/Singletons/Undef.hs view
@@ -1,12 +1,12 @@-{-# OPTIONS_GHC -Wall #-}-module Singletons.Undef where--import Data.Singletons.Base.TH--$(singletons [d|- foo :: Bool -> Bool- foo = undefined-- bar :: Bool -> Bool- bar = error "urk"- |])+{-# OPTIONS_GHC -Wall #-} +module Singletons.Undef where + +import Data.Singletons.Base.TH + +$(singletons [d| + foo :: Bool -> Bool + foo = undefined + + bar :: Bool -> Bool + bar = error "urk" + |])