Skip to content

Instantly share code, notes, and snippets.

@BekaValentine
Created September 19, 2015 17:16
Show Gist options
  • Select an option

  • Save BekaValentine/da20b3e7b0e968c7a911 to your computer and use it in GitHub Desktop.

Select an option

Save BekaValentine/da20b3e7b0e968c7a911 to your computer and use it in GitHub Desktop.
data family Lin a r
class Linearizable a where
linearize :: a -> r -> Lin a r
delinearize :: Lin a r -> (a,r)
data instance Lin Bool r where
LinBool :: Bool -> r -> Lin Bool r
instance Linearizable Bool where
linearize b r = LinBool b r
delinearize (LinBool b r) = (b,r)
data instance Lin Int r where
LinInt :: Int -> r -> Lin Int r
instance Linearizable Int where
linearize i r = LinInt i r
delinearize (LinInt i r) = (i,r)
data instance Lin (a,b) r where
LinPair :: Lin a (Lin b r) -> Lin (a,b) r
instance (Linearizable a, Linearizable b) => Linearizable (a,b) where
linearize (a,b) r = LinPair (linearize a (linearize b r))
delinearize (LinPair abr) = let (a,br) = delinearize abr
(b,r) = delinearize br
in ((a,b),r)
data instance Lin [a] r where
LinNil :: r -> Lin [a] r
LinCons :: Lin a (Lin [a] r) -> Lin [a] r
instance Linearizable a => Linearizable [a] where
linearize [] r = LinNil r
linearize (x:xs) r = LinCons (linearize x (linearize xs r))
delinearize (LinNil r) = ([],r)
delinearize (LinCons aasr) = let (a,asr) = delinearize aasr
(as,r) = delinearize asr
in (a:as,r)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment