Proposal: Don't require users to use undefined
Simon Peyton-Jones
simonpj at microsoft.com
Wed Oct 27 03:43:13 EDT 2010
| Users of the sizeOf or alignment methods (:: a -> Int) of the Storable
| class are pushed to use 'undefined' in their programs. Take the
| following function from Foreign.Marshal.Alloc as an example:
|
| malloc :: Storable a => IO (Ptr a)
| malloc = doMalloc undefined
| where
| doMalloc :: Storable b => b -> IO (Ptr b)
| doMalloc dummy = mallocBytes (sizeOf dummy)
|
...
|
| I would like to propose solving this. My proposal consists of 3 sub-proposals:
I'm not keen on this proposal.
a) The improvement is minor
b) A lot of exixting code has to be changed
c) There is a better way to do the job
What is really going on? We have
sizeOf :: forall a. Storable a => a -> Int
What we *want* is
newSizeOf :: forall a. Storable a => Int
but in H98 we call newSizeOf because there would be no way to tell newSizeOf which type to use.
The obvious solution is something Haskell badly needs: explicit type applications. Instead of writing
sizeOf (undefined :: Int)
we should write
newSizeOf @ Int
where the "@" says that the next argument is a type. As Haskell's type system becomes more sophisticated, the lack of type applications becomes more and more annoying. For example, to get impredicative polymorphism I want to write
Just @ (forall a. a->a) id
to get something of type
Maybe (forall a. a->a)
It's only a matter of time before we have explicit type applications. Indeed, the principal difficulty is *syntax*. (My "@" notation above might just work; because "@" is already unavailable as an operator.)
Given explicit type applications and scoped type variables, it's easy to do the Right Thing for your examples. And the Right Thing works at higher kinds too. Eg
class Typeable1 (a :: *->*) where
typeOf1 :: TypeRep
Then we can say (typeOf1 @ Maybe). This is harder with proxies; I don't think it's covered by your proposal.
Now, none of this is H98, of course. But we already have a H98 solution. I don't really think it's worth the disruption to switch from one workaround to another, even aside from dealing with the long-running deprecation and compatibility issues that then show up.
Simon
More information about the Libraries
mailing list