{ {-# LANGUAGE BangPatterns #-} module Sum where import Control.Monad.Error } itf S visit v1 inh l :: [Int] visit v2 syn s :: Int { sum' = sem sum : S monad Either String visit v1 clause sumNil lhs.s = 0 match [] = lhs.l clause sumCons tl.l = loc.xs lhs.s = loc.x + tl.s match (loc.x : loc.xs) = lhs.l attach v1 of tl : S = sum' } { test :: [Int] -> Either String Int test xs = do let inh1 = Inh_S_v1 { l_Inh_S = xs } syn1 <- invoke_S_v1 sum' inh1 let inh2 = Inh_S_v2 { } syn2 <- invoke_S_v2 (next_S_v1 syn1) inh2 let s = s_Syn_S syn2 return s main :: IO () main = putStrLn (show (test [1..100000])) }