{Browse 9999*9999} declare fun {Square X} X*X end {Browse {Square 9999}} declare Square = fun {$ X} X*X end {Browse {Square 6}} {Browse {fun {$ X} X*X end 5}} declare Increment = fun {$ X} X+1 end {Browse {Increment 5}} declare Inc = fun {$ X} {Increment X} end {Browse {Inc 6}} % {Inc 6} can be simplified to {Increment 6} using eta-reduction declare Compose = fun {$ F G} fun {$ X} {F {G X}} end end declare PlusOneSquared = {Compose Square Increment} {Browse {PlusOneSquared 5}} declare SquaredPlusOne = {Compose Increment Square} {Browse {SquaredPlusOne 5}} declare Plus = fun {$ X Y} X+Y end {Browse {Plus 3 4}} declare PlusC = fun {$ X} fun {$ Y} X+Y end end declare Plus2 = {PlusC 2} {Browse {Plus2 3}} %%% Combinators % Identity combinator declare I = fun {$ X} X end {Browse {I 5}} {Browse {I Square}} % Application combinator declare App = fun {$ F X} {F X} end {Browse {App Square 7}} % Sequencing combinator, Z should not appear free in Y declare Seq = fun {$ X Y} { fun {$ Z} Y end X } end {Browse {Seq 3 4}} % Curry as combinator declare Curry = fun {$ F} fun {$ X} fun {$ Y} {F X Y} end end end declare PlusC = {Curry Plus} declare Plus2 = {PlusC 2} {Browse {Plus2 3}} declare ComposeC = {Curry Compose} declare IncrementC = {ComposeC Increment} declare SquaredPlusOne = {IncrementC Square} {Browse {SquaredPlusOne 4}} declare IncTwice = {IncrementC Increment} {Browse {IncTwice 5}} {Browse {{IncrementC fun {$ X} X+2 end} 4}} declare Fact = fun {$ X} if X==0 then 1 else X*{Fact X-1} end end {Browse {Fact 10}}