用于外部(可能无界)IO的Scala惯用流生成器

时间:2013-11-12 11:11:56

标签: scala functional-programming web-scraping generator

我有两个用例1)遍历数据库游标2)实现类似于Python的Scrapy的数据抓取框架。我只想用for循环和yield来编写东西。

我的两个问题是:

1)重要的一个:我如何为IO实现生成器,以便它一次检索一个元素,它看起来有点像Python生成器。 Scala Stream示例主要关注数学问题,“我如何实现Python生成器”的示例并没有详细说明:D

2)生成器的签名将实现为仅返回单个实体和流的函数。如何在不必将返回显式定义为单值序列的情况下执行此操作?

示例(来自我的原型设计):

abstract class Expression
case class Visit(val url: String) extends Expression
case class SelectMultiple(selector: String, 
    List[(Element)=>ExpressionResult]) extends Expression

访问很可能会返回一个结果,而SelectMultiple会吐出Urls,并提取要写入磁盘的项目。

使用:

abstract class ExpressionResult
case class ExtractedEntity(val entity: Entity) extends ExpressionResult
case class ExtractedRequest(val url: String) extends ExpressionResult
case class Continue() extends ExpressionResult
case class Ignore() extends ExpressionResult

我有:

case class Visit(url:String, andDo: ScrapeExpression) extends ScrapeExpression{
  override def execute : ExpressionResult = {
    val doc = Jsoup.connect(url).get()
    andDo.element = doc
    println( "visiting")
    andDo.execute
    Continue()
  }
}

但我必须将执行签名更改为Seq[ExpressionResult]

SelectMultiple

P.s。,上面的原型显示了带有执行器的case类,在我弄清楚如何编写生成器之后,我将把逻辑移到表达式树的外部。

可能相关

How to implement lazy sequence (iterable) in scala?

Stream vs Views vs Iterators

Functionally processing a database cursor in Scala

Treating an SQL ResultSet like a Scala Stream

思路:

我觉得在这种情况下建模Iterator可能是我最好的选择,但我还没有考虑过它们如何适应表达式。但是库中迭代器的特征和模板是否会与for表达式相互影响,即使它们存在,它们是否会覆盖流式用例?

我应该用Java编写io代码(现在拍我:〜()?

0 个答案:

没有答案