假设我需要验证输入XML,例如
<a>
<a1>a1a1a1</a1>
<a2>a2a2a2</a2>
<a3/>
</a>
我需要确保其根元素标记为"a"
,子标记为"a1"
,"a2"
,"a3"
和文字"a1a1a1"
,{{分别为1}}和"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]
|+|
有意义吗?你会如何修复/改进它?