{ {-# LANGUAGE BangPatterns #-} module Eval where import Control.Monad.Error } data Expr var a con Int constr a ~ Int x :: Int itf Eval var a visit eval inh e :: Expr a syn val :: a { eval = sem eval : Eval inst m :: IO visit eval clause int match Expr.Int@loc = lhs.e lhs.val = loc.x }