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/Dim... Thanks, Bjorn

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_inf... 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@haskell.org [mailto:glasgow-haskell-users- | bounces@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@haskell.org | http://www.haskell.org/mailman/listinfo/glasgow-haskell-users
participants (2)
-
Bjorn Buckwalter
-
Simon Peyton-Jones