
#14782: typeclass polymorphism defeats bang patterns -------------------------------------+------------------------------------- Reporter: dmwit | Owner: (none) Type: bug | Status: closed Priority: normal | Milestone: Component: Compiler | Version: 8.2.2 Resolution: invalid | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Changes (by simonpj): * status: new => closed * resolution: => invalid Comment: It is a bit confusing. See [http://downloads.haskell.org/~ghc/master/users- guide/glasgow_exts.html#recursive-and-polymorphic-let-bindings the manual entry for semantics of let bindings] {{{ let n :: Num a => a; !n = undefined in return () means let n :: Num a => a n = undefined in n `seq` return () which, after elaboration of dictionaries etc means let n = /\a. \(d::Num a). undefined in n `seq` return () }}} So the `seq` sees a lambda and does nothing. --------- As to the "conflicts with the MR" message, consider {{{ f :: forall a. Num a => a -> a Just f = e }}} and consult [https://www.haskell.org/onlinereport/haskell2010/haskellch4.html#x10-880004.... the Haskell report on the monomorphism restriction]. It says that the MR applies unless "an explicit type signature is given for every variable in the group that is bound by simple pattern binding"; and "Recall that ... a simple pattern binding is a pattern binding in which the pattern consists of only a single variable". So here `f` is not bound by a simple pattern binding and hence falls under the MR, signature or no signature. It's the same for your pattern binding `x@n`. You may say "but it's still simple" but that's not what the rules currently say. Incidentally, there's a bad typo in the Haskell 98 and Haskell 2010 reports. Under [https://www.haskell.org/onlinereport/haskell2010/haskellch4.html#x10-860004.... pattern bindings] both say "A simple pattern binding has form p = e"; but of course ''all'' pattern bindings have that form. It should say "A simple pattern binding has form x = e, where x is a variable". -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/14782#comment:2 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler