SML中的自定义数据类型和函数
我定义了数据类型表达式SML中的自定义数据类型和函数,sml,smlnj,Sml,Smlnj,我定义了数据类型表达式 datatype 'a expression = Not of 'a expression | Or of 'a expression list | And of 'a expression list | Eq of 'a expression list | Imp of 'a expression * 'a ex
datatype 'a expression = Not of 'a expression
| Or of 'a expression list
| And of 'a expression list
| Eq of 'a expression list
| Imp of 'a expression * 'a expression
| Var of 'a
| True | False;
我需要实现这种类型的函数
getVars(''表达式->''列表)
此函数的目标是返回列表中的所有Var值
下面是函数返回的一个示例
-getVars(等式[Var“A”,Var“B”,Imp(Var“D”,而不是(Var“Q”)),Var“D”,Var“B”);val it=[“A”、“B”、“D”、“Q”]:字符串列表
我不知道如何实现这一点。请给我一些建议。因为您没有提供尝试,这里有一个模板可以帮助您开始:
fun getVars expr =
case expr of
Not subExpr => ...
| Or subExprs => ...
| And subExprs => ...
| ...
尝试提供更大的尝试以获得更具体的反馈。以下是我尝试解决这个问题的方法
fun getVars expr =
case expr of
Var i => i (*Only those i's are in output list*)
| Not j => getVars(j) (*j is expression so i can use recursion*)
| Or k => map (fn x => getVars(x)) k (*there i need to loop over list and do recursion over every element in list, couse elements are expressions*)
| And k => map (fn x => getVars(x)) k (*same*)
| Eq k => map (fn x => getVars(x)) k (*same*)
| Imp k => (*problem for me couse its not list*)
(*And i need to put solution for True and False too...*);
但这段代码不输出列表,只输出元素,因为我不知道如何将元素添加到列表中,如果没有添加元素,它应该返回[]
getVars True = [];
getVars Eq [Var 1, Var 2] = [1,2];
getVars Or [Var "te", Var "st"] = ["te", "st"];
getVars And [True, False] = [];
getVars And [Var "st", Var "st"] = ["st"]; (*This one is interesting*)
有更多的输入和输出示例。最常见的第一步是编写一个函数,每个构造函数有一个定义子句,必要时递归。