
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