2

我有一个由整数定义的列表列表:

val ex: List[List[Int]] = List(List (1, 2, 3), List(4, 5, 6), List(7, 8 , 9), ex)

如何使用scala中的循环定义将列表列表的所有元素乘以2?

编辑:实体 X 的循环定义是一个有效地使用 X 来设置自己 X 的定义。

例子:

val ex1: List[List[Int]] = List(List(1,2,3), <call ex1 to multiply the elements by two>)

该示例将创建一个无限列表。我很抱歉没有早点澄清。

谢谢!

4

3 回答 3

3

我不确定,但我认为您可能正在寻找 Streams,它类似于延迟定义的列表,并且该定义可以是递归的。这看起来像你想要的吗?

scala> val ex:Stream[List[Int]] = List(1,2,3) #:: ex.map( _ map (_*2) )
ex: Stream[List[Int]] = Stream(List(1, 2, 3), ?)

scala> ( ex take 5 ) foreach println
List(1, 2, 3)
List(2, 4, 6)
List(4, 8, 12)
List(8, 16, 24)
List(16, 32, 48)

也许

scala> val ex:Stream[List[Int]] = List(1,2,3) #:: ex.map( _ map (_+3) )
ex: Stream[List[Int]] = Stream(List(1, 2, 3), ?)

scala> ( ex take 5 ) foreach println
List(1, 2, 3)
List(4, 5, 6)
List(7, 8, 9)
List(10, 11, 12)
List(13, 14, 15)
于 2012-10-20T05:12:02.503 回答
1

如果我正确解释你的问题,你想这样做:

val ex: List[List[Int]] = {
  val ex = List(List(1, 2, 3), List(4, 5, 6), List(7, 8, 9))
  ex ++ ex
}

这不是一个循环定义,因为内部ex只是遮蔽了外部(如果您使用不同的变量名称会更清楚)。

如果您确实想要递归定义,则需要使用惰性数据结构,例如Stream(您可以尝试使用List,但您会得到NullPointerException)。所以你可以这样写:

val ex: Stream[List[Int]] = 
  Stream(List(1, 2, 3), List(4, 5, 6), List(7, 8, 9)) #::: (ex take 3)

ex.toList // if it actually needs to be a List, which is probably doesn't

#:::是on的惰性Stream等价物。:::List

如果您追加ex而不是ex take 3thenex将是无限的,您可以使用(ex take 6).toList.

编辑:在阅读@AmigoNico 对您的问题的解释(这可能是正确的解释 - 但谁知道!)之后,您也可以使用该iterate函数执行此操作,例如

List.iterate(List(1,2,3), 3)(_ map (_ * 2))
  // List(List(1, 2, 3), List(2, 4, 6), List(4, 8, 12))

// or if you want it infinte:
val xs = Stream.iterate(List(1,2,3))(_ map (_ * 2))
(xs take 3).toList
  // result same as above
于 2012-10-20T00:56:05.033 回答
0
  1. 你不能有无限List,因为它不是 Scala 中的惰性数据结构,你将不可避免地耗尽内存。但是 Scala 有一个惰性结构——Stream
  2. 您正在寻找的是一个iterate功能。标准库中没有它,所以这里有一个受Haskell启发的实现(假设您使用的是 Scala 2.10):

    implicit class AnyFunctional [ A ] ( val a : A ) extends AnyVal {
      def iterate ( f : A => A ) : Stream[A] = a #:: (f(a) iterate f)
    }
    

    将它放在范围内,您将能够像这样使用它:

    scala> List(1,2,3) iterate (_.map(_*2)) take 3 toList
    warning: there were 1 feature warnings; re-run with -feature for details
    res7: List[List[Int]] = List(List(1, 2, 3), List(2, 4, 6), List(4, 8, 12))
    
于 2012-10-19T23:38:30.270 回答