0

Haskellには、accumArray2つのタプルをキーでグループ化し、同じキーで値を減らす関数関数があります。Scalaにはありません。scalazにあるようですが、他の多くのscalaz機能に依存しています。ScalaでaccumArrayを書くためのより良い方法はありますか?haskellのこの関数の詳細はこちら:http://zvon.org/other/haskell/Outputarray/accumArray_f.html

以下は私の実装です。ありがとう。

  private def accumArray[A <% Ordered[A], B, C](f: (B, C) => B,
                                                base: B,
                                                bounds: (A, A),
                                                ll: List[(A, C)]): Vector[(A, B)] = {
    ll.filter(i => i._1 >= bounds._1 && i._1 <= bounds._2).
      groupBy(_._1).
      map(e =>
        e._1 -> e._2.map(_._2).foldLeft(base)(f)
      ).
      toVector
  }
4

2 に答える 2

1

これが私の解決策です、それほど短くはありません

def accumArray[A <% Ordered[A], B, C](f: (B, C) => B,
                                      base: B,
                                      bounds: (A, A),
                                      xs: Seq[(A, C)]): Vector[(A, B)] = {
  @scala.annotation.tailrec
  def accum(ys: Seq[(A, C)], zs: Vector[(A, B)]): Vector[(A, B)] =
    (ys, zs) match {
      case(Seq(), _)           => zs
      case(((a,c)) +: rs, Vector())  => accum(rs, Vector((a, f(base,c))))
      case(((a1,c)) +: rs, vs :+ ((a2,b))) =>
        if(a1 == a2) accum(rs, vs :+ (a2, f(b,c)))
        else accum(rs, zs :+ (a1, f(base,c)))
    }

  val (min, max) = bounds
  val ys = xs.filter{case(x, _) => x >= min && x <= max}.sortBy(_._1)
  accum(ys, Vector())
}
于 2013-02-09T00:29:59.280 に答える
0

タプルのリストは、キーと値のペアのリストと見なすことができます。それは私に Map タイプを思い出させます。どうやら ScalaZ を使用して Map を蓄積することは可能です。scala Maps を使用して値を蓄積する

私は ScalaZ (関数型プログラミング) についてまだ十分に学んでいないため、実際の例を紹介することはできませんが、Haskell の経験があり、ScalaZ でこれを行うのに十分な知識があると思われます。

于 2013-02-09T13:08:55.493 に答える