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))))