Question about ambiguous predicates in pattern bindings
Benjamin Redelings
benjamin.redelings at gmail.com
Sat Jan 15 19:09:25 UTC 2022
Hi,
1. I'm reading "A Static semantics for Haskell" and trying to code it
up. I came across some odd behavior with pattern bindings, and I was
wondering if someone could explain or point me in the right direction.
Suppose you have the declaration
(x,y) = ('a',2)
My current code is yielding:
x :: Num a => Char
y :: Num a => a
However, I notice that ghci gives x the type Char, with no constraint,
which is what I would expect. It also gives y the type 'Num b => b', so
I don't think it is defaulting a to Int here.
The weird results from my code stem from rule BIND-PRED in Figure 15 of
https://homepages.inf.ed.ac.uk/wadler/papers/staticsemantics/static-semantics.ps
E |- bind ~~> \dicts : theta -> monobinds in bind : (LIE_{encl},
theta => LVE)
Here theta = ( Num a ) and LVE = { x :: Char, y :: a }. So, theta => LVE is
{ x :: Num a => Char, y :: Num a => a }
The obvious thing to do is avoid changing a type T to Num a => T if T
does not contain a. Also I'm not totally sure if that trick gets to the
bottom of the issue. However, the paper doesn't mention define theta =>
LVE that way. Is there something else I should read on this?
2. If we just chop out predicates which mention variables not in the
type ( == ambiguous predicates?) then I'm not totally sure how to create
code for this.
I would imagine that we have something like
tup dn = ('a', fromInteger dn 2)
x = case (tup dn) of (x,y) -> x
y dn case (tup dn) of (x,y) -> y
In this case its not clear where to get the `dn` argument of `tup` from,
in the definition of `x`. Can we pass in `undefined`? Should we do
something else?
If anyone can shed light on this, I would be grateful :-)
-BenRI
More information about the ghc-devs
mailing list