这是我old question的后续行动。
假设我需要验证XML:
<a><a1/><a2/><a3/></a>
我需要确保根a
有子a1
,a2
和a3
(按此顺序)。
我想使用List
(而不是scalaz.Validation
)和Writer
monad来收集验证错误。所以我定义了一个函数来验证XML元素序列,如下所示:
type Validate = List[Elem] => Writer[List[String], List[Elem]]
现在我可以添加一个函数来验证XML元素的标签:
val label: String => Validate = ...
如果我将Validate
重新定义为Kleisli
,我将能够使用Validate
撰写andThen
个函数:
val children: Validate = label("a1") andThen label("a2") andThen label("a3")
Doest有意义吗?你会如何纠正/简化它?