列表列表循环定义Scala
我有一个由integer定义的列表:列表列表循环定义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
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以避免循环引用这至少在演示编译器中是一个编译错误;我把问题和答案写了下来。