相关疑难解决方法(0)

使用Scalaz Stream解析任务(替换Scalaz Iteratees)

介绍

我在许多项目中使用Scalaz 7的迭代,主要用于处理大型文件.我想开始切换到Scalaz ,这些旨在取代iteratee包(坦率地说它缺少很多部分并且使用起来很麻烦).

Streams基于机器(iteratee理念的另一种变体),它也已在Haskell中实现.我已经使用了Haskell机器库,但机器和流之间的关系并不是完全明显的(至少对我来说),并且流库的文档仍然有点稀疏.

这个问题是关于一个简单的解析任务,我希望看到使用流而不是迭代来实现.如果没有其他人能打败我,我会自己回答这个问题,但我确信我不是唯一一个正在(甚至考虑)这种转变的人,因为无论如何我需要完成这项工作,想我不妨在公共场合做这件事.

任务

假设我有一个包含已被标记化并用词性标记的句子的文件:

no UH
, ,
it PRP
was VBD
n't RB
monday NNP
. .

the DT
equity NN
market NN
was VBD
illiquid JJ
. .
Run Code Online (Sandbox Code Playgroud)

每行有一个标记,单词和词性由单个空格分隔,空白行表示句子边界.我想解析这个文件并返回一个句子列表,我们也可以将它们表示为字符串元组的列表:

List((no,UH), (,,,), (it,PRP), (was,VBD), (n't,RB), (monday,NNP), (.,.))
List((the,DT), (equity,NN), (market,NN), (was,VBD), (illiquid,JJ), (.,.)
Run Code Online (Sandbox Code Playgroud)

像往常一样,如果我们遇到无效输入或文件读取异常,我们希望优雅地失败,我们不想担心手动关闭资源等.

迭代解决方案

首先是一些常规文件读取的东西(它应该是iteratee包的一部分,它目前不提供远程高级别的任何东西):

import java.io.{ BufferedReader, File, FileReader }
import scalaz._, Scalaz._, effect.IO
import iteratee.{ Iteratee => I, _ …
Run Code Online (Sandbox Code Playgroud)

scala scalaz iterate transducer-machines scalaz-stream

48
推荐指数
1
解决办法
3987
查看次数