Ignore:
Timestamp:
May 4, 2014, 6:57:47 PM (11 years ago)
Author:
gobi
Message:

monad for observable sharing

File:
1 edited

Legend:

Unmodified
Added
Removed
  • sizechecking/branches/macs/Lambda.hs

    r24 r25  
    1 {-# LANGUAGE FlexibleContexts,FlexibleInstances #-} 
     1{-# LANGUAGE TypeFamilies #-} 
     2 
    23module Lambda where 
    34 
    45import qualified Data.Supply as S 
    56import qualified Data.Char as C 
     7import Control.Monad.IO.Class (MonadIO, liftIO) 
     8import Data.IORef (newIORef, readIORef, writeIORef) 
    69 
    710{- 
     
    912 -} 
    1013class Lambda l where 
    11     lam   :: (l a -> l b) -> l (a -> b) 
    12     app   :: l (a -> b) -> l a -> l b 
     14    lam :: (l a -> l b) -> l (a -> b) 
     15    app :: l (a -> b) -> l a -> l b 
    1316    lit :: Int -> l Int 
    1417 
     
    5457printAst :: S a -> IO () 
    5558printAst l = ast l >>= (\s -> putStrLn $ s "") 
     59 
     60 
     61type family Sem (m :: * -> *) a :: * 
     62type instance Sem m Int      = Int 
     63type instance Sem m (a -> b) = m (Sem m a) -> m (Sem m b) 
     64 
     65newtype R m a = R { unR :: m (Sem m a) } 
     66 
     67share :: (MonadIO m) => m a -> m (m a) 
     68share f = do 
     69    mem <- liftIO $ newIORef (False, f) 
     70    return $ do 
     71        (evald, thunk) <- liftIO $ readIORef mem 
     72        if evald then thunk 
     73        else do 
     74          value <- thunk 
     75          liftIO $ writeIORef mem (True, return value) 
     76          return value 
     77 
     78instance (MonadIO m) => Lambda (R m) where  
     79    app x y = R $ unR x >>= ($ (unR y)) 
     80    lit = R . return 
     81    lam f   = R . return $ (\x -> share x >>= unR . f . R) 
Note: See TracChangeset for help on using the changeset viewer.