[Haskell-cafe] What is a "simple pattern binding"?
R.Paterson at city.ac.uk
Sun Jun 26 01:17:12 CEST 2011
> > > g1 x y z = if x>y then show x ++ show z else g2 y x
> > >
> > > g2 :: (Show a, Ord a) => a -> a -> String
> > > g2 | False = \p q -> g1 q p ()
> > > | otherwise = \p q -> g1 q p 'a'
> > > where x = True
> > It appears to me that GHC is justified. According to 4.5.1 and 4.5.2, g1
> > by itself constitutes a declaration group. It is considered by itself
> > and is generalized prior to combining it with g2.
> Great, now I'm even more confused. 4.5.1 says:
> A binding b1 depends on a binding b2 in the same list of
> declarations if either
> 1. b1 contains a free identifier that has no type signature
> and is bound by b2, or
> 2. b1 depends on a binding that depends on b2.
> A declaration group is a minimal set of mutually dependent
> bindings. Hindley-Milner type inference is applied to each
> declaration group in dependency order.
> So here the first binding (of g1) contains the free identifier g2,
> which is bound by the second binding. Conversely, the second binding
> contains g1 free. So the two bindings are mutually dependent, no?
No, the binding of g1 doesn't depend on the binding of g2, because g2
has a type signature (clause 1).
The type of g1 is inferred using the declared type of g2. Then that
type is used in inferring a type for g2, which will be compared with
its declared signature.
More information about the Haskell-Cafe