假设我需要验证输入 XML,例如
<a>
<a1>a1a1a1</a1>
<a2>a2a2a2</a2>
<a3/>
</a>
我需要确保它的根元素具有 label"a"
和子元素,分别带有label "a1"
、和texts和。"a2"
"a3"
"a1a1a1"
"a2a2a2"
""
我可以定义基本的验证功能如下:
type Status = ... // either Ok or list of error messages
type Validate[A] = A => Status
type ValidateNode = Validate[scala.xml.Node]
val label(l: String): ValidateNode = ... // trivial
val text(t: String): ValidateNode = ... // trivial
val child(vn: ValidateNode) = ... // find such a child "c" that "vn(c)" is Ok
因为Status
是一个幺半群(与列表同构),那么Validate[A]
也是一个幺半群,我们可以用|+|
val a1: ValidateNode = label("a1") |+| text("a1a1a1")
val a2: ValidateNode = label("a2") |+| text("a2a2a2")
val a3: ValidateNode = label("a3")
val a: ValidateNode = label("a") |+| child(a1) |+| child(a2) |+| child(a3)
是否有意义 ?您将如何修复/改进它?