Admin message

Due to a large amount of spam we do not allow new users to create repositories, they are "external" users. If you are a new user and want to create a repository, for example for forking GHC, open a new issue on ghc/ghc using the "get-verified" issue template

Should unary tuple generated by `tupleT 1` ignored?
## Summary Since GHC 8.10.1, `tupleT 1 `appT` conT ''SomeType` generates `Unit SomeType` instead of just `SomeType`. Due to this behavior, my package isn't compiled as expected. ## Steps to reproduce Here is the minimum code to reproduce: ```haskell {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TemplateHaskell #-} import Language.Haskell.TH.Lib data ExampleData = ExampleData deriving Show class ExampleClass a where exampleMethod :: a -> String $( [d| instance ExampleClass $(tupleT 1 `appT` conT ''ExampleData) where exampleMethod _ = "ExampleData" |] ) main :: IO () main = print $ exampleMethod ExampleData ``` ## Expected behavior Should be successfully compiled. But actually GHC reports an error like below: ``` example-unary-tuple-th.hs:20:16: error: • No instance for (ExampleClass ExampleData) arising from a use of ‘exampleMethod’ • In the second argument of ‘($)’, namely ‘exampleMethod ExampleData’ In the expression: print $ exampleMethod ExampleData In an equation for ‘main’: main = print $ exampleMethod ExampleData | 20 | main = print $ exampleMethod ExampleData | ^^^^^^^^^^^^^^^^^^^^^^^^^ ``` ## Additional details Compiling with `-ddump-splices`, I found GHC interprets `$(tupleT 1 `appT` conT ''ExampleData)` as `Unit ExampleData` instead of `ExampleData`: ```haskell example-unary-tuple-th.hs:(13,3)-(16,6): Splicing declarations [d| instance ExampleClass $(tupleT 1 `appT` conT ''ExampleData) where exampleMethod _ = "ExampleData" |] pending(rn) [<splice_aEd, tupleT 1 `appT` conT ''ExampleData>] ======> instance ExampleClass Unit ExampleData where exampleMethod _ = "ExampleData" ``` I assume this is the cause. Perhaps related issue: https://gitlab.haskell.org/ghc/ghc/-/issues/17511 ## When this causes a problem In my package, [typesafe-precure](https://gitlab.haskell.org/ghc/ghc/-/issues/17511), many instances of type classes are generated by TH, from separately defined data structures. There are both tuples of types and single types among the generated instances, so if `Unit SomeType` is generated, I have to add an exceptional treatment for single types when creating `TypeQ` (e.g. https://github.com/igrep/typesafe-precure/blob/3844b4cb866cda9d0df4e2f7b986d066b66a1f83/src/ACME/PreCure/Types/TH.hs#L225 ). So I'm sure this can be actually avoided by such an exceptional treatment (I will add that in typesafe-precure later). If you think `Unit SomeType` and `SomeType` are separately treated, feel free to close (But I'm sure submitting this issue would help some people with the same problem). ## Environment I confirmed the error with these environments: * GHC 8.10.1 on Windows 10 ver. 1909 * GHC 8.10.2 on Linux `debian 4.19.0-10-amd64 #1 SMP Debian 4.19.132-1 (2020-07-24) x86_64 GNU/Linux`
issue