我必须写一个函数"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("夜晚"))="(星期六和晚上)"
我的功能正常,但我有两个问题.
Warning: match nonexhaustive有我的代码
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)
非常感谢你的帮助.
一般规则如下:如果您有递归数据类型,则应使用递归函数对其进行转换.
你的匹配表达并不详尽,因为有很多你无法处理的变种 - 即And(和(Atom("a"),Atom("b")),Atom("c")).
您应该使用递归调用自身来重写函数 - 即将Not(Atom(alpha))匹配替换为Not(expr):
show(Not(expr)) = "(- " ^ show(expr) ^ " )"
Run Code Online (Sandbox Code Playgroud)
我相信你可以弄明白其余的(你将有两个递归调用和/或).