Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
列表列表循环定义Scala_Scala - Fatal编程技术网

列表列表循环定义Scala

列表列表循环定义Scala,scala,Scala,我有一个由integer定义的列表: 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

我有一个由integer定义的列表:

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>)
该示例将创建一个无限列表列表。我很抱歉没有早些澄清

谢谢大家!

您不能有一个无限列表,因为它在Scala中不是一个懒惰的数据结构,您将不可避免地耗尽内存。但是Scala有一个懒惰的结构-流 你要找的是一个迭代函数。它在标准库中缺失,因此下面是一个受假设您使用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))
您不能有一个无限列表,因为它在Scala中不是一个懒惰的数据结构,您将不可避免地耗尽内存。但是Scala有一个懒惰的结构-流 你要找的是一个迭代函数。它在标准库中缺失,因此下面是一个受假设您使用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))

如果我正确解释了您的问题,您希望这样做:

val ex: List[List[Int]] = {
  val ex = List(List(1, 2, 3), List(4, 5, 6), List(7, 8, 9))
  ex ++ 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
:::是与列表中的::等价的惰性流

如果您附加ex而不是ex take 3,那么ex将是无限的,您可以使用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

如果我正确解释了您的问题,您希望这样做:

val ex: List[List[Int]] = {
  val ex = List(List(1, 2, 3), List(4, 5, 6), List(7, 8, 9))
  ex ++ 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
:::是与列表中的::等价的惰性流

如果您附加ex而不是ex take 3,那么ex将是无限的,您可以使用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

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

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)

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

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)

什么是循环定义?请看编辑后的帖子,对不起,我还是不明白。请给出输入和预期输出。我不知道什么是无限列表我猜他的意思是递归James,没有一个答案被标记为正确的-他们都没有标记吗?什么是循环定义?看编辑的帖子,很抱歉我还是不明白。请给出输入和预期输出。我不知道什么是无限列表我猜他指的是递归James,没有一个答案被标记为正确的-他们都没有标记吗?啊,现在我看到Luigi给出了一个两部分的答案,第二部分是关于流的。不过,我会留下我的,因为我们对问题的解释不同,所以我们的解决方案也不同。val ex应该是def ex以避免循环引用这至少在演示编译器中是一个编译错误;我写下了问题和答案。啊,现在我看到路易吉给出了一个分为两部分的答案,第二部分是关于溪流的。不过,我会留下我的,因为我们对问题的解释不同,所以我们的解决方案也不同。val ex应该是def ex以避免循环引用这至少在演示编译器中是一个编译错误;我把问题和答案写了下来。