我在许多项目中使用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) 我想学习这个概念,这样我就能理解和使用诸如机器之类的库.
我试图关注RúnarBjarnason关于机器的讨论,但信息太少,基本上只是一堆数据类型.我甚至无法理解什么k是
newtype Machine k o = Step k o (Machine k o)
data Step k o r = Stop
| Yield o r
| forall t . Await (t -> r) (k t) r
Run Code Online (Sandbox Code Playgroud)
或者t它是什么以及它为什么被量化.或者,管道式库和机器之间的概念差异是什么?
Paul Chiusano和RúnarÓli 在Scala编写了一本精彩的函数编程书.在其中他们提到了Scala社区中一个有点引用的概念 - Transducers.

我的问题是:Scala Transducers**之间有什么相同点和不同点(来自Scala中的函数编程一书)和Clojure Transducers?**
假设:
我知道
我正在玩Edward Kmett的机器模块,我在这里和那里都有点困惑.我认为问一个问题的最好方法是提供一个玩具用例.如下面所描述的.
机器一和二坐在两个叉子的叉子上.
机器1将整数列表作为参数,并将其向下推.机器2将字符列表作为参数,并将其向下推.
机器3保持内部状态,从某个条件开始mempty,然后mappends是从Wye基座的任一台机器接收的元件(因此不是两者).机器3然后获得当前状态并推动它下降.
机器四将它接收的元素打印到控制台.
到目前为止,我有这个:
y1 :: PlanT k [Int] m ()
y1 = yield
y2 :: PlanT k [Char] m ()
y2 = yield
Run Code Online (Sandbox Code Playgroud)
但我不确定如何结合y1和y2; 或者滚动隐藏状态的任意进程,而不是使用Process.hs导出的某个库存组合器.
根据建议,指向机器包的链接:http: //hackage.haskell.org/package/machines
并且pdf给出了它的作用的非常高级别的描述:https://dl.dropboxusercontent.com/u/4588997/Machines.pdf