标签: transducer-machines

使用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
查看次数

机器和管道(或其他类似的库)之间的概念差异是什么?

我想学习这个概念,这样我就能理解和使用诸如机器之类的库.

我试图关注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它是什么以及它为什么被量化.或者,管道式库和机器之间的概念差异是什么?

haskell conduit transducer-machines

28
推荐指数
1
解决办法
2735
查看次数

Scala传感器和Clojure传感器之间有什么相似之处和不同之处?

Paul ChiusanoRúnarÓli 在Scala编写了一本精彩的函数编程书.在其中他们提到了Scala社区中一个有点引用的概念 - Transducers.

Scala中的Scala传感器

在Clojure的社区- 传感器得到一点 压机.

我的问题是:Scala Transducers**之间有什么相同点和不同点(来自Scala中的函数编程一书)和Clojure Transducers?**

假设:

我知道

  1. 传感器与他们在电气工程中的概念相同

  2. 计算机科学中存在一种称为有限状态传感器的预先存在的概念

  3. 生物学和心理学中有一个先例采用了" 转换"这个词

  4. 目前已经是历史上其他技术书籍像SICP 采用字转换器.

scala clojure transducer transducer-machines

8
推荐指数
1
解决办法
940
查看次数

有人可以提供以下计划的机器实施吗?

我正在玩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

haskell transducer-machines

3
推荐指数
1
解决办法
294
查看次数