我有一个由整数定义的列表列表:
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>)
该示例将创建无限列表。我为之前没有澄清而道歉。
谢谢!
答案 0 :(得分: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)
答案 1 :(得分: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
#:::
与Stream
上:::
的{{1}}相当。
如果您追加List
而不是ex
,那么ex take 3
将是无限的,您可以使用ex
获取您的列表。
编辑:在阅读@ AmigoNico对您的问题的解释后(这可能是正确的解释 - 但谁知道!),您也可以使用(ex take 6).toList
函数执行此操作,例如< / p>
iterate
答案 2 :(得分:0)
List
,因为它不是Scala中的惰性数据结构,你将不可避免地耗尽内存。但Scala有一个懒惰的结构 - Stream
您正在寻找的是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))