[GHC] #11715: Constraint vs *
GHC
ghc-devs at haskell.org
Tue Aug 23 13:35:14 UTC 2016
#11715: Constraint vs *
-------------------------------------+-------------------------------------
Reporter: bgamari | Owner:
Type: bug | Status: new
Priority: high | Milestone: 8.2.1
Component: Compiler (Type | Version: 8.0.1-rc1
checker) |
Resolution: | Keywords: Typeable
Operating System: Unknown/Multiple | Architecture:
| Unknown/Multiple
Type of failure: None/Unknown | Test Case:
Blocked By: | Blocking:
Related Tickets: | Differential Rev(s):
Wiki Page: |
-------------------------------------+-------------------------------------
Comment (by int-index):
Replying to [comment:41 goldfire]:
> Now, understanding `with 3 $ with 4 $ ...` is easy: the `...` will have
access to `4`, which shadows `3`.
I am very suspicious about shadowing semantics. I'd rather see `Int`
treated like any other constraint, no different than `Given Int`. We don't
have shadowing semantics for `Given Int`: the example from comment:24
demonstrates that the first dictionary was picked, not the second one (and
this behavior can change with a minor compiler version).
Once again, it moves us further down the road where we admit that there
can be more than one value of one type to the left of `=>`. There
shouldn't be. Well-defined semantics for using nested `incoherentWith`
will encourage people to do so. In Edward's parlance, the `Constraint`
category is thin; let's not change it.
I also couldn't find any mention of shadowing in the "Implicit parameters"
section of the GHC user guide. Could you point me where I can read how it
gets resolved? As far as I know, implicit parameters use the `IP` class
under the hood, but GHC seems to consistently choose the innermost binding
(in contrast to `Given`, where the outermost binding prevails):
{{{#!hs
GHCi, version 8.1.20160813: http://www.haskell.org/ghc/ :? for help
Prelude> :set -XImplicitParams
Prelude> :set -XGADTs
Prelude> data X where X :: (?x :: Int) => X
Prelude> f :: X -> X -> Int; f X X = ?x
Prelude> f (let ?x = 1 in X) (let ?x = 2 in X)
2
}}}
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/11715#comment:42>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list