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*)

有更多的输入和输出示例。

最常见的第一步是编写一个函数,每个构造函数有一个定义子句,必要时递归。