问题描述
我定义了数据类型表达式。
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 (= ''a expression -> ''a list)
的目标是返回列表中的所有Var值。
这是函数返回的示例。
- getvars (Eq [Var "A",Var "B",Imp (Var "D",Not (Var "Q")),Var "D",Var "B"]); val it = ["A","B","D","Q"] : string list
我不知道该如何实现。请给我一些建议。
解决方法
由于您未提供任何尝试,因此以下模板可帮助您入门:
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*)
有更多的输入和输出示例。