我正在使用Java的DataInputStream和scala来解析一些简单的二进制文件(这是非常糟糕的经验,因为缺少无符号类型,即使在scala中也是如此,但那是另一回事)。
然而,我发现自己不得不使用可变数据结构,因为Java的流本质上是保持状态的实体。
用好的函数式数据结构包装Java流的好设计是什么?
发布于 2010-06-01 16:39:04
目前有一个项目正在进行中,该项目旨在为Scala创建一个IO:scala IO,它的灵感来自于Java7NIOAPI。它仍然是一个WIP,但您可能从中得到一些有趣的想法。还有一些关于如何使用它的示例,可以在here中找到
发布于 2010-06-01 22:42:09
读取文件的全部意义在于获得以前没有的状态。因此,我不太明白你到底想要什么。
人们可以假装拥有整个宇宙作为输入(和输出)参数,并创建一个“功能”模拟,但我从来没有看到过明确的演示,表明这具有任何优越的特征。
大多数函数式数据结构允许您对副本数量进行抽象。例如,列表允许您以方便的方式(map、reduce等)将对单个元素的操作扩展到所有元素。但是当您想要读取一个文件时,您需要对数据类型进行抽象,而且您实际上并不希望它完全抽象--您希望匹配您期望的某种类型的模板。我怀疑,如何指定这个模板--以及如何处理错误条件--是读取二进制文件挑战的核心。
(还要注意,除非您运行在高度多核的Sun机器(例如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],然后使用模式匹配来获取所需的数据。
发布于 2010-06-01 16:13:38
看一下来自Haskell的纯函数式方法的IO Monad。
一个实用的Scala实现将基于流实现Iterator/Iterable。例如,scala.io.Source supports this。
https://stackoverflow.com/questions/2947967
复制相似问题