
#13249: Default signature check can be quite onerous -------------------------------------+------------------------------------- Reporter: bgamari | Owner: (none) Type: feature request | Status: closed Priority: normal | Milestone: 8.2.1 Component: Compiler (Type | Version: 8.1 checker) | Resolution: invalid | Keywords: Operating System: Unknown/Multiple | Architecture: Type of failure: GHC rejects | Unknown/Multiple valid program | Test Case: Blocked By: | Blocking: Related Tickets: #12918 | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by RyanGlScott): Sorry for not noticing this sooner, but I agree with Simon that the situation is not as dire as it seems. It should be noted that the correct default type signature could actually be made a little shorter: {{{#!hs default remaining :: (MonadTrans t, MonadGet n, m ~ t n, Remaining m ~ Remaining n) => m (Remaining m) }}} That is, the `MonadGet n` constraint implies the `Monad n` constraint. I don't think four constraints is a unreasonable amount to ask for, given that we're using the "lift something into a `MonadTrans`" design pattern, which requires repeating the constraints (and associated type families) for the type that is lifted anyway. Also, to answer Iceland_jack's question: no, `t m (Remaining m)` would not be valid, both in the sense that GHC will reject it and in a semantic sense, as you're conflating two different `Monad`s. The first `m` in `t m (Remaining m)` represents the `Monad` you're lifted, while the second `m` is for the type which is a `MonadTrans` (i.e, the thing you're lifting into). Failing to distinguish between these two things has led to all sorts of problems in the past (see #12784), which is one the reasons we introduced this check in the first place. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/13249#comment:6 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler