1

我必须编写一个接收此数据类型的函数“to_string”

datatype prop = Atom of string | Not of prop | And of prop*prop | Or of prop*prop;

并返回一个字符串。

例子

显示 And(Atom("saturday"),Atom("night")) = "(saturday & night)"

我的功能正在运行,但我有两个问题。

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

非常感谢你的帮助。

4

1 回答 1

5

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

您的匹配表达式并不详尽,因为您无法处理很多变体 - 即 And(And(Atom("a")、Atom("b"))、Atom("c"))。

您应该通过对自身的递归调用来重写函数 - 即将 Not(Atom(alpha)) match 替换为 Not(expr):

show(Not(expr)) = "(- " ^ show(expr) ^ " )"

我相信你可以弄清楚其余的(你将有两个递归调用和/或)。

于 2010-12-25T22:24:10.753 回答