import Html exposing (text) import Text type Term = Con Int | Div Term Term type M a = Raise Exception | Return a type alias Exception = String unit : a -> M a unit a = Return a flatMap : M a -> (a -> M b) -> M b flatMap a k = case a of Raise e -> Raise e Return a -> k a eval : Term -> M Int eval term = case term of Con a -> unit a Div t u -> flatMap (eval t)(\a -> flatMap (eval u)(\b -> if b == 0 then Raise "divide by zero" else unit (a//b) ) ) main = text (toString (eval (Div(Div(Con 1972)(Con 2))(Con 0))))