-module(recursive). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]). -export([rec/1, fix/1, fix2/1, fix3/1, fix4/1, fix5/1, use_fix/2, use_fix2/3, use_fix3/4, use_fix4/5, use_fix5/6]). -spec rec(fun((fun(() -> FXS)) -> FXS)) -> FXS. rec(F) -> F(fun() -> rec(F) end). -spec fix(fun((FXZ, fun((FXZ) -> FXY)) -> FXY)) -> fun((FXZ) -> FXY). fix(Cb) -> rec( fun(F) -> fun(A) -> Cb(A, fun(_capture) -> Cb(_capture, F()) end) end end ). -spec fix2(fun((FYI, FYJ, fun((FYI, FYJ) -> FYH)) -> FYH)) -> fun((FYI, FYJ) -> FYH). fix2(Cb) -> rec( fun(F) -> fun(A, B) -> Cb(A, B, fun(A@1, B@1) -> Cb(A@1, B@1, F()) end) end end ). -spec fix3(fun((FYU, FYV, FYW, fun((FYU, FYV, FYW) -> FYT)) -> FYT)) -> fun((FYU, FYV, FYW) -> FYT). fix3(Cb) -> rec( fun(F) -> fun(A, B, C) -> Cb(A, B, C, fun(A@1, B@1, C@1) -> Cb(A@1, B@1, C@1, F()) end) end end ). -spec fix4(fun((FZJ, FZK, FZL, FZM, fun((FZJ, FZK, FZL, FZM) -> FZI)) -> FZI)) -> fun((FZJ, FZK, FZL, FZM) -> FZI). fix4(Cb) -> rec( fun(F) -> fun(A, B, C, D) -> Cb( A, B, C, D, fun(A@1, B@1, C@1, D@1) -> Cb(A@1, B@1, C@1, D@1, F()) end ) end end ). -spec fix5( fun((GAB, GAC, GAD, GAE, GAF, fun((GAB, GAC, GAD, GAE, GAF) -> GAA)) -> GAA) ) -> fun((GAB, GAC, GAD, GAE, GAF) -> GAA). fix5(Cb) -> rec( fun(F) -> fun(A, B, C, D, E) -> Cb( A, B, C, D, E, fun(A@1, B@1, C@1, D@1, E@1) -> Cb(A@1, B@1, C@1, D@1, E@1, F()) end ) end end ). -spec use_fix(FWS, fun((FWS, fun((FWS) -> GAH)) -> GAH)) -> GAH. use_fix(Initial, Cb) -> (fix(Cb))(Initial). -spec use_fix2(FWV, FWW, fun((FWV, FWW, fun((FWV, FWW) -> GAK)) -> GAK)) -> GAK. use_fix2(A, B, Cb) -> (fix2(Cb))(A, B). -spec use_fix3( FWZ, FXA, FXB, fun((FWZ, FXA, FXB, fun((FWZ, FXA, FXB) -> GAO)) -> GAO) ) -> GAO. use_fix3(A, B, C, Cb) -> (fix3(Cb))(A, B, C). -spec use_fix4( FXE, FXF, FXG, FXH, fun((FXE, FXF, FXG, FXH, fun((FXE, FXF, FXG, FXH) -> GAT)) -> GAT) ) -> GAT. use_fix4(A, B, C, D, Cb) -> (fix4(Cb))(A, B, C, D). -spec use_fix5( FXK, FXL, FXM, FXN, FXO, fun((FXK, FXL, FXM, FXN, FXO, fun((FXK, FXL, FXM, FXN, FXO) -> GAZ)) -> GAZ) ) -> GAZ. use_fix5(A, B, C, D, E, Cb) -> (fix5(Cb))(A, B, C, D, E).