列表清单圆形定义Scala

时间:2012-10-19 23:32:29

标签: scala

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

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>)

该示例将创建无限列表。我为之前没有澄清而道歉。

谢谢!

3 个答案:

答案 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)

  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))