时间:2010-06-01 07:34:34

标签: scala functional-programming stream

我正在使用带有scala的Java DataInputStream来解析一些简单的二进制文件(由于缺少无符号类型,这是非常糟糕的扩展,即使在scala中也是如此,但这是一个不同的故事。)

然而,我发现自己被迫使用可变数据结构,因为Java的流本质上是状态保留实体。

使用良好的功能数据结构包装Java流的好设计是什么?

3 个答案:

答案 0 :(得分:5)

目前正在进行一项旨在为Scala创建IO API的项目:scala IO 它受Java 7 NIO API的启发。它仍然是一个WIP,但您可能会从中获得一些有趣的想法。还有一些关于如何使用它的示例,可以找到here

答案 1 :(得分:2)

阅读文件的重点是获得以前没有的状态。因此,我并不完全明白你所追求的是什么。

可以假设一个人将整个宇宙作为输入(和输出)参数并创建一个“功能”模拟,但我从未见过明确证明这具有任何优越特性。

大多数功能数据结构允许您抽象复制数量。例如,列表允许您以方便的方式将单个元素的操作扩展到所有元素(map,reduce等)。但是当你想要读取文件时,你需要抽象数据类型,而且,你实际上并不想要它完全抽象 - 你想要匹配你期望的某种模板。如何指定此模板 - 以及如何处理错误条件 - 我怀疑是二进制文件读取挑战的核心。

(另请注意,除非您在其中一个高度多核太阳盒(例如T2000)上运行,否则您不需要不可变性,因为一个线程足够快以处理所有低级输入处理。)

一种可能性是将二进制文件读取视为解析问题。 Scala目前没有强大的库,但请参阅this thread,了解Paul Phillips编写的一些代码,这些代码在这方面有所帮助。

另一种可能性是自己创建某种模板,比如

List(classOf[Float],classOf[Int],classOf[String])

然后编写一些用match语句顺序解析该流的东西:

val FloatClass = classOf[Float]
listEntry match {
  case FloatClass => // Read float
  ...
 }

这些事情使得阅读二进制文件的工作变得更加容易,并且它至少功能,因为您可以将输入的字节流映射到List[Any]然后使用模式匹配来获取所需的数据。

答案 2 :(得分:1)

从Haskell看一下IO Monad的纯功能方法。

实用的Scala实现将基于Stream实现Iterator / Iterable。例如scala.io.Source supports这个。

相关问题