Quick actions

cmd+k|ctrl+k

Navigation

Languages

Type checker for the simply typed lambda calculus

Snippet info

Language

Erlang

Visibility

public

Author

rightfold

Created

2016-07-15T08:44:11Z

Updated

2016-08-25T13:19:05Z

% escript will ignore the first line

typeof({var, Name},                G) -> maps:get(Name, G);
typeof({abs, Param, ParamT, Body}, G) -> {ParamT, '->', typeof(Body, maps:put(Param, ParamT, G))};
typeof({app, Callee, Arg},         G) -> ArgT = typeof(Arg, G), {ArgT, '->', R} = typeof(Callee, G), R.

example(E, G) ->
    io:format("~p : ~p~n", [E, typeof(E, G)]).

main(_) ->
    example({var, "x"}, #{"x" => bool}),
    example({app, {var, "f"}, {var, "x"}}, #{"f" => {bool, '->', int}, "x" => bool}),
    example({abs, "x", int, {var, "x"}}, #{}),
    example({app, {abs, "x", int, {var, "x"}}, {var, "x"}}, #{"x" => int}),
    ok.
INFO