11

私はScalaを初めて使用し、Haskellを介した関数型プログラミングの経験は非常に限られています。

単一の入力リストから作成されたすべての可能なペアのリストを作成してみたいと思います。例:

val nums = List[Int](1, 2, 3, 4, 5)   // Create an input list
val pairs = composePairs(nums)        // Function I'd like to create

// pairs == List[Int, Int]((1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (2, 1) ... etc)

zip全体で1つのアイテムが複製されることを期待して、リスト全体で各要素を使用してみました。それは機能しませんでした(最初の可能なペアにのみ一致しました)。要素を繰り返す方法がわかりません(Haskellはそれを実行しcycletake私は信じています)。Scalaのドキュメントに従うのに問題がありました。

これにより、私が望む結果を得るには、おそらくもっと簡潔で機能的な方法があるのではないかと思います。誰かが良い解決策を持っていますか?

4

3 に答える 3

28

これはどう:

val pairs = for(x <- nums; y <- nums) yield (x, y)
于 2012-08-03T21:17:07.470 に答える
10

重複を望まない方のために:

val uniquePairs = for {
      (x, idxX) <- nums.zipWithIndex
      (y, idxY) <- nums.zipWithIndex
      if idxX < idxY
    } yield (x, y)

val nums = List(1,2,3,4,5)
uniquePairs: List[(Int, Int)] = List((1, 2), (1, 3), (1, 4), (1, 5), (2, 3), (2, 4), (2, 5), (3, 4), (3, 5), (4, 5))
于 2017-08-17T01:24:28.123 に答える
1

マップとフラット化を使用した別のバージョンがあります

val pairs = nums.flatMap(x => nums.map(y => (x,y)))

List[(Int, Int)] = List((1,1), (1,2), (1,3), (1,4), (1,5), (2,1), (2,2), (2,3), (2,4), (2,5), (3,1), (3,2), (3,3), (3,4), (3,5), (4,1), (4,2), (4,3), (4,4), (4,5), (5,1), (5,2) (5,3), (5,4), (5,5))

必要に応じて、これをcomposePairs関数に簡単にラップできます。

def composePairs(nums: Seq[Int]) =
    nums.flatMap(x => nums.map(y => (x,y)))
于 2012-08-03T21:52:38.720 に答える