This module is similar to Language.Syntactic.Sharing.Reify, but operates
on HOAST
rather than a general AST
. The reason for having this module is
that when using HOAST
, it is important to do simultaneous sharing analysis
and HOLambda
reification. Obviously we cannot do sharing analysis first
(using reifyGraph
from
Language.Syntactic.Sharing.Reify), since it needs to be able to look inside
HOLambda
. On the other hand, if we did HOLambda
reification first (using
reify
), we would destroy the sharing.
This module is based on TypeSafe Observable Sharing in Haskell (Andy Gill, Haskell Symposium, 2009).
 reifyGraphTop :: Typeable a => (forall a. HOASTF ctx dom a > Maybe (Witness' ctx a)) > HOASTF ctx dom a > IO (ASG ctx (Lambda ctx :+: (Variable ctx :+: dom)) a, VarId)
 reifyGraph :: Reifiable ctx a dom internal => (forall a. HOASTF ctx dom a > Maybe (Witness' ctx a)) > a > IO (ASG ctx (Lambda ctx :+: (Variable ctx :+: dom)) (NAryEval internal), VarId)
Documentation
reifyGraphTop :: Typeable a => (forall a. HOASTF ctx dom a > Maybe (Witness' ctx a)) > HOASTF ctx dom a > IO (ASG ctx (Lambda ctx :+: (Variable ctx :+: dom)) a, VarId)Source
Convert a syntax tree to a sharingpreserving graph
:: Reifiable ctx a dom internal  
=> (forall a. HOASTF ctx dom a > Maybe (Witness' ctx a))  A function that decides whether a given node can be shared.

> a  
> IO (ASG ctx (Lambda ctx :+: (Variable ctx :+: dom)) (NAryEval internal), VarId) 
Reifying an nary syntactic function to a sharingpreserving graph
This function is not referentially transparent (hence the IO
). However, it
is wellbehaved in the sense that the worst thing that could happen is that
sharing is lost. It is not possible to get false sharing.