在许多函数式编程语言中,可以将一系列局部变量赋值替换为一系列 let 表达式。
例如,这个 C 函数可以这样翻译:
int example(int a,int b){
a += 1;
b += 2;
if(a == 1){
b += 1;
}
else if(b == 1){
a += 1;
}
return a + b;
}
Futhark 编程语言中的等效函数可以这样编写,使用记录数据结构来存储局部变量:
let example a b =
let vars = {a,b} in
let vars = vars with a = vars.a + 1 in
let vars = vars with b = vars.b + 2 in
let vars = (if vars.a == 1 then
let vars = vars with b = vars.b + 1 in
vars
else if b == 1 then
let vars = vars with a = vars.a + 1 in
vars
else
vars)
in vars.a + vars.b
在某些情况下,还可以将一系列命令式语句转换为单个算术表达式。在 Prolog 中,这可以通过 replacing subterms 来完成:
:- use_module(prolog_vars_list).
:- set_prolog_flag(double_quotes, chars).
:- initialization(main).
main :-
To_solve = (Z=11,
Z=Z*2,
A=1+A,
A=A+2,
A = Z+1,
A = A * 2,
A=A+3+Z+P),
run_imperative(To_solve,B),
%print the input
writeln(To_solve),
%now print the output
writeln(B).
run_imperative(A,B) :- imperative_to_declarative(A,_=B).
imperative_to_declarative((A,B,C),D1) :-
imperative_to_declarative((B,C),D),imperative_to_declarative((A,D),D1).
imperative_to_declarative((A=A1,B=B1),(_=C)) :-
replace(A,A1,B1,C).
replace(Subterm0, Subterm, Term0, Term) :-
( Term0 == Subterm0 -> Term = Subterm
; var(Term0) -> Term = Term0
; Term0 =.. [F|Args0],
maplist(replace(Subterm0,Subterm), Args0, Args),
Term =.. [F|Args]
).
还有几种方法可以使用单子或递归来implement while-loops。