[GHC] #10875: Unexpected defaulting of partial type signatures and inconsistent behaviour when -fdefer-typed-holes is set.

GHC ghc-devs at haskell.org
Mon Sep 14 07:45:03 UTC 2015


#10875: Unexpected defaulting of partial type signatures and inconsistent behaviour
when -fdefer-typed-holes is set.
-------------------------------------+-------------------------------------
        Reporter:  holzensp          |                   Owner:
            Type:  bug               |                  Status:  new
        Priority:  normal            |               Milestone:
       Component:  Compiler          |                 Version:  7.10.2
      Resolution:                    |                Keywords:
                                     |  PartialTypeSignatures TypedHoles
Operating System:  MacOS X           |            Architecture:  x86_64
 Type of failure:  Incorrect         |  (amd64)
  warning at compile-time            |               Test Case:
      Blocked By:                    |                Blocking:
 Related Tickets:                    |  Differential Revisions:
-------------------------------------+-------------------------------------

Comment (by holzensp):

 I just realised that the above loss of the `RealFrac` constraint, may well
 be because GHC has nowhere to put it. I tried `(undefined::_ => _inner)`,
 but it seems the constraints hole is only used at top-level (i.e. GHC
 didn't output any message for this `_`).

 A further attempt using `ImplicitParams` also gave unexpected results.
 Consider this program:
 {{{#!hs
 {-#LANGUAGE NoMonomorphismRestriction #-}
 {-#LANGUAGE PartialTypeSignatures #-}
 {-#LANGUAGE NamedWildCards #-}
 {-#LANGUAGE ImplicitParams #-}

 foo :: _ => _outer
 foo x = round (?hole (1 + x))
 }}}
 which yields
 {{{
 Foo.hs:6:8: Warning:
     Found hole ‘_’ with inferred constraints: (Integral b,
                                                Num a,
                                                RealFrac a,
                                                ?hole::a -> a)
     In the type signature for ‘foo’: _ => _outer

 Foo.hs:6:13: Warning:
     Found hole ‘_outer’ with type: a1 -> b
     Where: ‘b’ is a rigid type variable bound by
                the inferred type of
                foo :: (Integral b, Num a1, RealFrac a, ?hole::a1 -> a) =>
 a1 -> b
                at Foo.hs:7:1
            ‘a1’ is a rigid type variable bound by
                 the inferred type of
                 foo :: (Integral b, Num a1, RealFrac a, ?hole::a1 -> a) =>
 a1 -> b
                 at Foo.hs:7:1
     In the type signature for ‘foo’: _ => _outer
 Ok, modules loaded: Main.
 }}}
 Notice how the first message, regarding `_` is too restrictive, by
 demanding that `?hole::a -> a`. However, the second message is more
 general, stating `?hole::a1 -> a`. Could this just be a pretty printer
 issue, where the first message discards the subscript of the type
 variable?

 Another surprise occurs when I remove the parenthesis and use `$` instead:
 {{{#!hs
 foo x = round $ ?hole (1 + x)
 }}}
 results in
 {{{
 Foo.hs:6:8: Warning:
     Found hole ‘_’ with inferred constraints: (Integral b,
                                                Num a,
                                                RealFrac r,
                                                ?hole::a -> r)
     In the type signature for ‘foo’: _ => _outer

 Foo.hs:6:13: Warning:
     Found hole ‘_outer’ with type: a -> b
     Where: ‘b’ is a rigid type variable bound by
                the inferred type of
                foo :: (Integral b, Num a, RealFrac r, ?hole::a -> r) => a
 -> b
                at Foo.hs:7:1
            ‘a’ is a rigid type variable bound by
                the inferred type of
                foo :: (Integral b, Num a, RealFrac r, ?hole::a -> r) => a
 -> b
                at Foo.hs:7:1
     In the type signature for ‘foo’: _ => _outer
 Ok, modules loaded: Main.
 }}}
 This is the result I was looking for!

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/10875#comment:2>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list