0

たとえば、入力 XML を検証する必要があるとします。

<a>
  <a1>a1a1a1</a1>
  <a2>a2a2a2</a2>
  <a3/>
</a>

そのルート要素に label と、それぞれ labels 、 、および text を持つ子があることを確認"a"する"a1"必要"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) 

それは理にかなっていますか?どのように修正/改善しますか?

4

0 に答える 0