相关疑难解决方法(0)

Scala中Streams的用例

在Scala中有一个Stream类,它非常像迭代器.主题Scala中Iterator和Stream之间的区别?提供了两者之间相同点和不同点的一些见解.

看看如何使用流非常简单,但我没有很多常见的用例,我会使用流而不是其他工件.

我现在的想法:

  • 如果你需要使用无限系列.但这对我来说似乎不是一个常见的用例,因此它不符合我的标准.(请纠正我,如果这是常见的,我只是有一个盲点)
  • 如果您有一系列数据需要计算每个元素,但您可能需要多次重复使用.这很弱,因为我可以将它加载到一个列表中,这对于大部分开发人员来说在概念上更容易理解.
  • 也许存在大量数据或计算量很大的系列,并且您需要的项目很可能不需要访问所有元素.但是,在这种情况下,除非你需要做一些搜索,在这种情况下,你可以使用一个清单,以及即使是稍微低效率的迭代器将是一个很好的匹配.
  • 有一系列复杂的数据需要重复使用.这里可以再次使用列表.虽然在这种情况下两种情况都同样难以使用,并且Stream更适合,因为并非所有元素都需要加载.但又不是那么常见......或者是这样吗?

所以我错过了任何重大用途吗?或者它是大多数开发人员的偏好?

谢谢

scala stream scala-collections

50
推荐指数
3
解决办法
2万
查看次数

Scala单位类型

我使用opencsv来解析csv文件,我的代码是

while( (line = reader.readNext()) != null ) { .... }
Run Code Online (Sandbox Code Playgroud)

我收到编译器警告说:

 comparing values of types Unit and Null using `!=' will always yield true
 [warn]     while( (aLine = reader.readNext()) != null ) {
Run Code Online (Sandbox Code Playgroud)

我应该怎么做while循环?

scala while-loop

31
推荐指数
4
解决办法
2万
查看次数

如何在Scala中使用Stream.cons编写非泄漏尾递归函数?

当编写在Stream(s)上运行的函数时,存在不同的递归概念.第一个简单的意义在编译器级别上不是递归的,因为如果不立即计算尾部,那么函数会立即返回,但返回的流是递归的:

final def simpleRec[A](as: Stream[A]): Stream[B] = 
  if (a.isEmpty) Stream.empty              
  else someB(a.head) #:: simpleRec(a.tail) 
Run Code Online (Sandbox Code Playgroud)

上述递归概念不会引起任何问题.第二个是在编译器级别上真正的尾递归:

@tailrec
final def rec[A](as: Stream[A]): Stream[B] = 
  if (a.isEmpty) Stream.empty              // A) degenerated
  else if (someCond) rec(a.tail)           // B) tail recursion
  else someB(a.head) #:: rec(a.tail)       // C) degenerated
Run Code Online (Sandbox Code Playgroud)

这里的问题是C)编译器将该情况检测为非tailrec调用,即使没有执行实际调用.这可以通过将流尾部分解为辅助函数来避免:

@tailrec
final def rec[A](as: Stream[A]): Stream[B] = 
  if (a.isEmpty) Stream.empty              
  else if (someCond) rec(a.tail)          // B)
  else someB(a.head) #:: recHelp(a.tail)  

@tailrec
final def recHelp[A](as: Stream[A]): Stream[B] = 
  rec(as)
Run Code Online (Sandbox Code Playgroud)

在编译时,这种方法最终会导致内存泄漏.由于尾递归rec最终是从recHelp …

recursion memory-leaks scala stream

14
推荐指数
1
解决办法
2336
查看次数

Scala流和它们的内存使用情况

据我了解,Stream保留最近评估的元素.我想它不会保留所有评估的元素(这是不可行的),因此它可能使用一些内部"缓存".

这是对的吗?我可以控制此缓存的大小和策略吗?

scala stream

12
推荐指数
2
解决办法
2069
查看次数

是否有类似Iteratee的概念从多个来源提取数据?

可以使用流(懒惰列表)从一个数字(例如两个为了简单)中提取需求.Iteratees可用于处理来自单一来源的数据.

是否有类似Iteratee的功能概念来处理多个输入源?我可以想象一个Iteratee,它的状态信号来自它想要拉动的源.

haskell functional-programming scala iterate

11
推荐指数
2
解决办法
1316
查看次数

特征中定义的Scala尾递归流处理器函数保持对流头的引用

在以下情况

trait T {

 @tailrec
 def consume[A](as: Stream[A]): Unit = {
    if (as.isEmpty) ()
    else consume(as.tail)
  }
 }

object O extends T
Run Code Online (Sandbox Code Playgroud)

主叫O.consume(Range(1, N).toStream)N足够大的,程序将运行的存储器,或者至少将消耗O(N),而不是所需要的O(1).

functional-programming scala stream

10
推荐指数
1
解决办法
1344
查看次数

为Paginated API创建Scala迭代器

我正在编写一个Scala库,以便更轻松地查询分页JSON API.每个API调用都返回一个如下所示的对象:

{
  "count": 100,
  "current_page": 1,
  "total_pages": 2,
  "records": [
    ...
  ]
}
Run Code Online (Sandbox Code Playgroud)

我想有一个函数返回某种迭代器,如MyIterator [Record].在Scala世界中是否有任何标准方法可以做到这一点,甚至可能在标准库中构建可以帮助我的方法?

我通常使用lift-json进行JSON解析,如果这有用的话.

谢谢.

api pagination iterator scala

4
推荐指数
1
解决办法
1393
查看次数