代码优化

tec*_*ref 1 sml smlnj

我必须写一个函数"to_string",它接收这个数据类型

datatype prop = Atom of string | Not of prop | And of prop*prop | Or of prop*prop;
Run Code Online (Sandbox Code Playgroud)

并返回一个字符串.

秀和(Atom("星期六"),Atom("夜晚"))="(星期六和晚上)"

我的功能正常,但我有两个问题.

  1. 口译员告诉我 - > Warning: match nonexhaustive
  2. 我想我可以用所有类型的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^") )";
Run Code Online (Sandbox Code Playgroud)

非常感谢你的帮助.

zeu*_*xcg 5

一般规则如下:如果您有递归数据类型,则应使用递归函数对其进行转换.

你的匹配表达并不详尽,因为有很多你无法处理的变种 - 即And(和(Atom("a"),Atom("b")),Atom("c")).

您应该使用递归调用自身来重写函数 - 即将Not(Atom(alpha))匹配替换为Not(expr):

show(Not(expr)) = "(- " ^ show(expr) ^ " )"
Run Code Online (Sandbox Code Playgroud)

我相信你可以弄明白其余的(你将有两个递归调用和/或).