import Html exposing (text) import Text type Term = Con Int | Div Term Term type alias M a = (Output, a) type alias Output = String unit : a -> M a unit a = ("", a) flatMap : M a -> (a -> M b) -> M b flatMap m k = let (x,a) = m in let (y,b) = k a in (x++y, b) eval : Term -> M Int eval term = case term of Con a -> flatMap (out(line(Con a) a)) (\() -> unit(a)) Div t u -> flatMap (eval t)(\a -> flatMap (eval u)(\b -> flatMap(out(line(Div t u)(a//b))) (\() -> unit(a//b)) ) ) out : Output -> M () out x = (x, ()) line : Term -> Int -> Output line t a = "eval(" ++ (toString t) ++ ") <= " ++ (toString a) main = text (toString (eval (Div(Div(Con 1972)(Con 2))(Con 23))))