Unlifted data types
Simon Peyton Jones
simonpj at microsoft.com
Tue Sep 8 07:52:12 UTC 2015
| And to
| be honest, I'm not sure we need arbitrary data types in Unlifted;
| Force (which would be primitive) might be enough.
That's an interesting thought. But presumably you'd have to use 'suspend' (a terrible name) a lot:
type StrictList a = Force (StrictList' a)
data StrictList' a = Nil | Cons !a (StrictList a)
mapStrict :: (a -> b) -> StrictList a -> StrictList b
mapStrict f xs = mapStrict' f (suspend xs)
mapStrict' :: (a -> b) -> StrictList' a -> StrictList' b
mapStrict' f Nil = Nil
mapStrict' f (Cons x xs) = Cons (f x) (mapStrict f xs)
That doesn't look terribly convenient.
| ensure that threads don't simply
| pass thunks between each other. But, if you have unlifted types, then
| you can have:
| data UMVar (a :: Unlifted)
| and then the type rules out the possibility of passing thunks through
| a reference (at least at the top level).
Really? Presumably UMVar is a new primitive? With a family of operations like MVar? If so can't we just define
newtype UMVar a = UMV (MVar a)
putUMVar :: UMVar a -> a -> IO ()
putUMVar (UMVar v) x = x `seq` putMVar v x
I don't see Force helping here.
More information about the ghc-devs