在Eric Torreborre关于迭代器模式本质一文的博文中,他描述了遍历的笛卡尔积如何也是遍历。
谁能给我看一个使用scalaz 库的例子,因为我不知道。假设问题是,对于List[Int]
我想提供以下两者:
Int
列表中元素的总和- A
List[String]
其元素是通过将“Z”附加到Int
s的字符串表示来创建的
我的理解是,我可以使用traverse
但仅实际遍历我的结构一次的方式来执行此操作,这与此解决方案不同:
val xs = List(1, 2, 3, 4)
val (sum, strings) = (xs.sum, xs map (_.toString + "Z"))
注意 1 -我知道还有其他方法可以做到这一点,我不需要遍历这个例子,也不一定是最清晰的解决方法。但是,我正在尝试理解 traverse,因此我真的在寻找所述问题的答案
编辑- 感谢下面的missingfaktor展示了如何使用State
. 我想我想知道的是如何组合这两个独立的计算。例如; 我的功能理论上如下:
val shape = (_ : List[Int]) map (_.toString + "Z")
val accum = (_ : List[Int]).sum
我想拥有这些相互独立的积累机制,然后选择是List[Int]
使用它们中的一个还是两个来遍历我。我想象一些代码有点像这样:
xs traverse shape //A List[String]
xs traverse accum //An Int
xs traverse (shape <x> accum) //The pair (List[String], Int)
Eric 暗示这是可能的,但我不知道该怎么做~ 即我不知道如何定义shape
和accum
以一种可以组合它们的方式,也不知道如何组合它们。
注意 2并不 意味着具有上述签名的函数shape
。accum
它们是具有执行上述遍历所需类型的表达式。