我创建了自己的数据类型:
datatype typ = Bool | Int | Arrow of typ*typ;
(* i.e., Arrow(argType, returnType) *)
(* diMLazy expressions *)
datatype expr = TrueExpr
| FalseExpr
| IntExpr of int
| VarExpr of string
| PlusExpr of expr*expr
| LessExpr of expr*expr
| IfExpr of expr*expr*expr
| ApplyExpr of expr*expr
| FunExpr of string*string*typ*typ*expr
使用这些,我需要编写一个函数 isFV,它返回传递给函数的任何自由变量的列表。到目前为止,我的代码是:
fun isFV (exp:expr) =
let
val bound_list = [];
(*Contains returns true if x:string is within a string list.*)
fun contains (i:string, str_list:string list) =
foldr(fn (x,y) => i = x orelse y) false str_list;
fun anaExp (ex:expr, aggr_list:string list) =
case ex of
TrueExpr => []
| FalseExpr => []
| IntExpr (a) => []
| PlusExpr (a, b) => anaExp(a,aggr_list) @ anaExp(b,aggr_list)
| LessExpr (a, b) => anaExp(a,aggr_list) @ anaExp(b,aggr_list)
| IfExpr (a, b, c) => anaExp(a,aggr_list) @ anaExp(b,aggr_list) @ anaExp(c,aggr_List)
| ApplyExpr (a,b) => anaExp(a,aggr_list) @ anaExp(b,aggr_list)
| FunExpr (a, b, c, d, e) => ??????
| VarExpr (a) = if(contains (a,aggr_List)) then [] else [a]
in
anaExp(exp, bound_list)
end
anaExp 意味着最初采用一个空列表并递归调用自身,直到它得到一个 VarExpr 项。然后它会将其添加到 aggr_list。
我如何应用 FuncExpr?我知道将 VarExpr 用作字符串类型,但我将什么用作 typ 类型?目前我有:
| FunExpr (a, b, c, d, e) => anaExp(VarExpr(a),aggr_list) @ anaExp(VarExpr(b),aggr_list)
@ anaExp(c,aggr_list) @ anaExp(d,aggr_list) @ anaExp(e,aggr_list)
但是我们知道将 typ 传递给 anaExp 会导致类型错误(c 和 d)。