[Haskell-cafe] isWHNF :: a -> IO Bool ?

Jan-Willem Maessen jmaessen at alum.mit.edu
Thu Sep 27 11:30:20 EDT 2007


On Sep 27, 2007, at 9:14 AM, Pepe Iborra wrote:

> Actually, in 6.8 we can build isWHNF on top of the GHC-API.
>
> First, you need to import the ghc package:
>>
>> ghci -package ghc
>> GHCi, version 6.7: http://www.haskell.org/ghc/  :? for help
>
> Then, you can define the isWHNF function as follows:
>
>> Prelude> :m +RtClosureInspect
>> Prelude RtClosureInspect> let isWHNF = fmap (isConstr . tipe) .  
>> getClosureData
>>
>> Prelude RtClosureInspect> :t isWHNF
>> isWHNF :: a -> IO Bool
>
> What the code above does is to inspect the info table associated to  
> the value given, and check if the closure is a Constructor closure,  
> i.e. in WHNF.

Very cool.  This is much nicer than when I asked much the same  
question a few years back (and I can think of all sorts of  
interesting things I can learn from the interface in that module).   
But what about indirection chasing?  Surely we want isWHNF to return  
True if we have an indirection to a WHNF.  Possibly one wants  
something a bit like this (untested, and rather depends on GHC's  
indirection semantics):

removingIndirections :: (forall c . c -> IO b) -> a -> IO b
removingIndirections k a = do
     closureData <- getClosureData a
     if isConstr (tipe closureData) then
         removingIndirections (ptrs closureData ! 0)
     else
         k a


simpleIsWHNF :: a -> IO Boolean
simpleIsWHNF =  fmap (isConstr . tipe) . getClosureData

isWHNF = removingIndirections simpleIsWHNF

-Jan-Willem Maessen




More information about the Haskell-Cafe mailing list