0
我试图简化一个真实的代码,但没有太多。如何遍历scalaz
给出下面的输入,执行的f和g只是为例子,真正的一个比较复杂
scala> val m = Map("a" -> 1, "b" -> 2, "c" -> 3, "d" -> 4)
m: scala.collection.immutable.Map[String,Int] = Map(a -> 1, b -> 2, c -> 3, d -> 4)
scala> val f : Int => Option[Int] = i => if (i % 2 == 0) Some(i) else None
f: Int => Option[Int] = <function1>
scala> val g = (a:Int, l:List[Int]) => a :: l
g: (Int, List[Int]) => List[Int] = <function2>
下面的过程是:
m.foldLeft(List[Int]()) { case (l, (k, v)) =>
f(v) match {
case Some(w) => g(w, l)
case None => l
}
}
是否有可能使用scalaz来更好地揭示意图?
我thinkink约m.traverseS
如上所述,f和g代码仅仅是举例,只有签名是重要的。 – 2014-10-06 14:10:52
这就是为什么我故意写我的例子只使用签名。一个选项[Int]实际上是一个Iterable [Int](甚至有一个隐式的)和一个(Int,List [Int])=> List [Int]总是可以写成Int => Endo [List [Int ]。所以这些签名对于f和g的任何实现都是有效的。 – lmm 2014-10-06 15:24:01