Safe Haskell | None |
---|
This module is similar to Language.Syntactic.Sharing.Reify, but operates
on
rather than a general AST
(HODomain
ctx dom)AST
. The reason for
having this module is that when using HODomain
, 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 Type-Safe Observable Sharing in Haskell (Andy Gill, Haskell Symposium, 2009).
- reifyGraphTop :: Typeable a => (forall a. ASTF (HODomain ctx dom) a -> Maybe (SatWit ctx a)) -> ASTF (HODomain ctx dom) a -> IO (ASG ctx (Lambda ctx :+: (Variable ctx :+: dom)) a, VarId)
- reifyGraph :: Syntactic a (HODomain ctx dom) => (forall a. ASTF (HODomain ctx dom) a -> Maybe (SatWit ctx a)) -> a -> IO (ASG ctx (Lambda ctx :+: (Variable ctx :+: dom)) (Internal a), VarId)
Documentation
reifyGraphTop :: Typeable a => (forall a. ASTF (HODomain ctx dom) a -> Maybe (SatWit ctx a)) -> ASTF (HODomain ctx dom) a -> IO (ASG ctx (Lambda ctx :+: (Variable ctx :+: dom)) a, VarId)Source
Convert a syntax tree to a sharing-preserving graph
:: Syntactic a (HODomain ctx dom) | |
=> (forall a. ASTF (HODomain ctx dom) a -> Maybe (SatWit ctx a)) | A function that decides whether a given node can be shared.
|
-> a | |
-> IO (ASG ctx (Lambda ctx :+: (Variable ctx :+: dom)) (Internal a), VarId) |
Reifying an n-ary syntactic function to a sharing-preserving graph
This function is not referentially transparent (hence the IO
). However, it
is well-behaved in the sense that the worst thing that could happen is that
sharing is lost. It is not possible to get false sharing.