Partial type signatures in class constraints behave unexpectedly
Minimal example:
{-# LANGUAGE PartialTypeSignatures #-}
{-# LANGUAGE TemplateHaskell #-}
module Minimal where
id [d|
f :: (Monad m, _) => [m a] -> m [a]
f' :: (Monad m, _) => [m a] -> m [a]
f = f'
f' [] = return []
f' (x:xx) = f xx
|]
[1 of 1] Compiling Minimal ( /Users/pepe/Dropbox/code/debug-hoed/test/minimal.hs, interpreted )
/Users/pepe/Dropbox/code/debug-hoed/test/minimal.hs:5:1: warning: [-Wpartial-type-signatures]
• Found type wildcard ‘_’ standing for ‘()’
• In the type signature:
f :: (Monad m_a7NN, _) => [m_a7NN a_a7NO] -> m_a7NN [a_a7NO]
|
5 | id [d|
| ^^^^^^...
/Users/pepe/Dropbox/code/debug-hoed/test/minimal.hs:5:1: warning: [-Wpartial-type-signatures]
• Found type wildcard ‘_’ standing for ‘()’
• In the type signature:
f' :: (Monad m_a7NL, _) => [m_a7NL a_a7NM] -> m_a7NL [a_a7NM]
|
5 | id [d|
| ^^^^^^...
Ok, one module loaded.
:browse
f :: (Monad m, Monad m) => [m a] -> m [a]
f' :: (Monad m, Monad m) => [m a] -> m [a]
Notice the duplicate Monad m constraint.
Things get even more weird if the type signatures are declared together:
id [d|
f, f' :: (Monad m, _) => [m a] -> m [a]
f = f'
f' [] = return []
f' (x:xx) = f xx
|]
[1 of 1] Compiling Minimal ( /Users/pepe/Dropbox/code/debug-hoed/test/minimal.hs, interpreted )
/Users/pepe/Dropbox/code/debug-hoed/test/minimal.hs:5:1: warning: [-Wpartial-type-signatures]
• Found type wildcard ‘_’ standing for ‘()’
• In the type signature:
f :: (Monad m_a88E, _) => [m_a88E a_a88F] -> m_a88E [a_a88F]
|
5 | id [d|
| ^^^^^^...
/Users/pepe/Dropbox/code/debug-hoed/test/minimal.hs:5:1: warning: [-Wpartial-type-signatures]
• Found type wildcard ‘_’ standing for ‘()’
• In the type signature:
f' :: (Monad m_a88E, _) => [m_a88E a_a88F] -> m_a88E [a_a88F]
|
5 | id [d|
| ^^^^^^...
Ok, one module loaded.
:browse
f ::
(Monad ghc-prim-0.5.1.1:GHC.Types.Any, Monad m) =>
[ghc-prim-0.5.1.1:GHC.Types.Any ghc-prim-0.5.1.1:GHC.Types.Any]
-> ghc-prim-0.5.1.1:GHC.Types.Any [ghc-prim-0.5.1.1:GHC.Types.Any]
f' ::
(Monad ghc-prim-0.5.1.1:GHC.Types.Any, Monad m) => [m a] -> m [a]
Trac metadata
Trac field | Value |
---|---|
Version | 8.2.2 |
Type | Bug |
TypeOfFailure | OtherFailure |
Priority | normal |
Resolution | Unresolved |
Component | Compiler |
Test case | |
Differential revisions | |
BlockedBy | |
Related | |
Blocking | |
CC | |
Operating system | |
Architecture |