xml - 如何使用内胚包装器来修复这个练习?

标签 xml scalaz kleisli

这是我之前的 question 的后续内容。

假设我需要通过路径查找 XML 节点。我可以编写一个函数来按名称获取子节点

import scala.xml.{Node => XmlNode}

def child(name: String): XmlNode = Option[XmlNode] = _.child.find(_.label == name)

我用 kleisli 编写了函数;例如

scala> val a = <a><a0><a1><a2/></a1></a0></a>
a: scala.xml.Elem = <a><a0><a1><a2/></a1></a0></a>

scala> val find01 = Kleisli(child("a0")) >=> Kleisli(child("a1"))
findAB: scalaz.Kleisli[Option,scala.xml.Node,scala.xml.Node] = Kleisli(<function1>)

scala> find01(a)
res85: Option[scala.xml.Node] = Some(<a1><a2/></a1>)

现在我正在使用内态包装器,但它不起作用:

 scala> List(child("a0"), child("a1")).foldMap(Endomorphic.endoKleisli[Option, XmlNode])
 res93: scalaz.Endomorphic[[α, β]scalaz.Kleisli[Option,α,β],scala.xml.Node] = Endomorphic(Kleisli(<function1>))

 scala> res93.run(a)
 res94: Option[scala.xml.Node] = None

你能帮忙找到这个错误吗?

最佳答案

在第一个示例中,您将从左到右书写 ( >=> )。

但是 Endomorphic calls the compose method (又名 <=< ),从右到左工作。

所以你的第二个例子将捕获 <a1>首先,然后寻找<a0>在里面,这显然失败了。

有两种方法可以恢复从左到右的行为。您可以在折叠列表之前反转列表,或者将每个元素包装在 Dual 中。 .

关于xml - 如何使用内胚包装器来修复这个练习?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31401343/

相关文章:

Ruby 的 XML 解析器

xml - 在 SOAP UI 的测试用例 XPATH 上获取节点时出错

c# - Linq 到 XML : Queries for If blocks C#

Scalaz Bind[Seq] 类型类

scala - 如何找出当我在 scalaz 中使用 Monoid for Map 时会发生什么

java - 使用 java 将每个元素存储在单独的文本文件中

scala - scalaz运算符的可发音名称?

scala - 如何将期权与 Kleisli 组合

scala - 如何在 Scala 中使用 >=>?

scala - Kleisli 是仿函数、应用函数还是单子(monad)?