On Mon, Jun 28, 2010 at 08:51:45AM +0400, Victor Nazarov wrote: > > > >> What we get with this instances is following code. > >> > >> > main = > >> > do print (sizeof :: Sizeof Word16) > >> > >> Let's try it. > >> > >> $ runhaskell this.lhs > >> this.lhs:78:14: > >> Couldn't match expected type `Int' > >> against inferred type `Sizeof sizeable' > >> NB: `Sizeof' is a type function, and may not be injective > >> In the first argument of `print', namely > >> `(sizeof :: Sizeof Word16)' > >> In the expression: print (sizeof :: Sizeof Word16) > >> In the expression: do { print (sizeof :: Sizeof Word16) } > > > > Right. Since Sizeof Word8 is Int too, the type can't help determining the > > value. > > > > Then it should be ambiguous type-parameter error or something like > this, why Int is expected?
It knows that Sizeof Word16 = Int which is why Int is expected. It also knows sizeof :: Sizeable sizeable => Sizeof sizeable so it tries to match 'Sizeof sizeable' with 'Int'. Unfortunately this is not enough information to figure out what 'sizeable' is supposed to be. There are quite a few options for sizeable that would make 'Sizeof sizeable = Int', and even if there were only one, type classes are open so there could always be another one added in another module somewhere. -Brent _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe