packages feed

hoop-0.3.0.0: test/Expr2.hs

{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# OPTIONS_GHC -ddump-splices -ddump-to-file #-}

module Expr2 where

--------------------------------------------------------------------------------

import Language.MSH

--------------------------------------------------------------------------------

[state|
abstract state Expr where
    eval :: Int

state Val : Expr where
    data val = 0 :: Int

    eval = do
        r <- this.!val
        return r

abstract state BinOp : Expr where 
    data left :: Expr 
    data right :: Expr 
    data opr :: Int -> Int -> Int

state Add : BinOp where 
    eval = do 
        x <- this.!left.!eval 
        y <- this.!right.!eval 
        f <- this.!opr 
        return (f x y)
|]

v :: Val
v = new 5

e :: Expr
e = upcast v

a :: Add
a = new (e,e,(+))

b :: BinOp 
b = upcast a

bar = (result $ v.!eval)
    + (result $ a.!eval)
    + (result $ e.!eval)
    + (result $ b.!eval)