SML中的自定义数据类型和函数

问题描述

我定义了数据类型表达式。

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

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