Skip to content

Unused variable warning affects compositionality when generating code

If I'm generating a program using template haskell, I might define a combinator to help me generate lambdas.

type Code a = Q (TExp a)

_lam :: (Code a -> Code b) -> Code (a -> b)
_lam f = [|| \a -> $$(f [|| a ||]) ||]

However, if I now pass a constant function into _lam, the generated code contains an unused variable a that I can do nothing about and desire not to do anything about.

c5 :: Code (a -> Int)
c5 = _lam (const [|| 5 ||])

However, GHC decides that it's wise to warn me about this when I splice it in.

> $$c5
F2.hs:6:5: warning: [-Wunused-matches] Defined but not used: ‘a’
  |
6 | q = $$c5
  |     ^^^

As Ryan will tell you, I'm against emitting warnings from generated code as it breaks the abstraction. The code that is generated is guaranteed to be type and scope correct but any aesthetic warning is irrelevant to the consumer.

I see it in precisely the same way as warning if we use a function that contains an unused variable in a library. Once the definition is exported from the library, its definition is opaque. The same principle should be applied to code generated by template haskell.

Trac metadata
Trac field Value
Version 8.6.3
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Compiler
Test case
Differential revisions
BlockedBy
Related
Blocking
CC
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information