Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用scalaz进行遍历_Scala_Scalaz - Fatal编程技术网

如何使用scalaz进行遍历

如何使用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

我试图简化一个真正的代码,但没有太多

给定以下输入,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>
是否可以使用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