代码优化

我必须写一个函数“to_string”,它接收这个数据类型
datatype prop = Atom of string | Not of prop | And of prop*prop | Or of prop*prop;
并返回一个字符串。 例   节目   而(Atom(“星期六”),Atom(“夜晚”))=   “(星期六和晚上)” 我的功能正常,但我有两个问题。 口译员告诉我 - >
Warning: match nonexhaustive
我想我可以用所有类型的Locals函数编写函数(Not,And,Or)并避免重复代码,但我不知道如何。 有我的代码
datatype prop = Atom of string | Not of prop | And of prop*prop | Or of prop*prop;

fun show(Atom(alpha)) = alpha
    | show(Not(Atom(alpha))) = "(- "^alpha^" )"

    | show(Or(Atom(alpha),Atom(beta)))  = "( "^alpha^" | "^beta^" )"
    | show(Not(Or(Atom(alpha),Atom(beta)))) = "(- ( "^alpha^" | "^beta^" ))"
    | show(Or(Not(Atom(alpha)),Atom(beta)))  = "( (-"^alpha^") | "^beta^" )"
    | show(Or(Atom(alpha),Not(Atom(beta))))  = "( "^alpha^" | (-"^beta^") )"
    | show(Or(Not(Atom(alpha)),Not(Atom(beta))))  = "( (-"^alpha^") | (-"^beta^") )"


    | show(And(Atom(alpha),Atom(beta))) = "( "^alpha^" & "^beta^" )"
    | show(Not(And(Atom(alpha),Atom(beta)))) = "(- ( "^alpha^" & "^beta^" ))"
    | show(And(Not(Atom(alpha)),Atom(beta))) = "( (-"^alpha^") & "^beta^" )"
    | show(And(Atom(alpha),Not(Atom(beta)))) = "( "^alpha^" & (-"^beta^") )"
    | show(And(Not(Atom(alpha)),Not(Atom(beta))))  = "( (-"^alpha^") & (-"^beta^") )";
非常感谢你的帮助。     
已邀请:
一般规则如下:如果您有递归数据类型,则应使用递归函数对其进行转换。 你的匹配表达式并不详尽,因为有很多你无法处理的变体 - 即And(和(Atom(“a”),Atom(“b”)),Atom(“c”))。 您应该使用递归调用自身来重写函数 - 即将Not(Atom(alpha))匹配替换为Not(expr):
show(Not(expr)) = "(- " ^ show(expr) ^ " )"
我相信你可以弄明白其余的(你将有两个递归调用和/或)。     

要回复问题请先登录注册