>> (False,Var n) else (True,Val (envLookup n env)) >> evalExpr c@(App op e1 e2) e = let (b1,v1) = (evalExpr e1 e) >> (b2,v2) = (evalExpr e2 e) > >> in if b1 && b2 then (True,Val (eval c e)) else (False,App op v1 v2) >> Allows you to refer to "App op e1 e2" as just "c" on the right hand side. (i.e., it's just an alias.)