如何使用scalaz进行遍历
我试图简化一个真正的代码,但没有太多 给定以下输入,f和g的实现只是示例,实际的实现更为复杂如何使用scalaz进行遍历,scala,scalaz,Scala,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 => Opti
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>
是否可以使用scalaz更好地揭示意图
我在想
m.traverseS
如果g
真的需要处理整个列表[Int]
,那么我马上想到Endo
(需要稍微重写g
):
但我不确定这是否更清楚。如上所述,f和g代码只是示例,只有签名才是重要的。这就是为什么我特意使用签名编写示例的原因。选项[Int]实际上是一个Iterable[Int](甚至还有一个隐式选项),并且(Int,List[Int])=>List[Int]总是可以写成Int=>Endo[List[Int]]。所以这些签名对于f和g的任何实现都是有效的。
m.collect{ case(s, i) => (s, f(i))}
.filter{ case (s,i) => i.isDefined }
.toList
.traverseS({s => State({ l: List[Int] => (g(s._2.get, l), ())})})
.run(Nil)
._1
.reverse
val f: Int => Iterable[Int] = ???
val g: Int => Endo[List[Int]] = ???
val m = Map("a" -> 1, "b" -> 2, "c" -> 3, "d" -> 4)
Foldable[List].fold(m.values.toList flatMap f map g).apply(List[Int]())
m.collect{ case(s, i) => (s, f(i))}
.filter{ case (s,i) => i.isDefined }
.toList
.traverseS({s => State({ l: List[Int] => (g(s._2.get, l), ())})})
.run(Nil)
._1
.reverse