Perplexing GHC-7.0.3 behavior with hairy type-level code (regression from 6.12.3??)
Simon Peyton-Jones
simonpj at microsoft.com
Tue Apr 26 10:53:49 CEST 2011
It's hard to say much without a particular program to look at. But when type families or functional dependencies are involved you can certainly get situations where
f :: <ty>
but if you write
g ::<ty>
g = f
the program is rejected. Sounds similar to what you are seeing. Look here:
http://www.haskell.org/haskellwiki/GHC/Type_families#Injectivity.2C_type_inference.2C_and_ambiguity
If you are still puzzled, by all means try to boil out a test case, the smaller the better. A bug is far from impossible.
Simon
| -----Original Message-----
| From: glasgow-haskell-users-bounces at haskell.org [mailto:glasgow-haskell-users-
| bounces at haskell.org] On Behalf Of Bjorn Buckwalter
| Sent: 22 April 2011 16:19
| To: GHC Users
| Subject: Perplexing GHC-7.0.3 behavior with hairy type-level code (regression from
| 6.12.3??)
|
| Hello all,
|
| I am doing some fairly hairy type-level stuff with
| FunctionalDependencies, UndecidableInstances, and other. Without going
| into details I have the following function which compiles fine:
|
| vecMat :: (Transpose m m', MatrixVector m' v v', Num a)
| => Vec v a -> Mat m a -> Vec v' a
| vecMat v m = transpose m `matVec` v
|
|
| However, I am perplexed by the following:
|
| 1. This does NOT compile despite the type signature being identical to
| that of 'vecMat':
|
| vecMat2 :: (Transpose m m', MatrixVector m' v v', Num a)
| => Vec v a -> Mat m a -> Vec v' a
| vecMat2 v m = vecMat v m
|
| The error message is along the lines of the below where 'HMap ...' is
| the context for the MatrixVector instance... I'll provide more details
| as needed.
|
| Could not deduce (HMap (DotProd, v) m' v')
| arising from a use of `vecMat'
| from the context (Transpose m m', MatrixVector m' v v', Num a)
| bound by the type signature for
| vecMat2 :: (Transpose m m', MatrixVector m' v v', Num a) =>
| Vec v a -> Mat m a -> Vec v' a
|
|
| 2. If I omit the type signature the definition of 'vecMat2' does compile:
|
| vecMat2 v m = vecMat v m
|
| 3. If I omit the second argument it also compiles:
|
| vecMat2 v = vecMat v
|
| 4. However, if I omit both arguments it does NOT compile:
|
| vecMat2 = vecMat
|
|
| So I guess I have two questions. First: why would 1 not compile?
| Second: why are 2, 3, and 4 not equivalent? Pointers to relevant
| documentation welcome.
|
| I broke my GHC-6.12.3 installation when upgrading to the latest HP
| with GHC-7.0.3 so I cannot test 2, 3, and 4 but I know that 1 DID
| compile on GHC-6.12.3. Is the change of behavior in GHC-7.0.3 a bug or
| a bug fix?
|
| I'll be happy to elaborate on the code if it would be useful, and try
| to find a minimal example. But I wanted to check if the behavior I am
| seeing makes any sense at all first. In case you cannot wait the
| 'matVec' definition is from:
|
| https://github.com/bjornbm/dimensional-
| vectors/blob/master/Numeric/Units/Dimensional/LinearAlgebra/Matrix.hs
|
|
| Thanks,
| Bjorn
|
| _______________________________________________
| Glasgow-haskell-users mailing list
| Glasgow-haskell-users at haskell.org
| http://www.haskell.org/mailman/listinfo/glasgow-haskell-users
More information about the Glasgow-haskell-users
mailing list