编写所有对的列表

KCh*_*oux 8 functional-programming scala list

我是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)
Run Code Online (Sandbox Code Playgroud)

我尝试zip在每个元素上使用整个列表,希望它会在整个列表中复制一个项目.它不起作用(只匹配第一个可能的对).我不确定如何重复一个元素(Haskell使用它cycle并且take我相信),并且我在跟踪Scala上的文档时遇到了麻烦.

这让我觉得可能有一种更简洁,更实用的方式来获得我想要的结果.有没有人有一个好的解决方案?

dby*_*rne 24

这个怎么样:

val pairs = for(x <- nums; y <- nums) yield (x, y)
Run Code Online (Sandbox Code Playgroud)

  • @KChaloux:它是`nums.flatMap(x => nums.map((x,_)))`的语法糖,实际上是`nums.map(x => nums.map((x,_))) .flatten`,如果有帮助的话. (7认同)

keo*_*eos 8

对于那些不想重复的人:

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))
Run Code Online (Sandbox Code Playgroud)